blob: f83c7c9ea8f0ed02c861168a6036d8ab61601f22 [file] [log] [blame]
Hans Wennborgdcfba332015-10-06 23:40:43 +00001//===--- ToolChains.cpp - ToolChain Implementations -------------*- C++ -*-===//
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "ToolChains.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "clang/Basic/ObjCRuntime.h"
12#include "clang/Basic/Version.h"
Benjamin Kramerd45b2052015-10-07 15:48:01 +000013#include "clang/Basic/VirtualFileSystem.h"
Alp Toker1d257e12014-06-04 03:28:55 +000014#include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
Daniel Dunbar6232d342010-05-20 21:48:38 +000015#include "clang/Driver/Compilation.h"
Daniel Dunbar76ce7412009-03-23 16:15:50 +000016#include "clang/Driver/Driver.h"
Daniel Dunbaraabb0b12009-03-25 06:12:34 +000017#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000018#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000019#include "clang/Driver/SanitizerArgs.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000020#include "llvm/ADT/STLExtras.h"
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +000021#include "llvm/ADT/SmallString.h"
Daniel Dunbar76ce7412009-03-23 16:15:50 +000022#include "llvm/ADT/StringExtras.h"
Bob Wilson997a97f2011-10-07 00:37:57 +000023#include "llvm/ADT/StringSwitch.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000024#include "llvm/Option/Arg.h"
25#include "llvm/Option/ArgList.h"
26#include "llvm/Option/OptTable.h"
27#include "llvm/Option/Option.h"
Xinliang David Li170cd102015-10-27 05:15:35 +000028#include "llvm/ProfileData/InstrProf.h"
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +000029#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000030#include "llvm/Support/FileSystem.h"
Rafael Espindolac8f008f2010-11-07 20:14:31 +000031#include "llvm/Support/MemoryBuffer.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000032#include "llvm/Support/Path.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000033#include "llvm/Support/Program.h"
Renato Golin33e1f822015-05-28 15:49:28 +000034#include "llvm/Support/TargetParser.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000035#include "llvm/Support/raw_ostream.h"
Daniel Dunbarb5023e92009-04-10 21:00:07 +000036#include <cstdlib> // ::getenv
Rafael Espindola8a8e5542014-06-12 17:19:42 +000037#include <system_error>
Daniel Dunbarb5023e92009-04-10 21:00:07 +000038
Daniel Dunbar59e5e882009-03-20 00:20:03 +000039using namespace clang::driver;
40using namespace clang::driver::toolchains;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000041using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000042using namespace llvm::opt;
Daniel Dunbar59e5e882009-03-20 00:20:03 +000043
Douglas Katzmana67e50c2015-06-26 15:47:46 +000044MachO::MachO(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
45 : ToolChain(D, Triple, Args) {
Tim Northover15ff71d2014-05-22 13:12:14 +000046 // We expect 'as', 'ld', etc. to be adjacent to our install dir.
47 getProgramPaths().push_back(getDriver().getInstalledDir());
48 if (getDriver().getInstalledDir() != getDriver().Dir)
49 getProgramPaths().push_back(getDriver().Dir);
Tim Northover157d9112014-01-16 08:48:16 +000050}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +000051
Tim Northover157d9112014-01-16 08:48:16 +000052/// Darwin - Darwin tool chain for i386 and x86_64.
Alexey Samsonov905c8022015-06-18 21:46:05 +000053Darwin::Darwin(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
54 : MachO(D, Triple, Args), TargetInitialized(false) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +000055
Tim Northover157d9112014-01-16 08:48:16 +000056types::ID MachO::LookupTypeForExtension(const char *Ext) const {
Daniel Dunbarcc7df6c2010-08-02 05:43:56 +000057 types::ID Ty = types::lookupTypeForExtension(Ext);
58
59 // Darwin always preprocesses assembly files (unless -x is used explicitly).
60 if (Ty == types::TY_PP_Asm)
61 return types::TY_Asm;
62
63 return Ty;
64}
65
Douglas Katzmana67e50c2015-06-26 15:47:46 +000066bool MachO::HasNativeLLVMSupport() const { return true; }
Daniel Dunbar62123a12010-09-17 00:24:52 +000067
John McCall24fc0de2011-07-06 00:26:06 +000068/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
John McCall5fb5df92012-06-20 06:18:46 +000069ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
Tim Northover6f3ff222015-10-30 16:30:27 +000070 if (isTargetWatchOSBased())
Tim Northover756447a2015-10-30 16:30:36 +000071 return ObjCRuntime(ObjCRuntime::WatchOS, TargetVersion);
Tim Northover9c7e0352013-12-12 11:55:52 +000072 if (isTargetIOSBased())
John McCall5fb5df92012-06-20 06:18:46 +000073 return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
Bob Wilson5ad5a952012-11-09 01:59:30 +000074 if (isNonFragile)
75 return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
76 return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
John McCall24fc0de2011-07-06 00:26:06 +000077}
78
John McCall7959fee2011-09-09 20:41:01 +000079/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
80bool Darwin::hasBlocksRuntime() const {
Tim Northover6f3ff222015-10-30 16:30:27 +000081 if (isTargetWatchOSBased())
82 return true;
83 else if (isTargetIOSBased())
John McCall7959fee2011-09-09 20:41:01 +000084 return !isIPhoneOSVersionLT(3, 2);
Tim Northover9c7e0352013-12-12 11:55:52 +000085 else {
Tim Northover157d9112014-01-16 08:48:16 +000086 assert(isTargetMacOS() && "unexpected darwin target");
87 return !isMacosxVersionLT(10, 6);
Tim Northover9c7e0352013-12-12 11:55:52 +000088 }
John McCall7959fee2011-09-09 20:41:01 +000089}
90
Renato Golin33e1f822015-05-28 15:49:28 +000091// This is just a MachO name translation routine and there's no
92// way to join this into ARMTargetParser without breaking all
93// other assumptions. Maybe MachO should consider standardising
94// their nomenclature.
95static const char *ArmMachOArchName(StringRef Arch) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000096 return llvm::StringSwitch<const char *>(Arch)
97 .Case("armv6k", "armv6")
98 .Case("armv6m", "armv6m")
99 .Case("armv5tej", "armv5")
100 .Case("xscale", "xscale")
101 .Case("armv4t", "armv4t")
102 .Case("armv7", "armv7")
103 .Cases("armv7a", "armv7-a", "armv7")
104 .Cases("armv7r", "armv7-r", "armv7")
105 .Cases("armv7em", "armv7e-m", "armv7em")
106 .Cases("armv7k", "armv7-k", "armv7k")
107 .Cases("armv7m", "armv7-m", "armv7m")
108 .Cases("armv7s", "armv7-s", "armv7s")
109 .Default(nullptr);
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000110}
111
Renato Golin33e1f822015-05-28 15:49:28 +0000112static const char *ArmMachOArchNameCPU(StringRef CPU) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000113 unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
Renato Golin33e1f822015-05-28 15:49:28 +0000114 if (ArchKind == llvm::ARM::AK_INVALID)
115 return nullptr;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000116 StringRef Arch = llvm::ARM::getArchName(ArchKind);
Renato Golin33e1f822015-05-28 15:49:28 +0000117
118 // FIXME: Make sure this MachO triple mangling is really necessary.
119 // ARMv5* normalises to ARMv5.
120 if (Arch.startswith("armv5"))
121 Arch = Arch.substr(0, 5);
122 // ARMv6*, except ARMv6M, normalises to ARMv6.
123 else if (Arch.startswith("armv6") && !Arch.endswith("6m"))
124 Arch = Arch.substr(0, 5);
125 // ARMv7A normalises to ARMv7.
126 else if (Arch.endswith("v7a"))
127 Arch = Arch.substr(0, 5);
128 return Arch.data();
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000129}
130
Tim Northover9c7e0352013-12-12 11:55:52 +0000131static bool isSoftFloatABI(const ArgList &Args) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000132 Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
Tim Northover9c7e0352013-12-12 11:55:52 +0000133 options::OPT_mfloat_abi_EQ);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000134 if (!A)
135 return false;
Rafael Auler3f7abf72014-09-29 21:50:34 +0000136
Tim Northover9c7e0352013-12-12 11:55:52 +0000137 return A->getOption().matches(options::OPT_msoft_float) ||
138 (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
139 A->getValue() == StringRef("soft"));
140}
141
Tim Northover157d9112014-01-16 08:48:16 +0000142StringRef MachO::getMachOArchName(const ArgList &Args) const {
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000143 switch (getTriple().getArch()) {
144 default:
Rafael Espindolaed1233e2014-08-28 21:23:05 +0000145 return getDefaultUniversalArchName();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000146
Tim Northover40956e62014-07-23 12:32:58 +0000147 case llvm::Triple::aarch64:
148 return "arm64";
149
Douglas Gregord9bb1522011-03-06 19:11:49 +0000150 case llvm::Triple::thumb:
Hans Wennborgdcfba332015-10-06 23:40:43 +0000151 case llvm::Triple::arm:
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000152 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000153 if (const char *Arch = ArmMachOArchName(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000154 return Arch;
155
156 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000157 if (const char *Arch = ArmMachOArchNameCPU(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000158 return Arch;
159
160 return "arm";
161 }
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000162}
163
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +0000164Darwin::~Darwin() {}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000165
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +0000166MachO::~MachO() {}
Tim Northover157d9112014-01-16 08:48:16 +0000167
168std::string MachO::ComputeEffectiveClangTriple(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000169 types::ID InputType) const {
Tim Northover157d9112014-01-16 08:48:16 +0000170 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
171
172 return Triple.getTriple();
173}
174
Chad Rosierd3a0f952011-09-20 20:44:06 +0000175std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
176 types::ID InputType) const {
177 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000178
179 // If the target isn't initialized (e.g., an unknown Darwin platform, return
180 // the default triple).
181 if (!isTargetInitialized())
182 return Triple.getTriple();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000183
Tim Northover157d9112014-01-16 08:48:16 +0000184 SmallString<16> Str;
Tim Northover6f3ff222015-10-30 16:30:27 +0000185 if (isTargetWatchOSBased())
186 Str += "watchos";
187 else if (isTargetTvOSBased())
188 Str += "tvos";
189 else if (isTargetIOSBased())
190 Str += "ios";
191 else
192 Str += "macosx";
Tim Northover157d9112014-01-16 08:48:16 +0000193 Str += getTargetVersion().getAsString();
194 Triple.setOSName(Str);
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000195
196 return Triple.getTriple();
197}
198
David Blaikie68e081d2011-12-20 02:48:34 +0000199void Generic_ELF::anchor() {}
200
Tim Northover157d9112014-01-16 08:48:16 +0000201Tool *MachO::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +0000202 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000203 case Action::LipoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000204 if (!Lipo)
205 Lipo.reset(new tools::darwin::Lipo(*this));
206 return Lipo.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000207 case Action::DsymutilJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000208 if (!Dsymutil)
209 Dsymutil.reset(new tools::darwin::Dsymutil(*this));
210 return Dsymutil.get();
Ben Langmuir9b9a8d32014-02-06 18:53:25 +0000211 case Action::VerifyDebugInfoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000212 if (!VerifyDebug)
213 VerifyDebug.reset(new tools::darwin::VerifyDebug(*this));
214 return VerifyDebug.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +0000215 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000216 return ToolChain::getTool(AC);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000217 }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000218}
219
Douglas Katzman95354292015-06-23 20:42:09 +0000220Tool *MachO::buildLinker() const { return new tools::darwin::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +0000221
Tim Northover157d9112014-01-16 08:48:16 +0000222Tool *MachO::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +0000223 return new tools::darwin::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +0000224}
Daniel Dunbar26d482a2009-09-18 08:15:03 +0000225
Douglas Katzman95354292015-06-23 20:42:09 +0000226DarwinClang::DarwinClang(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +0000227 const ArgList &Args)
Douglas Katzman95354292015-06-23 20:42:09 +0000228 : Darwin(D, Triple, Args) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +0000229
Tim Northover336f1892014-03-29 13:16:12 +0000230void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
Tim Northover6f3ff222015-10-30 16:30:27 +0000231 // For modern targets, promote certain warnings to errors.
232 if (isTargetWatchOSBased() || getTriple().isArch64Bit()) {
Tim Northover336f1892014-03-29 13:16:12 +0000233 // Always enable -Wdeprecated-objc-isa-usage and promote it
234 // to an error.
235 CC1Args.push_back("-Wdeprecated-objc-isa-usage");
236 CC1Args.push_back("-Werror=deprecated-objc-isa-usage");
237
Tim Northover6f3ff222015-10-30 16:30:27 +0000238 // For iOS and watchOS, also error about implicit function declarations,
239 // as that can impact calling conventions.
240 if (!isTargetMacOS())
241 CC1Args.push_back("-Werror=implicit-function-declaration");
Tim Northover336f1892014-03-29 13:16:12 +0000242 }
243}
244
Tim Northover157d9112014-01-16 08:48:16 +0000245/// \brief Determine whether Objective-C automated reference counting is
246/// enabled.
247static bool isObjCAutoRefCount(const ArgList &Args) {
248 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
249}
250
John McCall31168b02011-06-15 23:02:42 +0000251void DarwinClang::AddLinkARCArgs(const ArgList &Args,
252 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000253 // Avoid linking compatibility stubs on i386 mac.
254 if (isTargetMacOS() && getArch() == llvm::Triple::x86)
255 return;
256
257 ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true);
258
259 if ((runtime.hasNativeARC() || !isObjCAutoRefCount(Args)) &&
260 runtime.hasSubscripting())
261 return;
Eric Christopher551ef452011-08-23 17:56:55 +0000262
263 CmdArgs.push_back("-force_load");
Rafael Espindola358256c2013-06-26 02:13:00 +0000264 SmallString<128> P(getDriver().ClangExecutable);
265 llvm::sys::path::remove_filename(P); // 'clang'
266 llvm::sys::path::remove_filename(P); // 'bin'
Benjamin Kramer17381a02013-06-28 16:25:46 +0000267 llvm::sys::path::append(P, "lib", "arc", "libarclite_");
John McCall31168b02011-06-15 23:02:42 +0000268 // Mash in the platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000269 if (isTargetWatchOSSimulator())
270 P += "watchsimulator";
271 else if (isTargetWatchOS())
272 P += "watchos";
273 else if (isTargetTvOSSimulator())
274 P += "appletvsimulator";
275 else if (isTargetTvOS())
276 P += "appletvos";
277 else if (isTargetIOSSimulator())
Rafael Espindola358256c2013-06-26 02:13:00 +0000278 P += "iphonesimulator";
Argyrios Kyrtzidis058b4512011-10-18 17:40:15 +0000279 else if (isTargetIPhoneOS())
Rafael Espindola358256c2013-06-26 02:13:00 +0000280 P += "iphoneos";
John McCall31168b02011-06-15 23:02:42 +0000281 else
Rafael Espindola358256c2013-06-26 02:13:00 +0000282 P += "macosx";
283 P += ".a";
John McCall31168b02011-06-15 23:02:42 +0000284
Rafael Espindola358256c2013-06-26 02:13:00 +0000285 CmdArgs.push_back(Args.MakeArgString(P));
John McCall31168b02011-06-15 23:02:42 +0000286}
287
Tim Northover157d9112014-01-16 08:48:16 +0000288void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
Kuba Brecka2735a0252014-10-31 00:08:57 +0000289 StringRef DarwinLibName, bool AlwaysLink,
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000290 bool IsEmbedded, bool AddRPath) const {
291 SmallString<128> Dir(getDriver().ResourceDir);
292 llvm::sys::path::append(Dir, "lib", IsEmbedded ? "macho_embedded" : "darwin");
293
294 SmallString<128> P(Dir);
295 llvm::sys::path::append(P, DarwinLibName);
Eric Christopher551ef452011-08-23 17:56:55 +0000296
Eric Christopherc235d0c62011-06-22 17:41:40 +0000297 // For now, allow missing resource libraries to support developers who may
Alexey Samsonov8368b372012-11-21 14:17:42 +0000298 // not have compiler-rt checked out or integrated into their build (unless
299 // we explicitly force linking with this library).
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000300 if (AlwaysLink || getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000301 CmdArgs.push_back(Args.MakeArgString(P));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000302
303 // Adding the rpaths might negatively interact when other rpaths are involved,
304 // so we should make sure we add the rpaths last, after all user-specified
305 // rpaths. This is currently true from this place, but we need to be
306 // careful if this function is ever called before user's rpaths are emitted.
307 if (AddRPath) {
308 assert(DarwinLibName.endswith(".dylib") && "must be a dynamic library");
309
310 // Add @executable_path to rpath to support having the dylib copied with
311 // the executable.
312 CmdArgs.push_back("-rpath");
313 CmdArgs.push_back("@executable_path");
314
315 // Add the path to the resource dir to rpath to support using the dylib
316 // from the default location without copying.
317 CmdArgs.push_back("-rpath");
Yaron Keren92e1b622015-03-18 10:17:07 +0000318 CmdArgs.push_back(Args.MakeArgString(Dir));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000319 }
Eric Christopherc235d0c62011-06-22 17:41:40 +0000320}
321
Justin Bogner2fd95f62015-05-12 06:30:48 +0000322void Darwin::addProfileRTLibs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000323 ArgStringList &CmdArgs) const {
Xinliang David Li69306c02015-10-22 06:15:31 +0000324 if (!needsProfileRT(Args)) return;
Justin Bognerc7701242015-05-12 05:44:36 +0000325
326 // Select the appropriate runtime library for the target.
Vedant Kumar0affb932015-11-10 00:20:34 +0000327 if (isTargetWatchOSBased()) {
328 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_watchos.a",
329 /*AlwaysLink*/ true);
330 } else if (isTargetTvOSBased()) {
331 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_tvos.a",
332 /*AlwaysLink*/ true);
333 } else if (isTargetIOSBased()) {
Justin Bognerc7701242015-05-12 05:44:36 +0000334 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a",
335 /*AlwaysLink*/ true);
Vedant Kumar0affb932015-11-10 00:20:34 +0000336 } else {
337 assert(isTargetMacOS() && "unexpected non MacOS platform");
Justin Bognerc7701242015-05-12 05:44:36 +0000338 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a",
339 /*AlwaysLink*/ true);
Vedant Kumar0affb932015-11-10 00:20:34 +0000340 }
Xinliang David Li69306c02015-10-22 06:15:31 +0000341 return;
Justin Bognerc7701242015-05-12 05:44:36 +0000342}
343
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000344void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
345 ArgStringList &CmdArgs,
346 StringRef Sanitizer) const {
347 if (!Args.hasArg(options::OPT_dynamiclib) &&
348 !Args.hasArg(options::OPT_bundle)) {
349 // Sanitizer runtime libraries requires C++.
350 AddCXXStdlibLibArgs(Args, CmdArgs);
351 }
Tim Northover6f3ff222015-10-30 16:30:27 +0000352 // ASan is not supported on watchOS.
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000353 assert(isTargetMacOS() || isTargetIOSSimulator());
354 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000355 AddLinkRuntimeLib(
356 Args, CmdArgs,
357 (Twine("libclang_rt.") + Sanitizer + "_" + OS + "_dynamic.dylib").str(),
358 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
359 /*AddRPath*/ true);
Hans Wennborg10821e52015-04-09 18:47:01 +0000360
361 if (GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) {
362 // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
363 // all RTTI-related symbols that UBSan uses.
364 CmdArgs.push_back("-lc++abi");
365 }
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000366}
367
Daniel Dunbar6276f992009-09-18 08:15:13 +0000368void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
369 ArgStringList &CmdArgs) const {
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000370 // Darwin only supports the compiler-rt based runtime libraries.
371 switch (GetRuntimeLibType(Args)) {
372 case ToolChain::RLT_CompilerRT:
373 break;
374 default:
375 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000376 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000377 return;
378 }
379
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000380 // Darwin doesn't support real static executables, don't link any runtime
381 // libraries with -static.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000382 if (Args.hasArg(options::OPT_static) ||
383 Args.hasArg(options::OPT_fapple_kext) ||
384 Args.hasArg(options::OPT_mkernel))
Daniel Dunbar6276f992009-09-18 08:15:13 +0000385 return;
Daniel Dunbar6276f992009-09-18 08:15:13 +0000386
387 // Reject -static-libgcc for now, we can deal with this when and if someone
388 // cares. This is useful in situations where someone wants to statically link
389 // something like libstdc++, and needs its runtime support routines.
390 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000391 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
Daniel Dunbar6276f992009-09-18 08:15:13 +0000392 return;
393 }
394
Peter Collingbourne32701642013-11-01 18:16:25 +0000395 const SanitizerArgs &Sanitize = getSanitizerArgs();
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +0000396 if (Sanitize.needsAsanRt())
397 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
398 if (Sanitize.needsUbsanRt())
399 AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
Kuba Brecka85e01c02015-11-06 15:09:20 +0000400 if (Sanitize.needsTsanRt())
401 AddLinkSanitizerLibArgs(Args, CmdArgs, "tsan");
Daniel Dunbar1d6469f2011-12-01 23:40:18 +0000402
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000403 // Otherwise link libSystem, then the dynamic runtime library, and finally any
404 // target specific static runtime library.
Daniel Dunbar6276f992009-09-18 08:15:13 +0000405 CmdArgs.push_back("-lSystem");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000406
407 // Select the dynamic runtime library and the target specific static library.
Tim Northover6f3ff222015-10-30 16:30:27 +0000408 if (isTargetWatchOSBased()) {
409 // We currently always need a static runtime library for watchOS.
410 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.watchos.a");
411 } else if (isTargetTvOSBased()) {
412 // We currently always need a static runtime library for tvOS.
413 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.tvos.a");
414 } else if (isTargetIOSBased()) {
Daniel Dunbar2f31fb92011-04-30 04:25:16 +0000415 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
416 // it never went into the SDK.
Bob Wilson102be442011-10-07 17:54:41 +0000417 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
Tim Northovera2ee4332014-03-29 15:09:45 +0000418 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
Tim Northover40956e62014-07-23 12:32:58 +0000419 getTriple().getArch() != llvm::Triple::aarch64)
Bob Wilson102be442011-10-07 17:54:41 +0000420 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000421
Daniel Dunbard1076382011-04-18 23:48:36 +0000422 // We currently always need a static runtime library for iOS.
Eric Christopherc235d0c62011-06-22 17:41:40 +0000423 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000424 } else {
Tim Northover9c7e0352013-12-12 11:55:52 +0000425 assert(isTargetMacOS() && "unexpected non MacOS platform");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000426 // The dynamic runtime library was merged with libSystem for 10.6 and
427 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000428 if (isMacosxVersionLT(10, 5))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000429 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000430 else if (isMacosxVersionLT(10, 6))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000431 CmdArgs.push_back("-lgcc_s.10.5");
432
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000433 // For OS X, we thought we would only need a static runtime library when
Chris Lattner57540c52011-04-15 05:22:18 +0000434 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000435 // omitted from 10.4.dylib.
436 //
437 // Unfortunately, that turned out to not be true, because Darwin system
438 // headers can still use eprintf on i386, and it is not exported from
439 // libSystem. Therefore, we still must provide a runtime library just for
440 // the tiny tiny handful of projects that *might* use that symbol.
441 if (isMacosxVersionLT(10, 5)) {
Eric Christopherc235d0c62011-06-22 17:41:40 +0000442 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000443 } else {
444 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopherc235d0c62011-06-22 17:41:40 +0000445 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
446 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000447 }
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000448 }
Daniel Dunbar6276f992009-09-18 08:15:13 +0000449}
450
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000451void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +0000452 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000453
Daniel Dunbar455a0492012-08-17 18:43:50 +0000454 // Support allowing the SDKROOT environment variable used by xcrun and other
455 // Xcode tools to define the default sysroot, by making it the default for
456 // isysroot.
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000457 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
458 // Warn if the path does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000459 if (!getVFS().exists(A->getValue()))
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000460 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
461 } else {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000462 if (char *env = ::getenv("SDKROOT")) {
Daniel Dunbarb2543042013-01-15 20:33:56 +0000463 // We only use this value as the default if it is an absolute path,
464 // exists, and it is not the root path.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000465 if (llvm::sys::path::is_absolute(env) && getVFS().exists(env) &&
Daniel Dunbarb2543042013-01-15 20:33:56 +0000466 StringRef(env) != "/") {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000467 Args.append(Args.MakeSeparateArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000468 nullptr, Opts.getOption(options::OPT_isysroot), env));
Daniel Dunbar455a0492012-08-17 18:43:50 +0000469 }
470 }
471 }
472
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000473 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000474 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
Tim Northover6f3ff222015-10-30 16:30:27 +0000475 Arg *TvOSVersion = Args.getLastArg(options::OPT_mtvos_version_min_EQ);
476 Arg *WatchOSVersion = Args.getLastArg(options::OPT_mwatchos_version_min_EQ);
Eli Friedman027e9c32012-01-11 02:41:15 +0000477
Tim Northover6f3ff222015-10-30 16:30:27 +0000478 if (OSXVersion && (iOSVersion || TvOSVersion || WatchOSVersion)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000479 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Tim Northover6f3ff222015-10-30 16:30:27 +0000480 << OSXVersion->getAsString(Args)
481 << (iOSVersion ? iOSVersion :
482 TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
483 iOSVersion = TvOSVersion = WatchOSVersion = nullptr;
484 } else if (iOSVersion && (TvOSVersion || WatchOSVersion)) {
485 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
486 << iOSVersion->getAsString(Args)
487 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
488 TvOSVersion = WatchOSVersion = nullptr;
489 } else if (TvOSVersion && WatchOSVersion) {
490 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
491 << TvOSVersion->getAsString(Args)
492 << WatchOSVersion->getAsString(Args);
493 WatchOSVersion = nullptr;
494 } else if (!OSXVersion && !iOSVersion && !TvOSVersion && !WatchOSVersion) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000495 // If no deployment target was specified on the command line, check for
Daniel Dunbard54669d2010-01-26 01:45:19 +0000496 // environment defines.
Alexey Samsonov905c8022015-06-18 21:46:05 +0000497 std::string OSXTarget;
498 std::string iOSTarget;
Tim Northover6f3ff222015-10-30 16:30:27 +0000499 std::string TvOSTarget;
500 std::string WatchOSTarget;
501
Chad Rosier64707fe2011-08-31 20:56:25 +0000502 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
503 OSXTarget = env;
504 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
505 iOSTarget = env;
Tim Northover6f3ff222015-10-30 16:30:27 +0000506 if (char *env = ::getenv("TVOS_DEPLOYMENT_TARGET"))
507 TvOSTarget = env;
508 if (char *env = ::getenv("WATCHOS_DEPLOYMENT_TARGET"))
509 WatchOSTarget = env;
Daniel Dunbarb5023e92009-04-10 21:00:07 +0000510
Steven Wu7a1372c2015-06-25 01:59:35 +0000511 // If there is no command-line argument to specify the Target version and
512 // no environment variable defined, see if we can set the default based
513 // on -isysroot.
Tim Northover6f3ff222015-10-30 16:30:27 +0000514 if (OSXTarget.empty() && iOSTarget.empty() && WatchOSTarget.empty() &&
Steven Wu7a1372c2015-06-25 01:59:35 +0000515 Args.hasArg(options::OPT_isysroot)) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000516 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000517 StringRef isysroot = A->getValue();
Steven Wu7a1372c2015-06-25 01:59:35 +0000518 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
519 size_t BeginSDK = isysroot.rfind("SDKs/");
520 size_t EndSDK = isysroot.rfind(".sdk");
521 if (BeginSDK != StringRef::npos && EndSDK != StringRef::npos) {
522 StringRef SDK = isysroot.slice(BeginSDK + 5, EndSDK);
523 // Slice the version number out.
524 // Version number is between the first and the last number.
525 size_t StartVer = SDK.find_first_of("0123456789");
526 size_t EndVer = SDK.find_last_of("0123456789");
527 if (StartVer != StringRef::npos && EndVer > StartVer) {
528 StringRef Version = SDK.slice(StartVer, EndVer + 1);
529 if (SDK.startswith("iPhoneOS") ||
530 SDK.startswith("iPhoneSimulator"))
531 iOSTarget = Version;
532 else if (SDK.startswith("MacOSX"))
533 OSXTarget = Version;
Tim Northover6f3ff222015-10-30 16:30:27 +0000534 else if (SDK.startswith("WatchOS") ||
535 SDK.startswith("WatchSimulator"))
536 WatchOSTarget = Version;
537 else if (SDK.startswith("AppleTVOS") ||
538 SDK.startswith("AppleTVSimulator"))
539 TvOSTarget = Version;
Steven Wu7a1372c2015-06-25 01:59:35 +0000540 }
541 }
Chad Rosier64707fe2011-08-31 20:56:25 +0000542 }
543 }
Daniel Dunbard54669d2010-01-26 01:45:19 +0000544
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000545 // If no OSX or iOS target has been specified, try to guess platform
Alexey Samsonov905c8022015-06-18 21:46:05 +0000546 // from arch name and compute the version from the triple.
Tim Northover6f3ff222015-10-30 16:30:27 +0000547 if (OSXTarget.empty() && iOSTarget.empty() && TvOSTarget.empty() &&
548 WatchOSTarget.empty()) {
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000549 StringRef MachOArchName = getMachOArchName(Args);
Alexey Samsonov905c8022015-06-18 21:46:05 +0000550 unsigned Major, Minor, Micro;
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000551 if (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
Alexey Samsonov905c8022015-06-18 21:46:05 +0000552 MachOArchName == "arm64") {
553 getTriple().getiOSVersion(Major, Minor, Micro);
554 llvm::raw_string_ostream(iOSTarget) << Major << '.' << Minor << '.'
555 << Micro;
Tim Northover6f3ff222015-10-30 16:30:27 +0000556 } else if (MachOArchName == "armv7k") {
557 getTriple().getWatchOSVersion(Major, Minor, Micro);
558 llvm::raw_string_ostream(WatchOSTarget) << Major << '.' << Minor << '.'
559 << Micro;
Alexey Samsonov905c8022015-06-18 21:46:05 +0000560 } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
561 MachOArchName != "armv7em") {
562 if (!getTriple().getMacOSXVersion(Major, Minor, Micro)) {
563 getDriver().Diag(diag::err_drv_invalid_darwin_version)
564 << getTriple().getOSName();
565 }
566 llvm::raw_string_ostream(OSXTarget) << Major << '.' << Minor << '.'
567 << Micro;
568 }
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000569 }
Chad Rosierfe6fd362011-09-28 00:46:32 +0000570
Tim Northover6f3ff222015-10-30 16:30:27 +0000571 // Do not allow conflicts with the watchOS target.
572 if (!WatchOSTarget.empty() && (!iOSTarget.empty() || !TvOSTarget.empty())) {
573 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
574 << "WATCHOS_DEPLOYMENT_TARGET"
575 << (!iOSTarget.empty() ? "IPHONEOS_DEPLOYMENT_TARGET" :
576 "TVOS_DEPLOYMENT_TARGET");
577 }
578
579 // Do not allow conflicts with the tvOS target.
580 if (!TvOSTarget.empty() && !iOSTarget.empty()) {
581 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
582 << "TVOS_DEPLOYMENT_TARGET"
583 << "IPHONEOS_DEPLOYMENT_TARGET";
584 }
585
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000586 // Allow conflicts among OSX and iOS for historical reasons, but choose the
587 // default platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000588 if (!OSXTarget.empty() && (!iOSTarget.empty() ||
589 !WatchOSTarget.empty() ||
590 !TvOSTarget.empty())) {
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000591 if (getTriple().getArch() == llvm::Triple::arm ||
Tim Northover573cbee2014-05-24 12:52:07 +0000592 getTriple().getArch() == llvm::Triple::aarch64 ||
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000593 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosier64707fe2011-08-31 20:56:25 +0000594 OSXTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000595 else
Tim Northover6f3ff222015-10-30 16:30:27 +0000596 iOSTarget = WatchOSTarget = TvOSTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000597 }
Daniel Dunbar65969842010-01-29 17:02:25 +0000598
Chad Rosier64707fe2011-08-31 20:56:25 +0000599 if (!OSXTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000600 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000601 OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000602 Args.append(OSXVersion);
Chad Rosier64707fe2011-08-31 20:56:25 +0000603 } else if (!iOSTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000604 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000605 iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000606 Args.append(iOSVersion);
Tim Northover6f3ff222015-10-30 16:30:27 +0000607 } else if (!TvOSTarget.empty()) {
608 const Option O = Opts.getOption(options::OPT_mtvos_version_min_EQ);
609 TvOSVersion = Args.MakeJoinedArg(nullptr, O, TvOSTarget);
610 Args.append(TvOSVersion);
611 } else if (!WatchOSTarget.empty()) {
612 const Option O = Opts.getOption(options::OPT_mwatchos_version_min_EQ);
613 WatchOSVersion = Args.MakeJoinedArg(nullptr, O, WatchOSTarget);
614 Args.append(WatchOSVersion);
Daniel Dunbar84e727f2009-09-04 18:35:21 +0000615 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000616 }
Mike Stump11289f42009-09-09 15:08:12 +0000617
Tim Northover9c7e0352013-12-12 11:55:52 +0000618 DarwinPlatformKind Platform;
619 if (OSXVersion)
620 Platform = MacOS;
621 else if (iOSVersion)
622 Platform = IPhoneOS;
Tim Northover6f3ff222015-10-30 16:30:27 +0000623 else if (TvOSVersion)
624 Platform = TvOS;
625 else if (WatchOSVersion)
626 Platform = WatchOS;
Tim Northover9c7e0352013-12-12 11:55:52 +0000627 else
Tim Northover157d9112014-01-16 08:48:16 +0000628 llvm_unreachable("Unable to infer Darwin variant");
Tim Northover9c7e0352013-12-12 11:55:52 +0000629
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000630 // Set the tool chain target information.
631 unsigned Major, Minor, Micro;
632 bool HadExtra;
Tim Northover9c7e0352013-12-12 11:55:52 +0000633 if (Platform == MacOS) {
Tim Northover6f3ff222015-10-30 16:30:27 +0000634 assert((!iOSVersion && !TvOSVersion && !WatchOSVersion) &&
635 "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000636 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, Micro,
637 HadExtra) ||
638 HadExtra || Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000639 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000640 << OSXVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000641 } else if (Platform == IPhoneOS) {
642 assert(iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000643 if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
644 HadExtra) ||
645 HadExtra || Major >= 10 || Minor >= 100 || Micro >= 100)
Eli Friedman027e9c32012-01-11 02:41:15 +0000646 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000647 << iOSVersion->getAsString(Args);
Tim Northover6f3ff222015-10-30 16:30:27 +0000648 } else if (Platform == TvOS) {
649 if (!Driver::GetReleaseVersion(TvOSVersion->getValue(), Major, Minor,
650 Micro, HadExtra) || HadExtra ||
651 Major >= 10 || Minor >= 100 || Micro >= 100)
652 getDriver().Diag(diag::err_drv_invalid_version_number)
653 << TvOSVersion->getAsString(Args);
654 } else if (Platform == WatchOS) {
655 if (!Driver::GetReleaseVersion(WatchOSVersion->getValue(), Major, Minor,
656 Micro, HadExtra) || HadExtra ||
657 Major >= 10 || Minor >= 100 || Micro >= 100)
658 getDriver().Diag(diag::err_drv_invalid_version_number)
659 << WatchOSVersion->getAsString(Args);
Tim Northover157d9112014-01-16 08:48:16 +0000660 } else
661 llvm_unreachable("unknown kind of Darwin platform");
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000662
Bob Wilson7f294b52014-10-10 23:10:10 +0000663 // Recognize iOS targets with an x86 architecture as the iOS simulator.
Daniel Dunbarb1189432011-04-30 04:18:16 +0000664 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
665 getTriple().getArch() == llvm::Triple::x86_64))
Tim Northover9c7e0352013-12-12 11:55:52 +0000666 Platform = IPhoneOSSimulator;
Tim Northover6f3ff222015-10-30 16:30:27 +0000667 if (TvOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
668 getTriple().getArch() == llvm::Triple::x86_64))
669 Platform = TvOSSimulator;
670 if (WatchOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
671 getTriple().getArch() == llvm::Triple::x86_64))
672 Platform = WatchOSSimulator;
Daniel Dunbarb1189432011-04-30 04:18:16 +0000673
Tim Northover9c7e0352013-12-12 11:55:52 +0000674 setTarget(Platform, Major, Minor, Micro);
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000675}
676
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000677void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000678 ArgStringList &CmdArgs) const {
679 CXXStdlibType Type = GetCXXStdlibType(Args);
680
681 switch (Type) {
682 case ToolChain::CST_Libcxx:
683 CmdArgs.push_back("-lc++");
684 break;
685
Hans Wennborgdcfba332015-10-06 23:40:43 +0000686 case ToolChain::CST_Libstdcxx:
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000687 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
688 // it was previously found in the gcc lib dir. However, for all the Darwin
689 // platforms we care about it was -lstdc++.6, so we search for that
690 // explicitly if we can't see an obvious -lstdc++ candidate.
691
692 // Check in the sysroot first.
693 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000694 SmallString<128> P(A->getValue());
Benjamin Kramer17381a02013-06-28 16:25:46 +0000695 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000696
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000697 if (!getVFS().exists(P)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000698 llvm::sys::path::remove_filename(P);
699 llvm::sys::path::append(P, "libstdc++.6.dylib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000700 if (getVFS().exists(P)) {
Yaron Keren92e1b622015-03-18 10:17:07 +0000701 CmdArgs.push_back(Args.MakeArgString(P));
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000702 return;
703 }
704 }
705 }
706
707 // Otherwise, look in the root.
Bob Wilson1a9ad0f2011-11-11 07:47:04 +0000708 // FIXME: This should be removed someday when we don't have to care about
709 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000710 if (!getVFS().exists("/usr/lib/libstdc++.dylib") &&
711 getVFS().exists("/usr/lib/libstdc++.6.dylib")) {
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000712 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
713 return;
714 }
715
716 // Otherwise, let the linker search.
717 CmdArgs.push_back("-lstdc++");
718 break;
719 }
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000720}
721
Shantonu Senafeb03b2010-09-17 18:39:08 +0000722void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
723 ArgStringList &CmdArgs) const {
724
725 // For Darwin platforms, use the compiler-rt-based support library
726 // instead of the gcc-provided one (which is also incidentally
727 // only present in the gcc lib dir, which makes it hard to find).
728
Rafael Espindola358256c2013-06-26 02:13:00 +0000729 SmallString<128> P(getDriver().ResourceDir);
Benjamin Kramer17381a02013-06-28 16:25:46 +0000730 llvm::sys::path::append(P, "lib", "darwin");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000731
732 // Use the newer cc_kext for iOS ARM after 6.0.
Tim Northover6f3ff222015-10-30 16:30:27 +0000733 if (isTargetWatchOS()) {
734 llvm::sys::path::append(P, "libclang_rt.cc_kext_watchos.a");
735 } else if (isTargetTvOS()) {
736 llvm::sys::path::append(P, "libclang_rt.cc_kext_tvos.a");
737 } else if (isTargetIPhoneOS()) {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000738 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000739 } else {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000740 llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000741 }
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000742
Shantonu Senafeb03b2010-09-17 18:39:08 +0000743 // For now, allow missing resource libraries to support developers who may
744 // not have compiler-rt checked out or integrated into their build.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000745 if (getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000746 CmdArgs.push_back(Args.MakeArgString(P));
Shantonu Senafeb03b2010-09-17 18:39:08 +0000747}
748
Tim Northover157d9112014-01-16 08:48:16 +0000749DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
750 const char *BoundArch) const {
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000751 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
752 const OptTable &Opts = getDriver().getOpts();
753
754 // FIXME: We really want to get out of the tool chain level argument
755 // translation business, as it makes the driver functionality much
756 // more opaque. For now, we follow gcc closely solely for the
757 // purpose of easily achieving feature parity & testability. Once we
758 // have something that works, we should reevaluate each translation
759 // and try to push it down into tool specific logic.
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000760
Simon Atanasyan6f657c42014-05-08 19:32:46 +0000761 for (Arg *A : Args) {
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000762 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar471c4f82011-06-21 00:20:17 +0000763 // Skip this argument unless the architecture matches either the toolchain
764 // triple arch, or the arch being bound.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000765 llvm::Triple::ArchType XarchArch =
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000766 tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
767 if (!(XarchArch == getArch() ||
768 (BoundArch &&
769 XarchArch ==
770 tools::darwin::getArchTypeForMachOArchName(BoundArch))))
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000771 continue;
772
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000773 Arg *OriginalArg = A;
Richard Smithbd55daf2012-11-01 04:30:05 +0000774 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000775 unsigned Prev = Index;
Nico Webera04d5f82014-05-11 17:27:13 +0000776 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
Mike Stump11289f42009-09-09 15:08:12 +0000777
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000778 // If the argument parsing failed or more than one argument was
779 // consumed, the -Xarch_ argument's parameter tried to consume
780 // extra arguments. Emit an error and ignore.
781 //
782 // We also want to disallow any options which would alter the
783 // driver behavior; that isn't going to work in our model. We
784 // use isDriverOption() as an approximation, although things
785 // like -O4 are going to slip through.
Daniel Dunbar5a784c82011-04-21 17:41:34 +0000786 if (!XarchArg || Index > Prev + 1) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000787 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000788 << A->getAsString(Args);
Daniel Dunbar6914a982011-04-21 17:32:21 +0000789 continue;
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000790 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000791 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000792 << A->getAsString(Args);
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000793 continue;
794 }
795
Daniel Dunbar53b406f2009-03-29 22:29:05 +0000796 XarchArg->setBaseArg(A);
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000797
Nico Webera04d5f82014-05-11 17:27:13 +0000798 A = XarchArg.release();
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000799 DAL->AddSynthesizedArg(A);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000800
801 // Linker input arguments require custom handling. The problem is that we
802 // have already constructed the phase actions, so we can not treat them as
803 // "input arguments".
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000804 if (A->getOption().hasFlag(options::LinkerInput)) {
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000805 // Convert the argument into individual Zlinker_input_args.
Douglas Katzman6bbffc42015-06-25 18:51:37 +0000806 for (const char *Value : A->getValues()) {
807 DAL->AddSeparateArg(
808 OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000809 }
810 continue;
811 }
Mike Stump11289f42009-09-09 15:08:12 +0000812 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000813
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000814 // Sob. These is strictly gcc compatible for the time being. Apple
815 // gcc translates options twice, which means that self-expanding
816 // options add duplicates.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000817 switch ((options::ID)A->getOption().getID()) {
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000818 default:
819 DAL->append(A);
820 break;
821
822 case options::OPT_mkernel:
823 case options::OPT_fapple_kext:
824 DAL->append(A);
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000825 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000826 break;
Mike Stump11289f42009-09-09 15:08:12 +0000827
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000828 case options::OPT_dependency_file:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000829 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000830 break;
831
832 case options::OPT_gfull:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000833 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000834 DAL->AddFlagArg(
835 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000836 break;
837
838 case options::OPT_gused:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000839 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000840 DAL->AddFlagArg(
841 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000842 break;
843
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000844 case options::OPT_shared:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000845 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000846 break;
847
848 case options::OPT_fconstant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000849 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000850 break;
851
852 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000853 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000854 break;
855
856 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000857 DAL->AddFlagArg(A,
858 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000859 break;
860
861 case options::OPT_Wno_nonportable_cfstrings:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000862 DAL->AddFlagArg(
863 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000864 break;
865
866 case options::OPT_fpascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000867 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000868 break;
869
870 case options::OPT_fno_pascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000871 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000872 break;
873 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000874 }
875
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000876 if (getTriple().getArch() == llvm::Triple::x86 ||
877 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbarfffd1812009-11-19 04:00:53 +0000878 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000879 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
880 "core2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000881
882 // Add the arch options based on the particular spelling of -arch, to match
Chad Rosier7c5d9082012-04-27 14:58:16 +0000883 // how the driver driver works.
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000884 if (BoundArch) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000885 StringRef Name = BoundArch;
Michael J. Spencerfc790902012-10-19 22:36:40 +0000886 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
887 const Option MArch = Opts.getOption(options::OPT_march_EQ);
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000888
889 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
890 // which defines the list of which architectures we accept.
891 if (Name == "ppc")
892 ;
893 else if (Name == "ppc601")
Craig Topper92fc2df2014-05-17 16:56:41 +0000894 DAL->AddJoinedArg(nullptr, MCpu, "601");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000895 else if (Name == "ppc603")
Craig Topper92fc2df2014-05-17 16:56:41 +0000896 DAL->AddJoinedArg(nullptr, MCpu, "603");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000897 else if (Name == "ppc604")
Craig Topper92fc2df2014-05-17 16:56:41 +0000898 DAL->AddJoinedArg(nullptr, MCpu, "604");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000899 else if (Name == "ppc604e")
Craig Topper92fc2df2014-05-17 16:56:41 +0000900 DAL->AddJoinedArg(nullptr, MCpu, "604e");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000901 else if (Name == "ppc750")
Craig Topper92fc2df2014-05-17 16:56:41 +0000902 DAL->AddJoinedArg(nullptr, MCpu, "750");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000903 else if (Name == "ppc7400")
Craig Topper92fc2df2014-05-17 16:56:41 +0000904 DAL->AddJoinedArg(nullptr, MCpu, "7400");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000905 else if (Name == "ppc7450")
Craig Topper92fc2df2014-05-17 16:56:41 +0000906 DAL->AddJoinedArg(nullptr, MCpu, "7450");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000907 else if (Name == "ppc970")
Craig Topper92fc2df2014-05-17 16:56:41 +0000908 DAL->AddJoinedArg(nullptr, MCpu, "970");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000909
Bill Schmidt778d3872013-07-26 01:36:11 +0000910 else if (Name == "ppc64" || Name == "ppc64le")
Craig Topper92fc2df2014-05-17 16:56:41 +0000911 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000912
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000913 else if (Name == "i386")
914 ;
915 else if (Name == "i486")
Craig Topper92fc2df2014-05-17 16:56:41 +0000916 DAL->AddJoinedArg(nullptr, MArch, "i486");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000917 else if (Name == "i586")
Craig Topper92fc2df2014-05-17 16:56:41 +0000918 DAL->AddJoinedArg(nullptr, MArch, "i586");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000919 else if (Name == "i686")
Craig Topper92fc2df2014-05-17 16:56:41 +0000920 DAL->AddJoinedArg(nullptr, MArch, "i686");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000921 else if (Name == "pentium")
Craig Topper92fc2df2014-05-17 16:56:41 +0000922 DAL->AddJoinedArg(nullptr, MArch, "pentium");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000923 else if (Name == "pentium2")
Craig Topper92fc2df2014-05-17 16:56:41 +0000924 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000925 else if (Name == "pentpro")
Craig Topper92fc2df2014-05-17 16:56:41 +0000926 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000927 else if (Name == "pentIIm3")
Craig Topper92fc2df2014-05-17 16:56:41 +0000928 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000929
930 else if (Name == "x86_64")
Craig Topper92fc2df2014-05-17 16:56:41 +0000931 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Jim Grosbach82eee262013-11-16 00:53:35 +0000932 else if (Name == "x86_64h") {
Craig Topper92fc2df2014-05-17 16:56:41 +0000933 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
934 DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
Jim Grosbach82eee262013-11-16 00:53:35 +0000935 }
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000936
937 else if (Name == "arm")
Craig Topper92fc2df2014-05-17 16:56:41 +0000938 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000939 else if (Name == "armv4t")
Craig Topper92fc2df2014-05-17 16:56:41 +0000940 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000941 else if (Name == "armv5")
Craig Topper92fc2df2014-05-17 16:56:41 +0000942 DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000943 else if (Name == "xscale")
Craig Topper92fc2df2014-05-17 16:56:41 +0000944 DAL->AddJoinedArg(nullptr, MArch, "xscale");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000945 else if (Name == "armv6")
Craig Topper92fc2df2014-05-17 16:56:41 +0000946 DAL->AddJoinedArg(nullptr, MArch, "armv6k");
Bob Wilson743bf672013-03-04 22:37:49 +0000947 else if (Name == "armv6m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000948 DAL->AddJoinedArg(nullptr, MArch, "armv6m");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000949 else if (Name == "armv7")
Craig Topper92fc2df2014-05-17 16:56:41 +0000950 DAL->AddJoinedArg(nullptr, MArch, "armv7a");
Bob Wilson743bf672013-03-04 22:37:49 +0000951 else if (Name == "armv7em")
Craig Topper92fc2df2014-05-17 16:56:41 +0000952 DAL->AddJoinedArg(nullptr, MArch, "armv7em");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000953 else if (Name == "armv7k")
Craig Topper92fc2df2014-05-17 16:56:41 +0000954 DAL->AddJoinedArg(nullptr, MArch, "armv7k");
Bob Wilson743bf672013-03-04 22:37:49 +0000955 else if (Name == "armv7m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000956 DAL->AddJoinedArg(nullptr, MArch, "armv7m");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000957 else if (Name == "armv7s")
Craig Topper92fc2df2014-05-17 16:56:41 +0000958 DAL->AddJoinedArg(nullptr, MArch, "armv7s");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000959 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000960
Tim Northover157d9112014-01-16 08:48:16 +0000961 return DAL;
962}
963
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000964void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
965 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000966 // Embedded targets are simple at the moment, not supporting sanitizers and
967 // with different libraries for each member of the product { static, PIC } x
968 // { hard-float, soft-float }
969 llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000970 CompilerRT +=
971 (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
972 ? "hard"
973 : "soft";
Tim Northover157d9112014-01-16 08:48:16 +0000974 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
975
976 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
977}
978
Tim Northover157d9112014-01-16 08:48:16 +0000979DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
980 const char *BoundArch) const {
981 // First get the generic Apple args, before moving onto Darwin-specific ones.
982 DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
983 const OptTable &Opts = getDriver().getOpts();
984
Bob Wilsonf8cf1612014-02-21 00:20:07 +0000985 // If no architecture is bound, none of the translations here are relevant.
986 if (!BoundArch)
987 return DAL;
988
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000989 // Add an explicit version min argument for the deployment target. We do this
990 // after argument translation because -Xarch_ arguments may add a version min
991 // argument.
Bob Wilsonf8cf1612014-02-21 00:20:07 +0000992 AddDeploymentTarget(*DAL);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000993
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000994 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
995 // FIXME: It would be far better to avoid inserting those -static arguments,
996 // but we can't check the deployment target in the translation code until
997 // it is set here.
Tim Northover6f3ff222015-10-30 16:30:27 +0000998 if (isTargetWatchOSBased() ||
999 (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0))) {
1000 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001001 Arg *A = *it;
1002 ++it;
1003 if (A->getOption().getID() != options::OPT_mkernel &&
1004 A->getOption().getID() != options::OPT_fapple_kext)
1005 continue;
1006 assert(it != ie && "unexpected argument translation");
1007 A = *it;
1008 assert(A->getOption().getID() == options::OPT_static &&
1009 "missing expected -static argument");
1010 it = DAL->getArgs().erase(it);
1011 }
1012 }
1013
Bob Wilson0f7445b2013-11-02 23:19:53 +00001014 // Default to use libc++ on OS X 10.9+ and iOS 7+.
1015 if (((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
Tim Northover6f3ff222015-10-30 16:30:27 +00001016 (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0)) ||
1017 isTargetWatchOSBased()) &&
Bob Wilson0f7445b2013-11-02 23:19:53 +00001018 !Args.getLastArg(options::OPT_stdlib_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +00001019 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
1020 "libc++");
Bob Wilson0f7445b2013-11-02 23:19:53 +00001021
Bob Wilson102be442011-10-07 17:54:41 +00001022 // Validate the C++ standard library choice.
1023 CXXStdlibType Type = GetCXXStdlibType(*DAL);
1024 if (Type == ToolChain::CST_Libcxx) {
John McCall5fb5df92012-06-20 06:18:46 +00001025 // Check whether the target provides libc++.
1026 StringRef where;
1027
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001028 // Complain about targeting iOS < 5.0 in any way.
Tim Northover9c7e0352013-12-12 11:55:52 +00001029 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
Bob Wilson5ad5a952012-11-09 01:59:30 +00001030 where = "iOS 5.0";
John McCall5fb5df92012-06-20 06:18:46 +00001031
1032 if (where != StringRef()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001033 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where;
Bob Wilson102be442011-10-07 17:54:41 +00001034 }
1035 }
1036
Daniel Dunbaraabb0b12009-03-25 06:12:34 +00001037 return DAL;
Mike Stump11289f42009-09-09 15:08:12 +00001038}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001039
Tim Northover157d9112014-01-16 08:48:16 +00001040bool MachO::IsUnwindTablesDefault() const {
Rafael Espindolae8bd4e52012-10-07 03:23:40 +00001041 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001042}
1043
Tim Northover157d9112014-01-16 08:48:16 +00001044bool MachO::UseDwarfDebugFlags() const {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00001045 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
1046 return S[0] != '\0';
1047 return false;
1048}
1049
Tim Northovere931f9f2015-10-30 16:30:41 +00001050bool Darwin::UseSjLjExceptions(const ArgList &Args) const {
Daniel Dunbar3241d402010-02-10 18:49:11 +00001051 // Darwin uses SjLj exceptions on ARM.
Tim Northovere931f9f2015-10-30 16:30:41 +00001052 if (getTriple().getArch() != llvm::Triple::arm &&
1053 getTriple().getArch() != llvm::Triple::thumb)
1054 return false;
1055
1056 // We can't check directly for watchOS here. ComputeLLVMTriple only
1057 // fills in the ArchName correctly.
1058 llvm::Triple Triple(ComputeLLVMTriple(Args));
1059 return !(Triple.getArchName() == "armv7k" ||
1060 Triple.getArchName() == "thumbv7k");
1061
Daniel Dunbar3241d402010-02-10 18:49:11 +00001062}
1063
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001064bool MachO::isPICDefault() const { return true; }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001065
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001066bool MachO::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001067
Tim Northover157d9112014-01-16 08:48:16 +00001068bool MachO::isPICDefaultForced() const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001069 return (getArch() == llvm::Triple::x86_64 ||
Tim Northover573cbee2014-05-24 12:52:07 +00001070 getArch() == llvm::Triple::aarch64);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001071}
1072
Tim Northover157d9112014-01-16 08:48:16 +00001073bool MachO::SupportsProfiling() const {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001074 // Profiling instrumentation is only supported on x86.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00001075 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001076}
1077
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001078void Darwin::addMinVersionArgs(const ArgList &Args,
1079 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001080 VersionTuple TargetVersion = getTargetVersion();
1081
Tim Northover6f3ff222015-10-30 16:30:27 +00001082 if (isTargetWatchOS())
1083 CmdArgs.push_back("-watchos_version_min");
1084 else if (isTargetWatchOSSimulator())
1085 CmdArgs.push_back("-watchos_simulator_version_min");
1086 else if (isTargetTvOS())
1087 CmdArgs.push_back("-tvos_version_min");
1088 else if (isTargetTvOSSimulator())
1089 CmdArgs.push_back("-tvos_simulator_version_min");
1090 else if (isTargetIOSSimulator())
Tim Northover157d9112014-01-16 08:48:16 +00001091 CmdArgs.push_back("-ios_simulator_version_min");
Bob Wilson5cfc55e2014-02-01 21:06:21 +00001092 else if (isTargetIOSBased())
Tim Northover157d9112014-01-16 08:48:16 +00001093 CmdArgs.push_back("-iphoneos_version_min");
1094 else {
1095 assert(isTargetMacOS() && "unexpected target");
1096 CmdArgs.push_back("-macosx_version_min");
1097 }
1098
1099 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
1100}
1101
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001102void Darwin::addStartObjectFileArgs(const ArgList &Args,
1103 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001104 // Derived from startfile spec.
1105 if (Args.hasArg(options::OPT_dynamiclib)) {
1106 // Derived from darwin_dylib1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001107 if (isTargetWatchOSBased()) {
1108 ; // watchOS does not need dylib1.o.
1109 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001110 ; // iOS simulator does not need dylib1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001111 } else if (isTargetIPhoneOS()) {
1112 if (isIPhoneOSVersionLT(3, 1))
1113 CmdArgs.push_back("-ldylib1.o");
1114 } else {
1115 if (isMacosxVersionLT(10, 5))
1116 CmdArgs.push_back("-ldylib1.o");
1117 else if (isMacosxVersionLT(10, 6))
1118 CmdArgs.push_back("-ldylib1.10.5.o");
1119 }
1120 } else {
1121 if (Args.hasArg(options::OPT_bundle)) {
1122 if (!Args.hasArg(options::OPT_static)) {
1123 // Derived from darwin_bundle1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001124 if (isTargetWatchOSBased()) {
1125 ; // watchOS does not need bundle1.o.
1126 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001127 ; // iOS simulator does not need bundle1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001128 } else if (isTargetIPhoneOS()) {
1129 if (isIPhoneOSVersionLT(3, 1))
1130 CmdArgs.push_back("-lbundle1.o");
1131 } else {
1132 if (isMacosxVersionLT(10, 6))
1133 CmdArgs.push_back("-lbundle1.o");
1134 }
1135 }
1136 } else {
1137 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1138 if (Args.hasArg(options::OPT_static) ||
1139 Args.hasArg(options::OPT_object) ||
1140 Args.hasArg(options::OPT_preload)) {
1141 CmdArgs.push_back("-lgcrt0.o");
1142 } else {
1143 CmdArgs.push_back("-lgcrt1.o");
1144
1145 // darwin_crt2 spec is empty.
1146 }
1147 // By default on OS X 10.8 and later, we don't link with a crt1.o
1148 // file and the linker knows to use _main as the entry point. But,
1149 // when compiling with -pg, we need to link with the gcrt1.o file,
1150 // so pass the -no_new_main option to tell the linker to use the
1151 // "start" symbol as the entry point.
1152 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1153 CmdArgs.push_back("-no_new_main");
1154 } else {
1155 if (Args.hasArg(options::OPT_static) ||
1156 Args.hasArg(options::OPT_object) ||
1157 Args.hasArg(options::OPT_preload)) {
1158 CmdArgs.push_back("-lcrt0.o");
1159 } else {
1160 // Derived from darwin_crt1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001161 if (isTargetWatchOSBased()) {
1162 ; // watchOS does not need crt1.o.
1163 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001164 ; // iOS simulator does not need crt1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001165 } else if (isTargetIPhoneOS()) {
Tim Northover40956e62014-07-23 12:32:58 +00001166 if (getArch() == llvm::Triple::aarch64)
Tim Northovera2ee4332014-03-29 15:09:45 +00001167 ; // iOS does not need any crt1 files for arm64
1168 else if (isIPhoneOSVersionLT(3, 1))
Tim Northover157d9112014-01-16 08:48:16 +00001169 CmdArgs.push_back("-lcrt1.o");
1170 else if (isIPhoneOSVersionLT(6, 0))
1171 CmdArgs.push_back("-lcrt1.3.1.o");
1172 } else {
1173 if (isMacosxVersionLT(10, 5))
1174 CmdArgs.push_back("-lcrt1.o");
1175 else if (isMacosxVersionLT(10, 6))
1176 CmdArgs.push_back("-lcrt1.10.5.o");
1177 else if (isMacosxVersionLT(10, 8))
1178 CmdArgs.push_back("-lcrt1.10.6.o");
1179
1180 // darwin_crt2 spec is empty.
1181 }
1182 }
1183 }
1184 }
1185 }
1186
1187 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
Tim Northover6f3ff222015-10-30 16:30:27 +00001188 !isTargetWatchOS() &&
Tim Northover157d9112014-01-16 08:48:16 +00001189 isMacosxVersionLT(10, 5)) {
1190 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1191 CmdArgs.push_back(Str);
1192 }
1193}
1194
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001195bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
Daniel Dunbar16334e12010-04-10 16:20:23 +00001196
John McCall3deb1ad2012-08-21 02:47:43 +00001197void Darwin::CheckObjCARC() const {
Tim Northover6f3ff222015-10-30 16:30:27 +00001198 if (isTargetIOSBased() || isTargetWatchOSBased() ||
1199 (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
John McCall3deb1ad2012-08-21 02:47:43 +00001200 return;
John McCall93207072012-08-27 01:56:21 +00001201 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00001202}
1203
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001204SanitizerMask Darwin::getSupportedSanitizers() const {
1205 SanitizerMask Res = ToolChain::getSupportedSanitizers();
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001206 if (isTargetMacOS() || isTargetIOSSimulator())
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001207 Res |= SanitizerKind::Address;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001208 if (isTargetMacOS()) {
1209 if (!isMacosxVersionLT(10, 9))
1210 Res |= SanitizerKind::Vptr;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001211 Res |= SanitizerKind::SafeStack;
Kuba Brecka85e01c02015-11-06 15:09:20 +00001212 Res |= SanitizerKind::Thread;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001213 }
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001214 return Res;
1215}
1216
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001217/// Generic_GCC - A tool chain using the 'gcc' command to perform
1218/// all subcommands; this relies on gcc translating the majority of
1219/// command line options.
1220
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001221/// \brief Parse a GCCVersion object out of a string of text.
1222///
1223/// This is the primary means of forming GCCVersion objects.
1224/*static*/
1225Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001226 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001227 std::pair<StringRef, StringRef> First = VersionText.split('.');
1228 std::pair<StringRef, StringRef> Second = First.second.split('.');
1229
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001230 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1231 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001232 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001233 GoodVersion.MajorStr = First.first.str();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001234 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001235 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001236 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001237
1238 // First look for a number prefix and parse that if present. Otherwise just
1239 // stash the entire patch string in the suffix, and leave the number
1240 // unspecified. This covers versions strings such as:
1241 // 4.4
1242 // 4.4.0
1243 // 4.4.x
1244 // 4.4.2-rc4
1245 // 4.4.x-patched
1246 // And retains any patch number it finds.
1247 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1248 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001249 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001250 // Try to parse the number and any suffix.
1251 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1252 GoodVersion.Patch < 0)
1253 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001254 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001255 }
1256 }
1257
1258 return GoodVersion;
1259}
1260
1261/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001262bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1263 int RHSPatch,
1264 StringRef RHSPatchSuffix) const {
1265 if (Major != RHSMajor)
1266 return Major < RHSMajor;
1267 if (Minor != RHSMinor)
1268 return Minor < RHSMinor;
1269 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001270 // Note that versions without a specified patch sort higher than those with
1271 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001272 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001273 return true;
1274 if (Patch == -1)
1275 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001276
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001277 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001278 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001279 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001280 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001281 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001282 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001283 return true;
1284 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001285 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001286
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001287 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001288 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001289 }
1290
1291 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001292 return false;
1293}
1294
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001295static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001296 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1297 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001298 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001299 return GCC_INSTALL_PREFIX;
1300}
1301
Roman Divacky326d9982013-12-06 18:32:18 +00001302/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001303///
1304/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001305/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001306///
1307/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1308/// should instead pull the target out of the driver. This is currently
1309/// necessary because the driver doesn't store the final version of the target
1310/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001311void Generic_GCC::GCCInstallationDetector::init(
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001312 const llvm::Triple &TargetTriple, const ArgList &Args,
Douglas Katzman8c39e6a2015-09-18 15:23:16 +00001313 ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001314 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1315 ? TargetTriple.get64BitArchVariant()
1316 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001317 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001318 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001319 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001320 SmallVector<StringRef, 16> CandidateTripleAliases;
1321 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001322 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1323 CandidateTripleAliases, CandidateBiarchLibDirs,
1324 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001325
1326 // Compute the set of prefixes for our search.
1327 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1328 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001329
Rafael Espindola1af7c212012-02-19 01:38:32 +00001330 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1331 if (GCCToolchainDir != "") {
1332 if (GCCToolchainDir.back() == '/')
1333 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001334
Rafael Espindola1af7c212012-02-19 01:38:32 +00001335 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001336 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001337 // If we have a SysRoot, try that first.
1338 if (!D.SysRoot.empty()) {
1339 Prefixes.push_back(D.SysRoot);
1340 Prefixes.push_back(D.SysRoot + "/usr");
1341 }
1342
1343 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001344 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001345
1346 // And finally in /usr.
1347 if (D.SysRoot.empty())
1348 Prefixes.push_back("/usr");
Rafael Espindolac29af942012-02-03 01:01:20 +00001349 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001350
1351 // Loop over the various components which exist and select the best GCC
1352 // installation available. GCC installs are ranked by version number.
1353 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001354 for (const std::string &Prefix : Prefixes) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001355 if (!D.getVFS().exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001356 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001357 for (StringRef Suffix : CandidateLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001358 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001359 if (!D.getVFS().exists(LibDir))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001360 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001361 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001362 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Benjamin Kramer72e64312015-09-24 14:48:49 +00001363 for (StringRef Candidate : CandidateTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001364 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001365 }
Benjamin Kramer72e64312015-09-24 14:48:49 +00001366 for (StringRef Suffix : CandidateBiarchLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001367 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001368 if (!D.getVFS().exists(LibDir))
Chandler Carruth866faab2012-01-25 07:21:38 +00001369 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001370 for (StringRef Candidate : CandidateBiarchTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001371 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001372 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001373 }
1374 }
1375}
1376
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001377void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001378 for (const auto &InstallPath : CandidateGCCInstallPaths)
1379 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001380
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001381 if (!GCCInstallPath.empty())
1382 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1383
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001384 for (const auto &Multilib : Multilibs)
1385 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001386
1387 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1388 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001389}
1390
1391bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1392 if (BiarchSibling.hasValue()) {
1393 M = BiarchSibling.getValue();
1394 return true;
1395 }
1396 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001397}
1398
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001399/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001400 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001401 SmallVectorImpl<StringRef> &LibDirs,
1402 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001403 SmallVectorImpl<StringRef> &BiarchLibDirs,
1404 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001405 // Declare a bunch of static data sets that we'll select between below. These
1406 // are specifically designed to always refer to string literals to avoid any
1407 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001408 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1409 static const char *const AArch64Triples[] = {
1410 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1411 "aarch64-redhat-linux"};
1412 static const char *const AArch64beLibDirs[] = {"/lib"};
1413 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1414 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001415
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001416 static const char *const ARMLibDirs[] = {"/lib"};
1417 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1418 "arm-linux-androideabi"};
1419 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1420 "armv7hl-redhat-linux-gnueabi"};
1421 static const char *const ARMebLibDirs[] = {"/lib"};
1422 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1423 "armeb-linux-androideabi"};
1424 static const char *const ARMebHFTriples[] = {
1425 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001426
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001427 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001428 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001429 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1430 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1431 "x86_64-redhat-linux", "x86_64-suse-linux",
1432 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1433 "x86_64-slackware-linux", "x86_64-linux-android",
1434 "x86_64-unknown-linux"};
1435 static const char *const X32LibDirs[] = {"/libx32"};
1436 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001437 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001438 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1439 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1440 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1441 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1442 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001443
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001444 static const char *const MIPSLibDirs[] = {"/lib"};
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00001445 static const char *const MIPSTriples[] = {
1446 "mips-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001447 static const char *const MIPSELLibDirs[] = {"/lib"};
1448 static const char *const MIPSELTriples[] = {
1449 "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001450
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001451 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1452 static const char *const MIPS64Triples[] = {
1453 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1454 "mips64-linux-gnuabi64"};
1455 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1456 static const char *const MIPS64ELTriples[] = {
1457 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1458 "mips64el-linux-android", "mips64el-linux-gnuabi64"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001459
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001460 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001461 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001462 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1463 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1464 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1465 static const char *const PPC64Triples[] = {
1466 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1467 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1468 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1469 static const char *const PPC64LETriples[] = {
1470 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1471 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001472
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001473 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1474 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1475 "sparcv8-linux-gnu"};
1476 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1477 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1478 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001479
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001480 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001481 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001482 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1483 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001484
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001485 // Solaris.
1486 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1487 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1488 "i386-pc-solaris2.11"};
1489
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001490 using std::begin;
1491 using std::end;
1492
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001493 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1494 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1495 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001496 return;
1497 }
1498
Chandler Carruth866faab2012-01-25 07:21:38 +00001499 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001500 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001501 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1502 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1503 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1504 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001505 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001506 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001507 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1508 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1509 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1510 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001511 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001512 case llvm::Triple::arm:
1513 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001514 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001515 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001516 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001517 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001518 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001519 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001520 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001521 case llvm::Triple::armeb:
1522 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001523 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001524 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001525 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001526 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001527 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001528 }
1529 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001530 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001531 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1532 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1533 // x32 is always available when x86_64 is available, so adding it as
1534 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001535 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001536 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1537 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001538 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001539 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1540 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001541 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001542 break;
1543 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001544 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1545 TripleAliases.append(begin(X86Triples), end(X86Triples));
1546 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1547 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001548 break;
1549 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001550 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1551 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1552 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1553 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001554 break;
1555 case llvm::Triple::mipsel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001556 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1557 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1558 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1559 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1560 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001561 break;
1562 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001563 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1564 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1565 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1566 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001567 break;
1568 case llvm::Triple::mips64el:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001569 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1570 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1571 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1572 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1573 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001574 break;
1575 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001576 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1577 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1578 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1579 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001580 break;
1581 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001582 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1583 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1584 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1585 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001586 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001587 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001588 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1589 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001590 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001591 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001592 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001593 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1594 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1595 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1596 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001597 break;
1598 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001599 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1600 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1601 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1602 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001603 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001604 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001605 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1606 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001607 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001608 default:
1609 // By default, just rely on the standard lib directories and the original
1610 // triple.
1611 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001612 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001613
1614 // Always append the drivers target triple to the end, in case it doesn't
1615 // match any of our aliases.
1616 TripleAliases.push_back(TargetTriple.str());
1617
1618 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001619 if (TargetTriple.str() != BiarchTriple.str())
1620 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001621}
1622
Artem Belevich98607b62015-09-23 21:49:39 +00001623// \brief -- try common CUDA installation paths looking for files we need for
1624// CUDA compilation.
1625
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001626void Generic_GCC::CudaInstallationDetector::init(
1627 const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001628 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001629
1630 if (Args.hasArg(options::OPT_cuda_path_EQ))
1631 CudaPathCandidates.push_back(
1632 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1633 else {
1634 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
1635 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1636 }
1637
Benjamin Kramere8b76412015-09-24 14:48:37 +00001638 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001639 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001640 continue;
1641
1642 CudaInstallPath = CudaPath;
1643 CudaIncludePath = CudaInstallPath + "/include";
1644 CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1645 CudaLibPath =
1646 CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1647
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001648 if (!(D.getVFS().exists(CudaIncludePath) &&
1649 D.getVFS().exists(CudaLibPath) &&
1650 D.getVFS().exists(CudaLibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001651 continue;
1652
1653 IsValid = true;
1654 break;
1655 }
1656}
1657
1658void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1659 if (isValid())
1660 OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1661}
1662
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001663namespace {
1664// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001665class FilterNonExistent {
1666 StringRef Base;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001667 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001668
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001669public:
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001670 FilterNonExistent(StringRef Base, vfs::FileSystem &VFS)
1671 : Base(Base), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001672 bool operator()(const Multilib &M) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001673 return !VFS.exists(Base + M.gccSuffix() + "/crtbegin.o");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001674 }
1675};
1676} // end anonymous namespace
1677
1678static void addMultilibFlag(bool Enabled, const char *const Flag,
1679 std::vector<std::string> &Flags) {
1680 if (Enabled)
1681 Flags.push_back(std::string("+") + Flag);
1682 else
1683 Flags.push_back(std::string("-") + Flag);
1684}
1685
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001686static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001687 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1688 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1689}
1690
1691static bool isMips32(llvm::Triple::ArchType Arch) {
1692 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1693}
1694
1695static bool isMips64(llvm::Triple::ArchType Arch) {
1696 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1697}
1698
1699static bool isMipsEL(llvm::Triple::ArchType Arch) {
1700 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1701}
1702
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001703static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001704 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001705 return A && A->getOption().matches(options::OPT_mips16);
1706}
1707
1708static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001709 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001710 return A && A->getOption().matches(options::OPT_mmicromips);
1711}
1712
Benjamin Kramere003ca22015-10-28 13:54:16 +00001713namespace {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001714struct DetectedMultilibs {
1715 /// The set of multilibs that the detected installation supports.
1716 MultilibSet Multilibs;
1717
1718 /// The primary multilib appropriate for the given flags.
1719 Multilib SelectedMultilib;
1720
1721 /// On Biarch systems, this corresponds to the default multilib when
1722 /// targeting the non-default multilib. Otherwise, it is empty.
1723 llvm::Optional<Multilib> BiarchSibling;
1724};
Benjamin Kramere003ca22015-10-28 13:54:16 +00001725} // end anonymous namespace
Simon Atanasyan60280b42014-05-12 07:37:51 +00001726
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001727static Multilib makeMultilib(StringRef commonSuffix) {
1728 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1729}
1730
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001731static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
1732 StringRef Path, const ArgList &Args,
1733 DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001734 // Some MIPS toolchains put libraries and object files compiled
1735 // using different options in to the sub-directoris which names
1736 // reflects the flags used for compilation. For example sysroot
1737 // directory might looks like the following examples:
1738 //
1739 // /usr
1740 // /lib <= crt*.o files compiled with '-mips32'
1741 // /mips16
1742 // /usr
1743 // /lib <= crt*.o files compiled with '-mips16'
1744 // /el
1745 // /usr
1746 // /lib <= crt*.o files compiled with '-mips16 -EL'
1747 //
1748 // or
1749 //
1750 // /usr
1751 // /lib <= crt*.o files compiled with '-mips32r2'
1752 // /mips16
1753 // /usr
1754 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1755 // /mips32
1756 // /usr
1757 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001758
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001759 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001760
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001761 // Check for FSF toolchain multilibs
1762 MultilibSet FSFMipsMultilibs;
1763 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001764 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001765 .flag("+m32")
1766 .flag("-m64")
1767 .flag("-mmicromips")
1768 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001769
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001770 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001771 .flag("+m32")
1772 .flag("-m64")
1773 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001774
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001775 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001776 .flag("-m32")
1777 .flag("+m64")
1778 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001779
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001780 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1781 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001782
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001783 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001784 .flag("+m32")
1785 .flag("-m64")
1786 .flag("-mmicromips")
1787 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001788
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001789 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001790
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001791 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001792
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001793 auto MAbi64 =
1794 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001795
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001796 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001797
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001798 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001799
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001800 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001801
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001802 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001803
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001804 FSFMipsMultilibs =
1805 MultilibSet()
1806 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1807 MArchDefault)
1808 .Maybe(UCLibc)
1809 .Maybe(Mips16)
1810 .FilterOut("/mips64/mips16")
1811 .FilterOut("/mips64r2/mips16")
1812 .FilterOut("/micromips/mips16")
1813 .Maybe(MAbi64)
1814 .FilterOut("/micromips/64")
1815 .FilterOut("/mips32/64")
1816 .FilterOut("^/64")
1817 .FilterOut("/mips16/64")
1818 .Either(BigEndian, LittleEndian)
1819 .Maybe(SoftFloat)
1820 .Maybe(Nan2008)
1821 .FilterOut(".*sof/nan2008")
1822 .FilterOut(NonExistent)
1823 .setIncludeDirsCallback([](StringRef InstallDir,
1824 StringRef TripleStr, const Multilib &M) {
1825 std::vector<std::string> Dirs;
1826 Dirs.push_back((InstallDir + "/include").str());
1827 std::string SysRootInc =
1828 InstallDir.str() + "/../../../../sysroot";
1829 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1830 Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1831 else
1832 Dirs.push_back(SysRootInc + "/usr/include");
1833 return Dirs;
1834 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001835 }
1836
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001837 // Check for Code Sourcery toolchain multilibs
1838 MultilibSet CSMipsMultilibs;
1839 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001840 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001841
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001842 auto MArchMicroMips =
1843 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001844
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001845 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001846
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001847 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001848
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001849 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001850
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001851 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001852
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001853 auto DefaultFloat =
1854 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001855
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001856 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001857
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001858 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001859
1860 // Note that this one's osSuffix is ""
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001861 auto MAbi64 = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001862 .gccSuffix("/64")
1863 .includeSuffix("/64")
1864 .flag("+mabi=n64")
1865 .flag("-mabi=n32")
1866 .flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001867
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001868 CSMipsMultilibs =
1869 MultilibSet()
1870 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1871 .Maybe(UCLibc)
1872 .Either(SoftFloat, Nan2008, DefaultFloat)
1873 .FilterOut("/micromips/nan2008")
1874 .FilterOut("/mips16/nan2008")
1875 .Either(BigEndian, LittleEndian)
1876 .Maybe(MAbi64)
1877 .FilterOut("/mips16.*/64")
1878 .FilterOut("/micromips.*/64")
1879 .FilterOut(NonExistent)
1880 .setIncludeDirsCallback([](StringRef InstallDir,
1881 StringRef TripleStr, const Multilib &M) {
1882 std::vector<std::string> Dirs;
1883 Dirs.push_back((InstallDir + "/include").str());
1884 std::string SysRootInc =
1885 InstallDir.str() + "/../../../../" + TripleStr.str();
1886 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1887 Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1888 else
1889 Dirs.push_back(SysRootInc + "/libc/usr/include");
1890 return Dirs;
1891 });
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001892 }
1893
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001894 MultilibSet AndroidMipsMultilibs =
1895 MultilibSet()
1896 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1897 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1898 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001899
1900 MultilibSet DebianMipsMultilibs;
1901 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001902 Multilib MAbiN32 =
1903 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001904
1905 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001906 .gccSuffix("/64")
1907 .includeSuffix("/64")
1908 .flag("+m64")
1909 .flag("-m32")
1910 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001911
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001912 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001913
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001914 DebianMipsMultilibs =
1915 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001916 }
1917
Daniel Sanders2bf13662014-07-10 14:40:57 +00001918 MultilibSet ImgMultilibs;
1919 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001920 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001921
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001922 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001923
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001924 auto MAbi64 =
1925 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001926
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001927 ImgMultilibs =
1928 MultilibSet()
1929 .Maybe(Mips64r6)
1930 .Maybe(MAbi64)
1931 .Maybe(LittleEndian)
1932 .FilterOut(NonExistent)
1933 .setIncludeDirsCallback([](StringRef InstallDir,
1934 StringRef TripleStr, const Multilib &M) {
1935 std::vector<std::string> Dirs;
1936 Dirs.push_back((InstallDir + "/include").str());
1937 Dirs.push_back(
1938 (InstallDir + "/../../../../sysroot/usr/include").str());
1939 return Dirs;
1940 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00001941 }
1942
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001943 StringRef CPUName;
1944 StringRef ABIName;
1945 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
1946
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001947 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1948
1949 Multilib::flags_list Flags;
1950 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
1951 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
1952 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001953 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001954 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00001955 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001956 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00001957 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001958 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001959 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
1960 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001961 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001962 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001963 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00001964 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
1965 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001966 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
1967 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001968 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001969 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001970 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001971 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001972
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001973 if (TargetTriple.isAndroid()) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001974 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00001975 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
1976 Result.Multilibs = AndroidMipsMultilibs;
1977 return true;
1978 }
1979 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001980 }
1981
Daniel Sanders2bf13662014-07-10 14:40:57 +00001982 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1983 TargetTriple.getOS() == llvm::Triple::Linux &&
1984 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
1985 // Select mips-img-linux-gnu toolchain.
1986 if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
1987 Result.Multilibs = ImgMultilibs;
1988 return true;
1989 }
1990 return false;
1991 }
1992
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001993 // Sort candidates. Toolchain that best meets the directories goes first.
1994 // Then select the first toolchains matches command line flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001995 MultilibSet *candidates[] = {&DebianMipsMultilibs, &FSFMipsMultilibs,
1996 &CSMipsMultilibs};
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001997 std::sort(
1998 std::begin(candidates), std::end(candidates),
1999 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
2000 for (const auto &candidate : candidates) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00002001 if (candidate->select(Flags, Result.SelectedMultilib)) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002002 if (candidate == &DebianMipsMultilibs)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002003 Result.BiarchSibling = Multilib();
2004 Result.Multilibs = *candidate;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002005 return true;
2006 }
2007 }
2008
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002009 {
2010 // Fallback to the regular toolchain-tree structure.
2011 Multilib Default;
2012 Result.Multilibs.push_back(Default);
2013 Result.Multilibs.FilterOut(NonExistent);
2014
2015 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2016 Result.BiarchSibling = Multilib();
2017 return true;
2018 }
2019 }
2020
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002021 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002022}
2023
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002024static bool findBiarchMultilibs(const Driver &D,
2025 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002026 StringRef Path, const ArgList &Args,
2027 bool NeedsBiarchSuffix,
2028 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002029 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2030 // in what would normally be GCCInstallPath and put the 64-bit
2031 // libs in a subdirectory named 64. The simple logic we follow is that
2032 // *if* there is a subdirectory of the right name with crtbegin.o in it,
2033 // we use that. If not, and if not a biarch triple alias, we look for
2034 // crtbegin.o without the subdirectory.
2035
2036 Multilib Default;
2037 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002038 .gccSuffix("/64")
2039 .includeSuffix("/64")
2040 .flag("-m32")
2041 .flag("+m64")
2042 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002043 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002044 .gccSuffix("/32")
2045 .includeSuffix("/32")
2046 .flag("+m32")
2047 .flag("-m64")
2048 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00002049 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002050 .gccSuffix("/x32")
2051 .includeSuffix("/x32")
2052 .flag("-m32")
2053 .flag("-m64")
2054 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002055
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002056 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002057
Zinovy Nis1db95732014-07-10 15:27:19 +00002058 // Determine default multilib from: 32, 64, x32
2059 // Also handle cases such as 64 on 32, 32 on 64, etc.
2060 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00002061 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00002062 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002063 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002064 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002065 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002066 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00002067 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002068 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00002069 if (TargetTriple.isArch32Bit())
2070 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002071 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00002072 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002073 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002074 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00002075 }
2076
Zinovy Nis1db95732014-07-10 15:27:19 +00002077 if (Want == WANT32)
2078 Default.flag("+m32").flag("-m64").flag("-mx32");
2079 else if (Want == WANT64)
2080 Default.flag("-m32").flag("+m64").flag("-mx32");
2081 else if (Want == WANTX32)
2082 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002083 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002084 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002085
Simon Atanasyan60280b42014-05-12 07:37:51 +00002086 Result.Multilibs.push_back(Default);
2087 Result.Multilibs.push_back(Alt64);
2088 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00002089 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002090
Simon Atanasyan60280b42014-05-12 07:37:51 +00002091 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002092
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002093 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002094 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002095 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002096 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002097
Simon Atanasyan60280b42014-05-12 07:37:51 +00002098 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002099 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002100
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002101 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00002102 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002103 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002104
2105 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00002106}
2107
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002108void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2109 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2110 const std::string &LibDir, StringRef CandidateTriple,
2111 bool NeedsBiarchSuffix) {
2112 // Solaris is a special case. The GCC installation is under
2113 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2114 // need to iterate twice.
2115 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002116 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2117 !EC && LI != LE; LI = LI.increment(EC)) {
2118 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002119 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2120
2121 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002122 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002123 continue; // Saw this path before; no need to look at it again.
2124 if (CandidateVersion.isOlderThan(4, 1, 1))
2125 continue;
2126 if (CandidateVersion <= Version)
2127 continue;
2128
2129 GCCInstallPath =
2130 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002131 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002132 continue;
2133
2134 // If we make it here there has to be at least one GCC version, let's just
2135 // use the latest one.
2136 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002137 for (vfs::directory_iterator
2138 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2139 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002140 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2141
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002142 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002143 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2144
2145 if (CandidateSubVersion > Version)
2146 Version = CandidateSubVersion;
2147 }
2148
2149 GCCTriple.setTriple(CandidateTriple);
2150
2151 GCCInstallPath += "/" + Version.Text;
2152 GCCParentLibPath = GCCInstallPath + "/../../../../";
2153
2154 IsValid = true;
2155 }
2156}
2157
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002158void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002159 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002160 const std::string &LibDir, StringRef CandidateTriple,
2161 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002162 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002163 // There are various different suffixes involving the triple we
2164 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002165 // up to the lib directory. Specifically, the number of "up" steps
2166 // in the second half of each row is 1 + the number of path separators
2167 // in the first half.
2168 const std::string LibAndInstallSuffixes[][2] = {
2169 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2170
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002171 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002172 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2173
2174 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2175 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002176
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002177 // The Freescale PPC SDK has the gcc libraries in
2178 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002179 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002180
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002181 // Ubuntu has a strange mis-matched pair of triples that this happens to
2182 // match.
2183 // FIXME: It may be worthwhile to generalize this and look for a second
2184 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002185 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2186
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002187 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2188 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2189 NeedsBiarchSuffix);
2190 return;
2191 }
2192
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002193 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002194 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2195 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002196 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002197 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002198 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002199 for (vfs::directory_iterator
2200 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2201 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002202 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002203 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002204 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002205 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002206 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002207 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002208 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002209 continue;
2210 if (CandidateVersion <= Version)
2211 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002212
Simon Atanasyan60280b42014-05-12 07:37:51 +00002213 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002214
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002215 // Debian mips multilibs behave more like the rest of the biarch ones,
2216 // so handle them there
2217 if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002218 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002219 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002220 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002221 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002222 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002223 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002224
Simon Atanasyan60280b42014-05-12 07:37:51 +00002225 Multilibs = Detected.Multilibs;
2226 SelectedMultilib = Detected.SelectedMultilib;
2227 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002228 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002229 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002230 // FIXME: We hack together the directory name here instead of
2231 // using LI to ensure stable path separators across Windows and
2232 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002233 GCCInstallPath =
2234 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2235 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002236 IsValid = true;
2237 }
2238 }
2239}
2240
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002241Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002242 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002243 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002244 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002245 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002246 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002247}
2248
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002249Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002250
Rafael Espindola7cf32212013-03-20 03:05:54 +00002251Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002252 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002253 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002254 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002255 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002256 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002257 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002258 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002259 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002260 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002261 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002262 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002263 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002264}
2265
Rafael Espindola7cf32212013-03-20 03:05:54 +00002266Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002267 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002268}
2269
Douglas Katzman95354292015-06-23 20:42:09 +00002270Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002271
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002272void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2273 // Print the information about how we detected the GCC installation.
2274 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002275 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002276}
2277
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002278bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002279 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002280}
2281
David Majnemer17f448b2015-06-28 04:23:33 +00002282bool Generic_GCC::isPICDefault() const {
2283 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2284}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002285
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002286bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002287
David Majnemer17f448b2015-06-28 04:23:33 +00002288bool Generic_GCC::isPICDefaultForced() const {
2289 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2290}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002291
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002292bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002293 switch (getTriple().getArch()) {
2294 case llvm::Triple::x86:
2295 case llvm::Triple::x86_64:
2296 case llvm::Triple::aarch64:
2297 case llvm::Triple::aarch64_be:
2298 case llvm::Triple::arm:
2299 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002300 case llvm::Triple::bpfel:
2301 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002302 case llvm::Triple::thumb:
2303 case llvm::Triple::thumbeb:
2304 case llvm::Triple::ppc:
2305 case llvm::Triple::ppc64:
2306 case llvm::Triple::ppc64le:
2307 case llvm::Triple::sparc:
2308 case llvm::Triple::sparcel:
2309 case llvm::Triple::sparcv9:
2310 case llvm::Triple::systemz:
2311 return true;
2312 default:
2313 return false;
2314 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002315}
2316
James Y Knighta6c9ee72015-10-16 18:46:26 +00002317/// \brief Helper to add the variant paths of a libstdc++ installation.
2318bool Generic_GCC::addLibStdCXXIncludePaths(
2319 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2320 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2321 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2322 if (!getVFS().exists(Base + Suffix))
2323 return false;
2324
2325 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2326
2327 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2328 // that path exists or we have neither a GCC nor target multiarch triple, use
2329 // this vanilla search path.
2330 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2331 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2332 addSystemInclude(DriverArgs, CC1Args,
2333 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2334 } else {
2335 // Otherwise try to use multiarch naming schemes which have normalized the
2336 // triples and put the triple before the suffix.
2337 //
2338 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2339 // the target triple, so we support that here.
2340 addSystemInclude(DriverArgs, CC1Args,
2341 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2342 addSystemInclude(DriverArgs, CC1Args,
2343 Base + "/" + TargetMultiarchTriple + Suffix);
2344 }
2345
2346 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2347 return true;
2348}
2349
2350
Kristof Beylsfb387292014-01-10 13:44:34 +00002351void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2352 ArgStringList &CC1Args) const {
2353 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002354 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002355 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002356 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002357 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002358 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00002359 getTriple().getOS() == llvm::Triple::NaCl;
Kristof Beylsfb387292014-01-10 13:44:34 +00002360
2361 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002362 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002363 CC1Args.push_back("-fuse-init-array");
2364}
2365
Tony Linthicum76329bf2011-12-12 21:14:55 +00002366/// Hexagon Toolchain
2367
Douglas Katzman54366072015-07-27 16:53:08 +00002368std::string HexagonToolChain::GetGnuDir(const std::string &InstalledDir,
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002369 const ArgList &Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002370 // Locate the rest of the toolchain ...
Samuel Antaoc909c992014-11-07 17:48:03 +00002371 std::string GccToolchain = getGCCToolchainDir(Args);
2372
2373 if (!GccToolchain.empty())
2374 return GccToolchain;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002375
2376 std::string InstallRelDir = InstalledDir + "/../../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002377 if (getVFS().exists(InstallRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002378 return InstallRelDir;
2379
2380 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002381 if (getVFS().exists(PrefixRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002382 return PrefixRelDir;
2383
2384 return InstallRelDir;
2385}
2386
Douglas Katzman54366072015-07-27 16:53:08 +00002387const char *HexagonToolChain::GetSmallDataThreshold(const ArgList &Args) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002388 Arg *A;
2389
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002390 A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002391 options::OPT_msmall_data_threshold_EQ);
2392 if (A)
2393 return A->getValue();
2394
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002395 A = Args.getLastArg(options::OPT_shared, options::OPT_fpic,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002396 options::OPT_fPIC);
2397 if (A)
2398 return "0";
2399
Hans Wennborgdcfba332015-10-06 23:40:43 +00002400 return nullptr;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002401}
2402
Douglas Katzman54366072015-07-27 16:53:08 +00002403bool HexagonToolChain::UsesG0(const char *smallDataThreshold) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002404 return smallDataThreshold && smallDataThreshold[0] == '0';
2405}
2406
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002407static void GetHexagonLibraryPaths(const HexagonToolChain &TC,
2408 const ArgList &Args, const std::string &Ver,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002409 const std::string &MarchString,
2410 const std::string &InstalledDir,
2411 ToolChain::path_list *LibPaths) {
Matthew Curtise689b052012-12-06 15:46:07 +00002412 bool buildingLib = Args.hasArg(options::OPT_shared);
2413
2414 //----------------------------------------------------------------------------
2415 // -L Args
2416 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002417 for (Arg *A : Args.filtered(options::OPT_L))
2418 for (const char *Value : A->getValues())
2419 LibPaths->push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002420
2421 //----------------------------------------------------------------------------
2422 // Other standard paths
2423 //----------------------------------------------------------------------------
2424 const std::string MarchSuffix = "/" + MarchString;
2425 const std::string G0Suffix = "/G0";
2426 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002427 const std::string RootDir = TC.GetGnuDir(InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00002428
2429 // lib/gcc/hexagon/...
2430 std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
2431 if (buildingLib) {
2432 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
2433 LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
2434 }
2435 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
2436 LibPaths->push_back(LibGCCHexagonDir + Ver);
2437
2438 // lib/gcc/...
2439 LibPaths->push_back(RootDir + "lib/gcc");
2440
2441 // hexagon/lib/...
2442 std::string HexagonLibDir = RootDir + "hexagon/lib";
2443 if (buildingLib) {
2444 LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
2445 LibPaths->push_back(HexagonLibDir + G0Suffix);
2446 }
2447 LibPaths->push_back(HexagonLibDir + MarchSuffix);
2448 LibPaths->push_back(HexagonLibDir);
2449}
2450
Douglas Katzman54366072015-07-27 16:53:08 +00002451HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
2452 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002453 : Linux(D, Triple, Args) {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002454 const std::string InstalledDir(getDriver().getInstalledDir());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002455 const std::string GnuDir = GetGnuDir(InstalledDir, Args);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002456
2457 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2458 // program paths
2459 const std::string BinDir(GnuDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002460 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002461 getProgramPaths().push_back(BinDir);
2462
2463 // Determine version of GCC libraries and headers to use.
2464 const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
Rafael Espindolac0809172014-06-12 14:02:15 +00002465 std::error_code ec;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002466 GCCVersion MaxVersion = GCCVersion::Parse("0.0.0");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002467 for (vfs::directory_iterator di = D.getVFS().dir_begin(HexagonDir, ec), de;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002468 !ec && di != de; di = di.increment(ec)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002469 GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->getName()));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002470 if (MaxVersion < cv)
2471 MaxVersion = cv;
2472 }
2473 GCCLibAndIncVersion = MaxVersion;
Matthew Curtise689b052012-12-06 15:46:07 +00002474
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002475 ToolChain::path_list *LibPaths = &getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002476
2477 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2478 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2479 // support 'linux' we'll need to fix this up
2480 LibPaths->clear();
2481
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002482 GetHexagonLibraryPaths(*this, Args, GetGCCLibAndIncVersion(),
2483 GetTargetCPU(Args), InstalledDir, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002484}
2485
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002486HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002487
Douglas Katzman54366072015-07-27 16:53:08 +00002488Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002489 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002490}
2491
Douglas Katzman54366072015-07-27 16:53:08 +00002492Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002493 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002494}
2495
Douglas Katzman54366072015-07-27 16:53:08 +00002496void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2497 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002498 const Driver &D = getDriver();
2499
2500 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2501 DriverArgs.hasArg(options::OPT_nostdlibinc))
2502 return;
2503
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002504 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002505 std::string GnuDir = GetGnuDir(D.InstalledDir, DriverArgs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002506 std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
2507 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
2508 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
2509 addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002510}
2511
Douglas Katzman54366072015-07-27 16:53:08 +00002512void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2513 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002514 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2515 DriverArgs.hasArg(options::OPT_nostdincxx))
2516 return;
2517
2518 const Driver &D = getDriver();
2519 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002520 SmallString<128> IncludeDir(GetGnuDir(D.InstalledDir, DriverArgs));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002521
Rafael Espindola358256c2013-06-26 02:13:00 +00002522 llvm::sys::path::append(IncludeDir, "hexagon/include/c++/");
2523 llvm::sys::path::append(IncludeDir, Ver);
Yaron Keren92e1b622015-03-18 10:17:07 +00002524 addSystemInclude(DriverArgs, CC1Args, IncludeDir);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002525}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002526
Matthew Curtise689b052012-12-06 15:46:07 +00002527ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002528HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002529 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2530 if (!A)
2531 return ToolChain::CST_Libstdcxx;
2532
2533 StringRef Value = A->getValue();
2534 if (Value != "libstdc++") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002535 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002536 }
2537
2538 return ToolChain::CST_Libstdcxx;
2539}
2540
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002541static int getHexagonVersion(const ArgList &Args) {
2542 Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ);
2543 // Select the default CPU (v4) if none was given.
2544 if (!A)
2545 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002546
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002547 // FIXME: produce errors if we cannot parse the version.
2548 StringRef WhichHexagon = A->getValue();
2549 if (WhichHexagon.startswith("hexagonv")) {
2550 int Val;
2551 if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val))
2552 return Val;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002553 }
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002554 if (WhichHexagon.startswith("v")) {
2555 int Val;
2556 if (!WhichHexagon.substr(1).getAsInteger(10, Val))
2557 return Val;
2558 }
2559
2560 // FIXME: should probably be an error.
2561 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002562}
2563
Douglas Katzman54366072015-07-27 16:53:08 +00002564StringRef HexagonToolChain::GetTargetCPU(const ArgList &Args) {
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002565 int V = getHexagonVersion(Args);
2566 // FIXME: We don't support versions < 4. We should error on them.
2567 switch (V) {
2568 default:
2569 llvm_unreachable("Unexpected version");
2570 case 5:
2571 return "v5";
2572 case 4:
2573 return "v4";
2574 case 3:
2575 return "v3";
2576 case 2:
2577 return "v2";
2578 case 1:
2579 return "v1";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002580 }
Matthew Curtisf10a5952012-12-06 14:16:43 +00002581}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002582// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002583
Tom Stellard8fa33092015-07-18 01:49:05 +00002584/// AMDGPU Toolchain
2585AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2586 const ArgList &Args)
2587 : Generic_ELF(D, Triple, Args) { }
2588
2589Tool *AMDGPUToolChain::buildLinker() const {
2590 return new tools::amdgpu::Linker(*this);
2591}
2592// End AMDGPU
2593
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002594/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00002595NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2596 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002597 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002598
2599 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2600 // default paths, and must instead only use the paths provided
2601 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002602 path_list &file_paths = getFilePaths();
2603 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002604
2605 file_paths.clear();
2606 prog_paths.clear();
2607
2608 // Path for library files (libc.a, ...)
2609 std::string FilePath(getDriver().Dir + "/../");
2610
2611 // Path for tools (clang, ld, etc..)
2612 std::string ProgPath(getDriver().Dir + "/../");
2613
2614 // Path for toolchain libraries (libgcc.a, ...)
2615 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2616
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002617 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00002618 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002619 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00002620 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002621 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2622 file_paths.push_back(ToolPath + "i686-nacl");
2623 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002624 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002625 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2626 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2627 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2628 file_paths.push_back(ToolPath + "x86_64-nacl");
2629 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002630 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002631 file_paths.push_back(FilePath + "arm-nacl/lib");
2632 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2633 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2634 file_paths.push_back(ToolPath + "arm-nacl");
2635 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002636 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002637 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2638 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2639 prog_paths.push_back(ProgPath + "bin");
2640 file_paths.push_back(ToolPath + "mipsel-nacl");
2641 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002642 default:
2643 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002644 }
2645
2646 // Use provided linker, not system linker
Derek Schuffef465d72015-08-24 23:53:25 +00002647 Linker = GetLinkerPath();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002648 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2649}
2650
Douglas Katzman54366072015-07-27 16:53:08 +00002651void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2652 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002653 const Driver &D = getDriver();
2654 if (DriverArgs.hasArg(options::OPT_nostdinc))
2655 return;
2656
2657 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2658 SmallString<128> P(D.ResourceDir);
2659 llvm::sys::path::append(P, "include");
2660 addSystemInclude(DriverArgs, CC1Args, P.str());
2661 }
2662
2663 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2664 return;
2665
2666 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002667 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00002668 case llvm::Triple::x86:
2669 // x86 is special because multilib style uses x86_64-nacl/include for libc
2670 // headers but the SDK wants i686-nacl/usr/include. The other architectures
2671 // have the same substring.
2672 llvm::sys::path::append(P, "i686-nacl/usr/include");
2673 addSystemInclude(DriverArgs, CC1Args, P.str());
2674 llvm::sys::path::remove_filename(P);
2675 llvm::sys::path::remove_filename(P);
2676 llvm::sys::path::remove_filename(P);
2677 llvm::sys::path::append(P, "x86_64-nacl/include");
2678 addSystemInclude(DriverArgs, CC1Args, P.str());
2679 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002680 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002681 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002682 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002683 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002684 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002685 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002686 case llvm::Triple::mipsel:
2687 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2688 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002689 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002690 return;
2691 }
2692
2693 addSystemInclude(DriverArgs, CC1Args, P.str());
2694 llvm::sys::path::remove_filename(P);
2695 llvm::sys::path::remove_filename(P);
2696 llvm::sys::path::append(P, "include");
2697 addSystemInclude(DriverArgs, CC1Args, P.str());
2698}
2699
Douglas Katzman54366072015-07-27 16:53:08 +00002700void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2701 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002702 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2703 // if the value is libc++, and emits an error for other values.
2704 GetCXXStdlibType(Args);
2705 CmdArgs.push_back("-lc++");
2706}
2707
Douglas Katzman54366072015-07-27 16:53:08 +00002708void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2709 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002710 const Driver &D = getDriver();
2711 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2712 DriverArgs.hasArg(options::OPT_nostdincxx))
2713 return;
2714
2715 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2716 // if the value is libc++, and emits an error for other values.
2717 GetCXXStdlibType(DriverArgs);
2718
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002719 SmallString<128> P(D.Dir + "/../");
2720 switch (getTriple().getArch()) {
2721 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002722 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2723 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002724 break;
2725 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002726 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2727 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002728 break;
2729 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002730 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2731 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002732 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002733 case llvm::Triple::mipsel:
2734 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2735 addSystemInclude(DriverArgs, CC1Args, P.str());
2736 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002737 default:
2738 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002739 }
2740}
2741
Douglas Katzman54366072015-07-27 16:53:08 +00002742ToolChain::CXXStdlibType
2743NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002744 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2745 StringRef Value = A->getValue();
2746 if (Value == "libc++")
2747 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002748 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002749 }
2750
2751 return ToolChain::CST_Libcxx;
2752}
2753
Douglas Katzman54366072015-07-27 16:53:08 +00002754std::string
2755NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2756 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002757 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2758 if (TheTriple.getArch() == llvm::Triple::arm &&
2759 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2760 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2761 return TheTriple.getTriple();
2762}
2763
Douglas Katzman54366072015-07-27 16:53:08 +00002764Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002765 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002766}
2767
Douglas Katzman54366072015-07-27 16:53:08 +00002768Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002769 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002770 return new tools::nacltools::AssemblerARM(*this);
2771 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002772}
2773// End NaCl
2774
Chris Lattner09797542010-03-04 21:07:38 +00002775/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2776/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2777/// Currently does not support anything else but compilation.
2778
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002779TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002780 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002781 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002782 // Path mangling to find libexec
2783 std::string Path(getDriver().Dir);
2784
2785 Path += "/../libexec";
2786 getProgramPaths().push_back(Path);
2787}
2788
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002789TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002790
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002791bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002792
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002793bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002794
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002795bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002796
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002797bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002798
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002799// CloudABI - CloudABI tool chain which can call ld(1) directly.
2800
2801CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2802 const ArgList &Args)
2803 : Generic_ELF(D, Triple, Args) {
2804 SmallString<128> P(getDriver().Dir);
2805 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2806 getFilePaths().push_back(P.str());
2807}
2808
2809void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2810 ArgStringList &CC1Args) const {
2811 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2812 DriverArgs.hasArg(options::OPT_nostdincxx))
2813 return;
2814
2815 SmallString<128> P(getDriver().Dir);
2816 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2817 addSystemInclude(DriverArgs, CC1Args, P.str());
2818}
2819
2820void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
2821 ArgStringList &CmdArgs) const {
2822 CmdArgs.push_back("-lc++");
2823 CmdArgs.push_back("-lc++abi");
2824 CmdArgs.push_back("-lunwind");
2825}
2826
Douglas Katzman95354292015-06-23 20:42:09 +00002827Tool *CloudABI::buildLinker() const {
2828 return new tools::cloudabi::Linker(*this);
2829}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002830
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002831/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
2832
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002833OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
2834 const ArgList &Args)
2835 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00002836 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002837 getFilePaths().push_back("/usr/lib");
2838}
2839
Rafael Espindola7cf32212013-03-20 03:05:54 +00002840Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002841 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002842}
2843
Douglas Katzman95354292015-06-23 20:42:09 +00002844Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002845
Eli Friedman9fa28852012-08-08 23:57:20 +00002846/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
2847
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002848Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2849 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00002850 getFilePaths().push_back(getDriver().Dir + "/../lib");
2851 getFilePaths().push_back("/usr/lib");
2852}
2853
Rafael Espindola7cf32212013-03-20 03:05:54 +00002854Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002855 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002856}
2857
Douglas Katzman95354292015-06-23 20:42:09 +00002858Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00002859
Douglas Katzman95354292015-06-23 20:42:09 +00002860ToolChain::CXXStdlibType Bitrig::GetCXXStdlibType(const ArgList &Args) const {
Richard Smith51af5192014-05-01 23:24:24 +00002861 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2862 StringRef Value = A->getValue();
2863 if (Value == "libstdc++")
2864 return ToolChain::CST_Libstdcxx;
2865 if (Value == "libc++")
2866 return ToolChain::CST_Libcxx;
2867
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002868 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Richard Smith51af5192014-05-01 23:24:24 +00002869 }
2870 return ToolChain::CST_Libcxx;
2871}
2872
Eli Friedman9fa28852012-08-08 23:57:20 +00002873void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2874 ArgStringList &CC1Args) const {
2875 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2876 DriverArgs.hasArg(options::OPT_nostdincxx))
2877 return;
2878
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002879 switch (GetCXXStdlibType(DriverArgs)) {
2880 case ToolChain::CST_Libcxx:
2881 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00002882 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002883 break;
2884 case ToolChain::CST_Libstdcxx:
2885 addSystemInclude(DriverArgs, CC1Args,
2886 getDriver().SysRoot + "/usr/include/c++/stdc++");
2887 addSystemInclude(DriverArgs, CC1Args,
2888 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00002889
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002890 StringRef Triple = getTriple().str();
2891 if (Triple.startswith("amd64"))
2892 addSystemInclude(DriverArgs, CC1Args,
2893 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002894 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002895 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002896 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
2897 "/usr/include/c++/stdc++/" +
2898 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002899 break;
2900 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002901}
2902
2903void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
2904 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002905 switch (GetCXXStdlibType(Args)) {
2906 case ToolChain::CST_Libcxx:
2907 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00002908 CmdArgs.push_back("-lc++abi");
2909 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002910 break;
2911 case ToolChain::CST_Libstdcxx:
2912 CmdArgs.push_back("-lstdc++");
2913 break;
2914 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002915}
2916
Daniel Dunbare24297c2009-03-30 21:06:03 +00002917/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
2918
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002919FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
2920 const ArgList &Args)
2921 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00002922
Chandler Carruth0b1756b2012-01-26 01:35:15 +00002923 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
2924 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002925 if ((Triple.getArch() == llvm::Triple::x86 ||
2926 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002927 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002928 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
2929 else
2930 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00002931}
2932
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002933ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
David Chisnall867ccd82013-11-09 15:10:56 +00002934 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2935 StringRef Value = A->getValue();
2936 if (Value == "libstdc++")
2937 return ToolChain::CST_Libstdcxx;
2938 if (Value == "libc++")
2939 return ToolChain::CST_Libcxx;
2940
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002941 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
David Chisnall867ccd82013-11-09 15:10:56 +00002942 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002943 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00002944 return ToolChain::CST_Libcxx;
2945 return ToolChain::CST_Libstdcxx;
2946}
2947
2948void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2949 ArgStringList &CC1Args) const {
2950 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2951 DriverArgs.hasArg(options::OPT_nostdincxx))
2952 return;
2953
2954 switch (GetCXXStdlibType(DriverArgs)) {
2955 case ToolChain::CST_Libcxx:
2956 addSystemInclude(DriverArgs, CC1Args,
2957 getDriver().SysRoot + "/usr/include/c++/v1");
2958 break;
2959 case ToolChain::CST_Libstdcxx:
2960 addSystemInclude(DriverArgs, CC1Args,
2961 getDriver().SysRoot + "/usr/include/c++/4.2");
2962 addSystemInclude(DriverArgs, CC1Args,
2963 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
2964 break;
2965 }
2966}
2967
Rafael Espindola7cf32212013-03-20 03:05:54 +00002968Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002969 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002970}
2971
Douglas Katzman95354292015-06-23 20:42:09 +00002972Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00002973
Tim Northovere931f9f2015-10-30 16:30:41 +00002974bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002975 // FreeBSD uses SjLj exceptions on ARM oabi.
2976 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00002977 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002978 case llvm::Triple::GNUEABI:
2979 case llvm::Triple::EABI:
2980 return false;
2981
2982 default:
2983 return (getTriple().getArch() == llvm::Triple::arm ||
2984 getTriple().getArch() == llvm::Triple::thumb);
2985 }
2986}
2987
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002988bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002989
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002990bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002991
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00002992SanitizerMask FreeBSD::getSupportedSanitizers() const {
2993 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
2994 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
2995 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
2996 getTriple().getArch() == llvm::Triple::mips64el;
2997 SanitizerMask Res = ToolChain::getSupportedSanitizers();
2998 Res |= SanitizerKind::Address;
2999 Res |= SanitizerKind::Vptr;
3000 if (IsX86_64 || IsMIPS64) {
3001 Res |= SanitizerKind::Leak;
3002 Res |= SanitizerKind::Thread;
3003 }
3004 if (IsX86 || IsX86_64) {
3005 Res |= SanitizerKind::SafeStack;
3006 }
3007 return Res;
3008}
3009
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003010/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3011
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003012NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3013 : Generic_ELF(D, Triple, Args) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003014
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003015 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003016 // When targeting a 32-bit platform, try the special directory used on
3017 // 64-bit hosts, and only fall back to the main library directory if that
3018 // doesn't work.
3019 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3020 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003021 switch (Triple.getArch()) {
3022 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003023 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003024 break;
3025 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003026 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003027 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003028 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003029 switch (Triple.getEnvironment()) {
3030 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003031 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003032 getFilePaths().push_back("=/usr/lib/eabi");
3033 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003034 case llvm::Triple::EABIHF:
3035 case llvm::Triple::GNUEABIHF:
3036 getFilePaths().push_back("=/usr/lib/eabihf");
3037 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003038 default:
3039 getFilePaths().push_back("=/usr/lib/oabi");
3040 break;
3041 }
3042 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003043 case llvm::Triple::mips64:
3044 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003045 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003046 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003047 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003048 getFilePaths().push_back("=/usr/lib/64");
3049 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003050 case llvm::Triple::ppc:
3051 getFilePaths().push_back("=/usr/lib/powerpc");
3052 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003053 case llvm::Triple::sparc:
3054 getFilePaths().push_back("=/usr/lib/sparc");
3055 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003056 default:
3057 break;
3058 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003059
3060 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003061 }
3062}
3063
Rafael Espindola7cf32212013-03-20 03:05:54 +00003064Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003065 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003066}
3067
Douglas Katzman95354292015-06-23 20:42:09 +00003068Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003069
Douglas Katzman95354292015-06-23 20:42:09 +00003070ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003071 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3072 StringRef Value = A->getValue();
3073 if (Value == "libstdc++")
3074 return ToolChain::CST_Libstdcxx;
3075 if (Value == "libc++")
3076 return ToolChain::CST_Libcxx;
3077
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003078 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003079 }
3080
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003081 unsigned Major, Minor, Micro;
3082 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003083 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003084 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003085 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003086 case llvm::Triple::arm:
3087 case llvm::Triple::armeb:
3088 case llvm::Triple::thumb:
3089 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003090 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003091 case llvm::Triple::ppc64:
3092 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003093 case llvm::Triple::x86:
3094 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003095 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003096 default:
3097 break;
3098 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003099 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003100 return ToolChain::CST_Libstdcxx;
3101}
3102
3103void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3104 ArgStringList &CC1Args) const {
3105 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3106 DriverArgs.hasArg(options::OPT_nostdincxx))
3107 return;
3108
3109 switch (GetCXXStdlibType(DriverArgs)) {
3110 case ToolChain::CST_Libcxx:
3111 addSystemInclude(DriverArgs, CC1Args,
3112 getDriver().SysRoot + "/usr/include/c++/");
3113 break;
3114 case ToolChain::CST_Libstdcxx:
3115 addSystemInclude(DriverArgs, CC1Args,
3116 getDriver().SysRoot + "/usr/include/g++");
3117 addSystemInclude(DriverArgs, CC1Args,
3118 getDriver().SysRoot + "/usr/include/g++/backward");
3119 break;
3120 }
3121}
3122
Chris Lattner3e2ee142010-07-07 16:01:42 +00003123/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3124
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003125Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3126 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003127 getFilePaths().push_back(getDriver().Dir + "/../lib");
3128 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003129}
3130
Rafael Espindola7cf32212013-03-20 03:05:54 +00003131Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003132 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003133}
3134
Douglas Katzman95354292015-06-23 20:42:09 +00003135Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003136
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003137static void addPathIfExists(const Driver &D, const Twine &Path,
3138 ToolChain::path_list &Paths) {
3139 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003140 Paths.push_back(Path.str());
3141}
3142
David Chisnallf571cde2012-02-15 13:39:01 +00003143/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3144
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003145Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003146 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003147 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003148
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003149 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003150
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003151 path_list &Paths = getFilePaths();
3152 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003153 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003154
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003155 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003156 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003157 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003158
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003159 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003160
3161 std::string LibPath = "/usr/lib/";
3162 switch (Triple.getArch()) {
3163 case llvm::Triple::x86:
3164 case llvm::Triple::sparc:
3165 break;
3166 case llvm::Triple::x86_64:
3167 LibPath += "amd64/";
3168 break;
3169 case llvm::Triple::sparcv9:
3170 LibPath += "sparcv9/";
3171 break;
3172 default:
3173 llvm_unreachable("Unsupported architecture");
3174 }
3175
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003176 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003177}
3178
Rafael Espindola7cf32212013-03-20 03:05:54 +00003179Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003180 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003181}
3182
Douglas Katzman95354292015-06-23 20:42:09 +00003183Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003184
Rafael Espindolad5117262015-09-09 13:36:00 +00003185void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3186 ArgStringList &CC1Args) const {
3187 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3188 DriverArgs.hasArg(options::OPT_nostdincxx))
3189 return;
3190
3191 // Include the support directory for things like xlocale and fudged system
3192 // headers.
3193 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3194
3195 if (GCCInstallation.isValid()) {
3196 GCCVersion Version = GCCInstallation.getVersion();
3197 addSystemInclude(DriverArgs, CC1Args,
3198 getDriver().SysRoot + "/usr/gcc/" +
3199 Version.MajorStr + "." +
3200 Version.MinorStr +
3201 "/include/c++/" + Version.Text);
3202 addSystemInclude(DriverArgs, CC1Args,
3203 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3204 "." + Version.MinorStr + "/include/c++/" +
3205 Version.Text + "/" +
3206 GCCInstallation.getTriple().str());
3207 }
3208}
3209
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003210/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003211
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003212enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003213 // NB: Releases of a particular Linux distro should be kept together
3214 // in this enum, because some tests are done by integer comparison against
3215 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003216 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003217 DebianLenny,
3218 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003219 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003220 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003221 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003222 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003223 RHEL4,
3224 RHEL5,
3225 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003226 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003227 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003228 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003229 UbuntuHardy,
3230 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003231 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003232 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003233 UbuntuLucid,
3234 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003235 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003236 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003237 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003238 UbuntuQuantal,
3239 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003240 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003241 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003242 UbuntuUtopic,
3243 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003244 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003245 UbuntuXenial,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003246 UnknownDistro
3247};
3248
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003249static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003250 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003251}
3252
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003253static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003254
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003255static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003256 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003257}
3258
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003259static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003260 return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003261}
3262
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003263static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003264 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3265 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3266 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003267 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003268 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003269 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003270 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003271 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003272 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3273 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3274 .Case("hardy", UbuntuHardy)
3275 .Case("intrepid", UbuntuIntrepid)
3276 .Case("jaunty", UbuntuJaunty)
3277 .Case("karmic", UbuntuKarmic)
3278 .Case("lucid", UbuntuLucid)
3279 .Case("maverick", UbuntuMaverick)
3280 .Case("natty", UbuntuNatty)
3281 .Case("oneiric", UbuntuOneiric)
3282 .Case("precise", UbuntuPrecise)
3283 .Case("quantal", UbuntuQuantal)
3284 .Case("raring", UbuntuRaring)
3285 .Case("saucy", UbuntuSaucy)
3286 .Case("trusty", UbuntuTrusty)
3287 .Case("utopic", UbuntuUtopic)
3288 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003289 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003290 .Case("xenial", UbuntuXenial)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003291 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003292 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003293 }
3294
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003295 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3296 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003297 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003298 if (Data.startswith("Fedora release"))
3299 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003300 if (Data.startswith("Red Hat Enterprise Linux") ||
3301 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003302 if (Data.find("release 7") != StringRef::npos)
3303 return RHEL7;
3304 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003305 return RHEL6;
3306 else if (Data.find("release 5") != StringRef::npos)
3307 return RHEL5;
3308 else if (Data.find("release 4") != StringRef::npos)
3309 return RHEL4;
3310 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003311 return UnknownDistro;
3312 }
3313
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003314 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3315 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003316 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003317 if (Data[0] == '5')
3318 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003319 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003320 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003321 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003322 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003323 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003324 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003325 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3326 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003327 return UnknownDistro;
3328 }
3329
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003330 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003331 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003332
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003333 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003334 return Exherbo;
3335
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003336 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003337 return ArchLinux;
3338
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003339 return UnknownDistro;
3340}
3341
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003342/// \brief Get our best guess at the multiarch triple for a target.
3343///
3344/// Debian-based systems are starting to use a multiarch setup where they use
3345/// a target-triple directory in the library and header search paths.
3346/// Unfortunately, this triple does not align with the vanilla target triple,
3347/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003348static std::string getMultiarchTriple(const Driver &D,
3349 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003350 StringRef SysRoot) {
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003351 llvm::Triple::EnvironmentType TargetEnvironment = TargetTriple.getEnvironment();
3352
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003353 // For most architectures, just use whatever we have rather than trying to be
3354 // clever.
3355 switch (TargetTriple.getArch()) {
3356 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003357 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003358
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003359 // We use the existence of '/lib/<triple>' as a directory to detect some
3360 // common linux triples that don't quite match the Clang triple for both
3361 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3362 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003363 case llvm::Triple::arm:
3364 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003365 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003366 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003367 return "arm-linux-gnueabihf";
3368 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003369 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003370 return "arm-linux-gnueabi";
3371 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003372 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003373 case llvm::Triple::armeb:
3374 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003375 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003376 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003377 return "armeb-linux-gnueabihf";
3378 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003379 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003380 return "armeb-linux-gnueabi";
3381 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003382 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003383 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003384 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003385 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003386 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003387 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003388 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003389 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003390 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003391 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003392 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003393 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003394 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003395 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003396 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003397 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003398 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003399 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003400 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003401 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003402 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003403 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003404 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003405 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003406 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003407 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003408 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003409 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003410 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003411 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003412 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003413 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003414 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003415 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003416 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003417 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003418 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003419 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003420 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003421 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003422 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003423 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003424 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003425 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003426 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003427 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003428 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003429 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003430 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003431 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003432 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003433 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003434 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003435 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003436 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003437 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003438 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003439 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003440 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003441 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003442 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003443 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003444 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003445 return "s390x-linux-gnu";
3446 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003447 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003448 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003449}
3450
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003451static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003452 if (isMipsArch(Triple.getArch())) {
3453 // lib32 directory has a special meaning on MIPS targets.
3454 // It contains N32 ABI binaries. Use this folder if produce
3455 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003456 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003457 return "lib32";
3458 return Triple.isArch32Bit() ? "lib" : "lib64";
3459 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003460
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003461 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003462 // using that variant while targeting other architectures causes problems
3463 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003464 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003465 // them when we know we may need it.
3466 //
3467 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003468 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003469 // GCCInstallationDetector, but that is a more significant refactoring.
3470 if (Triple.getArch() == llvm::Triple::x86 ||
3471 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003472 return "lib32";
3473
Zinovy Nis1db95732014-07-10 15:27:19 +00003474 if (Triple.getArch() == llvm::Triple::x86_64 &&
3475 Triple.getEnvironment() == llvm::Triple::GNUX32)
3476 return "libx32";
3477
Simon Atanasyand4413882012-09-14 11:27:24 +00003478 return Triple.isArch32Bit() ? "lib" : "lib64";
3479}
3480
Rafael Espindola1af7c212012-02-19 01:38:32 +00003481Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003482 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003483 GCCInstallation.init(Triple, Args);
3484 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003485 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003486 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003487 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003488
Rafael Espindola10a63c22013-07-03 14:14:00 +00003489 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003490 // least) put various tools in a triple-prefixed directory off of the parent
3491 // of the GCC installation. We use the GCC triple here to ensure that we end
3492 // up with tools that support the same amount of cross compiling as the
3493 // detected GCC installation. For example, if we find a GCC installation
3494 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3495 // used to target i386.
3496 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003497 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003498 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003499 GCCInstallation.getTriple().str() + "/bin")
3500 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003501
Logan Chieneb9162f2014-06-26 14:23:45 +00003502 Linker = GetLinkerPath();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003503
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003504 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003505
Rafael Espindola10a63c22013-07-03 14:14:00 +00003506 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003507 ExtraOpts.push_back("-z");
3508 ExtraOpts.push_back("relro");
3509 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003510
Douglas Gregord9bb1522011-03-06 19:11:49 +00003511 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003512 ExtraOpts.push_back("-X");
3513
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003514 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003515 const bool IsMips = isMipsArch(Arch);
3516
3517 if (IsMips && !SysRoot.empty())
3518 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003519
Chandler Carruth0b842912011-12-09 04:45:18 +00003520 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3521 // and the MIPS ABI require .dynsym to be sorted in different ways.
3522 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3523 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003524 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003525 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003526 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003527 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003528 ExtraOpts.push_back("--hash-style=gnu");
3529
Rafael Espindola10a63c22013-07-03 14:14:00 +00003530 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003531 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3532 ExtraOpts.push_back("--hash-style=both");
3533 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003534
Chris Lattner84e38552011-05-22 05:36:06 +00003535 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003536 ExtraOpts.push_back("--no-add-needed");
3537
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003538 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003539 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003540 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003541 ExtraOpts.push_back("--build-id");
3542
Rafael Espindola10a63c22013-07-03 14:14:00 +00003543 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003544 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003545
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003546 // The selection of paths to try here is designed to match the patterns which
3547 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3548 // This was determined by running GCC in a fake filesystem, creating all
3549 // possible permutations of these directories, and seeing which ones it added
3550 // to the link paths.
3551 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003552
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003553 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003554 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003555
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003556 // Add the multilib suffixed paths where they are available.
3557 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003558 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003559 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003560 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003561
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003562 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003563 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003564 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003565 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003566
3567 // GCC cross compiling toolchains will install target libraries which ship
3568 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3569 // any part of the GCC installation in
3570 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3571 // debatable, but is the reality today. We need to search this tree even
3572 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003573 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003574 // installation that is *not* within the system root to ensure two things:
3575 //
3576 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003577 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003578 // appropriate rpath.
3579 // 2) There must not be libraries installed into
3580 // <prefix>/<triple>/<libdir> unless they should be preferred over
3581 // those within the system root.
3582 //
3583 // Note that this matches the GCC behavior. See the below comment for where
3584 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003585 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
3586 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003587 Paths);
3588
Chandler Carruth69a125b2012-04-06 16:32:06 +00003589 // If the GCC installation we found is inside of the sysroot, we want to
3590 // prefer libraries installed in the parent prefix of the GCC installation.
3591 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003592 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003593 // This usually happens when there is an external cross compiler on the
3594 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003595 // the cross. Note that GCC does include some of these directories in some
3596 // configurations but this seems somewhere between questionable and simply
3597 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003598 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003599 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
3600 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003601 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003602 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003603
3604 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003605 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003606 // those searched.
3607 // FIXME: It's not clear whether we should use the driver's installed
3608 // directory ('Dir' below) or the ResourceDir.
3609 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003610 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
3611 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003612 }
3613
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003614 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
3615 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
3616 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3617 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003618
Chandler Carruthb427c562013-06-22 11:35:51 +00003619 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003620 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003621 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003622 addPathIfExists(D,
3623 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003624 "/../../" + OSLibDir,
3625 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003626
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003627 // Add the 'other' biarch variant path
3628 Multilib BiarchSibling;
3629 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003630 addPathIfExists(D, GCCInstallation.getInstallPath() +
3631 BiarchSibling.gccSuffix(),
3632 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003633 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003634
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003635 // See comments above on the multilib variant for details of why this is
3636 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003637 const std::string &LibPath = GCCInstallation.getParentLibPath();
3638 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3639 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003640 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
3641 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003642 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003643
3644 // See comments above on the multilib variant for details of why this is
3645 // only included from within the sysroot.
3646 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003647 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003648 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003649
3650 // Similar to the logic for GCC above, if we are currently running Clang
3651 // inside of the requested system root, add its parent library path to those
3652 // searched.
3653 // FIXME: It's not clear whether we should use the driver's installed
3654 // directory ('Dir' below) or the ResourceDir.
3655 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003656 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003657
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003658 addPathIfExists(D, SysRoot + "/lib", Paths);
3659 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003660}
3661
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003662bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003663
Douglas Katzman95354292015-06-23 20:42:09 +00003664Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003665
3666Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003667 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003668}
3669
Simon Atanasyana0d89572013-10-05 14:37:55 +00003670std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003671 if (!getDriver().SysRoot.empty())
3672 return getDriver().SysRoot;
3673
3674 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3675 return std::string();
3676
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003677 // Standalone MIPS toolchains use different names for sysroot folder
3678 // and put it into different places. Here we try to check some known
3679 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003680
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003681 const StringRef InstallDir = GCCInstallation.getInstallPath();
3682 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003683 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003684
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003685 std::string Path =
3686 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3687 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003688
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003689 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003690 return Path;
3691
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003692 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003693
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003694 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003695 return Path;
3696
3697 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003698}
3699
Chandler Carrutha796f532011-11-05 20:17:13 +00003700void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3701 ArgStringList &CC1Args) const {
3702 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003703 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003704
3705 if (DriverArgs.hasArg(options::OPT_nostdinc))
3706 return;
3707
3708 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003709 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003710
3711 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003712 SmallString<128> P(D.ResourceDir);
3713 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003714 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003715 }
3716
3717 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3718 return;
3719
3720 // Check for configure-time C include directories.
3721 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3722 if (CIncludeDirs != "") {
3723 SmallVector<StringRef, 5> dirs;
3724 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003725 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003726 StringRef Prefix =
3727 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003728 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003729 }
3730 return;
3731 }
3732
3733 // Lacking those, try to detect the correct set of system includes for the
3734 // target triple.
3735
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003736 // Add include directories specific to the selected multilib set and multilib.
3737 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003738 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003739 if (Callback) {
3740 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3741 GCCInstallation.getTriple().str(),
3742 GCCInstallation.getMultilib());
3743 for (const auto &Path : IncludePaths)
3744 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3745 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003746 }
3747
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003748 // Implement generic Debian multiarch support.
3749 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003750 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003751
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003752 // FIXME: These are older forms of multiarch. It's not clear that they're
3753 // in use in any released version of Debian, so we should consider
3754 // removing them.
3755 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003756 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003757 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003758
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003759 // FIXME: These are older forms of multiarch. It's not clear that they're
3760 // in use in any released version of Debian, so we should consider
3761 // removing them.
3762 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3763 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003764 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003765 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003766 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003767 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003768 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003769 "/usr/include/arm-linux-gnueabihf"};
3770 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003771 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003772 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003773 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003774 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003775 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003776 "/usr/include/mips64el-linux-gnu",
3777 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003778 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003779 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003780 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003781 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003782 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003783 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003784 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003785 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003786 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003787 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003788 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
3789 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003790 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003791 switch (getTriple().getArch()) {
3792 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003793 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003794 break;
3795 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003796 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003797 break;
3798 case llvm::Triple::aarch64:
3799 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003800 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003801 break;
3802 case llvm::Triple::arm:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003803 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3804 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3805 else
3806 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003807 break;
3808 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00003809 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003810 break;
3811 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00003812 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003813 break;
3814 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003815 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003816 break;
3817 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003818 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003819 break;
3820 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003821 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003822 break;
3823 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003824 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003825 break;
3826 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003827 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003828 break;
3829 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00003830 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003831 break;
3832 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00003833 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003834 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003835 case llvm::Triple::systemz:
3836 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
3837 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003838 default:
3839 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003840 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003841 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003842 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003843 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003844 break;
3845 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003846 }
3847
3848 if (getTriple().getOS() == llvm::Triple::RTEMS)
3849 return;
3850
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003851 // Add an include of '/include' directly. This isn't provided by default by
3852 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
3853 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003854 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003855
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003856 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003857}
3858
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003859
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00003860static std::string DetectLibcxxIncludePath(StringRef base) {
3861 std::error_code EC;
3862 int MaxVersion = 0;
3863 std::string MaxVersionString = "";
3864 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
3865 LI = LI.increment(EC)) {
3866 StringRef VersionText = llvm::sys::path::filename(LI->path());
3867 int Version;
3868 if (VersionText[0] == 'v' &&
3869 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
3870 if (Version > MaxVersion) {
3871 MaxVersion = Version;
3872 MaxVersionString = VersionText;
3873 }
3874 }
3875 }
3876 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
3877}
3878
Chandler Carrutha796f532011-11-05 20:17:13 +00003879void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3880 ArgStringList &CC1Args) const {
3881 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3882 DriverArgs.hasArg(options::OPT_nostdincxx))
3883 return;
3884
Chandler Carruthf4701732011-11-07 09:01:17 +00003885 // Check if libc++ has been enabled and provide its include paths if so.
3886 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003887 const std::string LibCXXIncludePathCandidates[] = {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00003888 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003889
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003890 // We also check the system as for a long time this is the only place
3891 // Clang looked.
3892 // FIXME: We should really remove this. It doesn't make any sense.
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00003893 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++")};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003894 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00003895 if (IncludePath.empty() || !getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003896 continue;
3897 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003898 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003899 break;
3900 }
Chandler Carruthf4701732011-11-07 09:01:17 +00003901 return;
3902 }
3903
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00003904 // We need a detected GCC installation on Linux to provide libstdc++'s
3905 // headers. We handled the libc++ case above.
3906 if (!GCCInstallation.isValid())
3907 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00003908
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003909 // By default, look for the C++ headers in an include directory adjacent to
3910 // the lib directory of the GCC installation. Note that this is expect to be
3911 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
3912 StringRef LibDir = GCCInstallation.getParentLibPath();
3913 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003914 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003915 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003916 const std::string GCCMultiarchTriple = getMultiarchTriple(
3917 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003918 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003919 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00003920 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003921
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003922 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00003923 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003924 "/c++/" + Version.Text, TripleStr,
3925 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003926 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003927 return;
3928
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003929 // Otherwise, fall back on a bunch of options which don't use multiarch
3930 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003931 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003932 // Gentoo is weird and places its headers inside the GCC install,
3933 // so if the first attempt to find the headers fails, try these patterns.
3934 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
3935 Version.MinorStr,
3936 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
3937 // Android standalone toolchain has C++ headers in yet another place.
3938 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
3939 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
3940 // without a subdirectory corresponding to the gcc version.
3941 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003942 };
3943
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003944 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003945 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
3946 /*GCCMultiarchTriple*/ "",
3947 /*TargetMultiarchTriple*/ "",
3948 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003949 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003950 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003951}
3952
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003953bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003954
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003955SanitizerMask Linux::getSupportedSanitizers() const {
3956 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3957 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3958 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3959 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00003960 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
3961 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003962 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
3963 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003964 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3965 Res |= SanitizerKind::Address;
3966 Res |= SanitizerKind::KernelAddress;
3967 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00003968 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003969 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003970 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00003971 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003972 Res |= SanitizerKind::Leak;
Renato Golind45c2df2015-08-05 18:42:41 +00003973 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003974 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00003975 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00003976 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003977 if (IsX86 || IsX86_64) {
3978 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003979 }
3980 return Res;
3981}
3982
Xinliang David Li170cd102015-10-27 05:15:35 +00003983void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
3984 llvm::opt::ArgStringList &CmdArgs) const {
3985 if (!needsProfileRT(Args)) return;
3986
3987 // Add linker option -u__llvm_runtime_variable to cause runtime
3988 // initialization module to be linked in.
3989 if (!Args.hasArg(options::OPT_coverage))
3990 CmdArgs.push_back(Args.MakeArgString(
3991 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
3992 ToolChain::addProfileRTLibs(Args, CmdArgs);
3993}
3994
Daniel Dunbarcc912342009-05-02 18:28:39 +00003995/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
3996
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003997DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
3998 const ArgList &Args)
3999 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00004000
4001 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00004002 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00004003 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00004004 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004005
Daniel Dunbar083edf72009-12-21 18:54:17 +00004006 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004007 getFilePaths().push_back("/usr/lib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004008 if (D.getVFS().exists("/usr/lib/gcc47"))
John McCall65b8da02013-04-11 22:55:55 +00004009 getFilePaths().push_back("/usr/lib/gcc47");
4010 else
4011 getFilePaths().push_back("/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004012}
4013
Rafael Espindola7cf32212013-03-20 03:05:54 +00004014Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004015 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004016}
4017
4018Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004019 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004020}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004021
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004022/// Stub for CUDA toolchain. At the moment we don't have assembler or
4023/// linker and need toolchain mainly to propagate device-side options
4024/// to CC1.
4025
4026CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4027 const ArgList &Args)
4028 : Linux(D, Triple, Args) {}
4029
4030void
4031CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4032 llvm::opt::ArgStringList &CC1Args) const {
4033 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4034 CC1Args.push_back("-fcuda-is-device");
4035}
4036
4037llvm::opt::DerivedArgList *
4038CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
4039 const char *BoundArch) const {
4040 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
4041 const OptTable &Opts = getDriver().getOpts();
4042
4043 for (Arg *A : Args) {
4044 if (A->getOption().matches(options::OPT_Xarch__)) {
4045 // Skip this argument unless the architecture matches BoundArch
4046 if (A->getValue(0) != StringRef(BoundArch))
4047 continue;
4048
4049 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
4050 unsigned Prev = Index;
4051 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
4052
4053 // If the argument parsing failed or more than one argument was
4054 // consumed, the -Xarch_ argument's parameter tried to consume
4055 // extra arguments. Emit an error and ignore.
4056 //
4057 // We also want to disallow any options which would alter the
4058 // driver behavior; that isn't going to work in our model. We
4059 // use isDriverOption() as an approximation, although things
4060 // like -O4 are going to slip through.
4061 if (!XarchArg || Index > Prev + 1) {
4062 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
4063 << A->getAsString(Args);
4064 continue;
4065 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
4066 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
4067 << A->getAsString(Args);
4068 continue;
4069 }
4070 XarchArg->setBaseArg(A);
4071 A = XarchArg.release();
4072 DAL->AddSynthesizedArg(A);
4073 }
4074 DAL->append(A);
4075 }
4076
4077 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
4078 return DAL;
4079}
4080
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004081/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00004082XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
4083 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004084 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004085 // ProgramPaths are found via 'PATH' environment variable.
4086}
4087
Douglas Katzman54366072015-07-27 16:53:08 +00004088Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004089 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004090}
4091
Douglas Katzman54366072015-07-27 16:53:08 +00004092Tool *XCoreToolChain::buildLinker() const {
4093 return new tools::XCore::Linker(*this);
4094}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004095
Douglas Katzman54366072015-07-27 16:53:08 +00004096bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004097
Douglas Katzman54366072015-07-27 16:53:08 +00004098bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004099
Douglas Katzman54366072015-07-27 16:53:08 +00004100bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004101
Douglas Katzman54366072015-07-27 16:53:08 +00004102bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004103
Douglas Katzman54366072015-07-27 16:53:08 +00004104bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004105
Douglas Katzman54366072015-07-27 16:53:08 +00004106void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4107 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004108 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
4109 DriverArgs.hasArg(options::OPT_nostdlibinc))
4110 return;
4111 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
4112 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004113 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004114 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4115 ArrayRef<StringRef> DirVec(Dirs);
4116 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4117 }
4118}
4119
Douglas Katzman54366072015-07-27 16:53:08 +00004120void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
4121 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004122 CC1Args.push_back("-nostdsysteminc");
4123}
4124
Douglas Katzman54366072015-07-27 16:53:08 +00004125void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
4126 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004127 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00004128 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4129 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004130 return;
4131 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
4132 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004133 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004134 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4135 ArrayRef<StringRef> DirVec(Dirs);
4136 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4137 }
4138}
4139
Douglas Katzman54366072015-07-27 16:53:08 +00004140void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
4141 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004142 // We don't output any lib args. This is handled by xcc.
4143}
Douglas Katzman84a75642015-06-19 14:55:19 +00004144
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004145MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
4146 const ArgList &Args)
4147 : Generic_GCC(D, Triple, Args) {
4148 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
4149 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
4150 // This won't work to find gcc. Instead we give the installation detector an
4151 // extra triple, which is preferable to further hacks of the logic that at
4152 // present is based solely on getArch(). In particular, it would be wrong to
4153 // choose the myriad installation when targeting a non-myriad sparc install.
4154 switch (Triple.getArch()) {
4155 default:
4156 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName() << "myriad";
4157 case llvm::Triple::sparc:
4158 case llvm::Triple::sparcel:
4159 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004160 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004161 }
4162}
4163
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00004164MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004165
Douglas Katzmanb1278f32015-09-17 21:20:16 +00004166void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4167 ArgStringList &CC1Args) const {
4168 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4169 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4170}
4171
James Y Knighta6c9ee72015-10-16 18:46:26 +00004172void MyriadToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4173 ArgStringList &CC1Args) const {
4174 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4175 DriverArgs.hasArg(options::OPT_nostdincxx))
4176 return;
4177
4178 // Only libstdc++, for now.
4179 StringRef LibDir = GCCInstallation.getParentLibPath();
4180 const GCCVersion &Version = GCCInstallation.getVersion();
4181 StringRef TripleStr = GCCInstallation.getTriple().str();
4182 const Multilib &Multilib = GCCInstallation.getMultilib();
4183
4184 addLibStdCXXIncludePaths(LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4185 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
4186}
4187
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004188// MyriadToolChain handles several triples:
4189// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
4190Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4191 // The inherited method works fine if not targeting the SHAVE.
4192 if (!isShaveCompilation(getTriple()))
4193 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004194 switch (JA.getKind()) {
4195 case Action::CompileJobClass:
4196 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004197 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004198 return Compiler.get();
4199 case Action::AssembleJobClass:
4200 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004201 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004202 return Assembler.get();
4203 default:
4204 return ToolChain::getTool(JA.getKind());
4205 }
4206}
4207
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004208void MyriadToolChain::getCompilerSupportDir(std::string &Dir) const {
4209 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4210 // These files are tied to a particular version of gcc.
4211 SmallString<128> Result(GCCInstallation.getInstallPath());
4212 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4213 // but as this toolchain is for LEON sparc, it can assume FPU.
4214 if (this->getTriple().getArch() == llvm::Triple::sparcel)
4215 llvm::sys::path::append(Result, "le");
4216 Dir.assign(Result.str());
4217}
4218void MyriadToolChain::getBuiltinLibDir(std::string &Dir) const {
4219 // The contents of LibDir are independent of the version of gcc.
4220 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4221 SmallString<128> Result(GCCInstallation.getParentLibPath());
4222 if (this->getTriple().getArch() == llvm::Triple::sparcel)
4223 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib/le");
4224 else
4225 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib");
4226 Dir.assign(Result.str());
Douglas Katzman84a75642015-06-19 14:55:19 +00004227}
4228
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004229Tool *MyriadToolChain::buildLinker() const {
4230 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004231}
Dan Gohmanc2853072015-09-03 22:51:53 +00004232
4233bool WebAssembly::IsMathErrnoDefault() const { return false; }
4234
4235bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4236
4237bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4238
4239bool WebAssembly::isPICDefault() const { return false; }
4240
4241bool WebAssembly::isPIEDefault() const { return false; }
4242
4243bool WebAssembly::isPICDefaultForced() const { return false; }
4244
4245bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4246
4247// TODO: Support Objective C stuff.
4248bool WebAssembly::SupportsObjCGC() const { return false; }
4249
4250bool WebAssembly::hasBlocksRuntime() const { return false; }
4251
4252// TODO: Support profiling.
4253bool WebAssembly::SupportsProfiling() const { return false; }
4254
4255void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4256 ArgStringList &CC1Args) const {
4257 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4258 options::OPT_fno_use_init_array, true))
4259 CC1Args.push_back("-fuse-init-array");
4260}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004261
4262PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4263 : Generic_ELF(D, Triple, Args) {
4264 if (Args.hasArg(options::OPT_static))
4265 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4266
4267 // Determine where to find the PS4 libraries. We use SCE_PS4_SDK_DIR
4268 // if it exists; otherwise use the driver's installation path, which
4269 // should be <SDK_DIR>/host_tools/bin.
4270
4271 SmallString<512> PS4SDKDir;
4272 if (const char *EnvValue = getenv("SCE_PS4_SDK_DIR")) {
4273 if (!llvm::sys::fs::exists(EnvValue))
4274 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4275 PS4SDKDir = EnvValue;
4276 } else {
4277 PS4SDKDir = getDriver().Dir;
4278 llvm::sys::path::append(PS4SDKDir, "/../../");
4279 }
4280
4281 // By default, the driver won't report a warning if it can't find
4282 // PS4's include or lib directories. This behavior could be changed if
4283 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
4284 // If -isysroot was passed, use that as the SDK base path.
4285 std::string PrefixDir;
4286 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4287 PrefixDir = A->getValue();
4288 if (!llvm::sys::fs::exists(PrefixDir))
4289 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4290 } else
4291 PrefixDir = PS4SDKDir.str();
4292
4293 SmallString<512> PS4SDKIncludeDir(PrefixDir);
4294 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4295 if (!Args.hasArg(options::OPT_nostdinc) &&
4296 !Args.hasArg(options::OPT_nostdlibinc) &&
4297 !Args.hasArg(options::OPT_isysroot) &&
4298 !Args.hasArg(options::OPT__sysroot_EQ) &&
4299 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4300 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4301 << "PS4 system headers" << PS4SDKIncludeDir;
4302 }
4303
4304 SmallString<512> PS4SDKLibDir(PS4SDKDir);
4305 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4306 if (!Args.hasArg(options::OPT_nostdlib) &&
4307 !Args.hasArg(options::OPT_nodefaultlibs) &&
4308 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
4309 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
4310 !Args.hasArg(options::OPT_emit_ast) &&
4311 !llvm::sys::fs::exists(PS4SDKLibDir)) {
4312 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4313 << "PS4 system libraries" << PS4SDKLibDir;
4314 return;
4315 }
4316 getFilePaths().push_back(PS4SDKLibDir.str());
4317}
4318
4319Tool *PS4CPU::buildAssembler() const {
4320 return new tools::PS4cpu::Assemble(*this);
4321}
4322
4323Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
4324
4325bool PS4CPU::isPICDefault() const { return true; }
4326
4327bool PS4CPU::HasNativeLLVMSupport() const { return true; }
4328
4329SanitizerMask PS4CPU::getSupportedSanitizers() const {
4330 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4331 Res |= SanitizerKind::Address;
4332 Res |= SanitizerKind::Vptr;
4333 return Res;
4334}