blob: d1ce3f4f1f13a586415f04d06afd7ad27c55e50c [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 Kalintirisc744e122015-11-12 15:26:54 +00001445 static const char *const MIPSTriples[] = {"mips-linux-gnu", "mips-mti-linux",
1446 "mips-mti-linux-gnu",
1447 "mips-img-linux-gnu"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001448 static const char *const MIPSELLibDirs[] = {"/lib"};
1449 static const char *const MIPSELTriples[] = {
1450 "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001451
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001452 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1453 static const char *const MIPS64Triples[] = {
1454 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1455 "mips64-linux-gnuabi64"};
1456 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1457 static const char *const MIPS64ELTriples[] = {
1458 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1459 "mips64el-linux-android", "mips64el-linux-gnuabi64"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001460
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001461 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001462 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001463 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1464 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1465 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1466 static const char *const PPC64Triples[] = {
1467 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1468 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1469 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1470 static const char *const PPC64LETriples[] = {
1471 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1472 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001473
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001474 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1475 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1476 "sparcv8-linux-gnu"};
1477 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1478 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1479 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001480
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001481 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001482 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001483 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1484 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001485
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001486 // Solaris.
1487 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1488 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1489 "i386-pc-solaris2.11"};
1490
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001491 using std::begin;
1492 using std::end;
1493
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001494 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1495 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1496 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001497 return;
1498 }
1499
Chandler Carruth866faab2012-01-25 07:21:38 +00001500 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001501 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001502 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1503 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1504 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1505 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001506 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001507 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001508 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1509 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1510 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1511 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001512 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001513 case llvm::Triple::arm:
1514 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001515 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001516 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001517 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001518 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001519 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001520 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001521 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001522 case llvm::Triple::armeb:
1523 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001524 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001525 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001526 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001527 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001528 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001529 }
1530 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001531 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001532 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1533 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1534 // x32 is always available when x86_64 is available, so adding it as
1535 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001536 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001537 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1538 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001539 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001540 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1541 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001542 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001543 break;
1544 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001545 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1546 TripleAliases.append(begin(X86Triples), end(X86Triples));
1547 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1548 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001549 break;
1550 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001551 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1552 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1553 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1554 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001555 break;
1556 case llvm::Triple::mipsel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001557 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1558 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1559 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1560 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1561 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001562 break;
1563 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001564 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1565 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1566 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1567 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001568 break;
1569 case llvm::Triple::mips64el:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001570 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1571 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1572 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1573 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1574 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001575 break;
1576 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001577 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1578 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1579 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1580 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001581 break;
1582 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001583 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1584 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1585 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1586 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001587 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001588 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001589 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1590 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001591 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001592 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001593 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001594 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1595 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1596 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1597 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001598 break;
1599 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001600 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1601 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1602 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1603 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001604 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001605 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001606 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1607 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001608 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001609 default:
1610 // By default, just rely on the standard lib directories and the original
1611 // triple.
1612 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001613 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001614
1615 // Always append the drivers target triple to the end, in case it doesn't
1616 // match any of our aliases.
1617 TripleAliases.push_back(TargetTriple.str());
1618
1619 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001620 if (TargetTriple.str() != BiarchTriple.str())
1621 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001622}
1623
Artem Belevich98607b62015-09-23 21:49:39 +00001624// \brief -- try common CUDA installation paths looking for files we need for
1625// CUDA compilation.
1626
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001627void Generic_GCC::CudaInstallationDetector::init(
1628 const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001629 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001630
1631 if (Args.hasArg(options::OPT_cuda_path_EQ))
1632 CudaPathCandidates.push_back(
1633 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1634 else {
1635 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
1636 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1637 }
1638
Benjamin Kramere8b76412015-09-24 14:48:37 +00001639 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001640 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001641 continue;
1642
1643 CudaInstallPath = CudaPath;
1644 CudaIncludePath = CudaInstallPath + "/include";
1645 CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1646 CudaLibPath =
1647 CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1648
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001649 if (!(D.getVFS().exists(CudaIncludePath) &&
1650 D.getVFS().exists(CudaLibPath) &&
1651 D.getVFS().exists(CudaLibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001652 continue;
1653
1654 IsValid = true;
1655 break;
1656 }
1657}
1658
1659void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1660 if (isValid())
1661 OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1662}
1663
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001664namespace {
1665// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001666class FilterNonExistent {
1667 StringRef Base;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001668 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001669
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001670public:
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001671 FilterNonExistent(StringRef Base, vfs::FileSystem &VFS)
1672 : Base(Base), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001673 bool operator()(const Multilib &M) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001674 return !VFS.exists(Base + M.gccSuffix() + "/crtbegin.o");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001675 }
1676};
1677} // end anonymous namespace
1678
1679static void addMultilibFlag(bool Enabled, const char *const Flag,
1680 std::vector<std::string> &Flags) {
1681 if (Enabled)
1682 Flags.push_back(std::string("+") + Flag);
1683 else
1684 Flags.push_back(std::string("-") + Flag);
1685}
1686
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001687static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001688 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1689 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1690}
1691
1692static bool isMips32(llvm::Triple::ArchType Arch) {
1693 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1694}
1695
1696static bool isMips64(llvm::Triple::ArchType Arch) {
1697 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1698}
1699
1700static bool isMipsEL(llvm::Triple::ArchType Arch) {
1701 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1702}
1703
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001704static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001705 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001706 return A && A->getOption().matches(options::OPT_mips16);
1707}
1708
1709static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001710 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001711 return A && A->getOption().matches(options::OPT_mmicromips);
1712}
1713
Benjamin Kramere003ca22015-10-28 13:54:16 +00001714namespace {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001715struct DetectedMultilibs {
1716 /// The set of multilibs that the detected installation supports.
1717 MultilibSet Multilibs;
1718
1719 /// The primary multilib appropriate for the given flags.
1720 Multilib SelectedMultilib;
1721
1722 /// On Biarch systems, this corresponds to the default multilib when
1723 /// targeting the non-default multilib. Otherwise, it is empty.
1724 llvm::Optional<Multilib> BiarchSibling;
1725};
Benjamin Kramere003ca22015-10-28 13:54:16 +00001726} // end anonymous namespace
Simon Atanasyan60280b42014-05-12 07:37:51 +00001727
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001728static Multilib makeMultilib(StringRef commonSuffix) {
1729 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1730}
1731
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001732static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
1733 StringRef Path, const ArgList &Args,
1734 DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001735 // Some MIPS toolchains put libraries and object files compiled
1736 // using different options in to the sub-directoris which names
1737 // reflects the flags used for compilation. For example sysroot
1738 // directory might looks like the following examples:
1739 //
1740 // /usr
1741 // /lib <= crt*.o files compiled with '-mips32'
1742 // /mips16
1743 // /usr
1744 // /lib <= crt*.o files compiled with '-mips16'
1745 // /el
1746 // /usr
1747 // /lib <= crt*.o files compiled with '-mips16 -EL'
1748 //
1749 // or
1750 //
1751 // /usr
1752 // /lib <= crt*.o files compiled with '-mips32r2'
1753 // /mips16
1754 // /usr
1755 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1756 // /mips32
1757 // /usr
1758 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001759
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001760 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001761
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001762 // Check for FSF toolchain multilibs
1763 MultilibSet FSFMipsMultilibs;
1764 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001765 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001766 .flag("+m32")
1767 .flag("-m64")
1768 .flag("-mmicromips")
1769 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001770
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001771 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001772 .flag("+m32")
1773 .flag("-m64")
1774 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001775
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001776 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001777 .flag("-m32")
1778 .flag("+m64")
1779 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001780
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001781 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1782 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001783
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001784 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001785 .flag("+m32")
1786 .flag("-m64")
1787 .flag("-mmicromips")
1788 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001789
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001790 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001791
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001792 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001793
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001794 auto MAbi64 =
1795 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001796
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001797 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001798
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001799 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001800
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001801 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001802
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001803 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001804
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001805 FSFMipsMultilibs =
1806 MultilibSet()
1807 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1808 MArchDefault)
1809 .Maybe(UCLibc)
1810 .Maybe(Mips16)
1811 .FilterOut("/mips64/mips16")
1812 .FilterOut("/mips64r2/mips16")
1813 .FilterOut("/micromips/mips16")
1814 .Maybe(MAbi64)
1815 .FilterOut("/micromips/64")
1816 .FilterOut("/mips32/64")
1817 .FilterOut("^/64")
1818 .FilterOut("/mips16/64")
1819 .Either(BigEndian, LittleEndian)
1820 .Maybe(SoftFloat)
1821 .Maybe(Nan2008)
1822 .FilterOut(".*sof/nan2008")
1823 .FilterOut(NonExistent)
1824 .setIncludeDirsCallback([](StringRef InstallDir,
1825 StringRef TripleStr, const Multilib &M) {
1826 std::vector<std::string> Dirs;
1827 Dirs.push_back((InstallDir + "/include").str());
1828 std::string SysRootInc =
1829 InstallDir.str() + "/../../../../sysroot";
1830 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1831 Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1832 else
1833 Dirs.push_back(SysRootInc + "/usr/include");
1834 return Dirs;
1835 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001836 }
1837
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001838 // Check for Musl toolchain multilibs
1839 MultilibSet MuslMipsMultilibs;
1840 {
1841 auto MArchMipsR2 = makeMultilib("")
1842 .osSuffix("/mips-r2-hard-musl")
1843 .flag("+EB")
1844 .flag("-EL")
1845 .flag("+march=mips32r2");
1846
1847 auto MArchMipselR2 = makeMultilib("/mipsel-r2-hard-musl")
1848 .flag("-EB")
1849 .flag("+EL")
1850 .flag("+march=mips32r2");
1851
1852 MuslMipsMultilibs = MultilibSet().Either(MArchMipsR2, MArchMipselR2);
1853
1854 // Specify the callback that computes the include directories.
1855 MuslMipsMultilibs.setIncludeDirsCallback([](
1856 StringRef InstallDir, StringRef TripleStr, const Multilib &M) {
1857 std::vector<std::string> Dirs;
1858 Dirs.push_back(
1859 (InstallDir + "/../sysroot" + M.osSuffix() + "/usr/include").str());
1860 return Dirs;
1861 });
1862 }
1863
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001864 // Check for Code Sourcery toolchain multilibs
1865 MultilibSet CSMipsMultilibs;
1866 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001867 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001868
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001869 auto MArchMicroMips =
1870 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001871
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001872 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001873
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001874 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001875
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001876 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001877
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001878 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001879
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001880 auto DefaultFloat =
1881 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001882
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001883 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001884
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001885 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001886
1887 // Note that this one's osSuffix is ""
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001888 auto MAbi64 = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001889 .gccSuffix("/64")
1890 .includeSuffix("/64")
1891 .flag("+mabi=n64")
1892 .flag("-mabi=n32")
1893 .flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001894
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001895 CSMipsMultilibs =
1896 MultilibSet()
1897 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1898 .Maybe(UCLibc)
1899 .Either(SoftFloat, Nan2008, DefaultFloat)
1900 .FilterOut("/micromips/nan2008")
1901 .FilterOut("/mips16/nan2008")
1902 .Either(BigEndian, LittleEndian)
1903 .Maybe(MAbi64)
1904 .FilterOut("/mips16.*/64")
1905 .FilterOut("/micromips.*/64")
1906 .FilterOut(NonExistent)
1907 .setIncludeDirsCallback([](StringRef InstallDir,
1908 StringRef TripleStr, const Multilib &M) {
1909 std::vector<std::string> Dirs;
1910 Dirs.push_back((InstallDir + "/include").str());
1911 std::string SysRootInc =
1912 InstallDir.str() + "/../../../../" + TripleStr.str();
1913 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1914 Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1915 else
1916 Dirs.push_back(SysRootInc + "/libc/usr/include");
1917 return Dirs;
1918 });
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001919 }
1920
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001921 MultilibSet AndroidMipsMultilibs =
1922 MultilibSet()
1923 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1924 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1925 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001926
1927 MultilibSet DebianMipsMultilibs;
1928 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001929 Multilib MAbiN32 =
1930 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001931
1932 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001933 .gccSuffix("/64")
1934 .includeSuffix("/64")
1935 .flag("+m64")
1936 .flag("-m32")
1937 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001938
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001939 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001940
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001941 DebianMipsMultilibs =
1942 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001943 }
1944
Daniel Sanders2bf13662014-07-10 14:40:57 +00001945 MultilibSet ImgMultilibs;
1946 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001947 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001948
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001949 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001950
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001951 auto MAbi64 =
1952 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001953
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001954 ImgMultilibs =
1955 MultilibSet()
1956 .Maybe(Mips64r6)
1957 .Maybe(MAbi64)
1958 .Maybe(LittleEndian)
1959 .FilterOut(NonExistent)
1960 .setIncludeDirsCallback([](StringRef InstallDir,
1961 StringRef TripleStr, const Multilib &M) {
1962 std::vector<std::string> Dirs;
1963 Dirs.push_back((InstallDir + "/include").str());
1964 Dirs.push_back(
1965 (InstallDir + "/../../../../sysroot/usr/include").str());
1966 return Dirs;
1967 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00001968 }
1969
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001970 StringRef CPUName;
1971 StringRef ABIName;
1972 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
1973
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001974 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1975
1976 Multilib::flags_list Flags;
1977 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
1978 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
1979 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001980 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001981 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00001982 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001983 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00001984 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001985 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001986 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
1987 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001988 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001989 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001990 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00001991 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
1992 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001993 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
1994 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001995 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001996 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001997 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001998 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001999
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002000 if (TargetTriple.isAndroid()) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002001 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00002002 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2003 Result.Multilibs = AndroidMipsMultilibs;
2004 return true;
2005 }
2006 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002007 }
2008
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002009 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2010 TargetTriple.getOS() == llvm::Triple::Linux &&
2011 TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment) {
2012 if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2013 Result.Multilibs = MuslMipsMultilibs;
2014 return true;
2015 }
2016 return false;
2017 }
2018
Daniel Sanders2bf13662014-07-10 14:40:57 +00002019 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
2020 TargetTriple.getOS() == llvm::Triple::Linux &&
2021 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
2022 // Select mips-img-linux-gnu toolchain.
2023 if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
2024 Result.Multilibs = ImgMultilibs;
2025 return true;
2026 }
2027 return false;
2028 }
2029
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002030 // Sort candidates. Toolchain that best meets the directories goes first.
2031 // Then select the first toolchains matches command line flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002032 MultilibSet *candidates[] = {&DebianMipsMultilibs, &FSFMipsMultilibs,
2033 &CSMipsMultilibs};
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002034 std::sort(
2035 std::begin(candidates), std::end(candidates),
2036 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
2037 for (const auto &candidate : candidates) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00002038 if (candidate->select(Flags, Result.SelectedMultilib)) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002039 if (candidate == &DebianMipsMultilibs)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002040 Result.BiarchSibling = Multilib();
2041 Result.Multilibs = *candidate;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002042 return true;
2043 }
2044 }
2045
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002046 {
2047 // Fallback to the regular toolchain-tree structure.
2048 Multilib Default;
2049 Result.Multilibs.push_back(Default);
2050 Result.Multilibs.FilterOut(NonExistent);
2051
2052 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2053 Result.BiarchSibling = Multilib();
2054 return true;
2055 }
2056 }
2057
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002058 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002059}
2060
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002061static bool findBiarchMultilibs(const Driver &D,
2062 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002063 StringRef Path, const ArgList &Args,
2064 bool NeedsBiarchSuffix,
2065 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002066 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2067 // in what would normally be GCCInstallPath and put the 64-bit
2068 // libs in a subdirectory named 64. The simple logic we follow is that
2069 // *if* there is a subdirectory of the right name with crtbegin.o in it,
2070 // we use that. If not, and if not a biarch triple alias, we look for
2071 // crtbegin.o without the subdirectory.
2072
2073 Multilib Default;
2074 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002075 .gccSuffix("/64")
2076 .includeSuffix("/64")
2077 .flag("-m32")
2078 .flag("+m64")
2079 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002080 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002081 .gccSuffix("/32")
2082 .includeSuffix("/32")
2083 .flag("+m32")
2084 .flag("-m64")
2085 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00002086 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002087 .gccSuffix("/x32")
2088 .includeSuffix("/x32")
2089 .flag("-m32")
2090 .flag("-m64")
2091 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002092
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002093 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002094
Zinovy Nis1db95732014-07-10 15:27:19 +00002095 // Determine default multilib from: 32, 64, x32
2096 // Also handle cases such as 64 on 32, 32 on 64, etc.
2097 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00002098 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00002099 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002100 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002101 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002102 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002103 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00002104 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002105 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00002106 if (TargetTriple.isArch32Bit())
2107 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002108 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00002109 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002110 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002111 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00002112 }
2113
Zinovy Nis1db95732014-07-10 15:27:19 +00002114 if (Want == WANT32)
2115 Default.flag("+m32").flag("-m64").flag("-mx32");
2116 else if (Want == WANT64)
2117 Default.flag("-m32").flag("+m64").flag("-mx32");
2118 else if (Want == WANTX32)
2119 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002120 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002121 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002122
Simon Atanasyan60280b42014-05-12 07:37:51 +00002123 Result.Multilibs.push_back(Default);
2124 Result.Multilibs.push_back(Alt64);
2125 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00002126 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002127
Simon Atanasyan60280b42014-05-12 07:37:51 +00002128 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002129
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002130 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002131 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002132 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002133 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002134
Simon Atanasyan60280b42014-05-12 07:37:51 +00002135 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002136 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002137
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002138 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00002139 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002140 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002141
2142 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00002143}
2144
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002145void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2146 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2147 const std::string &LibDir, StringRef CandidateTriple,
2148 bool NeedsBiarchSuffix) {
2149 // Solaris is a special case. The GCC installation is under
2150 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2151 // need to iterate twice.
2152 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002153 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2154 !EC && LI != LE; LI = LI.increment(EC)) {
2155 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002156 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2157
2158 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002159 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002160 continue; // Saw this path before; no need to look at it again.
2161 if (CandidateVersion.isOlderThan(4, 1, 1))
2162 continue;
2163 if (CandidateVersion <= Version)
2164 continue;
2165
2166 GCCInstallPath =
2167 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002168 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002169 continue;
2170
2171 // If we make it here there has to be at least one GCC version, let's just
2172 // use the latest one.
2173 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002174 for (vfs::directory_iterator
2175 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2176 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002177 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2178
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002179 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002180 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2181
2182 if (CandidateSubVersion > Version)
2183 Version = CandidateSubVersion;
2184 }
2185
2186 GCCTriple.setTriple(CandidateTriple);
2187
2188 GCCInstallPath += "/" + Version.Text;
2189 GCCParentLibPath = GCCInstallPath + "/../../../../";
2190
2191 IsValid = true;
2192 }
2193}
2194
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002195void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002196 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002197 const std::string &LibDir, StringRef CandidateTriple,
2198 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002199 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002200 // There are various different suffixes involving the triple we
2201 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002202 // up to the lib directory. Specifically, the number of "up" steps
2203 // in the second half of each row is 1 + the number of path separators
2204 // in the first half.
2205 const std::string LibAndInstallSuffixes[][2] = {
2206 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2207
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002208 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002209 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2210
2211 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2212 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002213
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002214 // The Freescale PPC SDK has the gcc libraries in
2215 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002216 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002217
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002218 // Ubuntu has a strange mis-matched pair of triples that this happens to
2219 // match.
2220 // FIXME: It may be worthwhile to generalize this and look for a second
2221 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002222 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2223
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002224 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2225 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2226 NeedsBiarchSuffix);
2227 return;
2228 }
2229
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002230 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002231 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2232 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002233 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002234 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002235 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002236 for (vfs::directory_iterator
2237 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2238 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002239 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002240 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002241 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002242 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002243 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002244 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002245 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002246 continue;
2247 if (CandidateVersion <= Version)
2248 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002249
Simon Atanasyan60280b42014-05-12 07:37:51 +00002250 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002251
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002252 // Debian mips multilibs behave more like the rest of the biarch ones,
2253 // so handle them there
2254 if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002255 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002256 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002257 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002258 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002259 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002260 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002261
Simon Atanasyan60280b42014-05-12 07:37:51 +00002262 Multilibs = Detected.Multilibs;
2263 SelectedMultilib = Detected.SelectedMultilib;
2264 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002265 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002266 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002267 // FIXME: We hack together the directory name here instead of
2268 // using LI to ensure stable path separators across Windows and
2269 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002270 GCCInstallPath =
2271 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2272 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002273 IsValid = true;
2274 }
2275 }
2276}
2277
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002278Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002279 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002280 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002281 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002282 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002283 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002284}
2285
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002286Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002287
Rafael Espindola7cf32212013-03-20 03:05:54 +00002288Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002289 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002290 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002291 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002292 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002293 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002294 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002295 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002296 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002297 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002298 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002299 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002300 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002301}
2302
Rafael Espindola7cf32212013-03-20 03:05:54 +00002303Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002304 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002305}
2306
Douglas Katzman95354292015-06-23 20:42:09 +00002307Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002308
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002309void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2310 // Print the information about how we detected the GCC installation.
2311 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002312 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002313}
2314
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002315bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002316 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002317}
2318
David Majnemer17f448b2015-06-28 04:23:33 +00002319bool Generic_GCC::isPICDefault() const {
2320 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2321}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002322
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002323bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002324
David Majnemer17f448b2015-06-28 04:23:33 +00002325bool Generic_GCC::isPICDefaultForced() const {
2326 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2327}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002328
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002329bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002330 switch (getTriple().getArch()) {
2331 case llvm::Triple::x86:
2332 case llvm::Triple::x86_64:
2333 case llvm::Triple::aarch64:
2334 case llvm::Triple::aarch64_be:
2335 case llvm::Triple::arm:
2336 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002337 case llvm::Triple::bpfel:
2338 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002339 case llvm::Triple::thumb:
2340 case llvm::Triple::thumbeb:
2341 case llvm::Triple::ppc:
2342 case llvm::Triple::ppc64:
2343 case llvm::Triple::ppc64le:
2344 case llvm::Triple::sparc:
2345 case llvm::Triple::sparcel:
2346 case llvm::Triple::sparcv9:
2347 case llvm::Triple::systemz:
2348 return true;
2349 default:
2350 return false;
2351 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002352}
2353
James Y Knighta6c9ee72015-10-16 18:46:26 +00002354/// \brief Helper to add the variant paths of a libstdc++ installation.
2355bool Generic_GCC::addLibStdCXXIncludePaths(
2356 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2357 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2358 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2359 if (!getVFS().exists(Base + Suffix))
2360 return false;
2361
2362 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2363
2364 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2365 // that path exists or we have neither a GCC nor target multiarch triple, use
2366 // this vanilla search path.
2367 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2368 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2369 addSystemInclude(DriverArgs, CC1Args,
2370 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2371 } else {
2372 // Otherwise try to use multiarch naming schemes which have normalized the
2373 // triples and put the triple before the suffix.
2374 //
2375 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2376 // the target triple, so we support that here.
2377 addSystemInclude(DriverArgs, CC1Args,
2378 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2379 addSystemInclude(DriverArgs, CC1Args,
2380 Base + "/" + TargetMultiarchTriple + Suffix);
2381 }
2382
2383 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2384 return true;
2385}
2386
2387
Kristof Beylsfb387292014-01-10 13:44:34 +00002388void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2389 ArgStringList &CC1Args) const {
2390 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002391 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002392 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002393 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002394 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002395 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002396 getTriple().getOS() == llvm::Triple::NaCl ||
2397 (getTriple().getVendor() == llvm::Triple::MipsTechnologies &&
2398 !getTriple().hasEnvironment());
Kristof Beylsfb387292014-01-10 13:44:34 +00002399
2400 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002401 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002402 CC1Args.push_back("-fuse-init-array");
2403}
2404
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002405/// Mips Toolchain
2406MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
2407 const llvm::Triple &Triple,
2408 const ArgList &Args)
2409 : Linux(D, Triple, Args) {
2410 // Select the correct multilib according to the given arguments.
2411 DetectedMultilibs Result;
2412 findMIPSMultilibs(D, Triple, "", Args, Result);
2413 Multilibs = Result.Multilibs;
2414 SelectedMultilib = Result.SelectedMultilib;
2415
2416 // Find out the library suffix based on the ABI.
2417 LibSuffix = tools::mips::getMipsABILibSuffix(Args, Triple);
2418 getFilePaths().clear();
2419 getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix);
2420
2421 // Use LLD by default.
2422 if (!Args.getLastArg(options::OPT_fuse_ld_EQ))
2423 Linker = GetProgramPath("lld");
2424}
2425
2426void MipsLLVMToolChain::AddClangSystemIncludeArgs(
2427 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2428 if (DriverArgs.hasArg(options::OPT_nostdinc))
2429 return;
2430
2431 const Driver &D = getDriver();
2432
2433 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2434 SmallString<128> P(D.ResourceDir);
2435 llvm::sys::path::append(P, "include");
2436 addSystemInclude(DriverArgs, CC1Args, P);
2437 }
2438
2439 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2440 return;
2441
2442 const auto &Callback = Multilibs.includeDirsCallback();
2443 if (Callback) {
2444 const auto IncludePaths =
2445 Callback(D.getInstalledDir(), getTripleString(), SelectedMultilib);
2446 for (const auto &Path : IncludePaths)
2447 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
2448 }
2449}
2450
2451Tool *MipsLLVMToolChain::buildLinker() const {
2452 return new tools::gnutools::Linker(*this);
2453}
2454
2455std::string MipsLLVMToolChain::computeSysRoot() const {
2456 if (!getDriver().SysRoot.empty())
2457 return getDriver().SysRoot + SelectedMultilib.osSuffix();
2458
2459 const std::string InstalledDir(getDriver().getInstalledDir());
2460 std::string SysRootPath =
2461 InstalledDir + "/../sysroot" + SelectedMultilib.osSuffix();
2462 if (llvm::sys::fs::exists(SysRootPath))
2463 return SysRootPath;
2464
2465 return std::string();
2466}
2467
2468ToolChain::CXXStdlibType
2469MipsLLVMToolChain::GetCXXStdlibType(const ArgList &Args) const {
2470 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2471 if (A) {
2472 StringRef Value = A->getValue();
2473 if (Value != "libc++")
2474 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2475 << A->getAsString(Args);
2476 }
2477
2478 return ToolChain::CST_Libcxx;
2479}
2480
2481void MipsLLVMToolChain::AddClangCXXStdlibIncludeArgs(
2482 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2483 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2484 DriverArgs.hasArg(options::OPT_nostdincxx))
2485 return;
2486
2487 assert((GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) &&
2488 "Only -lc++ (aka libcxx) is suported in this toolchain.");
2489
2490 const auto &Callback = Multilibs.includeDirsCallback();
2491 if (Callback) {
2492 const auto IncludePaths = Callback(getDriver().getInstalledDir(),
2493 getTripleString(), SelectedMultilib);
2494 for (const auto &Path : IncludePaths) {
2495 if (llvm::sys::fs::exists(Path + "/c++/v1")) {
2496 addSystemInclude(DriverArgs, CC1Args, Path + "/c++/v1");
2497 break;
2498 }
2499 }
2500 }
2501}
2502
2503void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2504 ArgStringList &CmdArgs) const {
2505 assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
2506 "Only -lc++ (aka libxx) is suported in this toolchain.");
2507
2508 CmdArgs.push_back("-lc++");
2509 CmdArgs.push_back("-lc++abi");
2510 CmdArgs.push_back("-lunwind");
2511}
2512
2513std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
2514 StringRef Component,
2515 bool Shared) const {
2516 SmallString<128> Path(getDriver().ResourceDir);
2517 llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
2518 getOS());
2519 llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" +
Vasileios Kalintirisbbc99302015-11-16 15:41:30 +00002520 "mips" + (Shared ? ".so" : ".a")));
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002521 return Path.str();
2522}
2523
Tony Linthicum76329bf2011-12-12 21:14:55 +00002524/// Hexagon Toolchain
2525
Douglas Katzman54366072015-07-27 16:53:08 +00002526std::string HexagonToolChain::GetGnuDir(const std::string &InstalledDir,
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002527 const ArgList &Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002528 // Locate the rest of the toolchain ...
Samuel Antaoc909c992014-11-07 17:48:03 +00002529 std::string GccToolchain = getGCCToolchainDir(Args);
2530
2531 if (!GccToolchain.empty())
2532 return GccToolchain;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002533
2534 std::string InstallRelDir = InstalledDir + "/../../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002535 if (getVFS().exists(InstallRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002536 return InstallRelDir;
2537
2538 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002539 if (getVFS().exists(PrefixRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002540 return PrefixRelDir;
2541
2542 return InstallRelDir;
2543}
2544
Douglas Katzman54366072015-07-27 16:53:08 +00002545const char *HexagonToolChain::GetSmallDataThreshold(const ArgList &Args) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002546 Arg *A;
2547
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002548 A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002549 options::OPT_msmall_data_threshold_EQ);
2550 if (A)
2551 return A->getValue();
2552
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002553 A = Args.getLastArg(options::OPT_shared, options::OPT_fpic,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002554 options::OPT_fPIC);
2555 if (A)
2556 return "0";
2557
Hans Wennborgdcfba332015-10-06 23:40:43 +00002558 return nullptr;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002559}
2560
Douglas Katzman54366072015-07-27 16:53:08 +00002561bool HexagonToolChain::UsesG0(const char *smallDataThreshold) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002562 return smallDataThreshold && smallDataThreshold[0] == '0';
2563}
2564
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002565static void GetHexagonLibraryPaths(const HexagonToolChain &TC,
2566 const ArgList &Args, const std::string &Ver,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002567 const std::string &MarchString,
2568 const std::string &InstalledDir,
2569 ToolChain::path_list *LibPaths) {
Matthew Curtise689b052012-12-06 15:46:07 +00002570 bool buildingLib = Args.hasArg(options::OPT_shared);
2571
2572 //----------------------------------------------------------------------------
2573 // -L Args
2574 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002575 for (Arg *A : Args.filtered(options::OPT_L))
2576 for (const char *Value : A->getValues())
2577 LibPaths->push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002578
2579 //----------------------------------------------------------------------------
2580 // Other standard paths
2581 //----------------------------------------------------------------------------
2582 const std::string MarchSuffix = "/" + MarchString;
2583 const std::string G0Suffix = "/G0";
2584 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002585 const std::string RootDir = TC.GetGnuDir(InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00002586
2587 // lib/gcc/hexagon/...
2588 std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
2589 if (buildingLib) {
2590 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
2591 LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
2592 }
2593 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
2594 LibPaths->push_back(LibGCCHexagonDir + Ver);
2595
2596 // lib/gcc/...
2597 LibPaths->push_back(RootDir + "lib/gcc");
2598
2599 // hexagon/lib/...
2600 std::string HexagonLibDir = RootDir + "hexagon/lib";
2601 if (buildingLib) {
2602 LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
2603 LibPaths->push_back(HexagonLibDir + G0Suffix);
2604 }
2605 LibPaths->push_back(HexagonLibDir + MarchSuffix);
2606 LibPaths->push_back(HexagonLibDir);
2607}
2608
Douglas Katzman54366072015-07-27 16:53:08 +00002609HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
2610 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002611 : Linux(D, Triple, Args) {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002612 const std::string InstalledDir(getDriver().getInstalledDir());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002613 const std::string GnuDir = GetGnuDir(InstalledDir, Args);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002614
2615 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2616 // program paths
2617 const std::string BinDir(GnuDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002618 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002619 getProgramPaths().push_back(BinDir);
2620
2621 // Determine version of GCC libraries and headers to use.
2622 const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
Rafael Espindolac0809172014-06-12 14:02:15 +00002623 std::error_code ec;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002624 GCCVersion MaxVersion = GCCVersion::Parse("0.0.0");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002625 for (vfs::directory_iterator di = D.getVFS().dir_begin(HexagonDir, ec), de;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002626 !ec && di != de; di = di.increment(ec)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002627 GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->getName()));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002628 if (MaxVersion < cv)
2629 MaxVersion = cv;
2630 }
2631 GCCLibAndIncVersion = MaxVersion;
Matthew Curtise689b052012-12-06 15:46:07 +00002632
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002633 ToolChain::path_list *LibPaths = &getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002634
2635 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2636 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2637 // support 'linux' we'll need to fix this up
2638 LibPaths->clear();
2639
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002640 GetHexagonLibraryPaths(*this, Args, GetGCCLibAndIncVersion(),
2641 GetTargetCPU(Args), InstalledDir, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002642}
2643
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002644HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002645
Douglas Katzman54366072015-07-27 16:53:08 +00002646Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002647 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002648}
2649
Douglas Katzman54366072015-07-27 16:53:08 +00002650Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002651 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002652}
2653
Douglas Katzman54366072015-07-27 16:53:08 +00002654void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2655 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002656 const Driver &D = getDriver();
2657
2658 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2659 DriverArgs.hasArg(options::OPT_nostdlibinc))
2660 return;
2661
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002662 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002663 std::string GnuDir = GetGnuDir(D.InstalledDir, DriverArgs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002664 std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
2665 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
2666 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
2667 addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002668}
2669
Douglas Katzman54366072015-07-27 16:53:08 +00002670void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2671 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002672 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2673 DriverArgs.hasArg(options::OPT_nostdincxx))
2674 return;
2675
2676 const Driver &D = getDriver();
2677 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002678 SmallString<128> IncludeDir(GetGnuDir(D.InstalledDir, DriverArgs));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002679
Rafael Espindola358256c2013-06-26 02:13:00 +00002680 llvm::sys::path::append(IncludeDir, "hexagon/include/c++/");
2681 llvm::sys::path::append(IncludeDir, Ver);
Yaron Keren92e1b622015-03-18 10:17:07 +00002682 addSystemInclude(DriverArgs, CC1Args, IncludeDir);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002683}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002684
Matthew Curtise689b052012-12-06 15:46:07 +00002685ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002686HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002687 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2688 if (!A)
2689 return ToolChain::CST_Libstdcxx;
2690
2691 StringRef Value = A->getValue();
2692 if (Value != "libstdc++") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002693 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002694 }
2695
2696 return ToolChain::CST_Libstdcxx;
2697}
2698
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002699static int getHexagonVersion(const ArgList &Args) {
2700 Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ);
2701 // Select the default CPU (v4) if none was given.
2702 if (!A)
2703 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002704
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002705 // FIXME: produce errors if we cannot parse the version.
2706 StringRef WhichHexagon = A->getValue();
2707 if (WhichHexagon.startswith("hexagonv")) {
2708 int Val;
2709 if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val))
2710 return Val;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002711 }
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002712 if (WhichHexagon.startswith("v")) {
2713 int Val;
2714 if (!WhichHexagon.substr(1).getAsInteger(10, Val))
2715 return Val;
2716 }
2717
2718 // FIXME: should probably be an error.
2719 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002720}
2721
Douglas Katzman54366072015-07-27 16:53:08 +00002722StringRef HexagonToolChain::GetTargetCPU(const ArgList &Args) {
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002723 int V = getHexagonVersion(Args);
2724 // FIXME: We don't support versions < 4. We should error on them.
2725 switch (V) {
2726 default:
2727 llvm_unreachable("Unexpected version");
2728 case 5:
2729 return "v5";
2730 case 4:
2731 return "v4";
2732 case 3:
2733 return "v3";
2734 case 2:
2735 return "v2";
2736 case 1:
2737 return "v1";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002738 }
Matthew Curtisf10a5952012-12-06 14:16:43 +00002739}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002740// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002741
Tom Stellard8fa33092015-07-18 01:49:05 +00002742/// AMDGPU Toolchain
2743AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2744 const ArgList &Args)
2745 : Generic_ELF(D, Triple, Args) { }
2746
2747Tool *AMDGPUToolChain::buildLinker() const {
2748 return new tools::amdgpu::Linker(*this);
2749}
2750// End AMDGPU
2751
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002752/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00002753NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2754 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002755 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002756
2757 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2758 // default paths, and must instead only use the paths provided
2759 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002760 path_list &file_paths = getFilePaths();
2761 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002762
2763 file_paths.clear();
2764 prog_paths.clear();
2765
2766 // Path for library files (libc.a, ...)
2767 std::string FilePath(getDriver().Dir + "/../");
2768
2769 // Path for tools (clang, ld, etc..)
2770 std::string ProgPath(getDriver().Dir + "/../");
2771
2772 // Path for toolchain libraries (libgcc.a, ...)
2773 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2774
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002775 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00002776 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002777 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00002778 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002779 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2780 file_paths.push_back(ToolPath + "i686-nacl");
2781 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002782 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002783 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2784 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2785 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2786 file_paths.push_back(ToolPath + "x86_64-nacl");
2787 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002788 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002789 file_paths.push_back(FilePath + "arm-nacl/lib");
2790 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2791 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2792 file_paths.push_back(ToolPath + "arm-nacl");
2793 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002794 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002795 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2796 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2797 prog_paths.push_back(ProgPath + "bin");
2798 file_paths.push_back(ToolPath + "mipsel-nacl");
2799 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002800 default:
2801 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002802 }
2803
2804 // Use provided linker, not system linker
Derek Schuffef465d72015-08-24 23:53:25 +00002805 Linker = GetLinkerPath();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002806 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2807}
2808
Douglas Katzman54366072015-07-27 16:53:08 +00002809void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2810 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002811 const Driver &D = getDriver();
2812 if (DriverArgs.hasArg(options::OPT_nostdinc))
2813 return;
2814
2815 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2816 SmallString<128> P(D.ResourceDir);
2817 llvm::sys::path::append(P, "include");
2818 addSystemInclude(DriverArgs, CC1Args, P.str());
2819 }
2820
2821 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2822 return;
2823
2824 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002825 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00002826 case llvm::Triple::x86:
2827 // x86 is special because multilib style uses x86_64-nacl/include for libc
2828 // headers but the SDK wants i686-nacl/usr/include. The other architectures
2829 // have the same substring.
2830 llvm::sys::path::append(P, "i686-nacl/usr/include");
2831 addSystemInclude(DriverArgs, CC1Args, P.str());
2832 llvm::sys::path::remove_filename(P);
2833 llvm::sys::path::remove_filename(P);
2834 llvm::sys::path::remove_filename(P);
2835 llvm::sys::path::append(P, "x86_64-nacl/include");
2836 addSystemInclude(DriverArgs, CC1Args, P.str());
2837 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002838 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002839 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002840 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002841 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002842 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002843 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002844 case llvm::Triple::mipsel:
2845 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2846 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002847 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002848 return;
2849 }
2850
2851 addSystemInclude(DriverArgs, CC1Args, P.str());
2852 llvm::sys::path::remove_filename(P);
2853 llvm::sys::path::remove_filename(P);
2854 llvm::sys::path::append(P, "include");
2855 addSystemInclude(DriverArgs, CC1Args, P.str());
2856}
2857
Douglas Katzman54366072015-07-27 16:53:08 +00002858void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2859 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002860 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2861 // if the value is libc++, and emits an error for other values.
2862 GetCXXStdlibType(Args);
2863 CmdArgs.push_back("-lc++");
2864}
2865
Douglas Katzman54366072015-07-27 16:53:08 +00002866void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2867 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002868 const Driver &D = getDriver();
2869 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2870 DriverArgs.hasArg(options::OPT_nostdincxx))
2871 return;
2872
2873 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2874 // if the value is libc++, and emits an error for other values.
2875 GetCXXStdlibType(DriverArgs);
2876
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002877 SmallString<128> P(D.Dir + "/../");
2878 switch (getTriple().getArch()) {
2879 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002880 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2881 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002882 break;
2883 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002884 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2885 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002886 break;
2887 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002888 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2889 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002890 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002891 case llvm::Triple::mipsel:
2892 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2893 addSystemInclude(DriverArgs, CC1Args, P.str());
2894 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002895 default:
2896 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002897 }
2898}
2899
Douglas Katzman54366072015-07-27 16:53:08 +00002900ToolChain::CXXStdlibType
2901NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002902 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2903 StringRef Value = A->getValue();
2904 if (Value == "libc++")
2905 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002906 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002907 }
2908
2909 return ToolChain::CST_Libcxx;
2910}
2911
Douglas Katzman54366072015-07-27 16:53:08 +00002912std::string
2913NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2914 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002915 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2916 if (TheTriple.getArch() == llvm::Triple::arm &&
2917 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2918 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2919 return TheTriple.getTriple();
2920}
2921
Douglas Katzman54366072015-07-27 16:53:08 +00002922Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002923 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002924}
2925
Douglas Katzman54366072015-07-27 16:53:08 +00002926Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002927 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002928 return new tools::nacltools::AssemblerARM(*this);
2929 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002930}
2931// End NaCl
2932
Chris Lattner09797542010-03-04 21:07:38 +00002933/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2934/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2935/// Currently does not support anything else but compilation.
2936
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002937TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002938 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002939 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002940 // Path mangling to find libexec
2941 std::string Path(getDriver().Dir);
2942
2943 Path += "/../libexec";
2944 getProgramPaths().push_back(Path);
2945}
2946
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002947TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002948
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002949bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002950
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002951bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002952
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002953bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002954
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002955bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002956
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002957// CloudABI - CloudABI tool chain which can call ld(1) directly.
2958
2959CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2960 const ArgList &Args)
2961 : Generic_ELF(D, Triple, Args) {
2962 SmallString<128> P(getDriver().Dir);
2963 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2964 getFilePaths().push_back(P.str());
2965}
2966
2967void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2968 ArgStringList &CC1Args) const {
2969 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2970 DriverArgs.hasArg(options::OPT_nostdincxx))
2971 return;
2972
2973 SmallString<128> P(getDriver().Dir);
2974 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2975 addSystemInclude(DriverArgs, CC1Args, P.str());
2976}
2977
2978void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
2979 ArgStringList &CmdArgs) const {
2980 CmdArgs.push_back("-lc++");
2981 CmdArgs.push_back("-lc++abi");
2982 CmdArgs.push_back("-lunwind");
2983}
2984
Douglas Katzman95354292015-06-23 20:42:09 +00002985Tool *CloudABI::buildLinker() const {
2986 return new tools::cloudabi::Linker(*this);
2987}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002988
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002989/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
2990
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002991OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
2992 const ArgList &Args)
2993 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00002994 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002995 getFilePaths().push_back("/usr/lib");
2996}
2997
Rafael Espindola7cf32212013-03-20 03:05:54 +00002998Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002999 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003000}
3001
Douglas Katzman95354292015-06-23 20:42:09 +00003002Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003003
Eli Friedman9fa28852012-08-08 23:57:20 +00003004/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
3005
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003006Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3007 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003008 getFilePaths().push_back(getDriver().Dir + "/../lib");
3009 getFilePaths().push_back("/usr/lib");
3010}
3011
Rafael Espindola7cf32212013-03-20 03:05:54 +00003012Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003013 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003014}
3015
Douglas Katzman95354292015-06-23 20:42:09 +00003016Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00003017
Douglas Katzman95354292015-06-23 20:42:09 +00003018ToolChain::CXXStdlibType Bitrig::GetCXXStdlibType(const ArgList &Args) const {
Richard Smith51af5192014-05-01 23:24:24 +00003019 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3020 StringRef Value = A->getValue();
3021 if (Value == "libstdc++")
3022 return ToolChain::CST_Libstdcxx;
3023 if (Value == "libc++")
3024 return ToolChain::CST_Libcxx;
3025
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003026 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Richard Smith51af5192014-05-01 23:24:24 +00003027 }
3028 return ToolChain::CST_Libcxx;
3029}
3030
Eli Friedman9fa28852012-08-08 23:57:20 +00003031void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3032 ArgStringList &CC1Args) const {
3033 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3034 DriverArgs.hasArg(options::OPT_nostdincxx))
3035 return;
3036
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003037 switch (GetCXXStdlibType(DriverArgs)) {
3038 case ToolChain::CST_Libcxx:
3039 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00003040 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003041 break;
3042 case ToolChain::CST_Libstdcxx:
3043 addSystemInclude(DriverArgs, CC1Args,
3044 getDriver().SysRoot + "/usr/include/c++/stdc++");
3045 addSystemInclude(DriverArgs, CC1Args,
3046 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00003047
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003048 StringRef Triple = getTriple().str();
3049 if (Triple.startswith("amd64"))
3050 addSystemInclude(DriverArgs, CC1Args,
3051 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003052 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003053 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003054 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
3055 "/usr/include/c++/stdc++/" +
3056 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003057 break;
3058 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003059}
3060
3061void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
3062 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003063 switch (GetCXXStdlibType(Args)) {
3064 case ToolChain::CST_Libcxx:
3065 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00003066 CmdArgs.push_back("-lc++abi");
3067 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003068 break;
3069 case ToolChain::CST_Libstdcxx:
3070 CmdArgs.push_back("-lstdc++");
3071 break;
3072 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003073}
3074
Daniel Dunbare24297c2009-03-30 21:06:03 +00003075/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
3076
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003077FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
3078 const ArgList &Args)
3079 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00003080
Chandler Carruth0b1756b2012-01-26 01:35:15 +00003081 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
3082 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003083 if ((Triple.getArch() == llvm::Triple::x86 ||
3084 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003085 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003086 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
3087 else
3088 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00003089}
3090
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003091ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
David Chisnall867ccd82013-11-09 15:10:56 +00003092 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3093 StringRef Value = A->getValue();
3094 if (Value == "libstdc++")
3095 return ToolChain::CST_Libstdcxx;
3096 if (Value == "libc++")
3097 return ToolChain::CST_Libcxx;
3098
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003099 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
David Chisnall867ccd82013-11-09 15:10:56 +00003100 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003101 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00003102 return ToolChain::CST_Libcxx;
3103 return ToolChain::CST_Libstdcxx;
3104}
3105
3106void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3107 ArgStringList &CC1Args) const {
3108 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3109 DriverArgs.hasArg(options::OPT_nostdincxx))
3110 return;
3111
3112 switch (GetCXXStdlibType(DriverArgs)) {
3113 case ToolChain::CST_Libcxx:
3114 addSystemInclude(DriverArgs, CC1Args,
3115 getDriver().SysRoot + "/usr/include/c++/v1");
3116 break;
3117 case ToolChain::CST_Libstdcxx:
3118 addSystemInclude(DriverArgs, CC1Args,
3119 getDriver().SysRoot + "/usr/include/c++/4.2");
3120 addSystemInclude(DriverArgs, CC1Args,
3121 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
3122 break;
3123 }
3124}
3125
Rafael Espindola7cf32212013-03-20 03:05:54 +00003126Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003127 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003128}
3129
Douglas Katzman95354292015-06-23 20:42:09 +00003130Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00003131
Tim Northovere931f9f2015-10-30 16:30:41 +00003132bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003133 // FreeBSD uses SjLj exceptions on ARM oabi.
3134 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00003135 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003136 case llvm::Triple::GNUEABI:
3137 case llvm::Triple::EABI:
3138 return false;
3139
3140 default:
3141 return (getTriple().getArch() == llvm::Triple::arm ||
3142 getTriple().getArch() == llvm::Triple::thumb);
3143 }
3144}
3145
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003146bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003147
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003148bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003149
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003150SanitizerMask FreeBSD::getSupportedSanitizers() const {
3151 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3152 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3153 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3154 getTriple().getArch() == llvm::Triple::mips64el;
3155 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3156 Res |= SanitizerKind::Address;
3157 Res |= SanitizerKind::Vptr;
3158 if (IsX86_64 || IsMIPS64) {
3159 Res |= SanitizerKind::Leak;
3160 Res |= SanitizerKind::Thread;
3161 }
3162 if (IsX86 || IsX86_64) {
3163 Res |= SanitizerKind::SafeStack;
3164 }
3165 return Res;
3166}
3167
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003168/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3169
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003170NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3171 : Generic_ELF(D, Triple, Args) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003172
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003173 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003174 // When targeting a 32-bit platform, try the special directory used on
3175 // 64-bit hosts, and only fall back to the main library directory if that
3176 // doesn't work.
3177 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3178 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003179 switch (Triple.getArch()) {
3180 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003181 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003182 break;
3183 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003184 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003185 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003186 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003187 switch (Triple.getEnvironment()) {
3188 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003189 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003190 getFilePaths().push_back("=/usr/lib/eabi");
3191 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003192 case llvm::Triple::EABIHF:
3193 case llvm::Triple::GNUEABIHF:
3194 getFilePaths().push_back("=/usr/lib/eabihf");
3195 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003196 default:
3197 getFilePaths().push_back("=/usr/lib/oabi");
3198 break;
3199 }
3200 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003201 case llvm::Triple::mips64:
3202 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003203 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003204 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003205 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003206 getFilePaths().push_back("=/usr/lib/64");
3207 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003208 case llvm::Triple::ppc:
3209 getFilePaths().push_back("=/usr/lib/powerpc");
3210 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003211 case llvm::Triple::sparc:
3212 getFilePaths().push_back("=/usr/lib/sparc");
3213 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003214 default:
3215 break;
3216 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003217
3218 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003219 }
3220}
3221
Rafael Espindola7cf32212013-03-20 03:05:54 +00003222Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003223 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003224}
3225
Douglas Katzman95354292015-06-23 20:42:09 +00003226Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003227
Douglas Katzman95354292015-06-23 20:42:09 +00003228ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003229 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3230 StringRef Value = A->getValue();
3231 if (Value == "libstdc++")
3232 return ToolChain::CST_Libstdcxx;
3233 if (Value == "libc++")
3234 return ToolChain::CST_Libcxx;
3235
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003236 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003237 }
3238
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003239 unsigned Major, Minor, Micro;
3240 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003241 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003242 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003243 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003244 case llvm::Triple::arm:
3245 case llvm::Triple::armeb:
3246 case llvm::Triple::thumb:
3247 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003248 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003249 case llvm::Triple::ppc64:
3250 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003251 case llvm::Triple::x86:
3252 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003253 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003254 default:
3255 break;
3256 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003257 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003258 return ToolChain::CST_Libstdcxx;
3259}
3260
3261void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3262 ArgStringList &CC1Args) const {
3263 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3264 DriverArgs.hasArg(options::OPT_nostdincxx))
3265 return;
3266
3267 switch (GetCXXStdlibType(DriverArgs)) {
3268 case ToolChain::CST_Libcxx:
3269 addSystemInclude(DriverArgs, CC1Args,
3270 getDriver().SysRoot + "/usr/include/c++/");
3271 break;
3272 case ToolChain::CST_Libstdcxx:
3273 addSystemInclude(DriverArgs, CC1Args,
3274 getDriver().SysRoot + "/usr/include/g++");
3275 addSystemInclude(DriverArgs, CC1Args,
3276 getDriver().SysRoot + "/usr/include/g++/backward");
3277 break;
3278 }
3279}
3280
Chris Lattner3e2ee142010-07-07 16:01:42 +00003281/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3282
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003283Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3284 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003285 getFilePaths().push_back(getDriver().Dir + "/../lib");
3286 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003287}
3288
Rafael Espindola7cf32212013-03-20 03:05:54 +00003289Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003290 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003291}
3292
Douglas Katzman95354292015-06-23 20:42:09 +00003293Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003294
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003295static void addPathIfExists(const Driver &D, const Twine &Path,
3296 ToolChain::path_list &Paths) {
3297 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003298 Paths.push_back(Path.str());
3299}
3300
David Chisnallf571cde2012-02-15 13:39:01 +00003301/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3302
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003303Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003304 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003305 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003306
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003307 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003308
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003309 path_list &Paths = getFilePaths();
3310 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003311 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003312
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003313 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003314 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003315 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003316
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003317 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003318
3319 std::string LibPath = "/usr/lib/";
3320 switch (Triple.getArch()) {
3321 case llvm::Triple::x86:
3322 case llvm::Triple::sparc:
3323 break;
3324 case llvm::Triple::x86_64:
3325 LibPath += "amd64/";
3326 break;
3327 case llvm::Triple::sparcv9:
3328 LibPath += "sparcv9/";
3329 break;
3330 default:
3331 llvm_unreachable("Unsupported architecture");
3332 }
3333
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003334 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003335}
3336
Rafael Espindola7cf32212013-03-20 03:05:54 +00003337Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003338 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003339}
3340
Douglas Katzman95354292015-06-23 20:42:09 +00003341Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003342
Rafael Espindolad5117262015-09-09 13:36:00 +00003343void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3344 ArgStringList &CC1Args) const {
3345 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3346 DriverArgs.hasArg(options::OPT_nostdincxx))
3347 return;
3348
3349 // Include the support directory for things like xlocale and fudged system
3350 // headers.
3351 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3352
3353 if (GCCInstallation.isValid()) {
3354 GCCVersion Version = GCCInstallation.getVersion();
3355 addSystemInclude(DriverArgs, CC1Args,
3356 getDriver().SysRoot + "/usr/gcc/" +
3357 Version.MajorStr + "." +
3358 Version.MinorStr +
3359 "/include/c++/" + Version.Text);
3360 addSystemInclude(DriverArgs, CC1Args,
3361 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3362 "." + Version.MinorStr + "/include/c++/" +
3363 Version.Text + "/" +
3364 GCCInstallation.getTriple().str());
3365 }
3366}
3367
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003368/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003369
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003370enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003371 // NB: Releases of a particular Linux distro should be kept together
3372 // in this enum, because some tests are done by integer comparison against
3373 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003374 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003375 DebianLenny,
3376 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003377 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003378 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003379 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003380 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003381 RHEL4,
3382 RHEL5,
3383 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003384 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003385 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003386 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003387 UbuntuHardy,
3388 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003389 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003390 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003391 UbuntuLucid,
3392 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003393 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003394 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003395 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003396 UbuntuQuantal,
3397 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003398 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003399 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003400 UbuntuUtopic,
3401 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003402 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003403 UbuntuXenial,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003404 UnknownDistro
3405};
3406
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003407static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003408 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003409}
3410
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003411static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003412
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003413static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003414 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003415}
3416
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003417static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003418 return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003419}
3420
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003421static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003422 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3423 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3424 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003425 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003426 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003427 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003428 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003429 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003430 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3431 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3432 .Case("hardy", UbuntuHardy)
3433 .Case("intrepid", UbuntuIntrepid)
3434 .Case("jaunty", UbuntuJaunty)
3435 .Case("karmic", UbuntuKarmic)
3436 .Case("lucid", UbuntuLucid)
3437 .Case("maverick", UbuntuMaverick)
3438 .Case("natty", UbuntuNatty)
3439 .Case("oneiric", UbuntuOneiric)
3440 .Case("precise", UbuntuPrecise)
3441 .Case("quantal", UbuntuQuantal)
3442 .Case("raring", UbuntuRaring)
3443 .Case("saucy", UbuntuSaucy)
3444 .Case("trusty", UbuntuTrusty)
3445 .Case("utopic", UbuntuUtopic)
3446 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003447 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003448 .Case("xenial", UbuntuXenial)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003449 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003450 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003451 }
3452
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003453 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3454 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003455 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003456 if (Data.startswith("Fedora release"))
3457 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003458 if (Data.startswith("Red Hat Enterprise Linux") ||
3459 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003460 if (Data.find("release 7") != StringRef::npos)
3461 return RHEL7;
3462 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003463 return RHEL6;
3464 else if (Data.find("release 5") != StringRef::npos)
3465 return RHEL5;
3466 else if (Data.find("release 4") != StringRef::npos)
3467 return RHEL4;
3468 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003469 return UnknownDistro;
3470 }
3471
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003472 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3473 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003474 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003475 if (Data[0] == '5')
3476 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003477 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003478 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003479 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003480 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003481 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003482 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003483 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3484 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003485 return UnknownDistro;
3486 }
3487
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003488 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003489 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003490
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003491 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003492 return Exherbo;
3493
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003494 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003495 return ArchLinux;
3496
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003497 return UnknownDistro;
3498}
3499
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003500/// \brief Get our best guess at the multiarch triple for a target.
3501///
3502/// Debian-based systems are starting to use a multiarch setup where they use
3503/// a target-triple directory in the library and header search paths.
3504/// Unfortunately, this triple does not align with the vanilla target triple,
3505/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003506static std::string getMultiarchTriple(const Driver &D,
3507 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003508 StringRef SysRoot) {
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003509 llvm::Triple::EnvironmentType TargetEnvironment = TargetTriple.getEnvironment();
3510
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003511 // For most architectures, just use whatever we have rather than trying to be
3512 // clever.
3513 switch (TargetTriple.getArch()) {
3514 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003515 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003516
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003517 // We use the existence of '/lib/<triple>' as a directory to detect some
3518 // common linux triples that don't quite match the Clang triple for both
3519 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3520 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003521 case llvm::Triple::arm:
3522 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003523 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003524 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003525 return "arm-linux-gnueabihf";
3526 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003527 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003528 return "arm-linux-gnueabi";
3529 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003530 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003531 case llvm::Triple::armeb:
3532 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003533 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003534 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003535 return "armeb-linux-gnueabihf";
3536 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003537 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003538 return "armeb-linux-gnueabi";
3539 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003540 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003541 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003542 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003543 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003544 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003545 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003546 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003547 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003548 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003549 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003550 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003551 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003552 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003553 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003554 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003555 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003556 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003557 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003558 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003559 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003560 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003561 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003562 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003563 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003564 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003565 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003566 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003567 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003568 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003569 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003570 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003571 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003572 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003573 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003574 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003575 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003576 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003577 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003578 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003579 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003580 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003581 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003582 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003583 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003584 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003585 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003586 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003587 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003588 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003589 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003590 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003591 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003592 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003593 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003594 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003595 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003596 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003597 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003598 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003599 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003600 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003601 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003602 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003603 return "s390x-linux-gnu";
3604 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003605 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003606 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003607}
3608
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003609static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003610 if (isMipsArch(Triple.getArch())) {
3611 // lib32 directory has a special meaning on MIPS targets.
3612 // It contains N32 ABI binaries. Use this folder if produce
3613 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003614 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003615 return "lib32";
3616 return Triple.isArch32Bit() ? "lib" : "lib64";
3617 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003618
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003619 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003620 // using that variant while targeting other architectures causes problems
3621 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003622 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003623 // them when we know we may need it.
3624 //
3625 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003626 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003627 // GCCInstallationDetector, but that is a more significant refactoring.
3628 if (Triple.getArch() == llvm::Triple::x86 ||
3629 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003630 return "lib32";
3631
Zinovy Nis1db95732014-07-10 15:27:19 +00003632 if (Triple.getArch() == llvm::Triple::x86_64 &&
3633 Triple.getEnvironment() == llvm::Triple::GNUX32)
3634 return "libx32";
3635
Simon Atanasyand4413882012-09-14 11:27:24 +00003636 return Triple.isArch32Bit() ? "lib" : "lib64";
3637}
3638
Rafael Espindola1af7c212012-02-19 01:38:32 +00003639Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003640 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003641 GCCInstallation.init(Triple, Args);
3642 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003643 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003644 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003645 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003646
Rafael Espindola10a63c22013-07-03 14:14:00 +00003647 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003648 // least) put various tools in a triple-prefixed directory off of the parent
3649 // of the GCC installation. We use the GCC triple here to ensure that we end
3650 // up with tools that support the same amount of cross compiling as the
3651 // detected GCC installation. For example, if we find a GCC installation
3652 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3653 // used to target i386.
3654 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003655 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003656 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003657 GCCInstallation.getTriple().str() + "/bin")
3658 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003659
Logan Chieneb9162f2014-06-26 14:23:45 +00003660 Linker = GetLinkerPath();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003661
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003662 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003663
Rafael Espindola10a63c22013-07-03 14:14:00 +00003664 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003665 ExtraOpts.push_back("-z");
3666 ExtraOpts.push_back("relro");
3667 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003668
Douglas Gregord9bb1522011-03-06 19:11:49 +00003669 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003670 ExtraOpts.push_back("-X");
3671
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003672 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003673 const bool IsMips = isMipsArch(Arch);
3674
3675 if (IsMips && !SysRoot.empty())
3676 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003677
Chandler Carruth0b842912011-12-09 04:45:18 +00003678 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3679 // and the MIPS ABI require .dynsym to be sorted in different ways.
3680 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3681 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003682 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003683 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003684 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003685 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003686 ExtraOpts.push_back("--hash-style=gnu");
3687
Rafael Espindola10a63c22013-07-03 14:14:00 +00003688 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003689 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3690 ExtraOpts.push_back("--hash-style=both");
3691 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003692
Chris Lattner84e38552011-05-22 05:36:06 +00003693 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003694 ExtraOpts.push_back("--no-add-needed");
3695
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003696 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003697 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003698 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003699 ExtraOpts.push_back("--build-id");
3700
Rafael Espindola10a63c22013-07-03 14:14:00 +00003701 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003702 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003703
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003704 // The selection of paths to try here is designed to match the patterns which
3705 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3706 // This was determined by running GCC in a fake filesystem, creating all
3707 // possible permutations of these directories, and seeing which ones it added
3708 // to the link paths.
3709 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003710
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003711 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003712 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003713
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003714 // Add the multilib suffixed paths where they are available.
3715 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003716 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003717 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003718 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003719
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003720 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003721 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003722 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003723 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003724
3725 // GCC cross compiling toolchains will install target libraries which ship
3726 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3727 // any part of the GCC installation in
3728 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3729 // debatable, but is the reality today. We need to search this tree even
3730 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003731 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003732 // installation that is *not* within the system root to ensure two things:
3733 //
3734 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003735 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003736 // appropriate rpath.
3737 // 2) There must not be libraries installed into
3738 // <prefix>/<triple>/<libdir> unless they should be preferred over
3739 // those within the system root.
3740 //
3741 // Note that this matches the GCC behavior. See the below comment for where
3742 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003743 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
3744 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003745 Paths);
3746
Chandler Carruth69a125b2012-04-06 16:32:06 +00003747 // If the GCC installation we found is inside of the sysroot, we want to
3748 // prefer libraries installed in the parent prefix of the GCC installation.
3749 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003750 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003751 // This usually happens when there is an external cross compiler on the
3752 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003753 // the cross. Note that GCC does include some of these directories in some
3754 // configurations but this seems somewhere between questionable and simply
3755 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003756 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003757 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
3758 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003759 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003760 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003761
3762 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003763 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003764 // those searched.
3765 // FIXME: It's not clear whether we should use the driver's installed
3766 // directory ('Dir' below) or the ResourceDir.
3767 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003768 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
3769 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003770 }
3771
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003772 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
3773 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
3774 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3775 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003776
Chandler Carruthb427c562013-06-22 11:35:51 +00003777 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003778 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003779 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003780 addPathIfExists(D,
3781 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003782 "/../../" + OSLibDir,
3783 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003784
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003785 // Add the 'other' biarch variant path
3786 Multilib BiarchSibling;
3787 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003788 addPathIfExists(D, GCCInstallation.getInstallPath() +
3789 BiarchSibling.gccSuffix(),
3790 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003791 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003792
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003793 // See comments above on the multilib variant for details of why this is
3794 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003795 const std::string &LibPath = GCCInstallation.getParentLibPath();
3796 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3797 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003798 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
3799 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003800 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003801
3802 // See comments above on the multilib variant for details of why this is
3803 // only included from within the sysroot.
3804 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003805 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003806 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003807
3808 // Similar to the logic for GCC above, if we are currently running Clang
3809 // inside of the requested system root, add its parent library path to those
3810 // searched.
3811 // FIXME: It's not clear whether we should use the driver's installed
3812 // directory ('Dir' below) or the ResourceDir.
3813 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003814 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003815
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003816 addPathIfExists(D, SysRoot + "/lib", Paths);
3817 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003818}
3819
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003820bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003821
Douglas Katzman95354292015-06-23 20:42:09 +00003822Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003823
3824Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003825 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003826}
3827
Simon Atanasyana0d89572013-10-05 14:37:55 +00003828std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003829 if (!getDriver().SysRoot.empty())
3830 return getDriver().SysRoot;
3831
3832 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3833 return std::string();
3834
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003835 // Standalone MIPS toolchains use different names for sysroot folder
3836 // and put it into different places. Here we try to check some known
3837 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003838
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003839 const StringRef InstallDir = GCCInstallation.getInstallPath();
3840 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003841 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003842
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003843 std::string Path =
3844 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3845 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003846
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003847 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003848 return Path;
3849
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003850 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003851
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003852 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003853 return Path;
3854
3855 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003856}
3857
Chandler Carrutha796f532011-11-05 20:17:13 +00003858void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3859 ArgStringList &CC1Args) const {
3860 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003861 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003862
3863 if (DriverArgs.hasArg(options::OPT_nostdinc))
3864 return;
3865
3866 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003867 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003868
3869 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003870 SmallString<128> P(D.ResourceDir);
3871 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003872 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003873 }
3874
3875 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3876 return;
3877
3878 // Check for configure-time C include directories.
3879 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3880 if (CIncludeDirs != "") {
3881 SmallVector<StringRef, 5> dirs;
3882 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003883 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003884 StringRef Prefix =
3885 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003886 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003887 }
3888 return;
3889 }
3890
3891 // Lacking those, try to detect the correct set of system includes for the
3892 // target triple.
3893
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003894 // Add include directories specific to the selected multilib set and multilib.
3895 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003896 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003897 if (Callback) {
3898 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3899 GCCInstallation.getTriple().str(),
3900 GCCInstallation.getMultilib());
3901 for (const auto &Path : IncludePaths)
3902 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3903 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003904 }
3905
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003906 // Implement generic Debian multiarch support.
3907 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003908 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003909
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003910 // FIXME: These are older forms of multiarch. It's not clear that they're
3911 // in use in any released version of Debian, so we should consider
3912 // removing them.
3913 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003914 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003915 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003916
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003917 // FIXME: These are older forms of multiarch. It's not clear that they're
3918 // in use in any released version of Debian, so we should consider
3919 // removing them.
3920 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3921 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003922 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003923 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003924 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003925 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003926 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003927 "/usr/include/arm-linux-gnueabihf"};
3928 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003929 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003930 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003931 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003932 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003933 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003934 "/usr/include/mips64el-linux-gnu",
3935 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003936 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003937 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003938 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003939 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003940 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003941 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003942 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003943 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003944 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003945 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003946 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
3947 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003948 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003949 switch (getTriple().getArch()) {
3950 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003951 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003952 break;
3953 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003954 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003955 break;
3956 case llvm::Triple::aarch64:
3957 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003958 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003959 break;
3960 case llvm::Triple::arm:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003961 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3962 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3963 else
3964 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003965 break;
3966 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00003967 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003968 break;
3969 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00003970 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003971 break;
3972 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003973 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003974 break;
3975 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003976 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003977 break;
3978 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003979 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003980 break;
3981 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003982 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003983 break;
3984 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003985 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003986 break;
3987 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00003988 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003989 break;
3990 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00003991 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003992 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003993 case llvm::Triple::systemz:
3994 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
3995 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003996 default:
3997 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003998 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003999 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004000 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004001 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004002 break;
4003 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004004 }
4005
4006 if (getTriple().getOS() == llvm::Triple::RTEMS)
4007 return;
4008
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004009 // Add an include of '/include' directly. This isn't provided by default by
4010 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
4011 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004012 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004013
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004014 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004015}
4016
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004017
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004018static std::string DetectLibcxxIncludePath(StringRef base) {
4019 std::error_code EC;
4020 int MaxVersion = 0;
4021 std::string MaxVersionString = "";
4022 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
4023 LI = LI.increment(EC)) {
4024 StringRef VersionText = llvm::sys::path::filename(LI->path());
4025 int Version;
4026 if (VersionText[0] == 'v' &&
4027 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
4028 if (Version > MaxVersion) {
4029 MaxVersion = Version;
4030 MaxVersionString = VersionText;
4031 }
4032 }
4033 }
4034 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
4035}
4036
Chandler Carrutha796f532011-11-05 20:17:13 +00004037void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4038 ArgStringList &CC1Args) const {
4039 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4040 DriverArgs.hasArg(options::OPT_nostdincxx))
4041 return;
4042
Chandler Carruthf4701732011-11-07 09:01:17 +00004043 // Check if libc++ has been enabled and provide its include paths if so.
4044 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004045 const std::string LibCXXIncludePathCandidates[] = {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004046 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004047
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004048 // We also check the system as for a long time this is the only place
4049 // Clang looked.
4050 // FIXME: We should really remove this. It doesn't make any sense.
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004051 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++")};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004052 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004053 if (IncludePath.empty() || !getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004054 continue;
4055 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004056 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004057 break;
4058 }
Chandler Carruthf4701732011-11-07 09:01:17 +00004059 return;
4060 }
4061
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00004062 // We need a detected GCC installation on Linux to provide libstdc++'s
4063 // headers. We handled the libc++ case above.
4064 if (!GCCInstallation.isValid())
4065 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00004066
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004067 // By default, look for the C++ headers in an include directory adjacent to
4068 // the lib directory of the GCC installation. Note that this is expect to be
4069 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
4070 StringRef LibDir = GCCInstallation.getParentLibPath();
4071 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004072 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004073 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004074 const std::string GCCMultiarchTriple = getMultiarchTriple(
4075 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004076 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004077 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00004078 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004079
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004080 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00004081 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004082 "/c++/" + Version.Text, TripleStr,
4083 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004084 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004085 return;
4086
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004087 // Otherwise, fall back on a bunch of options which don't use multiarch
4088 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004089 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004090 // Gentoo is weird and places its headers inside the GCC install,
4091 // so if the first attempt to find the headers fails, try these patterns.
4092 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
4093 Version.MinorStr,
4094 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
4095 // Android standalone toolchain has C++ headers in yet another place.
4096 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4097 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
4098 // without a subdirectory corresponding to the gcc version.
4099 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004100 };
4101
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004102 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004103 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
4104 /*GCCMultiarchTriple*/ "",
4105 /*TargetMultiarchTriple*/ "",
4106 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004107 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004108 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004109}
4110
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004111bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004112
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004113SanitizerMask Linux::getSupportedSanitizers() const {
4114 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
4115 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
4116 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
4117 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00004118 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
4119 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004120 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
4121 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004122 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4123 Res |= SanitizerKind::Address;
4124 Res |= SanitizerKind::KernelAddress;
4125 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00004126 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004127 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004128 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00004129 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004130 Res |= SanitizerKind::Leak;
Renato Golind45c2df2015-08-05 18:42:41 +00004131 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004132 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00004133 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00004134 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004135 if (IsX86 || IsX86_64) {
4136 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004137 }
4138 return Res;
4139}
4140
Xinliang David Li170cd102015-10-27 05:15:35 +00004141void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
4142 llvm::opt::ArgStringList &CmdArgs) const {
4143 if (!needsProfileRT(Args)) return;
4144
4145 // Add linker option -u__llvm_runtime_variable to cause runtime
4146 // initialization module to be linked in.
4147 if (!Args.hasArg(options::OPT_coverage))
4148 CmdArgs.push_back(Args.MakeArgString(
4149 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
4150 ToolChain::addProfileRTLibs(Args, CmdArgs);
4151}
4152
Daniel Dunbarcc912342009-05-02 18:28:39 +00004153/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
4154
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004155DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
4156 const ArgList &Args)
4157 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00004158
4159 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00004160 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00004161 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00004162 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004163
Daniel Dunbar083edf72009-12-21 18:54:17 +00004164 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004165 getFilePaths().push_back("/usr/lib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004166 if (D.getVFS().exists("/usr/lib/gcc47"))
John McCall65b8da02013-04-11 22:55:55 +00004167 getFilePaths().push_back("/usr/lib/gcc47");
4168 else
4169 getFilePaths().push_back("/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004170}
4171
Rafael Espindola7cf32212013-03-20 03:05:54 +00004172Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004173 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004174}
4175
4176Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004177 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004178}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004179
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004180/// Stub for CUDA toolchain. At the moment we don't have assembler or
4181/// linker and need toolchain mainly to propagate device-side options
4182/// to CC1.
4183
4184CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4185 const ArgList &Args)
4186 : Linux(D, Triple, Args) {}
4187
4188void
4189CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4190 llvm::opt::ArgStringList &CC1Args) const {
4191 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4192 CC1Args.push_back("-fcuda-is-device");
4193}
4194
4195llvm::opt::DerivedArgList *
4196CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
4197 const char *BoundArch) const {
4198 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
4199 const OptTable &Opts = getDriver().getOpts();
4200
4201 for (Arg *A : Args) {
4202 if (A->getOption().matches(options::OPT_Xarch__)) {
4203 // Skip this argument unless the architecture matches BoundArch
4204 if (A->getValue(0) != StringRef(BoundArch))
4205 continue;
4206
4207 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
4208 unsigned Prev = Index;
4209 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
4210
4211 // If the argument parsing failed or more than one argument was
4212 // consumed, the -Xarch_ argument's parameter tried to consume
4213 // extra arguments. Emit an error and ignore.
4214 //
4215 // We also want to disallow any options which would alter the
4216 // driver behavior; that isn't going to work in our model. We
4217 // use isDriverOption() as an approximation, although things
4218 // like -O4 are going to slip through.
4219 if (!XarchArg || Index > Prev + 1) {
4220 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
4221 << A->getAsString(Args);
4222 continue;
4223 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
4224 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
4225 << A->getAsString(Args);
4226 continue;
4227 }
4228 XarchArg->setBaseArg(A);
4229 A = XarchArg.release();
4230 DAL->AddSynthesizedArg(A);
4231 }
4232 DAL->append(A);
4233 }
4234
4235 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
4236 return DAL;
4237}
4238
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004239/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00004240XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
4241 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004242 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004243 // ProgramPaths are found via 'PATH' environment variable.
4244}
4245
Douglas Katzman54366072015-07-27 16:53:08 +00004246Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004247 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004248}
4249
Douglas Katzman54366072015-07-27 16:53:08 +00004250Tool *XCoreToolChain::buildLinker() const {
4251 return new tools::XCore::Linker(*this);
4252}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004253
Douglas Katzman54366072015-07-27 16:53:08 +00004254bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004255
Douglas Katzman54366072015-07-27 16:53:08 +00004256bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004257
Douglas Katzman54366072015-07-27 16:53:08 +00004258bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004259
Douglas Katzman54366072015-07-27 16:53:08 +00004260bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004261
Douglas Katzman54366072015-07-27 16:53:08 +00004262bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004263
Douglas Katzman54366072015-07-27 16:53:08 +00004264void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4265 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004266 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
4267 DriverArgs.hasArg(options::OPT_nostdlibinc))
4268 return;
4269 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
4270 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004271 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004272 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4273 ArrayRef<StringRef> DirVec(Dirs);
4274 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4275 }
4276}
4277
Douglas Katzman54366072015-07-27 16:53:08 +00004278void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
4279 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004280 CC1Args.push_back("-nostdsysteminc");
4281}
4282
Douglas Katzman54366072015-07-27 16:53:08 +00004283void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
4284 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004285 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00004286 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4287 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004288 return;
4289 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
4290 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004291 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004292 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4293 ArrayRef<StringRef> DirVec(Dirs);
4294 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4295 }
4296}
4297
Douglas Katzman54366072015-07-27 16:53:08 +00004298void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
4299 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004300 // We don't output any lib args. This is handled by xcc.
4301}
Douglas Katzman84a75642015-06-19 14:55:19 +00004302
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004303MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
4304 const ArgList &Args)
4305 : Generic_GCC(D, Triple, Args) {
4306 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
4307 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
4308 // This won't work to find gcc. Instead we give the installation detector an
4309 // extra triple, which is preferable to further hacks of the logic that at
4310 // present is based solely on getArch(). In particular, it would be wrong to
4311 // choose the myriad installation when targeting a non-myriad sparc install.
4312 switch (Triple.getArch()) {
4313 default:
4314 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName() << "myriad";
4315 case llvm::Triple::sparc:
4316 case llvm::Triple::sparcel:
4317 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004318 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004319 }
4320}
4321
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00004322MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004323
Douglas Katzmanb1278f32015-09-17 21:20:16 +00004324void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4325 ArgStringList &CC1Args) const {
4326 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4327 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4328}
4329
James Y Knighta6c9ee72015-10-16 18:46:26 +00004330void MyriadToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4331 ArgStringList &CC1Args) const {
4332 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4333 DriverArgs.hasArg(options::OPT_nostdincxx))
4334 return;
4335
4336 // Only libstdc++, for now.
4337 StringRef LibDir = GCCInstallation.getParentLibPath();
4338 const GCCVersion &Version = GCCInstallation.getVersion();
4339 StringRef TripleStr = GCCInstallation.getTriple().str();
4340 const Multilib &Multilib = GCCInstallation.getMultilib();
4341
4342 addLibStdCXXIncludePaths(LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4343 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
4344}
4345
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004346// MyriadToolChain handles several triples:
4347// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
4348Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4349 // The inherited method works fine if not targeting the SHAVE.
4350 if (!isShaveCompilation(getTriple()))
4351 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004352 switch (JA.getKind()) {
4353 case Action::CompileJobClass:
4354 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004355 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004356 return Compiler.get();
4357 case Action::AssembleJobClass:
4358 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004359 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004360 return Assembler.get();
4361 default:
4362 return ToolChain::getTool(JA.getKind());
4363 }
4364}
4365
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004366void MyriadToolChain::getCompilerSupportDir(std::string &Dir) const {
4367 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4368 // These files are tied to a particular version of gcc.
4369 SmallString<128> Result(GCCInstallation.getInstallPath());
4370 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4371 // but as this toolchain is for LEON sparc, it can assume FPU.
4372 if (this->getTriple().getArch() == llvm::Triple::sparcel)
4373 llvm::sys::path::append(Result, "le");
4374 Dir.assign(Result.str());
4375}
4376void MyriadToolChain::getBuiltinLibDir(std::string &Dir) const {
4377 // The contents of LibDir are independent of the version of gcc.
4378 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4379 SmallString<128> Result(GCCInstallation.getParentLibPath());
4380 if (this->getTriple().getArch() == llvm::Triple::sparcel)
4381 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib/le");
4382 else
4383 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib");
4384 Dir.assign(Result.str());
Douglas Katzman84a75642015-06-19 14:55:19 +00004385}
4386
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004387Tool *MyriadToolChain::buildLinker() const {
4388 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004389}
Dan Gohmanc2853072015-09-03 22:51:53 +00004390
4391bool WebAssembly::IsMathErrnoDefault() const { return false; }
4392
4393bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4394
4395bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4396
4397bool WebAssembly::isPICDefault() const { return false; }
4398
4399bool WebAssembly::isPIEDefault() const { return false; }
4400
4401bool WebAssembly::isPICDefaultForced() const { return false; }
4402
4403bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4404
4405// TODO: Support Objective C stuff.
4406bool WebAssembly::SupportsObjCGC() const { return false; }
4407
4408bool WebAssembly::hasBlocksRuntime() const { return false; }
4409
4410// TODO: Support profiling.
4411bool WebAssembly::SupportsProfiling() const { return false; }
4412
4413void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4414 ArgStringList &CC1Args) const {
4415 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4416 options::OPT_fno_use_init_array, true))
4417 CC1Args.push_back("-fuse-init-array");
4418}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004419
4420PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4421 : Generic_ELF(D, Triple, Args) {
4422 if (Args.hasArg(options::OPT_static))
4423 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4424
4425 // Determine where to find the PS4 libraries. We use SCE_PS4_SDK_DIR
4426 // if it exists; otherwise use the driver's installation path, which
4427 // should be <SDK_DIR>/host_tools/bin.
4428
4429 SmallString<512> PS4SDKDir;
4430 if (const char *EnvValue = getenv("SCE_PS4_SDK_DIR")) {
4431 if (!llvm::sys::fs::exists(EnvValue))
4432 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4433 PS4SDKDir = EnvValue;
4434 } else {
4435 PS4SDKDir = getDriver().Dir;
4436 llvm::sys::path::append(PS4SDKDir, "/../../");
4437 }
4438
4439 // By default, the driver won't report a warning if it can't find
4440 // PS4's include or lib directories. This behavior could be changed if
4441 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
4442 // If -isysroot was passed, use that as the SDK base path.
4443 std::string PrefixDir;
4444 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4445 PrefixDir = A->getValue();
4446 if (!llvm::sys::fs::exists(PrefixDir))
4447 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4448 } else
4449 PrefixDir = PS4SDKDir.str();
4450
4451 SmallString<512> PS4SDKIncludeDir(PrefixDir);
4452 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4453 if (!Args.hasArg(options::OPT_nostdinc) &&
4454 !Args.hasArg(options::OPT_nostdlibinc) &&
4455 !Args.hasArg(options::OPT_isysroot) &&
4456 !Args.hasArg(options::OPT__sysroot_EQ) &&
4457 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4458 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4459 << "PS4 system headers" << PS4SDKIncludeDir;
4460 }
4461
4462 SmallString<512> PS4SDKLibDir(PS4SDKDir);
4463 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4464 if (!Args.hasArg(options::OPT_nostdlib) &&
4465 !Args.hasArg(options::OPT_nodefaultlibs) &&
4466 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
4467 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
4468 !Args.hasArg(options::OPT_emit_ast) &&
4469 !llvm::sys::fs::exists(PS4SDKLibDir)) {
4470 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4471 << "PS4 system libraries" << PS4SDKLibDir;
4472 return;
4473 }
4474 getFilePaths().push_back(PS4SDKLibDir.str());
4475}
4476
4477Tool *PS4CPU::buildAssembler() const {
4478 return new tools::PS4cpu::Assemble(*this);
4479}
4480
4481Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
4482
4483bool PS4CPU::isPICDefault() const { return true; }
4484
4485bool PS4CPU::HasNativeLLVMSupport() const { return true; }
4486
4487SanitizerMask PS4CPU::getSupportedSanitizers() const {
4488 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4489 Res |= SanitizerKind::Address;
4490 Res |= SanitizerKind::Vptr;
4491 return Res;
4492}