blob: e8a2d833d3cb1568568992325c0b7cee024e9ce1 [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"
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +000028#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000029#include "llvm/Support/FileSystem.h"
Rafael Espindolac8f008f2010-11-07 20:14:31 +000030#include "llvm/Support/MemoryBuffer.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000031#include "llvm/Support/Path.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000032#include "llvm/Support/Program.h"
Renato Golin33e1f822015-05-28 15:49:28 +000033#include "llvm/Support/TargetParser.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000034#include "llvm/Support/raw_ostream.h"
Daniel Dunbarb5023e92009-04-10 21:00:07 +000035#include <cstdlib> // ::getenv
Rafael Espindola8a8e5542014-06-12 17:19:42 +000036#include <system_error>
Daniel Dunbarb5023e92009-04-10 21:00:07 +000037
Daniel Dunbar59e5e882009-03-20 00:20:03 +000038using namespace clang::driver;
39using namespace clang::driver::toolchains;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000040using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000041using namespace llvm::opt;
Daniel Dunbar59e5e882009-03-20 00:20:03 +000042
Douglas Katzmana67e50c2015-06-26 15:47:46 +000043MachO::MachO(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
44 : ToolChain(D, Triple, Args) {
Tim Northover15ff71d2014-05-22 13:12:14 +000045 // We expect 'as', 'ld', etc. to be adjacent to our install dir.
46 getProgramPaths().push_back(getDriver().getInstalledDir());
47 if (getDriver().getInstalledDir() != getDriver().Dir)
48 getProgramPaths().push_back(getDriver().Dir);
Tim Northover157d9112014-01-16 08:48:16 +000049}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +000050
Tim Northover157d9112014-01-16 08:48:16 +000051/// Darwin - Darwin tool chain for i386 and x86_64.
Alexey Samsonov905c8022015-06-18 21:46:05 +000052Darwin::Darwin(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
53 : MachO(D, Triple, Args), TargetInitialized(false) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +000054
Tim Northover157d9112014-01-16 08:48:16 +000055types::ID MachO::LookupTypeForExtension(const char *Ext) const {
Daniel Dunbarcc7df6c2010-08-02 05:43:56 +000056 types::ID Ty = types::lookupTypeForExtension(Ext);
57
58 // Darwin always preprocesses assembly files (unless -x is used explicitly).
59 if (Ty == types::TY_PP_Asm)
60 return types::TY_Asm;
61
62 return Ty;
63}
64
Douglas Katzmana67e50c2015-06-26 15:47:46 +000065bool MachO::HasNativeLLVMSupport() const { return true; }
Daniel Dunbar62123a12010-09-17 00:24:52 +000066
John McCall24fc0de2011-07-06 00:26:06 +000067/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
John McCall5fb5df92012-06-20 06:18:46 +000068ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
Tim Northover9c7e0352013-12-12 11:55:52 +000069 if (isTargetIOSBased())
John McCall5fb5df92012-06-20 06:18:46 +000070 return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
Bob Wilson5ad5a952012-11-09 01:59:30 +000071 if (isNonFragile)
72 return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
73 return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
John McCall24fc0de2011-07-06 00:26:06 +000074}
75
John McCall7959fee2011-09-09 20:41:01 +000076/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
77bool Darwin::hasBlocksRuntime() const {
Tim Northover9c7e0352013-12-12 11:55:52 +000078 if (isTargetIOSBased())
John McCall7959fee2011-09-09 20:41:01 +000079 return !isIPhoneOSVersionLT(3, 2);
Tim Northover9c7e0352013-12-12 11:55:52 +000080 else {
Tim Northover157d9112014-01-16 08:48:16 +000081 assert(isTargetMacOS() && "unexpected darwin target");
82 return !isMacosxVersionLT(10, 6);
Tim Northover9c7e0352013-12-12 11:55:52 +000083 }
John McCall7959fee2011-09-09 20:41:01 +000084}
85
Renato Golin33e1f822015-05-28 15:49:28 +000086// This is just a MachO name translation routine and there's no
87// way to join this into ARMTargetParser without breaking all
88// other assumptions. Maybe MachO should consider standardising
89// their nomenclature.
90static const char *ArmMachOArchName(StringRef Arch) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000091 return llvm::StringSwitch<const char *>(Arch)
92 .Case("armv6k", "armv6")
93 .Case("armv6m", "armv6m")
94 .Case("armv5tej", "armv5")
95 .Case("xscale", "xscale")
96 .Case("armv4t", "armv4t")
97 .Case("armv7", "armv7")
98 .Cases("armv7a", "armv7-a", "armv7")
99 .Cases("armv7r", "armv7-r", "armv7")
100 .Cases("armv7em", "armv7e-m", "armv7em")
101 .Cases("armv7k", "armv7-k", "armv7k")
102 .Cases("armv7m", "armv7-m", "armv7m")
103 .Cases("armv7s", "armv7-s", "armv7s")
104 .Default(nullptr);
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000105}
106
Renato Golin33e1f822015-05-28 15:49:28 +0000107static const char *ArmMachOArchNameCPU(StringRef CPU) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000108 unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
Renato Golin33e1f822015-05-28 15:49:28 +0000109 if (ArchKind == llvm::ARM::AK_INVALID)
110 return nullptr;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000111 StringRef Arch = llvm::ARM::getArchName(ArchKind);
Renato Golin33e1f822015-05-28 15:49:28 +0000112
113 // FIXME: Make sure this MachO triple mangling is really necessary.
114 // ARMv5* normalises to ARMv5.
115 if (Arch.startswith("armv5"))
116 Arch = Arch.substr(0, 5);
117 // ARMv6*, except ARMv6M, normalises to ARMv6.
118 else if (Arch.startswith("armv6") && !Arch.endswith("6m"))
119 Arch = Arch.substr(0, 5);
120 // ARMv7A normalises to ARMv7.
121 else if (Arch.endswith("v7a"))
122 Arch = Arch.substr(0, 5);
123 return Arch.data();
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000124}
125
Tim Northover9c7e0352013-12-12 11:55:52 +0000126static bool isSoftFloatABI(const ArgList &Args) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000127 Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
Tim Northover9c7e0352013-12-12 11:55:52 +0000128 options::OPT_mfloat_abi_EQ);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000129 if (!A)
130 return false;
Rafael Auler3f7abf72014-09-29 21:50:34 +0000131
Tim Northover9c7e0352013-12-12 11:55:52 +0000132 return A->getOption().matches(options::OPT_msoft_float) ||
133 (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
134 A->getValue() == StringRef("soft"));
135}
136
Tim Northover157d9112014-01-16 08:48:16 +0000137StringRef MachO::getMachOArchName(const ArgList &Args) const {
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000138 switch (getTriple().getArch()) {
139 default:
Rafael Espindolaed1233e2014-08-28 21:23:05 +0000140 return getDefaultUniversalArchName();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000141
Tim Northover40956e62014-07-23 12:32:58 +0000142 case llvm::Triple::aarch64:
143 return "arm64";
144
Douglas Gregord9bb1522011-03-06 19:11:49 +0000145 case llvm::Triple::thumb:
Hans Wennborgdcfba332015-10-06 23:40:43 +0000146 case llvm::Triple::arm:
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000147 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000148 if (const char *Arch = ArmMachOArchName(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000149 return Arch;
150
151 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000152 if (const char *Arch = ArmMachOArchNameCPU(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000153 return Arch;
154
155 return "arm";
156 }
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000157}
158
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +0000159Darwin::~Darwin() {}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000160
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +0000161MachO::~MachO() {}
Tim Northover157d9112014-01-16 08:48:16 +0000162
163std::string MachO::ComputeEffectiveClangTriple(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000164 types::ID InputType) const {
Tim Northover157d9112014-01-16 08:48:16 +0000165 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
166
167 return Triple.getTriple();
168}
169
Chad Rosierd3a0f952011-09-20 20:44:06 +0000170std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
171 types::ID InputType) const {
172 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000173
174 // If the target isn't initialized (e.g., an unknown Darwin platform, return
175 // the default triple).
176 if (!isTargetInitialized())
177 return Triple.getTriple();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000178
Tim Northover157d9112014-01-16 08:48:16 +0000179 SmallString<16> Str;
180 Str += isTargetIOSBased() ? "ios" : "macosx";
181 Str += getTargetVersion().getAsString();
182 Triple.setOSName(Str);
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000183
184 return Triple.getTriple();
185}
186
David Blaikie68e081d2011-12-20 02:48:34 +0000187void Generic_ELF::anchor() {}
188
Tim Northover157d9112014-01-16 08:48:16 +0000189Tool *MachO::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +0000190 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000191 case Action::LipoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000192 if (!Lipo)
193 Lipo.reset(new tools::darwin::Lipo(*this));
194 return Lipo.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000195 case Action::DsymutilJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000196 if (!Dsymutil)
197 Dsymutil.reset(new tools::darwin::Dsymutil(*this));
198 return Dsymutil.get();
Ben Langmuir9b9a8d32014-02-06 18:53:25 +0000199 case Action::VerifyDebugInfoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000200 if (!VerifyDebug)
201 VerifyDebug.reset(new tools::darwin::VerifyDebug(*this));
202 return VerifyDebug.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +0000203 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000204 return ToolChain::getTool(AC);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000205 }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000206}
207
Douglas Katzman95354292015-06-23 20:42:09 +0000208Tool *MachO::buildLinker() const { return new tools::darwin::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +0000209
Tim Northover157d9112014-01-16 08:48:16 +0000210Tool *MachO::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +0000211 return new tools::darwin::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +0000212}
Daniel Dunbar26d482a2009-09-18 08:15:03 +0000213
Douglas Katzman95354292015-06-23 20:42:09 +0000214DarwinClang::DarwinClang(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +0000215 const ArgList &Args)
Douglas Katzman95354292015-06-23 20:42:09 +0000216 : Darwin(D, Triple, Args) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +0000217
Tim Northover336f1892014-03-29 13:16:12 +0000218void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
219 // For iOS, 64-bit, promote certain warnings to errors.
220 if (!isTargetMacOS() && getTriple().isArch64Bit()) {
221 // Always enable -Wdeprecated-objc-isa-usage and promote it
222 // to an error.
223 CC1Args.push_back("-Wdeprecated-objc-isa-usage");
224 CC1Args.push_back("-Werror=deprecated-objc-isa-usage");
225
226 // Also error about implicit function declarations, as that
227 // can impact calling conventions.
228 CC1Args.push_back("-Werror=implicit-function-declaration");
229 }
230}
231
Tim Northover157d9112014-01-16 08:48:16 +0000232/// \brief Determine whether Objective-C automated reference counting is
233/// enabled.
234static bool isObjCAutoRefCount(const ArgList &Args) {
235 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
236}
237
John McCall31168b02011-06-15 23:02:42 +0000238void DarwinClang::AddLinkARCArgs(const ArgList &Args,
239 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000240 // Avoid linking compatibility stubs on i386 mac.
241 if (isTargetMacOS() && getArch() == llvm::Triple::x86)
242 return;
243
244 ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true);
245
246 if ((runtime.hasNativeARC() || !isObjCAutoRefCount(Args)) &&
247 runtime.hasSubscripting())
248 return;
Eric Christopher551ef452011-08-23 17:56:55 +0000249
250 CmdArgs.push_back("-force_load");
Rafael Espindola358256c2013-06-26 02:13:00 +0000251 SmallString<128> P(getDriver().ClangExecutable);
252 llvm::sys::path::remove_filename(P); // 'clang'
253 llvm::sys::path::remove_filename(P); // 'bin'
Benjamin Kramer17381a02013-06-28 16:25:46 +0000254 llvm::sys::path::append(P, "lib", "arc", "libarclite_");
John McCall31168b02011-06-15 23:02:42 +0000255 // Mash in the platform.
Argyrios Kyrtzidis058b4512011-10-18 17:40:15 +0000256 if (isTargetIOSSimulator())
Rafael Espindola358256c2013-06-26 02:13:00 +0000257 P += "iphonesimulator";
Argyrios Kyrtzidis058b4512011-10-18 17:40:15 +0000258 else if (isTargetIPhoneOS())
Rafael Espindola358256c2013-06-26 02:13:00 +0000259 P += "iphoneos";
John McCall31168b02011-06-15 23:02:42 +0000260 else
Rafael Espindola358256c2013-06-26 02:13:00 +0000261 P += "macosx";
262 P += ".a";
John McCall31168b02011-06-15 23:02:42 +0000263
Rafael Espindola358256c2013-06-26 02:13:00 +0000264 CmdArgs.push_back(Args.MakeArgString(P));
John McCall31168b02011-06-15 23:02:42 +0000265}
266
Tim Northover157d9112014-01-16 08:48:16 +0000267void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
Kuba Brecka2735a0252014-10-31 00:08:57 +0000268 StringRef DarwinLibName, bool AlwaysLink,
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000269 bool IsEmbedded, bool AddRPath) const {
270 SmallString<128> Dir(getDriver().ResourceDir);
271 llvm::sys::path::append(Dir, "lib", IsEmbedded ? "macho_embedded" : "darwin");
272
273 SmallString<128> P(Dir);
274 llvm::sys::path::append(P, DarwinLibName);
Eric Christopher551ef452011-08-23 17:56:55 +0000275
Eric Christopherc235d0c62011-06-22 17:41:40 +0000276 // For now, allow missing resource libraries to support developers who may
Alexey Samsonov8368b372012-11-21 14:17:42 +0000277 // not have compiler-rt checked out or integrated into their build (unless
278 // we explicitly force linking with this library).
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000279 if (AlwaysLink || getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000280 CmdArgs.push_back(Args.MakeArgString(P));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000281
282 // Adding the rpaths might negatively interact when other rpaths are involved,
283 // so we should make sure we add the rpaths last, after all user-specified
284 // rpaths. This is currently true from this place, but we need to be
285 // careful if this function is ever called before user's rpaths are emitted.
286 if (AddRPath) {
287 assert(DarwinLibName.endswith(".dylib") && "must be a dynamic library");
288
289 // Add @executable_path to rpath to support having the dylib copied with
290 // the executable.
291 CmdArgs.push_back("-rpath");
292 CmdArgs.push_back("@executable_path");
293
294 // Add the path to the resource dir to rpath to support using the dylib
295 // from the default location without copying.
296 CmdArgs.push_back("-rpath");
Yaron Keren92e1b622015-03-18 10:17:07 +0000297 CmdArgs.push_back(Args.MakeArgString(Dir));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000298 }
Eric Christopherc235d0c62011-06-22 17:41:40 +0000299}
300
Justin Bogner2fd95f62015-05-12 06:30:48 +0000301void Darwin::addProfileRTLibs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000302 ArgStringList &CmdArgs) const {
Xinliang David Li69306c02015-10-22 06:15:31 +0000303 if (!needsProfileRT(Args)) return;
Justin Bognerc7701242015-05-12 05:44:36 +0000304
305 // Select the appropriate runtime library for the target.
306 if (isTargetIOSBased())
307 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a",
308 /*AlwaysLink*/ true);
309 else
310 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a",
311 /*AlwaysLink*/ true);
Xinliang David Li69306c02015-10-22 06:15:31 +0000312 return;
Justin Bognerc7701242015-05-12 05:44:36 +0000313}
314
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000315void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
316 ArgStringList &CmdArgs,
317 StringRef Sanitizer) const {
318 if (!Args.hasArg(options::OPT_dynamiclib) &&
319 !Args.hasArg(options::OPT_bundle)) {
320 // Sanitizer runtime libraries requires C++.
321 AddCXXStdlibLibArgs(Args, CmdArgs);
322 }
323 assert(isTargetMacOS() || isTargetIOSSimulator());
324 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000325 AddLinkRuntimeLib(
326 Args, CmdArgs,
327 (Twine("libclang_rt.") + Sanitizer + "_" + OS + "_dynamic.dylib").str(),
328 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
329 /*AddRPath*/ true);
Hans Wennborg10821e52015-04-09 18:47:01 +0000330
331 if (GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) {
332 // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
333 // all RTTI-related symbols that UBSan uses.
334 CmdArgs.push_back("-lc++abi");
335 }
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000336}
337
Daniel Dunbar6276f992009-09-18 08:15:13 +0000338void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
339 ArgStringList &CmdArgs) const {
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000340 // Darwin only supports the compiler-rt based runtime libraries.
341 switch (GetRuntimeLibType(Args)) {
342 case ToolChain::RLT_CompilerRT:
343 break;
344 default:
345 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000346 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000347 return;
348 }
349
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000350 // Darwin doesn't support real static executables, don't link any runtime
351 // libraries with -static.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000352 if (Args.hasArg(options::OPT_static) ||
353 Args.hasArg(options::OPT_fapple_kext) ||
354 Args.hasArg(options::OPT_mkernel))
Daniel Dunbar6276f992009-09-18 08:15:13 +0000355 return;
Daniel Dunbar6276f992009-09-18 08:15:13 +0000356
357 // Reject -static-libgcc for now, we can deal with this when and if someone
358 // cares. This is useful in situations where someone wants to statically link
359 // something like libstdc++, and needs its runtime support routines.
360 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000361 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
Daniel Dunbar6276f992009-09-18 08:15:13 +0000362 return;
363 }
364
Peter Collingbourne32701642013-11-01 18:16:25 +0000365 const SanitizerArgs &Sanitize = getSanitizerArgs();
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +0000366 if (Sanitize.needsAsanRt())
367 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
368 if (Sanitize.needsUbsanRt())
369 AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
Daniel Dunbar1d6469f2011-12-01 23:40:18 +0000370
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000371 // Otherwise link libSystem, then the dynamic runtime library, and finally any
372 // target specific static runtime library.
Daniel Dunbar6276f992009-09-18 08:15:13 +0000373 CmdArgs.push_back("-lSystem");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000374
375 // Select the dynamic runtime library and the target specific static library.
Tim Northover9c7e0352013-12-12 11:55:52 +0000376 if (isTargetIOSBased()) {
Daniel Dunbar2f31fb92011-04-30 04:25:16 +0000377 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
378 // it never went into the SDK.
Bob Wilson102be442011-10-07 17:54:41 +0000379 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
Tim Northovera2ee4332014-03-29 15:09:45 +0000380 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
Tim Northover40956e62014-07-23 12:32:58 +0000381 getTriple().getArch() != llvm::Triple::aarch64)
Bob Wilson102be442011-10-07 17:54:41 +0000382 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000383
Daniel Dunbard1076382011-04-18 23:48:36 +0000384 // We currently always need a static runtime library for iOS.
Eric Christopherc235d0c62011-06-22 17:41:40 +0000385 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000386 } else {
Tim Northover9c7e0352013-12-12 11:55:52 +0000387 assert(isTargetMacOS() && "unexpected non MacOS platform");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000388 // The dynamic runtime library was merged with libSystem for 10.6 and
389 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000390 if (isMacosxVersionLT(10, 5))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000391 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000392 else if (isMacosxVersionLT(10, 6))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000393 CmdArgs.push_back("-lgcc_s.10.5");
394
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000395 // For OS X, we thought we would only need a static runtime library when
Chris Lattner57540c52011-04-15 05:22:18 +0000396 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000397 // omitted from 10.4.dylib.
398 //
399 // Unfortunately, that turned out to not be true, because Darwin system
400 // headers can still use eprintf on i386, and it is not exported from
401 // libSystem. Therefore, we still must provide a runtime library just for
402 // the tiny tiny handful of projects that *might* use that symbol.
403 if (isMacosxVersionLT(10, 5)) {
Eric Christopherc235d0c62011-06-22 17:41:40 +0000404 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000405 } else {
406 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopherc235d0c62011-06-22 17:41:40 +0000407 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
408 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000409 }
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000410 }
Daniel Dunbar6276f992009-09-18 08:15:13 +0000411}
412
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000413void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +0000414 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000415
Daniel Dunbar455a0492012-08-17 18:43:50 +0000416 // Support allowing the SDKROOT environment variable used by xcrun and other
417 // Xcode tools to define the default sysroot, by making it the default for
418 // isysroot.
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000419 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
420 // Warn if the path does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000421 if (!getVFS().exists(A->getValue()))
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000422 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
423 } else {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000424 if (char *env = ::getenv("SDKROOT")) {
Daniel Dunbarb2543042013-01-15 20:33:56 +0000425 // We only use this value as the default if it is an absolute path,
426 // exists, and it is not the root path.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000427 if (llvm::sys::path::is_absolute(env) && getVFS().exists(env) &&
Daniel Dunbarb2543042013-01-15 20:33:56 +0000428 StringRef(env) != "/") {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000429 Args.append(Args.MakeSeparateArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000430 nullptr, Opts.getOption(options::OPT_isysroot), env));
Daniel Dunbar455a0492012-08-17 18:43:50 +0000431 }
432 }
433 }
434
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000435 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000436 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
Eli Friedman027e9c32012-01-11 02:41:15 +0000437
Bob Wilson7f294b52014-10-10 23:10:10 +0000438 if (OSXVersion && iOSVersion) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000439 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000440 << OSXVersion->getAsString(Args) << iOSVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000441 iOSVersion = nullptr;
442 } else if (!OSXVersion && !iOSVersion) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000443 // If no deployment target was specified on the command line, check for
Daniel Dunbard54669d2010-01-26 01:45:19 +0000444 // environment defines.
Alexey Samsonov905c8022015-06-18 21:46:05 +0000445 std::string OSXTarget;
446 std::string iOSTarget;
Chad Rosier64707fe2011-08-31 20:56:25 +0000447 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
448 OSXTarget = env;
449 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
450 iOSTarget = env;
Daniel Dunbarb5023e92009-04-10 21:00:07 +0000451
Steven Wu7a1372c2015-06-25 01:59:35 +0000452 // If there is no command-line argument to specify the Target version and
453 // no environment variable defined, see if we can set the default based
454 // on -isysroot.
455 if (iOSTarget.empty() && OSXTarget.empty() &&
456 Args.hasArg(options::OPT_isysroot)) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000457 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000458 StringRef isysroot = A->getValue();
Steven Wu7a1372c2015-06-25 01:59:35 +0000459 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
460 size_t BeginSDK = isysroot.rfind("SDKs/");
461 size_t EndSDK = isysroot.rfind(".sdk");
462 if (BeginSDK != StringRef::npos && EndSDK != StringRef::npos) {
463 StringRef SDK = isysroot.slice(BeginSDK + 5, EndSDK);
464 // Slice the version number out.
465 // Version number is between the first and the last number.
466 size_t StartVer = SDK.find_first_of("0123456789");
467 size_t EndVer = SDK.find_last_of("0123456789");
468 if (StartVer != StringRef::npos && EndVer > StartVer) {
469 StringRef Version = SDK.slice(StartVer, EndVer + 1);
470 if (SDK.startswith("iPhoneOS") ||
471 SDK.startswith("iPhoneSimulator"))
472 iOSTarget = Version;
473 else if (SDK.startswith("MacOSX"))
474 OSXTarget = Version;
475 }
476 }
Chad Rosier64707fe2011-08-31 20:56:25 +0000477 }
478 }
Daniel Dunbard54669d2010-01-26 01:45:19 +0000479
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000480 // If no OSX or iOS target has been specified, try to guess platform
Alexey Samsonov905c8022015-06-18 21:46:05 +0000481 // from arch name and compute the version from the triple.
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000482 if (OSXTarget.empty() && iOSTarget.empty()) {
483 StringRef MachOArchName = getMachOArchName(Args);
Alexey Samsonov905c8022015-06-18 21:46:05 +0000484 unsigned Major, Minor, Micro;
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000485 if (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
Alexey Samsonov905c8022015-06-18 21:46:05 +0000486 MachOArchName == "arm64") {
487 getTriple().getiOSVersion(Major, Minor, Micro);
488 llvm::raw_string_ostream(iOSTarget) << Major << '.' << Minor << '.'
489 << Micro;
490 } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
491 MachOArchName != "armv7em") {
492 if (!getTriple().getMacOSXVersion(Major, Minor, Micro)) {
493 getDriver().Diag(diag::err_drv_invalid_darwin_version)
494 << getTriple().getOSName();
495 }
496 llvm::raw_string_ostream(OSXTarget) << Major << '.' << Minor << '.'
497 << Micro;
498 }
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000499 }
Chad Rosierfe6fd362011-09-28 00:46:32 +0000500
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000501 // Allow conflicts among OSX and iOS for historical reasons, but choose the
502 // default platform.
Chad Rosier64707fe2011-08-31 20:56:25 +0000503 if (!OSXTarget.empty() && !iOSTarget.empty()) {
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000504 if (getTriple().getArch() == llvm::Triple::arm ||
Tim Northover573cbee2014-05-24 12:52:07 +0000505 getTriple().getArch() == llvm::Triple::aarch64 ||
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000506 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosier64707fe2011-08-31 20:56:25 +0000507 OSXTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000508 else
Chad Rosier64707fe2011-08-31 20:56:25 +0000509 iOSTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000510 }
Daniel Dunbar65969842010-01-29 17:02:25 +0000511
Chad Rosier64707fe2011-08-31 20:56:25 +0000512 if (!OSXTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000513 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000514 OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000515 Args.append(OSXVersion);
Chad Rosier64707fe2011-08-31 20:56:25 +0000516 } else if (!iOSTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000517 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000518 iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000519 Args.append(iOSVersion);
Daniel Dunbar84e727f2009-09-04 18:35:21 +0000520 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000521 }
Mike Stump11289f42009-09-09 15:08:12 +0000522
Tim Northover9c7e0352013-12-12 11:55:52 +0000523 DarwinPlatformKind Platform;
524 if (OSXVersion)
525 Platform = MacOS;
526 else if (iOSVersion)
527 Platform = IPhoneOS;
Tim Northover9c7e0352013-12-12 11:55:52 +0000528 else
Tim Northover157d9112014-01-16 08:48:16 +0000529 llvm_unreachable("Unable to infer Darwin variant");
Tim Northover9c7e0352013-12-12 11:55:52 +0000530
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000531 // Set the tool chain target information.
532 unsigned Major, Minor, Micro;
533 bool HadExtra;
Tim Northover9c7e0352013-12-12 11:55:52 +0000534 if (Platform == MacOS) {
Bob Wilson7f294b52014-10-10 23:10:10 +0000535 assert(!iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000536 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, Micro,
537 HadExtra) ||
538 HadExtra || Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000539 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000540 << OSXVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000541 } else if (Platform == IPhoneOS) {
542 assert(iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000543 if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
544 HadExtra) ||
545 HadExtra || Major >= 10 || Minor >= 100 || Micro >= 100)
Eli Friedman027e9c32012-01-11 02:41:15 +0000546 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000547 << iOSVersion->getAsString(Args);
Tim Northover157d9112014-01-16 08:48:16 +0000548 } else
549 llvm_unreachable("unknown kind of Darwin platform");
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000550
Bob Wilson7f294b52014-10-10 23:10:10 +0000551 // Recognize iOS targets with an x86 architecture as the iOS simulator.
Daniel Dunbarb1189432011-04-30 04:18:16 +0000552 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
553 getTriple().getArch() == llvm::Triple::x86_64))
Tim Northover9c7e0352013-12-12 11:55:52 +0000554 Platform = IPhoneOSSimulator;
Daniel Dunbarb1189432011-04-30 04:18:16 +0000555
Tim Northover9c7e0352013-12-12 11:55:52 +0000556 setTarget(Platform, Major, Minor, Micro);
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000557}
558
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000559void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000560 ArgStringList &CmdArgs) const {
561 CXXStdlibType Type = GetCXXStdlibType(Args);
562
563 switch (Type) {
564 case ToolChain::CST_Libcxx:
565 CmdArgs.push_back("-lc++");
566 break;
567
Hans Wennborgdcfba332015-10-06 23:40:43 +0000568 case ToolChain::CST_Libstdcxx:
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000569 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
570 // it was previously found in the gcc lib dir. However, for all the Darwin
571 // platforms we care about it was -lstdc++.6, so we search for that
572 // explicitly if we can't see an obvious -lstdc++ candidate.
573
574 // Check in the sysroot first.
575 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000576 SmallString<128> P(A->getValue());
Benjamin Kramer17381a02013-06-28 16:25:46 +0000577 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000578
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000579 if (!getVFS().exists(P)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000580 llvm::sys::path::remove_filename(P);
581 llvm::sys::path::append(P, "libstdc++.6.dylib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000582 if (getVFS().exists(P)) {
Yaron Keren92e1b622015-03-18 10:17:07 +0000583 CmdArgs.push_back(Args.MakeArgString(P));
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000584 return;
585 }
586 }
587 }
588
589 // Otherwise, look in the root.
Bob Wilson1a9ad0f2011-11-11 07:47:04 +0000590 // FIXME: This should be removed someday when we don't have to care about
591 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000592 if (!getVFS().exists("/usr/lib/libstdc++.dylib") &&
593 getVFS().exists("/usr/lib/libstdc++.6.dylib")) {
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000594 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
595 return;
596 }
597
598 // Otherwise, let the linker search.
599 CmdArgs.push_back("-lstdc++");
600 break;
601 }
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000602}
603
Shantonu Senafeb03b2010-09-17 18:39:08 +0000604void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
605 ArgStringList &CmdArgs) const {
606
607 // For Darwin platforms, use the compiler-rt-based support library
608 // instead of the gcc-provided one (which is also incidentally
609 // only present in the gcc lib dir, which makes it hard to find).
610
Rafael Espindola358256c2013-06-26 02:13:00 +0000611 SmallString<128> P(getDriver().ResourceDir);
Benjamin Kramer17381a02013-06-28 16:25:46 +0000612 llvm::sys::path::append(P, "lib", "darwin");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000613
614 // Use the newer cc_kext for iOS ARM after 6.0.
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000615 if (isTargetIPhoneOS()) {
616 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000617 } else {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000618 llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000619 }
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000620
Shantonu Senafeb03b2010-09-17 18:39:08 +0000621 // For now, allow missing resource libraries to support developers who may
622 // not have compiler-rt checked out or integrated into their build.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000623 if (getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000624 CmdArgs.push_back(Args.MakeArgString(P));
Shantonu Senafeb03b2010-09-17 18:39:08 +0000625}
626
Tim Northover157d9112014-01-16 08:48:16 +0000627DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
628 const char *BoundArch) const {
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000629 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
630 const OptTable &Opts = getDriver().getOpts();
631
632 // FIXME: We really want to get out of the tool chain level argument
633 // translation business, as it makes the driver functionality much
634 // more opaque. For now, we follow gcc closely solely for the
635 // purpose of easily achieving feature parity & testability. Once we
636 // have something that works, we should reevaluate each translation
637 // and try to push it down into tool specific logic.
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000638
Simon Atanasyan6f657c42014-05-08 19:32:46 +0000639 for (Arg *A : Args) {
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000640 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar471c4f82011-06-21 00:20:17 +0000641 // Skip this argument unless the architecture matches either the toolchain
642 // triple arch, or the arch being bound.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000643 llvm::Triple::ArchType XarchArch =
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000644 tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
645 if (!(XarchArch == getArch() ||
646 (BoundArch &&
647 XarchArch ==
648 tools::darwin::getArchTypeForMachOArchName(BoundArch))))
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000649 continue;
650
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000651 Arg *OriginalArg = A;
Richard Smithbd55daf2012-11-01 04:30:05 +0000652 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000653 unsigned Prev = Index;
Nico Webera04d5f82014-05-11 17:27:13 +0000654 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
Mike Stump11289f42009-09-09 15:08:12 +0000655
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000656 // If the argument parsing failed or more than one argument was
657 // consumed, the -Xarch_ argument's parameter tried to consume
658 // extra arguments. Emit an error and ignore.
659 //
660 // We also want to disallow any options which would alter the
661 // driver behavior; that isn't going to work in our model. We
662 // use isDriverOption() as an approximation, although things
663 // like -O4 are going to slip through.
Daniel Dunbar5a784c82011-04-21 17:41:34 +0000664 if (!XarchArg || Index > Prev + 1) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000665 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000666 << A->getAsString(Args);
Daniel Dunbar6914a982011-04-21 17:32:21 +0000667 continue;
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000668 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000669 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000670 << A->getAsString(Args);
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000671 continue;
672 }
673
Daniel Dunbar53b406f2009-03-29 22:29:05 +0000674 XarchArg->setBaseArg(A);
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000675
Nico Webera04d5f82014-05-11 17:27:13 +0000676 A = XarchArg.release();
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000677 DAL->AddSynthesizedArg(A);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000678
679 // Linker input arguments require custom handling. The problem is that we
680 // have already constructed the phase actions, so we can not treat them as
681 // "input arguments".
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000682 if (A->getOption().hasFlag(options::LinkerInput)) {
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000683 // Convert the argument into individual Zlinker_input_args.
Douglas Katzman6bbffc42015-06-25 18:51:37 +0000684 for (const char *Value : A->getValues()) {
685 DAL->AddSeparateArg(
686 OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000687 }
688 continue;
689 }
Mike Stump11289f42009-09-09 15:08:12 +0000690 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000691
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000692 // Sob. These is strictly gcc compatible for the time being. Apple
693 // gcc translates options twice, which means that self-expanding
694 // options add duplicates.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000695 switch ((options::ID)A->getOption().getID()) {
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000696 default:
697 DAL->append(A);
698 break;
699
700 case options::OPT_mkernel:
701 case options::OPT_fapple_kext:
702 DAL->append(A);
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000703 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000704 break;
Mike Stump11289f42009-09-09 15:08:12 +0000705
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000706 case options::OPT_dependency_file:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000707 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000708 break;
709
710 case options::OPT_gfull:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000711 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000712 DAL->AddFlagArg(
713 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000714 break;
715
716 case options::OPT_gused:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000717 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000718 DAL->AddFlagArg(
719 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000720 break;
721
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000722 case options::OPT_shared:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000723 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000724 break;
725
726 case options::OPT_fconstant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000727 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000728 break;
729
730 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000731 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000732 break;
733
734 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000735 DAL->AddFlagArg(A,
736 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000737 break;
738
739 case options::OPT_Wno_nonportable_cfstrings:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000740 DAL->AddFlagArg(
741 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000742 break;
743
744 case options::OPT_fpascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000745 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000746 break;
747
748 case options::OPT_fno_pascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000749 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000750 break;
751 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000752 }
753
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000754 if (getTriple().getArch() == llvm::Triple::x86 ||
755 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbarfffd1812009-11-19 04:00:53 +0000756 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000757 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
758 "core2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000759
760 // Add the arch options based on the particular spelling of -arch, to match
Chad Rosier7c5d9082012-04-27 14:58:16 +0000761 // how the driver driver works.
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000762 if (BoundArch) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000763 StringRef Name = BoundArch;
Michael J. Spencerfc790902012-10-19 22:36:40 +0000764 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
765 const Option MArch = Opts.getOption(options::OPT_march_EQ);
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000766
767 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
768 // which defines the list of which architectures we accept.
769 if (Name == "ppc")
770 ;
771 else if (Name == "ppc601")
Craig Topper92fc2df2014-05-17 16:56:41 +0000772 DAL->AddJoinedArg(nullptr, MCpu, "601");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000773 else if (Name == "ppc603")
Craig Topper92fc2df2014-05-17 16:56:41 +0000774 DAL->AddJoinedArg(nullptr, MCpu, "603");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000775 else if (Name == "ppc604")
Craig Topper92fc2df2014-05-17 16:56:41 +0000776 DAL->AddJoinedArg(nullptr, MCpu, "604");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000777 else if (Name == "ppc604e")
Craig Topper92fc2df2014-05-17 16:56:41 +0000778 DAL->AddJoinedArg(nullptr, MCpu, "604e");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000779 else if (Name == "ppc750")
Craig Topper92fc2df2014-05-17 16:56:41 +0000780 DAL->AddJoinedArg(nullptr, MCpu, "750");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000781 else if (Name == "ppc7400")
Craig Topper92fc2df2014-05-17 16:56:41 +0000782 DAL->AddJoinedArg(nullptr, MCpu, "7400");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000783 else if (Name == "ppc7450")
Craig Topper92fc2df2014-05-17 16:56:41 +0000784 DAL->AddJoinedArg(nullptr, MCpu, "7450");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000785 else if (Name == "ppc970")
Craig Topper92fc2df2014-05-17 16:56:41 +0000786 DAL->AddJoinedArg(nullptr, MCpu, "970");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000787
Bill Schmidt778d3872013-07-26 01:36:11 +0000788 else if (Name == "ppc64" || Name == "ppc64le")
Craig Topper92fc2df2014-05-17 16:56:41 +0000789 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000790
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000791 else if (Name == "i386")
792 ;
793 else if (Name == "i486")
Craig Topper92fc2df2014-05-17 16:56:41 +0000794 DAL->AddJoinedArg(nullptr, MArch, "i486");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000795 else if (Name == "i586")
Craig Topper92fc2df2014-05-17 16:56:41 +0000796 DAL->AddJoinedArg(nullptr, MArch, "i586");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000797 else if (Name == "i686")
Craig Topper92fc2df2014-05-17 16:56:41 +0000798 DAL->AddJoinedArg(nullptr, MArch, "i686");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000799 else if (Name == "pentium")
Craig Topper92fc2df2014-05-17 16:56:41 +0000800 DAL->AddJoinedArg(nullptr, MArch, "pentium");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000801 else if (Name == "pentium2")
Craig Topper92fc2df2014-05-17 16:56:41 +0000802 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000803 else if (Name == "pentpro")
Craig Topper92fc2df2014-05-17 16:56:41 +0000804 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000805 else if (Name == "pentIIm3")
Craig Topper92fc2df2014-05-17 16:56:41 +0000806 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000807
808 else if (Name == "x86_64")
Craig Topper92fc2df2014-05-17 16:56:41 +0000809 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Jim Grosbach82eee262013-11-16 00:53:35 +0000810 else if (Name == "x86_64h") {
Craig Topper92fc2df2014-05-17 16:56:41 +0000811 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
812 DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
Jim Grosbach82eee262013-11-16 00:53:35 +0000813 }
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000814
815 else if (Name == "arm")
Craig Topper92fc2df2014-05-17 16:56:41 +0000816 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000817 else if (Name == "armv4t")
Craig Topper92fc2df2014-05-17 16:56:41 +0000818 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000819 else if (Name == "armv5")
Craig Topper92fc2df2014-05-17 16:56:41 +0000820 DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000821 else if (Name == "xscale")
Craig Topper92fc2df2014-05-17 16:56:41 +0000822 DAL->AddJoinedArg(nullptr, MArch, "xscale");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000823 else if (Name == "armv6")
Craig Topper92fc2df2014-05-17 16:56:41 +0000824 DAL->AddJoinedArg(nullptr, MArch, "armv6k");
Bob Wilson743bf672013-03-04 22:37:49 +0000825 else if (Name == "armv6m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000826 DAL->AddJoinedArg(nullptr, MArch, "armv6m");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000827 else if (Name == "armv7")
Craig Topper92fc2df2014-05-17 16:56:41 +0000828 DAL->AddJoinedArg(nullptr, MArch, "armv7a");
Bob Wilson743bf672013-03-04 22:37:49 +0000829 else if (Name == "armv7em")
Craig Topper92fc2df2014-05-17 16:56:41 +0000830 DAL->AddJoinedArg(nullptr, MArch, "armv7em");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000831 else if (Name == "armv7k")
Craig Topper92fc2df2014-05-17 16:56:41 +0000832 DAL->AddJoinedArg(nullptr, MArch, "armv7k");
Bob Wilson743bf672013-03-04 22:37:49 +0000833 else if (Name == "armv7m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000834 DAL->AddJoinedArg(nullptr, MArch, "armv7m");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000835 else if (Name == "armv7s")
Craig Topper92fc2df2014-05-17 16:56:41 +0000836 DAL->AddJoinedArg(nullptr, MArch, "armv7s");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000837 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000838
Tim Northover157d9112014-01-16 08:48:16 +0000839 return DAL;
840}
841
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000842void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
843 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000844 // Embedded targets are simple at the moment, not supporting sanitizers and
845 // with different libraries for each member of the product { static, PIC } x
846 // { hard-float, soft-float }
847 llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000848 CompilerRT +=
849 (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
850 ? "hard"
851 : "soft";
Tim Northover157d9112014-01-16 08:48:16 +0000852 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
853
854 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
855}
856
Tim Northover157d9112014-01-16 08:48:16 +0000857DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
858 const char *BoundArch) const {
859 // First get the generic Apple args, before moving onto Darwin-specific ones.
860 DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
861 const OptTable &Opts = getDriver().getOpts();
862
Bob Wilsonf8cf1612014-02-21 00:20:07 +0000863 // If no architecture is bound, none of the translations here are relevant.
864 if (!BoundArch)
865 return DAL;
866
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000867 // Add an explicit version min argument for the deployment target. We do this
868 // after argument translation because -Xarch_ arguments may add a version min
869 // argument.
Bob Wilsonf8cf1612014-02-21 00:20:07 +0000870 AddDeploymentTarget(*DAL);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000871
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000872 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
873 // FIXME: It would be far better to avoid inserting those -static arguments,
874 // but we can't check the deployment target in the translation code until
875 // it is set here.
Bob Wilson5f4346d2014-12-02 00:27:35 +0000876 if (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000877 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie;) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000878 Arg *A = *it;
879 ++it;
880 if (A->getOption().getID() != options::OPT_mkernel &&
881 A->getOption().getID() != options::OPT_fapple_kext)
882 continue;
883 assert(it != ie && "unexpected argument translation");
884 A = *it;
885 assert(A->getOption().getID() == options::OPT_static &&
886 "missing expected -static argument");
887 it = DAL->getArgs().erase(it);
888 }
889 }
890
Bob Wilson0f7445b2013-11-02 23:19:53 +0000891 // Default to use libc++ on OS X 10.9+ and iOS 7+.
892 if (((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
Tim Northover9c7e0352013-12-12 11:55:52 +0000893 (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0))) &&
Bob Wilson0f7445b2013-11-02 23:19:53 +0000894 !Args.getLastArg(options::OPT_stdlib_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000895 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
896 "libc++");
Bob Wilson0f7445b2013-11-02 23:19:53 +0000897
Bob Wilson102be442011-10-07 17:54:41 +0000898 // Validate the C++ standard library choice.
899 CXXStdlibType Type = GetCXXStdlibType(*DAL);
900 if (Type == ToolChain::CST_Libcxx) {
John McCall5fb5df92012-06-20 06:18:46 +0000901 // Check whether the target provides libc++.
902 StringRef where;
903
Alp Tokerf6a24ce2013-12-05 16:25:25 +0000904 // Complain about targeting iOS < 5.0 in any way.
Tim Northover9c7e0352013-12-12 11:55:52 +0000905 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
Bob Wilson5ad5a952012-11-09 01:59:30 +0000906 where = "iOS 5.0";
John McCall5fb5df92012-06-20 06:18:46 +0000907
908 if (where != StringRef()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000909 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where;
Bob Wilson102be442011-10-07 17:54:41 +0000910 }
911 }
912
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000913 return DAL;
Mike Stump11289f42009-09-09 15:08:12 +0000914}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000915
Tim Northover157d9112014-01-16 08:48:16 +0000916bool MachO::IsUnwindTablesDefault() const {
Rafael Espindolae8bd4e52012-10-07 03:23:40 +0000917 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000918}
919
Tim Northover157d9112014-01-16 08:48:16 +0000920bool MachO::UseDwarfDebugFlags() const {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +0000921 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
922 return S[0] != '\0';
923 return false;
924}
925
Daniel Dunbar3241d402010-02-10 18:49:11 +0000926bool Darwin::UseSjLjExceptions() const {
927 // Darwin uses SjLj exceptions on ARM.
928 return (getTriple().getArch() == llvm::Triple::arm ||
929 getTriple().getArch() == llvm::Triple::thumb);
930}
931
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000932bool MachO::isPICDefault() const { return true; }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000933
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000934bool MachO::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +0000935
Tim Northover157d9112014-01-16 08:48:16 +0000936bool MachO::isPICDefaultForced() const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000937 return (getArch() == llvm::Triple::x86_64 ||
Tim Northover573cbee2014-05-24 12:52:07 +0000938 getArch() == llvm::Triple::aarch64);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000939}
940
Tim Northover157d9112014-01-16 08:48:16 +0000941bool MachO::SupportsProfiling() const {
Daniel Dunbar733b0f82011-03-01 18:49:30 +0000942 // Profiling instrumentation is only supported on x86.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000943 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
Daniel Dunbar733b0f82011-03-01 18:49:30 +0000944}
945
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000946void Darwin::addMinVersionArgs(const ArgList &Args,
947 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000948 VersionTuple TargetVersion = getTargetVersion();
949
Bob Wilson771b7cd2014-10-10 19:38:34 +0000950 if (isTargetIOSSimulator())
Tim Northover157d9112014-01-16 08:48:16 +0000951 CmdArgs.push_back("-ios_simulator_version_min");
Bob Wilson5cfc55e2014-02-01 21:06:21 +0000952 else if (isTargetIOSBased())
Tim Northover157d9112014-01-16 08:48:16 +0000953 CmdArgs.push_back("-iphoneos_version_min");
954 else {
955 assert(isTargetMacOS() && "unexpected target");
956 CmdArgs.push_back("-macosx_version_min");
957 }
958
959 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
960}
961
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000962void Darwin::addStartObjectFileArgs(const ArgList &Args,
963 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000964 // Derived from startfile spec.
965 if (Args.hasArg(options::OPT_dynamiclib)) {
966 // Derived from darwin_dylib1 spec.
967 if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +0000968 ; // iOS simulator does not need dylib1.o.
Tim Northover157d9112014-01-16 08:48:16 +0000969 } else if (isTargetIPhoneOS()) {
970 if (isIPhoneOSVersionLT(3, 1))
971 CmdArgs.push_back("-ldylib1.o");
972 } else {
973 if (isMacosxVersionLT(10, 5))
974 CmdArgs.push_back("-ldylib1.o");
975 else if (isMacosxVersionLT(10, 6))
976 CmdArgs.push_back("-ldylib1.10.5.o");
977 }
978 } else {
979 if (Args.hasArg(options::OPT_bundle)) {
980 if (!Args.hasArg(options::OPT_static)) {
981 // Derived from darwin_bundle1 spec.
982 if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +0000983 ; // iOS simulator does not need bundle1.o.
Tim Northover157d9112014-01-16 08:48:16 +0000984 } else if (isTargetIPhoneOS()) {
985 if (isIPhoneOSVersionLT(3, 1))
986 CmdArgs.push_back("-lbundle1.o");
987 } else {
988 if (isMacosxVersionLT(10, 6))
989 CmdArgs.push_back("-lbundle1.o");
990 }
991 }
992 } else {
993 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
994 if (Args.hasArg(options::OPT_static) ||
995 Args.hasArg(options::OPT_object) ||
996 Args.hasArg(options::OPT_preload)) {
997 CmdArgs.push_back("-lgcrt0.o");
998 } else {
999 CmdArgs.push_back("-lgcrt1.o");
1000
1001 // darwin_crt2 spec is empty.
1002 }
1003 // By default on OS X 10.8 and later, we don't link with a crt1.o
1004 // file and the linker knows to use _main as the entry point. But,
1005 // when compiling with -pg, we need to link with the gcrt1.o file,
1006 // so pass the -no_new_main option to tell the linker to use the
1007 // "start" symbol as the entry point.
1008 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1009 CmdArgs.push_back("-no_new_main");
1010 } else {
1011 if (Args.hasArg(options::OPT_static) ||
1012 Args.hasArg(options::OPT_object) ||
1013 Args.hasArg(options::OPT_preload)) {
1014 CmdArgs.push_back("-lcrt0.o");
1015 } else {
1016 // Derived from darwin_crt1 spec.
1017 if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001018 ; // iOS simulator does not need crt1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001019 } else if (isTargetIPhoneOS()) {
Tim Northover40956e62014-07-23 12:32:58 +00001020 if (getArch() == llvm::Triple::aarch64)
Tim Northovera2ee4332014-03-29 15:09:45 +00001021 ; // iOS does not need any crt1 files for arm64
1022 else if (isIPhoneOSVersionLT(3, 1))
Tim Northover157d9112014-01-16 08:48:16 +00001023 CmdArgs.push_back("-lcrt1.o");
1024 else if (isIPhoneOSVersionLT(6, 0))
1025 CmdArgs.push_back("-lcrt1.3.1.o");
1026 } else {
1027 if (isMacosxVersionLT(10, 5))
1028 CmdArgs.push_back("-lcrt1.o");
1029 else if (isMacosxVersionLT(10, 6))
1030 CmdArgs.push_back("-lcrt1.10.5.o");
1031 else if (isMacosxVersionLT(10, 8))
1032 CmdArgs.push_back("-lcrt1.10.6.o");
1033
1034 // darwin_crt2 spec is empty.
1035 }
1036 }
1037 }
1038 }
1039 }
1040
1041 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
1042 isMacosxVersionLT(10, 5)) {
1043 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1044 CmdArgs.push_back(Str);
1045 }
1046}
1047
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001048bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
Daniel Dunbar16334e12010-04-10 16:20:23 +00001049
John McCall3deb1ad2012-08-21 02:47:43 +00001050void Darwin::CheckObjCARC() const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001051 if (isTargetIOSBased() || (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
John McCall3deb1ad2012-08-21 02:47:43 +00001052 return;
John McCall93207072012-08-27 01:56:21 +00001053 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00001054}
1055
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001056SanitizerMask Darwin::getSupportedSanitizers() const {
1057 SanitizerMask Res = ToolChain::getSupportedSanitizers();
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001058 if (isTargetMacOS() || isTargetIOSSimulator())
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001059 Res |= SanitizerKind::Address;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001060 if (isTargetMacOS()) {
1061 if (!isMacosxVersionLT(10, 9))
1062 Res |= SanitizerKind::Vptr;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001063 Res |= SanitizerKind::SafeStack;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001064 }
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001065 return Res;
1066}
1067
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001068/// Generic_GCC - A tool chain using the 'gcc' command to perform
1069/// all subcommands; this relies on gcc translating the majority of
1070/// command line options.
1071
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001072/// \brief Parse a GCCVersion object out of a string of text.
1073///
1074/// This is the primary means of forming GCCVersion objects.
1075/*static*/
1076Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001077 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001078 std::pair<StringRef, StringRef> First = VersionText.split('.');
1079 std::pair<StringRef, StringRef> Second = First.second.split('.');
1080
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001081 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1082 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001083 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001084 GoodVersion.MajorStr = First.first.str();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001085 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001086 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001087 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001088
1089 // First look for a number prefix and parse that if present. Otherwise just
1090 // stash the entire patch string in the suffix, and leave the number
1091 // unspecified. This covers versions strings such as:
1092 // 4.4
1093 // 4.4.0
1094 // 4.4.x
1095 // 4.4.2-rc4
1096 // 4.4.x-patched
1097 // And retains any patch number it finds.
1098 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1099 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001100 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001101 // Try to parse the number and any suffix.
1102 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1103 GoodVersion.Patch < 0)
1104 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001105 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001106 }
1107 }
1108
1109 return GoodVersion;
1110}
1111
1112/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001113bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1114 int RHSPatch,
1115 StringRef RHSPatchSuffix) const {
1116 if (Major != RHSMajor)
1117 return Major < RHSMajor;
1118 if (Minor != RHSMinor)
1119 return Minor < RHSMinor;
1120 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001121 // Note that versions without a specified patch sort higher than those with
1122 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001123 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001124 return true;
1125 if (Patch == -1)
1126 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001127
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001128 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001129 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001130 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001131 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001132 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001133 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001134 return true;
1135 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001136 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001137
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001138 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001139 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001140 }
1141
1142 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001143 return false;
1144}
1145
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001146static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001147 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1148 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001149 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001150 return GCC_INSTALL_PREFIX;
1151}
1152
Roman Divacky326d9982013-12-06 18:32:18 +00001153/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001154///
1155/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001156/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001157///
1158/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1159/// should instead pull the target out of the driver. This is currently
1160/// necessary because the driver doesn't store the final version of the target
1161/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001162void Generic_GCC::GCCInstallationDetector::init(
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001163 const llvm::Triple &TargetTriple, const ArgList &Args,
Douglas Katzman8c39e6a2015-09-18 15:23:16 +00001164 ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001165 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1166 ? TargetTriple.get64BitArchVariant()
1167 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001168 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001169 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001170 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001171 SmallVector<StringRef, 16> CandidateTripleAliases;
1172 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001173 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1174 CandidateTripleAliases, CandidateBiarchLibDirs,
1175 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001176
1177 // Compute the set of prefixes for our search.
1178 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1179 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001180
Rafael Espindola1af7c212012-02-19 01:38:32 +00001181 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1182 if (GCCToolchainDir != "") {
1183 if (GCCToolchainDir.back() == '/')
1184 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001185
Rafael Espindola1af7c212012-02-19 01:38:32 +00001186 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001187 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001188 // If we have a SysRoot, try that first.
1189 if (!D.SysRoot.empty()) {
1190 Prefixes.push_back(D.SysRoot);
1191 Prefixes.push_back(D.SysRoot + "/usr");
1192 }
1193
1194 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001195 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001196
1197 // And finally in /usr.
1198 if (D.SysRoot.empty())
1199 Prefixes.push_back("/usr");
Rafael Espindolac29af942012-02-03 01:01:20 +00001200 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001201
1202 // Loop over the various components which exist and select the best GCC
1203 // installation available. GCC installs are ranked by version number.
1204 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001205 for (const std::string &Prefix : Prefixes) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001206 if (!D.getVFS().exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001207 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001208 for (StringRef Suffix : CandidateLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001209 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001210 if (!D.getVFS().exists(LibDir))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001211 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001212 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001213 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Benjamin Kramer72e64312015-09-24 14:48:49 +00001214 for (StringRef Candidate : CandidateTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001215 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001216 }
Benjamin Kramer72e64312015-09-24 14:48:49 +00001217 for (StringRef Suffix : CandidateBiarchLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001218 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001219 if (!D.getVFS().exists(LibDir))
Chandler Carruth866faab2012-01-25 07:21:38 +00001220 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001221 for (StringRef Candidate : CandidateBiarchTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001222 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001223 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001224 }
1225 }
1226}
1227
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001228void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001229 for (const auto &InstallPath : CandidateGCCInstallPaths)
1230 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001231
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001232 if (!GCCInstallPath.empty())
1233 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1234
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001235 for (const auto &Multilib : Multilibs)
1236 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001237
1238 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1239 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001240}
1241
1242bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1243 if (BiarchSibling.hasValue()) {
1244 M = BiarchSibling.getValue();
1245 return true;
1246 }
1247 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001248}
1249
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001250/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001251 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001252 SmallVectorImpl<StringRef> &LibDirs,
1253 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001254 SmallVectorImpl<StringRef> &BiarchLibDirs,
1255 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001256 // Declare a bunch of static data sets that we'll select between below. These
1257 // are specifically designed to always refer to string literals to avoid any
1258 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001259 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1260 static const char *const AArch64Triples[] = {
1261 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1262 "aarch64-redhat-linux"};
1263 static const char *const AArch64beLibDirs[] = {"/lib"};
1264 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1265 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001266
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001267 static const char *const ARMLibDirs[] = {"/lib"};
1268 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1269 "arm-linux-androideabi"};
1270 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1271 "armv7hl-redhat-linux-gnueabi"};
1272 static const char *const ARMebLibDirs[] = {"/lib"};
1273 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1274 "armeb-linux-androideabi"};
1275 static const char *const ARMebHFTriples[] = {
1276 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001277
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001278 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001279 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001280 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1281 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1282 "x86_64-redhat-linux", "x86_64-suse-linux",
1283 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1284 "x86_64-slackware-linux", "x86_64-linux-android",
1285 "x86_64-unknown-linux"};
1286 static const char *const X32LibDirs[] = {"/libx32"};
1287 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001288 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001289 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1290 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1291 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1292 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1293 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001294
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001295 static const char *const MIPSLibDirs[] = {"/lib"};
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00001296 static const char *const MIPSTriples[] = {
1297 "mips-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001298 static const char *const MIPSELLibDirs[] = {"/lib"};
1299 static const char *const MIPSELTriples[] = {
1300 "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001301
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001302 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1303 static const char *const MIPS64Triples[] = {
1304 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1305 "mips64-linux-gnuabi64"};
1306 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1307 static const char *const MIPS64ELTriples[] = {
1308 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1309 "mips64el-linux-android", "mips64el-linux-gnuabi64"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001310
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001311 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001312 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001313 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1314 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1315 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1316 static const char *const PPC64Triples[] = {
1317 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1318 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1319 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1320 static const char *const PPC64LETriples[] = {
1321 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1322 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001323
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001324 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1325 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1326 "sparcv8-linux-gnu"};
1327 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1328 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1329 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001330
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001331 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001332 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001333 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1334 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001335
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001336 // Solaris.
1337 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1338 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1339 "i386-pc-solaris2.11"};
1340
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001341 using std::begin;
1342 using std::end;
1343
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001344 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1345 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1346 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001347 return;
1348 }
1349
Chandler Carruth866faab2012-01-25 07:21:38 +00001350 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001351 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001352 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1353 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1354 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1355 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001356 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001357 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001358 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1359 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1360 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1361 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001362 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001363 case llvm::Triple::arm:
1364 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001365 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001366 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001367 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001368 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001369 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001370 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001371 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001372 case llvm::Triple::armeb:
1373 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001374 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001375 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001376 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001377 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001378 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001379 }
1380 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001381 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001382 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1383 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1384 // x32 is always available when x86_64 is available, so adding it as
1385 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001386 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001387 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1388 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001389 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001390 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1391 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001392 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001393 break;
1394 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001395 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1396 TripleAliases.append(begin(X86Triples), end(X86Triples));
1397 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1398 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001399 break;
1400 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001401 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1402 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1403 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1404 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001405 break;
1406 case llvm::Triple::mipsel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001407 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1408 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1409 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1410 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1411 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001412 break;
1413 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001414 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1415 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1416 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1417 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001418 break;
1419 case llvm::Triple::mips64el:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001420 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1421 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1422 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1423 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1424 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001425 break;
1426 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001427 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1428 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1429 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1430 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001431 break;
1432 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001433 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1434 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1435 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1436 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001437 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001438 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001439 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1440 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001441 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001442 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001443 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001444 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1445 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1446 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1447 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001448 break;
1449 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001450 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1451 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1452 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1453 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001454 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001455 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001456 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1457 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001458 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001459 default:
1460 // By default, just rely on the standard lib directories and the original
1461 // triple.
1462 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001463 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001464
1465 // Always append the drivers target triple to the end, in case it doesn't
1466 // match any of our aliases.
1467 TripleAliases.push_back(TargetTriple.str());
1468
1469 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001470 if (TargetTriple.str() != BiarchTriple.str())
1471 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001472}
1473
Artem Belevich98607b62015-09-23 21:49:39 +00001474// \brief -- try common CUDA installation paths looking for files we need for
1475// CUDA compilation.
1476
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001477void Generic_GCC::CudaInstallationDetector::init(
1478 const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001479 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001480
1481 if (Args.hasArg(options::OPT_cuda_path_EQ))
1482 CudaPathCandidates.push_back(
1483 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1484 else {
1485 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
1486 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1487 }
1488
Benjamin Kramere8b76412015-09-24 14:48:37 +00001489 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001490 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001491 continue;
1492
1493 CudaInstallPath = CudaPath;
1494 CudaIncludePath = CudaInstallPath + "/include";
1495 CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1496 CudaLibPath =
1497 CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1498
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001499 if (!(D.getVFS().exists(CudaIncludePath) &&
1500 D.getVFS().exists(CudaLibPath) &&
1501 D.getVFS().exists(CudaLibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001502 continue;
1503
1504 IsValid = true;
1505 break;
1506 }
1507}
1508
1509void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1510 if (isValid())
1511 OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1512}
1513
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001514namespace {
1515// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001516class FilterNonExistent {
1517 StringRef Base;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001518 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001519
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001520public:
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001521 FilterNonExistent(StringRef Base, vfs::FileSystem &VFS)
1522 : Base(Base), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001523 bool operator()(const Multilib &M) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001524 return !VFS.exists(Base + M.gccSuffix() + "/crtbegin.o");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001525 }
1526};
1527} // end anonymous namespace
1528
1529static void addMultilibFlag(bool Enabled, const char *const Flag,
1530 std::vector<std::string> &Flags) {
1531 if (Enabled)
1532 Flags.push_back(std::string("+") + Flag);
1533 else
1534 Flags.push_back(std::string("-") + Flag);
1535}
1536
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001537static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001538 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1539 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1540}
1541
1542static bool isMips32(llvm::Triple::ArchType Arch) {
1543 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1544}
1545
1546static bool isMips64(llvm::Triple::ArchType Arch) {
1547 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1548}
1549
1550static bool isMipsEL(llvm::Triple::ArchType Arch) {
1551 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1552}
1553
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001554static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001555 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001556 return A && A->getOption().matches(options::OPT_mips16);
1557}
1558
1559static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001560 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001561 return A && A->getOption().matches(options::OPT_mmicromips);
1562}
1563
Simon Atanasyan60280b42014-05-12 07:37:51 +00001564struct DetectedMultilibs {
1565 /// The set of multilibs that the detected installation supports.
1566 MultilibSet Multilibs;
1567
1568 /// The primary multilib appropriate for the given flags.
1569 Multilib SelectedMultilib;
1570
1571 /// On Biarch systems, this corresponds to the default multilib when
1572 /// targeting the non-default multilib. Otherwise, it is empty.
1573 llvm::Optional<Multilib> BiarchSibling;
1574};
1575
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001576static Multilib makeMultilib(StringRef commonSuffix) {
1577 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1578}
1579
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001580static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
1581 StringRef Path, const ArgList &Args,
1582 DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001583 // Some MIPS toolchains put libraries and object files compiled
1584 // using different options in to the sub-directoris which names
1585 // reflects the flags used for compilation. For example sysroot
1586 // directory might looks like the following examples:
1587 //
1588 // /usr
1589 // /lib <= crt*.o files compiled with '-mips32'
1590 // /mips16
1591 // /usr
1592 // /lib <= crt*.o files compiled with '-mips16'
1593 // /el
1594 // /usr
1595 // /lib <= crt*.o files compiled with '-mips16 -EL'
1596 //
1597 // or
1598 //
1599 // /usr
1600 // /lib <= crt*.o files compiled with '-mips32r2'
1601 // /mips16
1602 // /usr
1603 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1604 // /mips32
1605 // /usr
1606 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001607
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001608 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001609
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001610 // Check for FSF toolchain multilibs
1611 MultilibSet FSFMipsMultilibs;
1612 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001613 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001614 .flag("+m32")
1615 .flag("-m64")
1616 .flag("-mmicromips")
1617 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001618
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001619 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001620 .flag("+m32")
1621 .flag("-m64")
1622 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001623
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001624 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001625 .flag("-m32")
1626 .flag("+m64")
1627 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001628
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001629 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1630 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001631
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001632 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001633 .flag("+m32")
1634 .flag("-m64")
1635 .flag("-mmicromips")
1636 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001637
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001638 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001639
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001640 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001641
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001642 auto MAbi64 =
1643 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001644
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001645 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001646
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001647 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001648
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001649 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001650
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001651 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001652
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001653 FSFMipsMultilibs =
1654 MultilibSet()
1655 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1656 MArchDefault)
1657 .Maybe(UCLibc)
1658 .Maybe(Mips16)
1659 .FilterOut("/mips64/mips16")
1660 .FilterOut("/mips64r2/mips16")
1661 .FilterOut("/micromips/mips16")
1662 .Maybe(MAbi64)
1663 .FilterOut("/micromips/64")
1664 .FilterOut("/mips32/64")
1665 .FilterOut("^/64")
1666 .FilterOut("/mips16/64")
1667 .Either(BigEndian, LittleEndian)
1668 .Maybe(SoftFloat)
1669 .Maybe(Nan2008)
1670 .FilterOut(".*sof/nan2008")
1671 .FilterOut(NonExistent)
1672 .setIncludeDirsCallback([](StringRef InstallDir,
1673 StringRef TripleStr, const Multilib &M) {
1674 std::vector<std::string> Dirs;
1675 Dirs.push_back((InstallDir + "/include").str());
1676 std::string SysRootInc =
1677 InstallDir.str() + "/../../../../sysroot";
1678 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1679 Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1680 else
1681 Dirs.push_back(SysRootInc + "/usr/include");
1682 return Dirs;
1683 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001684 }
1685
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001686 // Check for Code Sourcery toolchain multilibs
1687 MultilibSet CSMipsMultilibs;
1688 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001689 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001690
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001691 auto MArchMicroMips =
1692 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001693
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001694 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001695
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001696 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001697
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001698 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001699
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001700 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001701
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001702 auto DefaultFloat =
1703 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001704
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001705 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001706
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001707 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001708
1709 // Note that this one's osSuffix is ""
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001710 auto MAbi64 = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001711 .gccSuffix("/64")
1712 .includeSuffix("/64")
1713 .flag("+mabi=n64")
1714 .flag("-mabi=n32")
1715 .flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001716
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001717 CSMipsMultilibs =
1718 MultilibSet()
1719 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1720 .Maybe(UCLibc)
1721 .Either(SoftFloat, Nan2008, DefaultFloat)
1722 .FilterOut("/micromips/nan2008")
1723 .FilterOut("/mips16/nan2008")
1724 .Either(BigEndian, LittleEndian)
1725 .Maybe(MAbi64)
1726 .FilterOut("/mips16.*/64")
1727 .FilterOut("/micromips.*/64")
1728 .FilterOut(NonExistent)
1729 .setIncludeDirsCallback([](StringRef InstallDir,
1730 StringRef TripleStr, const Multilib &M) {
1731 std::vector<std::string> Dirs;
1732 Dirs.push_back((InstallDir + "/include").str());
1733 std::string SysRootInc =
1734 InstallDir.str() + "/../../../../" + TripleStr.str();
1735 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1736 Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1737 else
1738 Dirs.push_back(SysRootInc + "/libc/usr/include");
1739 return Dirs;
1740 });
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001741 }
1742
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001743 MultilibSet AndroidMipsMultilibs =
1744 MultilibSet()
1745 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1746 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1747 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001748
1749 MultilibSet DebianMipsMultilibs;
1750 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001751 Multilib MAbiN32 =
1752 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001753
1754 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001755 .gccSuffix("/64")
1756 .includeSuffix("/64")
1757 .flag("+m64")
1758 .flag("-m32")
1759 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001760
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001761 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001762
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001763 DebianMipsMultilibs =
1764 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001765 }
1766
Daniel Sanders2bf13662014-07-10 14:40:57 +00001767 MultilibSet ImgMultilibs;
1768 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001769 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001770
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001771 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001772
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001773 auto MAbi64 =
1774 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001775
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001776 ImgMultilibs =
1777 MultilibSet()
1778 .Maybe(Mips64r6)
1779 .Maybe(MAbi64)
1780 .Maybe(LittleEndian)
1781 .FilterOut(NonExistent)
1782 .setIncludeDirsCallback([](StringRef InstallDir,
1783 StringRef TripleStr, const Multilib &M) {
1784 std::vector<std::string> Dirs;
1785 Dirs.push_back((InstallDir + "/include").str());
1786 Dirs.push_back(
1787 (InstallDir + "/../../../../sysroot/usr/include").str());
1788 return Dirs;
1789 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00001790 }
1791
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001792 StringRef CPUName;
1793 StringRef ABIName;
1794 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
1795
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001796 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1797
1798 Multilib::flags_list Flags;
1799 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
1800 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
1801 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001802 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001803 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00001804 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001805 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00001806 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001807 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001808 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
1809 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001810 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001811 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001812 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00001813 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
1814 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001815 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
1816 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001817 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001818 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001819 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001820 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001821
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001822 if (TargetTriple.isAndroid()) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001823 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00001824 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
1825 Result.Multilibs = AndroidMipsMultilibs;
1826 return true;
1827 }
1828 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001829 }
1830
Daniel Sanders2bf13662014-07-10 14:40:57 +00001831 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1832 TargetTriple.getOS() == llvm::Triple::Linux &&
1833 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
1834 // Select mips-img-linux-gnu toolchain.
1835 if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
1836 Result.Multilibs = ImgMultilibs;
1837 return true;
1838 }
1839 return false;
1840 }
1841
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001842 // Sort candidates. Toolchain that best meets the directories goes first.
1843 // Then select the first toolchains matches command line flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001844 MultilibSet *candidates[] = {&DebianMipsMultilibs, &FSFMipsMultilibs,
1845 &CSMipsMultilibs};
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001846 std::sort(
1847 std::begin(candidates), std::end(candidates),
1848 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
1849 for (const auto &candidate : candidates) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001850 if (candidate->select(Flags, Result.SelectedMultilib)) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001851 if (candidate == &DebianMipsMultilibs)
Simon Atanasyan60280b42014-05-12 07:37:51 +00001852 Result.BiarchSibling = Multilib();
1853 Result.Multilibs = *candidate;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001854 return true;
1855 }
1856 }
1857
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00001858 {
1859 // Fallback to the regular toolchain-tree structure.
1860 Multilib Default;
1861 Result.Multilibs.push_back(Default);
1862 Result.Multilibs.FilterOut(NonExistent);
1863
1864 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
1865 Result.BiarchSibling = Multilib();
1866 return true;
1867 }
1868 }
1869
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001870 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001871}
1872
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001873static bool findBiarchMultilibs(const Driver &D,
1874 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00001875 StringRef Path, const ArgList &Args,
1876 bool NeedsBiarchSuffix,
1877 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001878 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
1879 // in what would normally be GCCInstallPath and put the 64-bit
1880 // libs in a subdirectory named 64. The simple logic we follow is that
1881 // *if* there is a subdirectory of the right name with crtbegin.o in it,
1882 // we use that. If not, and if not a biarch triple alias, we look for
1883 // crtbegin.o without the subdirectory.
1884
1885 Multilib Default;
1886 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001887 .gccSuffix("/64")
1888 .includeSuffix("/64")
1889 .flag("-m32")
1890 .flag("+m64")
1891 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001892 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001893 .gccSuffix("/32")
1894 .includeSuffix("/32")
1895 .flag("+m32")
1896 .flag("-m64")
1897 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00001898 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001899 .gccSuffix("/x32")
1900 .includeSuffix("/x32")
1901 .flag("-m32")
1902 .flag("-m64")
1903 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001904
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001905 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001906
Zinovy Nis1db95732014-07-10 15:27:19 +00001907 // Determine default multilib from: 32, 64, x32
1908 // Also handle cases such as 64 on 32, 32 on 64, etc.
1909 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00001910 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00001911 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00001912 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001913 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00001914 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001915 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00001916 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001917 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00001918 if (TargetTriple.isArch32Bit())
1919 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001920 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00001921 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001922 else
Zinovy Nis1db95732014-07-10 15:27:19 +00001923 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00001924 }
1925
Zinovy Nis1db95732014-07-10 15:27:19 +00001926 if (Want == WANT32)
1927 Default.flag("+m32").flag("-m64").flag("-mx32");
1928 else if (Want == WANT64)
1929 Default.flag("-m32").flag("+m64").flag("-mx32");
1930 else if (Want == WANTX32)
1931 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001932 else
Zinovy Nis1db95732014-07-10 15:27:19 +00001933 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001934
Simon Atanasyan60280b42014-05-12 07:37:51 +00001935 Result.Multilibs.push_back(Default);
1936 Result.Multilibs.push_back(Alt64);
1937 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00001938 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001939
Simon Atanasyan60280b42014-05-12 07:37:51 +00001940 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001941
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001942 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001943 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001944 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001945 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001946
Simon Atanasyan60280b42014-05-12 07:37:51 +00001947 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001948 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001949
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001950 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00001951 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00001952 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001953
1954 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001955}
1956
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001957void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
1958 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
1959 const std::string &LibDir, StringRef CandidateTriple,
1960 bool NeedsBiarchSuffix) {
1961 // Solaris is a special case. The GCC installation is under
1962 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
1963 // need to iterate twice.
1964 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001965 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
1966 !EC && LI != LE; LI = LI.increment(EC)) {
1967 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001968 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
1969
1970 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001971 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001972 continue; // Saw this path before; no need to look at it again.
1973 if (CandidateVersion.isOlderThan(4, 1, 1))
1974 continue;
1975 if (CandidateVersion <= Version)
1976 continue;
1977
1978 GCCInstallPath =
1979 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001980 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001981 continue;
1982
1983 // If we make it here there has to be at least one GCC version, let's just
1984 // use the latest one.
1985 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001986 for (vfs::directory_iterator
1987 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
1988 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001989 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
1990
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001991 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001992 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
1993
1994 if (CandidateSubVersion > Version)
1995 Version = CandidateSubVersion;
1996 }
1997
1998 GCCTriple.setTriple(CandidateTriple);
1999
2000 GCCInstallPath += "/" + Version.Text;
2001 GCCParentLibPath = GCCInstallPath + "/../../../../";
2002
2003 IsValid = true;
2004 }
2005}
2006
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002007void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002008 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002009 const std::string &LibDir, StringRef CandidateTriple,
2010 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002011 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002012 // There are various different suffixes involving the triple we
2013 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002014 // up to the lib directory. Specifically, the number of "up" steps
2015 // in the second half of each row is 1 + the number of path separators
2016 // in the first half.
2017 const std::string LibAndInstallSuffixes[][2] = {
2018 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2019
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002020 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002021 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2022
2023 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2024 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002025
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002026 // The Freescale PPC SDK has the gcc libraries in
2027 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002028 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002029
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002030 // Ubuntu has a strange mis-matched pair of triples that this happens to
2031 // match.
2032 // FIXME: It may be worthwhile to generalize this and look for a second
2033 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002034 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2035
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002036 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2037 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2038 NeedsBiarchSuffix);
2039 return;
2040 }
2041
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002042 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002043 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2044 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002045 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002046 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002047 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002048 for (vfs::directory_iterator
2049 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2050 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002051 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002052 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002053 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002054 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002055 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002056 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002057 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002058 continue;
2059 if (CandidateVersion <= Version)
2060 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002061
Simon Atanasyan60280b42014-05-12 07:37:51 +00002062 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002063
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002064 // Debian mips multilibs behave more like the rest of the biarch ones,
2065 // so handle them there
2066 if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002067 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002068 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002069 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002070 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002071 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002072 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002073
Simon Atanasyan60280b42014-05-12 07:37:51 +00002074 Multilibs = Detected.Multilibs;
2075 SelectedMultilib = Detected.SelectedMultilib;
2076 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002077 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002078 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002079 // FIXME: We hack together the directory name here instead of
2080 // using LI to ensure stable path separators across Windows and
2081 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002082 GCCInstallPath =
2083 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2084 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002085 IsValid = true;
2086 }
2087 }
2088}
2089
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002090Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002091 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002092 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002093 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002094 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002095 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002096}
2097
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002098Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002099
Rafael Espindola7cf32212013-03-20 03:05:54 +00002100Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002101 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002102 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002103 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002104 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002105 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002106 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002107 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002108 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002109 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002110 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002111 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002112 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002113}
2114
Rafael Espindola7cf32212013-03-20 03:05:54 +00002115Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002116 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002117}
2118
Douglas Katzman95354292015-06-23 20:42:09 +00002119Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002120
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002121void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2122 // Print the information about how we detected the GCC installation.
2123 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002124 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002125}
2126
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002127bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002128 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002129}
2130
David Majnemer17f448b2015-06-28 04:23:33 +00002131bool Generic_GCC::isPICDefault() const {
2132 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2133}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002134
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002135bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002136
David Majnemer17f448b2015-06-28 04:23:33 +00002137bool Generic_GCC::isPICDefaultForced() const {
2138 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2139}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002140
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002141bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002142 switch (getTriple().getArch()) {
2143 case llvm::Triple::x86:
2144 case llvm::Triple::x86_64:
2145 case llvm::Triple::aarch64:
2146 case llvm::Triple::aarch64_be:
2147 case llvm::Triple::arm:
2148 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002149 case llvm::Triple::bpfel:
2150 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002151 case llvm::Triple::thumb:
2152 case llvm::Triple::thumbeb:
2153 case llvm::Triple::ppc:
2154 case llvm::Triple::ppc64:
2155 case llvm::Triple::ppc64le:
2156 case llvm::Triple::sparc:
2157 case llvm::Triple::sparcel:
2158 case llvm::Triple::sparcv9:
2159 case llvm::Triple::systemz:
2160 return true;
2161 default:
2162 return false;
2163 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002164}
2165
James Y Knighta6c9ee72015-10-16 18:46:26 +00002166/// \brief Helper to add the variant paths of a libstdc++ installation.
2167bool Generic_GCC::addLibStdCXXIncludePaths(
2168 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2169 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2170 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2171 if (!getVFS().exists(Base + Suffix))
2172 return false;
2173
2174 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2175
2176 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2177 // that path exists or we have neither a GCC nor target multiarch triple, use
2178 // this vanilla search path.
2179 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2180 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2181 addSystemInclude(DriverArgs, CC1Args,
2182 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2183 } else {
2184 // Otherwise try to use multiarch naming schemes which have normalized the
2185 // triples and put the triple before the suffix.
2186 //
2187 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2188 // the target triple, so we support that here.
2189 addSystemInclude(DriverArgs, CC1Args,
2190 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2191 addSystemInclude(DriverArgs, CC1Args,
2192 Base + "/" + TargetMultiarchTriple + Suffix);
2193 }
2194
2195 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2196 return true;
2197}
2198
2199
Kristof Beylsfb387292014-01-10 13:44:34 +00002200void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2201 ArgStringList &CC1Args) const {
2202 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002203 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002204 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002205 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002206 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002207 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00002208 getTriple().getOS() == llvm::Triple::NaCl;
Kristof Beylsfb387292014-01-10 13:44:34 +00002209
2210 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002211 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002212 CC1Args.push_back("-fuse-init-array");
2213}
2214
Tony Linthicum76329bf2011-12-12 21:14:55 +00002215/// Hexagon Toolchain
2216
Douglas Katzman54366072015-07-27 16:53:08 +00002217std::string HexagonToolChain::GetGnuDir(const std::string &InstalledDir,
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002218 const ArgList &Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002219 // Locate the rest of the toolchain ...
Samuel Antaoc909c992014-11-07 17:48:03 +00002220 std::string GccToolchain = getGCCToolchainDir(Args);
2221
2222 if (!GccToolchain.empty())
2223 return GccToolchain;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002224
2225 std::string InstallRelDir = InstalledDir + "/../../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002226 if (getVFS().exists(InstallRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002227 return InstallRelDir;
2228
2229 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002230 if (getVFS().exists(PrefixRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002231 return PrefixRelDir;
2232
2233 return InstallRelDir;
2234}
2235
Douglas Katzman54366072015-07-27 16:53:08 +00002236const char *HexagonToolChain::GetSmallDataThreshold(const ArgList &Args) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002237 Arg *A;
2238
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002239 A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002240 options::OPT_msmall_data_threshold_EQ);
2241 if (A)
2242 return A->getValue();
2243
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002244 A = Args.getLastArg(options::OPT_shared, options::OPT_fpic,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002245 options::OPT_fPIC);
2246 if (A)
2247 return "0";
2248
Hans Wennborgdcfba332015-10-06 23:40:43 +00002249 return nullptr;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002250}
2251
Douglas Katzman54366072015-07-27 16:53:08 +00002252bool HexagonToolChain::UsesG0(const char *smallDataThreshold) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002253 return smallDataThreshold && smallDataThreshold[0] == '0';
2254}
2255
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002256static void GetHexagonLibraryPaths(const HexagonToolChain &TC,
2257 const ArgList &Args, const std::string &Ver,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002258 const std::string &MarchString,
2259 const std::string &InstalledDir,
2260 ToolChain::path_list *LibPaths) {
Matthew Curtise689b052012-12-06 15:46:07 +00002261 bool buildingLib = Args.hasArg(options::OPT_shared);
2262
2263 //----------------------------------------------------------------------------
2264 // -L Args
2265 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002266 for (Arg *A : Args.filtered(options::OPT_L))
2267 for (const char *Value : A->getValues())
2268 LibPaths->push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002269
2270 //----------------------------------------------------------------------------
2271 // Other standard paths
2272 //----------------------------------------------------------------------------
2273 const std::string MarchSuffix = "/" + MarchString;
2274 const std::string G0Suffix = "/G0";
2275 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002276 const std::string RootDir = TC.GetGnuDir(InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00002277
2278 // lib/gcc/hexagon/...
2279 std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
2280 if (buildingLib) {
2281 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
2282 LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
2283 }
2284 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
2285 LibPaths->push_back(LibGCCHexagonDir + Ver);
2286
2287 // lib/gcc/...
2288 LibPaths->push_back(RootDir + "lib/gcc");
2289
2290 // hexagon/lib/...
2291 std::string HexagonLibDir = RootDir + "hexagon/lib";
2292 if (buildingLib) {
2293 LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
2294 LibPaths->push_back(HexagonLibDir + G0Suffix);
2295 }
2296 LibPaths->push_back(HexagonLibDir + MarchSuffix);
2297 LibPaths->push_back(HexagonLibDir);
2298}
2299
Douglas Katzman54366072015-07-27 16:53:08 +00002300HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
2301 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002302 : Linux(D, Triple, Args) {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002303 const std::string InstalledDir(getDriver().getInstalledDir());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002304 const std::string GnuDir = GetGnuDir(InstalledDir, Args);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002305
2306 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2307 // program paths
2308 const std::string BinDir(GnuDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002309 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002310 getProgramPaths().push_back(BinDir);
2311
2312 // Determine version of GCC libraries and headers to use.
2313 const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
Rafael Espindolac0809172014-06-12 14:02:15 +00002314 std::error_code ec;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002315 GCCVersion MaxVersion = GCCVersion::Parse("0.0.0");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002316 for (vfs::directory_iterator di = D.getVFS().dir_begin(HexagonDir, ec), de;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002317 !ec && di != de; di = di.increment(ec)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002318 GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->getName()));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002319 if (MaxVersion < cv)
2320 MaxVersion = cv;
2321 }
2322 GCCLibAndIncVersion = MaxVersion;
Matthew Curtise689b052012-12-06 15:46:07 +00002323
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002324 ToolChain::path_list *LibPaths = &getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002325
2326 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2327 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2328 // support 'linux' we'll need to fix this up
2329 LibPaths->clear();
2330
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002331 GetHexagonLibraryPaths(*this, Args, GetGCCLibAndIncVersion(),
2332 GetTargetCPU(Args), InstalledDir, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002333}
2334
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002335HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002336
Douglas Katzman54366072015-07-27 16:53:08 +00002337Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002338 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002339}
2340
Douglas Katzman54366072015-07-27 16:53:08 +00002341Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002342 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002343}
2344
Douglas Katzman54366072015-07-27 16:53:08 +00002345void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2346 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002347 const Driver &D = getDriver();
2348
2349 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2350 DriverArgs.hasArg(options::OPT_nostdlibinc))
2351 return;
2352
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002353 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002354 std::string GnuDir = GetGnuDir(D.InstalledDir, DriverArgs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002355 std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
2356 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
2357 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
2358 addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002359}
2360
Douglas Katzman54366072015-07-27 16:53:08 +00002361void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2362 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002363 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2364 DriverArgs.hasArg(options::OPT_nostdincxx))
2365 return;
2366
2367 const Driver &D = getDriver();
2368 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002369 SmallString<128> IncludeDir(GetGnuDir(D.InstalledDir, DriverArgs));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002370
Rafael Espindola358256c2013-06-26 02:13:00 +00002371 llvm::sys::path::append(IncludeDir, "hexagon/include/c++/");
2372 llvm::sys::path::append(IncludeDir, Ver);
Yaron Keren92e1b622015-03-18 10:17:07 +00002373 addSystemInclude(DriverArgs, CC1Args, IncludeDir);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002374}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002375
Matthew Curtise689b052012-12-06 15:46:07 +00002376ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002377HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002378 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2379 if (!A)
2380 return ToolChain::CST_Libstdcxx;
2381
2382 StringRef Value = A->getValue();
2383 if (Value != "libstdc++") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002384 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002385 }
2386
2387 return ToolChain::CST_Libstdcxx;
2388}
2389
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002390static int getHexagonVersion(const ArgList &Args) {
2391 Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ);
2392 // Select the default CPU (v4) if none was given.
2393 if (!A)
2394 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002395
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002396 // FIXME: produce errors if we cannot parse the version.
2397 StringRef WhichHexagon = A->getValue();
2398 if (WhichHexagon.startswith("hexagonv")) {
2399 int Val;
2400 if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val))
2401 return Val;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002402 }
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002403 if (WhichHexagon.startswith("v")) {
2404 int Val;
2405 if (!WhichHexagon.substr(1).getAsInteger(10, Val))
2406 return Val;
2407 }
2408
2409 // FIXME: should probably be an error.
2410 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002411}
2412
Douglas Katzman54366072015-07-27 16:53:08 +00002413StringRef HexagonToolChain::GetTargetCPU(const ArgList &Args) {
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002414 int V = getHexagonVersion(Args);
2415 // FIXME: We don't support versions < 4. We should error on them.
2416 switch (V) {
2417 default:
2418 llvm_unreachable("Unexpected version");
2419 case 5:
2420 return "v5";
2421 case 4:
2422 return "v4";
2423 case 3:
2424 return "v3";
2425 case 2:
2426 return "v2";
2427 case 1:
2428 return "v1";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002429 }
Matthew Curtisf10a5952012-12-06 14:16:43 +00002430}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002431// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002432
Tom Stellard8fa33092015-07-18 01:49:05 +00002433/// AMDGPU Toolchain
2434AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2435 const ArgList &Args)
2436 : Generic_ELF(D, Triple, Args) { }
2437
2438Tool *AMDGPUToolChain::buildLinker() const {
2439 return new tools::amdgpu::Linker(*this);
2440}
2441// End AMDGPU
2442
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002443/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00002444NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2445 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002446 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002447
2448 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2449 // default paths, and must instead only use the paths provided
2450 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002451 path_list &file_paths = getFilePaths();
2452 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002453
2454 file_paths.clear();
2455 prog_paths.clear();
2456
2457 // Path for library files (libc.a, ...)
2458 std::string FilePath(getDriver().Dir + "/../");
2459
2460 // Path for tools (clang, ld, etc..)
2461 std::string ProgPath(getDriver().Dir + "/../");
2462
2463 // Path for toolchain libraries (libgcc.a, ...)
2464 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2465
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002466 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00002467 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002468 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00002469 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002470 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2471 file_paths.push_back(ToolPath + "i686-nacl");
2472 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002473 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002474 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2475 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2476 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2477 file_paths.push_back(ToolPath + "x86_64-nacl");
2478 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002479 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002480 file_paths.push_back(FilePath + "arm-nacl/lib");
2481 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2482 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2483 file_paths.push_back(ToolPath + "arm-nacl");
2484 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002485 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002486 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2487 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2488 prog_paths.push_back(ProgPath + "bin");
2489 file_paths.push_back(ToolPath + "mipsel-nacl");
2490 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002491 default:
2492 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002493 }
2494
2495 // Use provided linker, not system linker
Derek Schuffef465d72015-08-24 23:53:25 +00002496 Linker = GetLinkerPath();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002497 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2498}
2499
Douglas Katzman54366072015-07-27 16:53:08 +00002500void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2501 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002502 const Driver &D = getDriver();
2503 if (DriverArgs.hasArg(options::OPT_nostdinc))
2504 return;
2505
2506 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2507 SmallString<128> P(D.ResourceDir);
2508 llvm::sys::path::append(P, "include");
2509 addSystemInclude(DriverArgs, CC1Args, P.str());
2510 }
2511
2512 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2513 return;
2514
2515 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002516 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00002517 case llvm::Triple::x86:
2518 // x86 is special because multilib style uses x86_64-nacl/include for libc
2519 // headers but the SDK wants i686-nacl/usr/include. The other architectures
2520 // have the same substring.
2521 llvm::sys::path::append(P, "i686-nacl/usr/include");
2522 addSystemInclude(DriverArgs, CC1Args, P.str());
2523 llvm::sys::path::remove_filename(P);
2524 llvm::sys::path::remove_filename(P);
2525 llvm::sys::path::remove_filename(P);
2526 llvm::sys::path::append(P, "x86_64-nacl/include");
2527 addSystemInclude(DriverArgs, CC1Args, P.str());
2528 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002529 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002530 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002531 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002532 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002533 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002534 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002535 case llvm::Triple::mipsel:
2536 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2537 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002538 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002539 return;
2540 }
2541
2542 addSystemInclude(DriverArgs, CC1Args, P.str());
2543 llvm::sys::path::remove_filename(P);
2544 llvm::sys::path::remove_filename(P);
2545 llvm::sys::path::append(P, "include");
2546 addSystemInclude(DriverArgs, CC1Args, P.str());
2547}
2548
Douglas Katzman54366072015-07-27 16:53:08 +00002549void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2550 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002551 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2552 // if the value is libc++, and emits an error for other values.
2553 GetCXXStdlibType(Args);
2554 CmdArgs.push_back("-lc++");
2555}
2556
Douglas Katzman54366072015-07-27 16:53:08 +00002557void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2558 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002559 const Driver &D = getDriver();
2560 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2561 DriverArgs.hasArg(options::OPT_nostdincxx))
2562 return;
2563
2564 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2565 // if the value is libc++, and emits an error for other values.
2566 GetCXXStdlibType(DriverArgs);
2567
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002568 SmallString<128> P(D.Dir + "/../");
2569 switch (getTriple().getArch()) {
2570 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002571 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2572 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002573 break;
2574 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002575 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2576 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002577 break;
2578 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002579 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2580 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002581 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002582 case llvm::Triple::mipsel:
2583 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2584 addSystemInclude(DriverArgs, CC1Args, P.str());
2585 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002586 default:
2587 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002588 }
2589}
2590
Douglas Katzman54366072015-07-27 16:53:08 +00002591ToolChain::CXXStdlibType
2592NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002593 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2594 StringRef Value = A->getValue();
2595 if (Value == "libc++")
2596 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002597 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002598 }
2599
2600 return ToolChain::CST_Libcxx;
2601}
2602
Douglas Katzman54366072015-07-27 16:53:08 +00002603std::string
2604NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2605 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002606 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2607 if (TheTriple.getArch() == llvm::Triple::arm &&
2608 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2609 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2610 return TheTriple.getTriple();
2611}
2612
Douglas Katzman54366072015-07-27 16:53:08 +00002613Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002614 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002615}
2616
Douglas Katzman54366072015-07-27 16:53:08 +00002617Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002618 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002619 return new tools::nacltools::AssemblerARM(*this);
2620 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002621}
2622// End NaCl
2623
Chris Lattner09797542010-03-04 21:07:38 +00002624/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2625/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2626/// Currently does not support anything else but compilation.
2627
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002628TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002629 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002630 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002631 // Path mangling to find libexec
2632 std::string Path(getDriver().Dir);
2633
2634 Path += "/../libexec";
2635 getProgramPaths().push_back(Path);
2636}
2637
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002638TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002639
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002640bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002641
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002642bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002643
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002644bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002645
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002646bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002647
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002648// CloudABI - CloudABI tool chain which can call ld(1) directly.
2649
2650CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2651 const ArgList &Args)
2652 : Generic_ELF(D, Triple, Args) {
2653 SmallString<128> P(getDriver().Dir);
2654 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2655 getFilePaths().push_back(P.str());
2656}
2657
2658void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2659 ArgStringList &CC1Args) const {
2660 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2661 DriverArgs.hasArg(options::OPT_nostdincxx))
2662 return;
2663
2664 SmallString<128> P(getDriver().Dir);
2665 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2666 addSystemInclude(DriverArgs, CC1Args, P.str());
2667}
2668
2669void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
2670 ArgStringList &CmdArgs) const {
2671 CmdArgs.push_back("-lc++");
2672 CmdArgs.push_back("-lc++abi");
2673 CmdArgs.push_back("-lunwind");
2674}
2675
Douglas Katzman95354292015-06-23 20:42:09 +00002676Tool *CloudABI::buildLinker() const {
2677 return new tools::cloudabi::Linker(*this);
2678}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002679
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002680/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
2681
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002682OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
2683 const ArgList &Args)
2684 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00002685 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002686 getFilePaths().push_back("/usr/lib");
2687}
2688
Rafael Espindola7cf32212013-03-20 03:05:54 +00002689Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002690 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002691}
2692
Douglas Katzman95354292015-06-23 20:42:09 +00002693Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002694
Eli Friedman9fa28852012-08-08 23:57:20 +00002695/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
2696
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002697Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2698 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00002699 getFilePaths().push_back(getDriver().Dir + "/../lib");
2700 getFilePaths().push_back("/usr/lib");
2701}
2702
Rafael Espindola7cf32212013-03-20 03:05:54 +00002703Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002704 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002705}
2706
Douglas Katzman95354292015-06-23 20:42:09 +00002707Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00002708
Douglas Katzman95354292015-06-23 20:42:09 +00002709ToolChain::CXXStdlibType Bitrig::GetCXXStdlibType(const ArgList &Args) const {
Richard Smith51af5192014-05-01 23:24:24 +00002710 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2711 StringRef Value = A->getValue();
2712 if (Value == "libstdc++")
2713 return ToolChain::CST_Libstdcxx;
2714 if (Value == "libc++")
2715 return ToolChain::CST_Libcxx;
2716
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002717 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Richard Smith51af5192014-05-01 23:24:24 +00002718 }
2719 return ToolChain::CST_Libcxx;
2720}
2721
Eli Friedman9fa28852012-08-08 23:57:20 +00002722void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2723 ArgStringList &CC1Args) const {
2724 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2725 DriverArgs.hasArg(options::OPT_nostdincxx))
2726 return;
2727
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002728 switch (GetCXXStdlibType(DriverArgs)) {
2729 case ToolChain::CST_Libcxx:
2730 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00002731 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002732 break;
2733 case ToolChain::CST_Libstdcxx:
2734 addSystemInclude(DriverArgs, CC1Args,
2735 getDriver().SysRoot + "/usr/include/c++/stdc++");
2736 addSystemInclude(DriverArgs, CC1Args,
2737 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00002738
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002739 StringRef Triple = getTriple().str();
2740 if (Triple.startswith("amd64"))
2741 addSystemInclude(DriverArgs, CC1Args,
2742 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002743 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002744 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002745 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
2746 "/usr/include/c++/stdc++/" +
2747 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002748 break;
2749 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002750}
2751
2752void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
2753 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002754 switch (GetCXXStdlibType(Args)) {
2755 case ToolChain::CST_Libcxx:
2756 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00002757 CmdArgs.push_back("-lc++abi");
2758 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002759 break;
2760 case ToolChain::CST_Libstdcxx:
2761 CmdArgs.push_back("-lstdc++");
2762 break;
2763 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002764}
2765
Daniel Dunbare24297c2009-03-30 21:06:03 +00002766/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
2767
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002768FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
2769 const ArgList &Args)
2770 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00002771
Chandler Carruth0b1756b2012-01-26 01:35:15 +00002772 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
2773 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002774 if ((Triple.getArch() == llvm::Triple::x86 ||
2775 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002776 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002777 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
2778 else
2779 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00002780}
2781
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002782ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
David Chisnall867ccd82013-11-09 15:10:56 +00002783 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2784 StringRef Value = A->getValue();
2785 if (Value == "libstdc++")
2786 return ToolChain::CST_Libstdcxx;
2787 if (Value == "libc++")
2788 return ToolChain::CST_Libcxx;
2789
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002790 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
David Chisnall867ccd82013-11-09 15:10:56 +00002791 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002792 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00002793 return ToolChain::CST_Libcxx;
2794 return ToolChain::CST_Libstdcxx;
2795}
2796
2797void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2798 ArgStringList &CC1Args) const {
2799 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2800 DriverArgs.hasArg(options::OPT_nostdincxx))
2801 return;
2802
2803 switch (GetCXXStdlibType(DriverArgs)) {
2804 case ToolChain::CST_Libcxx:
2805 addSystemInclude(DriverArgs, CC1Args,
2806 getDriver().SysRoot + "/usr/include/c++/v1");
2807 break;
2808 case ToolChain::CST_Libstdcxx:
2809 addSystemInclude(DriverArgs, CC1Args,
2810 getDriver().SysRoot + "/usr/include/c++/4.2");
2811 addSystemInclude(DriverArgs, CC1Args,
2812 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
2813 break;
2814 }
2815}
2816
Rafael Espindola7cf32212013-03-20 03:05:54 +00002817Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002818 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002819}
2820
Douglas Katzman95354292015-06-23 20:42:09 +00002821Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00002822
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002823bool FreeBSD::UseSjLjExceptions() const {
2824 // FreeBSD uses SjLj exceptions on ARM oabi.
2825 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00002826 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002827 case llvm::Triple::GNUEABI:
2828 case llvm::Triple::EABI:
2829 return false;
2830
2831 default:
2832 return (getTriple().getArch() == llvm::Triple::arm ||
2833 getTriple().getArch() == llvm::Triple::thumb);
2834 }
2835}
2836
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002837bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002838
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002839bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002840
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00002841SanitizerMask FreeBSD::getSupportedSanitizers() const {
2842 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
2843 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
2844 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
2845 getTriple().getArch() == llvm::Triple::mips64el;
2846 SanitizerMask Res = ToolChain::getSupportedSanitizers();
2847 Res |= SanitizerKind::Address;
2848 Res |= SanitizerKind::Vptr;
2849 if (IsX86_64 || IsMIPS64) {
2850 Res |= SanitizerKind::Leak;
2851 Res |= SanitizerKind::Thread;
2852 }
2853 if (IsX86 || IsX86_64) {
2854 Res |= SanitizerKind::SafeStack;
2855 }
2856 return Res;
2857}
2858
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002859/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
2860
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002861NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2862 : Generic_ELF(D, Triple, Args) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002863
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00002864 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00002865 // When targeting a 32-bit platform, try the special directory used on
2866 // 64-bit hosts, and only fall back to the main library directory if that
2867 // doesn't work.
2868 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
2869 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002870 switch (Triple.getArch()) {
2871 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00002872 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002873 break;
2874 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00002875 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002876 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00002877 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002878 switch (Triple.getEnvironment()) {
2879 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002880 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002881 getFilePaths().push_back("=/usr/lib/eabi");
2882 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00002883 case llvm::Triple::EABIHF:
2884 case llvm::Triple::GNUEABIHF:
2885 getFilePaths().push_back("=/usr/lib/eabihf");
2886 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002887 default:
2888 getFilePaths().push_back("=/usr/lib/oabi");
2889 break;
2890 }
2891 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002892 case llvm::Triple::mips64:
2893 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002894 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002895 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002896 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002897 getFilePaths().push_back("=/usr/lib/64");
2898 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00002899 case llvm::Triple::ppc:
2900 getFilePaths().push_back("=/usr/lib/powerpc");
2901 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00002902 case llvm::Triple::sparc:
2903 getFilePaths().push_back("=/usr/lib/sparc");
2904 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002905 default:
2906 break;
2907 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00002908
2909 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002910 }
2911}
2912
Rafael Espindola7cf32212013-03-20 03:05:54 +00002913Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002914 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002915}
2916
Douglas Katzman95354292015-06-23 20:42:09 +00002917Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002918
Douglas Katzman95354292015-06-23 20:42:09 +00002919ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002920 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2921 StringRef Value = A->getValue();
2922 if (Value == "libstdc++")
2923 return ToolChain::CST_Libstdcxx;
2924 if (Value == "libc++")
2925 return ToolChain::CST_Libcxx;
2926
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002927 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002928 }
2929
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002930 unsigned Major, Minor, Micro;
2931 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00002932 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002933 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00002934 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00002935 case llvm::Triple::arm:
2936 case llvm::Triple::armeb:
2937 case llvm::Triple::thumb:
2938 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00002939 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00002940 case llvm::Triple::ppc64:
2941 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002942 case llvm::Triple::x86:
2943 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002944 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002945 default:
2946 break;
2947 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002948 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002949 return ToolChain::CST_Libstdcxx;
2950}
2951
2952void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2953 ArgStringList &CC1Args) const {
2954 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2955 DriverArgs.hasArg(options::OPT_nostdincxx))
2956 return;
2957
2958 switch (GetCXXStdlibType(DriverArgs)) {
2959 case ToolChain::CST_Libcxx:
2960 addSystemInclude(DriverArgs, CC1Args,
2961 getDriver().SysRoot + "/usr/include/c++/");
2962 break;
2963 case ToolChain::CST_Libstdcxx:
2964 addSystemInclude(DriverArgs, CC1Args,
2965 getDriver().SysRoot + "/usr/include/g++");
2966 addSystemInclude(DriverArgs, CC1Args,
2967 getDriver().SysRoot + "/usr/include/g++/backward");
2968 break;
2969 }
2970}
2971
Chris Lattner3e2ee142010-07-07 16:01:42 +00002972/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
2973
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002974Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2975 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00002976 getFilePaths().push_back(getDriver().Dir + "/../lib");
2977 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00002978}
2979
Rafael Espindola7cf32212013-03-20 03:05:54 +00002980Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002981 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002982}
2983
Douglas Katzman95354292015-06-23 20:42:09 +00002984Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00002985
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002986static void addPathIfExists(const Driver &D, const Twine &Path,
2987 ToolChain::path_list &Paths) {
2988 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002989 Paths.push_back(Path.str());
2990}
2991
David Chisnallf571cde2012-02-15 13:39:01 +00002992/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
2993
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002994Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002995 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002996 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00002997
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002998 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00002999
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003000 path_list &Paths = getFilePaths();
3001 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003002 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003003
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003004 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003005 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003006 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003007
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003008 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003009
3010 std::string LibPath = "/usr/lib/";
3011 switch (Triple.getArch()) {
3012 case llvm::Triple::x86:
3013 case llvm::Triple::sparc:
3014 break;
3015 case llvm::Triple::x86_64:
3016 LibPath += "amd64/";
3017 break;
3018 case llvm::Triple::sparcv9:
3019 LibPath += "sparcv9/";
3020 break;
3021 default:
3022 llvm_unreachable("Unsupported architecture");
3023 }
3024
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003025 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003026}
3027
Rafael Espindola7cf32212013-03-20 03:05:54 +00003028Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003029 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003030}
3031
Douglas Katzman95354292015-06-23 20:42:09 +00003032Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003033
Rafael Espindolad5117262015-09-09 13:36:00 +00003034void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3035 ArgStringList &CC1Args) const {
3036 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3037 DriverArgs.hasArg(options::OPT_nostdincxx))
3038 return;
3039
3040 // Include the support directory for things like xlocale and fudged system
3041 // headers.
3042 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3043
3044 if (GCCInstallation.isValid()) {
3045 GCCVersion Version = GCCInstallation.getVersion();
3046 addSystemInclude(DriverArgs, CC1Args,
3047 getDriver().SysRoot + "/usr/gcc/" +
3048 Version.MajorStr + "." +
3049 Version.MinorStr +
3050 "/include/c++/" + Version.Text);
3051 addSystemInclude(DriverArgs, CC1Args,
3052 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3053 "." + Version.MinorStr + "/include/c++/" +
3054 Version.Text + "/" +
3055 GCCInstallation.getTriple().str());
3056 }
3057}
3058
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003059/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003060
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003061enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003062 // NB: Releases of a particular Linux distro should be kept together
3063 // in this enum, because some tests are done by integer comparison against
3064 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003065 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003066 DebianLenny,
3067 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003068 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003069 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003070 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003071 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003072 RHEL4,
3073 RHEL5,
3074 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003075 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003076 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003077 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003078 UbuntuHardy,
3079 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003080 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003081 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003082 UbuntuLucid,
3083 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003084 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003085 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003086 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003087 UbuntuQuantal,
3088 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003089 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003090 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003091 UbuntuUtopic,
3092 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003093 UbuntuWily,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003094 UnknownDistro
3095};
3096
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003097static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003098 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003099}
3100
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003101static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003102
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003103static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003104 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003105}
3106
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003107static bool IsUbuntu(enum Distro Distro) {
Benjamin Kramer2d469802015-07-09 15:31:17 +00003108 return Distro >= UbuntuHardy && Distro <= UbuntuWily;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003109}
3110
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003111static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003112 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3113 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3114 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003115 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003116 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003117 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003118 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003119 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003120 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3121 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3122 .Case("hardy", UbuntuHardy)
3123 .Case("intrepid", UbuntuIntrepid)
3124 .Case("jaunty", UbuntuJaunty)
3125 .Case("karmic", UbuntuKarmic)
3126 .Case("lucid", UbuntuLucid)
3127 .Case("maverick", UbuntuMaverick)
3128 .Case("natty", UbuntuNatty)
3129 .Case("oneiric", UbuntuOneiric)
3130 .Case("precise", UbuntuPrecise)
3131 .Case("quantal", UbuntuQuantal)
3132 .Case("raring", UbuntuRaring)
3133 .Case("saucy", UbuntuSaucy)
3134 .Case("trusty", UbuntuTrusty)
3135 .Case("utopic", UbuntuUtopic)
3136 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003137 .Case("wily", UbuntuWily)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003138 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003139 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003140 }
3141
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003142 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3143 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003144 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003145 if (Data.startswith("Fedora release"))
3146 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003147 if (Data.startswith("Red Hat Enterprise Linux") ||
3148 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003149 if (Data.find("release 7") != StringRef::npos)
3150 return RHEL7;
3151 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003152 return RHEL6;
3153 else if (Data.find("release 5") != StringRef::npos)
3154 return RHEL5;
3155 else if (Data.find("release 4") != StringRef::npos)
3156 return RHEL4;
3157 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003158 return UnknownDistro;
3159 }
3160
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003161 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3162 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003163 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003164 if (Data[0] == '5')
3165 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003166 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003167 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003168 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003169 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003170 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003171 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003172 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3173 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003174 return UnknownDistro;
3175 }
3176
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003177 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003178 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003179
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003180 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003181 return Exherbo;
3182
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003183 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003184 return ArchLinux;
3185
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003186 return UnknownDistro;
3187}
3188
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003189/// \brief Get our best guess at the multiarch triple for a target.
3190///
3191/// Debian-based systems are starting to use a multiarch setup where they use
3192/// a target-triple directory in the library and header search paths.
3193/// Unfortunately, this triple does not align with the vanilla target triple,
3194/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003195static std::string getMultiarchTriple(const Driver &D,
3196 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003197 StringRef SysRoot) {
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003198 llvm::Triple::EnvironmentType TargetEnvironment = TargetTriple.getEnvironment();
3199
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003200 // For most architectures, just use whatever we have rather than trying to be
3201 // clever.
3202 switch (TargetTriple.getArch()) {
3203 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003204 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003205
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003206 // We use the existence of '/lib/<triple>' as a directory to detect some
3207 // common linux triples that don't quite match the Clang triple for both
3208 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3209 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003210 case llvm::Triple::arm:
3211 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003212 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003213 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003214 return "arm-linux-gnueabihf";
3215 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003216 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003217 return "arm-linux-gnueabi";
3218 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003219 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003220 case llvm::Triple::armeb:
3221 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003222 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003223 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003224 return "armeb-linux-gnueabihf";
3225 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003226 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003227 return "armeb-linux-gnueabi";
3228 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003229 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003230 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003231 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003232 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003233 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003234 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003235 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003236 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003237 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003238 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003239 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003240 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003241 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003242 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003243 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003244 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003245 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003246 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003247 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003248 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003249 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003250 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003251 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003252 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003253 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003254 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003255 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003256 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003257 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003258 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003259 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003260 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003261 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003262 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003263 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003264 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003265 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003266 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003267 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003268 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003269 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003270 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003271 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003272 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003273 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003274 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003275 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003276 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003277 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003278 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003279 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003280 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003281 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003282 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003283 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003284 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003285 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003286 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003287 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003288 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003289 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003290 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003291 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003292 return "s390x-linux-gnu";
3293 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003294 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003295 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003296}
3297
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003298static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003299 if (isMipsArch(Triple.getArch())) {
3300 // lib32 directory has a special meaning on MIPS targets.
3301 // It contains N32 ABI binaries. Use this folder if produce
3302 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003303 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003304 return "lib32";
3305 return Triple.isArch32Bit() ? "lib" : "lib64";
3306 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003307
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003308 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003309 // using that variant while targeting other architectures causes problems
3310 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003311 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003312 // them when we know we may need it.
3313 //
3314 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003315 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003316 // GCCInstallationDetector, but that is a more significant refactoring.
3317 if (Triple.getArch() == llvm::Triple::x86 ||
3318 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003319 return "lib32";
3320
Zinovy Nis1db95732014-07-10 15:27:19 +00003321 if (Triple.getArch() == llvm::Triple::x86_64 &&
3322 Triple.getEnvironment() == llvm::Triple::GNUX32)
3323 return "libx32";
3324
Simon Atanasyand4413882012-09-14 11:27:24 +00003325 return Triple.isArch32Bit() ? "lib" : "lib64";
3326}
3327
Rafael Espindola1af7c212012-02-19 01:38:32 +00003328Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003329 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003330 GCCInstallation.init(Triple, Args);
3331 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003332 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003333 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003334 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003335
Rafael Espindola10a63c22013-07-03 14:14:00 +00003336 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003337 // least) put various tools in a triple-prefixed directory off of the parent
3338 // of the GCC installation. We use the GCC triple here to ensure that we end
3339 // up with tools that support the same amount of cross compiling as the
3340 // detected GCC installation. For example, if we find a GCC installation
3341 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3342 // used to target i386.
3343 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003344 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003345 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003346 GCCInstallation.getTriple().str() + "/bin")
3347 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003348
Logan Chieneb9162f2014-06-26 14:23:45 +00003349 Linker = GetLinkerPath();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003350
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003351 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003352
Rafael Espindola10a63c22013-07-03 14:14:00 +00003353 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003354 ExtraOpts.push_back("-z");
3355 ExtraOpts.push_back("relro");
3356 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003357
Douglas Gregord9bb1522011-03-06 19:11:49 +00003358 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003359 ExtraOpts.push_back("-X");
3360
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003361 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003362 const bool IsMips = isMipsArch(Arch);
3363
3364 if (IsMips && !SysRoot.empty())
3365 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003366
Chandler Carruth0b842912011-12-09 04:45:18 +00003367 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3368 // and the MIPS ABI require .dynsym to be sorted in different ways.
3369 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3370 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003371 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003372 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003373 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003374 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003375 ExtraOpts.push_back("--hash-style=gnu");
3376
Rafael Espindola10a63c22013-07-03 14:14:00 +00003377 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003378 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3379 ExtraOpts.push_back("--hash-style=both");
3380 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003381
Chris Lattner84e38552011-05-22 05:36:06 +00003382 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003383 ExtraOpts.push_back("--no-add-needed");
3384
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003385 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003386 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003387 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003388 ExtraOpts.push_back("--build-id");
3389
Rafael Espindola10a63c22013-07-03 14:14:00 +00003390 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003391 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003392
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003393 // The selection of paths to try here is designed to match the patterns which
3394 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3395 // This was determined by running GCC in a fake filesystem, creating all
3396 // possible permutations of these directories, and seeing which ones it added
3397 // to the link paths.
3398 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003399
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003400 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003401 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003402
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003403 // Add the multilib suffixed paths where they are available.
3404 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003405 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003406 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003407 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003408
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003409 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003410 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003411 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003412 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003413
3414 // GCC cross compiling toolchains will install target libraries which ship
3415 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3416 // any part of the GCC installation in
3417 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3418 // debatable, but is the reality today. We need to search this tree even
3419 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003420 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003421 // installation that is *not* within the system root to ensure two things:
3422 //
3423 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003424 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003425 // appropriate rpath.
3426 // 2) There must not be libraries installed into
3427 // <prefix>/<triple>/<libdir> unless they should be preferred over
3428 // those within the system root.
3429 //
3430 // Note that this matches the GCC behavior. See the below comment for where
3431 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003432 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
3433 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003434 Paths);
3435
Chandler Carruth69a125b2012-04-06 16:32:06 +00003436 // If the GCC installation we found is inside of the sysroot, we want to
3437 // prefer libraries installed in the parent prefix of the GCC installation.
3438 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003439 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003440 // This usually happens when there is an external cross compiler on the
3441 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003442 // the cross. Note that GCC does include some of these directories in some
3443 // configurations but this seems somewhere between questionable and simply
3444 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003445 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003446 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
3447 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003448 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003449 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003450
3451 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003452 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003453 // those searched.
3454 // FIXME: It's not clear whether we should use the driver's installed
3455 // directory ('Dir' below) or the ResourceDir.
3456 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003457 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
3458 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003459 }
3460
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003461 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
3462 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
3463 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3464 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003465
Chandler Carruthb427c562013-06-22 11:35:51 +00003466 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003467 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003468 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003469 addPathIfExists(D,
3470 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003471 "/../../" + OSLibDir,
3472 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003473
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003474 // Add the 'other' biarch variant path
3475 Multilib BiarchSibling;
3476 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003477 addPathIfExists(D, GCCInstallation.getInstallPath() +
3478 BiarchSibling.gccSuffix(),
3479 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003480 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003481
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003482 // See comments above on the multilib variant for details of why this is
3483 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003484 const std::string &LibPath = GCCInstallation.getParentLibPath();
3485 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3486 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003487 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
3488 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003489 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003490
3491 // See comments above on the multilib variant for details of why this is
3492 // only included from within the sysroot.
3493 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003494 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003495 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003496
3497 // Similar to the logic for GCC above, if we are currently running Clang
3498 // inside of the requested system root, add its parent library path to those
3499 // searched.
3500 // FIXME: It's not clear whether we should use the driver's installed
3501 // directory ('Dir' below) or the ResourceDir.
3502 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003503 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003504
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003505 addPathIfExists(D, SysRoot + "/lib", Paths);
3506 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003507}
3508
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003509bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003510
Douglas Katzman95354292015-06-23 20:42:09 +00003511Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003512
3513Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003514 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003515}
3516
Simon Atanasyana0d89572013-10-05 14:37:55 +00003517std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003518 if (!getDriver().SysRoot.empty())
3519 return getDriver().SysRoot;
3520
3521 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3522 return std::string();
3523
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003524 // Standalone MIPS toolchains use different names for sysroot folder
3525 // and put it into different places. Here we try to check some known
3526 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003527
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003528 const StringRef InstallDir = GCCInstallation.getInstallPath();
3529 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003530 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003531
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003532 std::string Path =
3533 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3534 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003535
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003536 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003537 return Path;
3538
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003539 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003540
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003541 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003542 return Path;
3543
3544 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003545}
3546
Chandler Carrutha796f532011-11-05 20:17:13 +00003547void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3548 ArgStringList &CC1Args) const {
3549 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003550 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003551
3552 if (DriverArgs.hasArg(options::OPT_nostdinc))
3553 return;
3554
3555 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003556 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003557
3558 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003559 SmallString<128> P(D.ResourceDir);
3560 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003561 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003562 }
3563
3564 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3565 return;
3566
3567 // Check for configure-time C include directories.
3568 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3569 if (CIncludeDirs != "") {
3570 SmallVector<StringRef, 5> dirs;
3571 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003572 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003573 StringRef Prefix =
3574 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003575 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003576 }
3577 return;
3578 }
3579
3580 // Lacking those, try to detect the correct set of system includes for the
3581 // target triple.
3582
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003583 // Add include directories specific to the selected multilib set and multilib.
3584 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003585 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003586 if (Callback) {
3587 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3588 GCCInstallation.getTriple().str(),
3589 GCCInstallation.getMultilib());
3590 for (const auto &Path : IncludePaths)
3591 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3592 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003593 }
3594
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003595 // Implement generic Debian multiarch support.
3596 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003597 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003598
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003599 // FIXME: These are older forms of multiarch. It's not clear that they're
3600 // in use in any released version of Debian, so we should consider
3601 // removing them.
3602 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003603 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003604 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003605
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003606 // FIXME: These are older forms of multiarch. It's not clear that they're
3607 // in use in any released version of Debian, so we should consider
3608 // removing them.
3609 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3610 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003611 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003612 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003613 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003614 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003615 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003616 "/usr/include/arm-linux-gnueabihf"};
3617 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003618 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003619 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003620 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003621 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003622 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003623 "/usr/include/mips64el-linux-gnu",
3624 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003625 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003626 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003627 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003628 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003629 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003630 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003631 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003632 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003633 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003634 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003635 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
3636 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003637 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003638 switch (getTriple().getArch()) {
3639 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003640 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003641 break;
3642 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003643 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003644 break;
3645 case llvm::Triple::aarch64:
3646 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003647 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003648 break;
3649 case llvm::Triple::arm:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003650 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3651 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3652 else
3653 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003654 break;
3655 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00003656 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003657 break;
3658 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00003659 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003660 break;
3661 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003662 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003663 break;
3664 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003665 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003666 break;
3667 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003668 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003669 break;
3670 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003671 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003672 break;
3673 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003674 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003675 break;
3676 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00003677 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003678 break;
3679 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00003680 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003681 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003682 case llvm::Triple::systemz:
3683 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
3684 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003685 default:
3686 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003687 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003688 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003689 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003690 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003691 break;
3692 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003693 }
3694
3695 if (getTriple().getOS() == llvm::Triple::RTEMS)
3696 return;
3697
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003698 // Add an include of '/include' directly. This isn't provided by default by
3699 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
3700 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003701 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003702
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003703 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003704}
3705
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003706
Chandler Carrutha796f532011-11-05 20:17:13 +00003707void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3708 ArgStringList &CC1Args) const {
3709 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3710 DriverArgs.hasArg(options::OPT_nostdincxx))
3711 return;
3712
Chandler Carruthf4701732011-11-07 09:01:17 +00003713 // Check if libc++ has been enabled and provide its include paths if so.
3714 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003715 const std::string LibCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003716 // The primary location is within the Clang installation.
3717 // FIXME: We shouldn't hard code 'v1' here to make Clang future proof to
3718 // newer ABI versions.
3719 getDriver().Dir + "/../include/c++/v1",
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003720
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003721 // We also check the system as for a long time this is the only place
3722 // Clang looked.
3723 // FIXME: We should really remove this. It doesn't make any sense.
3724 getDriver().SysRoot + "/usr/include/c++/v1"};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003725 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003726 if (!getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003727 continue;
3728 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003729 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003730 break;
3731 }
Chandler Carruthf4701732011-11-07 09:01:17 +00003732 return;
3733 }
3734
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00003735 // We need a detected GCC installation on Linux to provide libstdc++'s
3736 // headers. We handled the libc++ case above.
3737 if (!GCCInstallation.isValid())
3738 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00003739
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003740 // By default, look for the C++ headers in an include directory adjacent to
3741 // the lib directory of the GCC installation. Note that this is expect to be
3742 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
3743 StringRef LibDir = GCCInstallation.getParentLibPath();
3744 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003745 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003746 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003747 const std::string GCCMultiarchTriple = getMultiarchTriple(
3748 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003749 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003750 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00003751 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003752
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003753 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00003754 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003755 "/c++/" + Version.Text, TripleStr,
3756 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003757 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003758 return;
3759
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003760 // Otherwise, fall back on a bunch of options which don't use multiarch
3761 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003762 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003763 // Gentoo is weird and places its headers inside the GCC install,
3764 // so if the first attempt to find the headers fails, try these patterns.
3765 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
3766 Version.MinorStr,
3767 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
3768 // Android standalone toolchain has C++ headers in yet another place.
3769 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
3770 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
3771 // without a subdirectory corresponding to the gcc version.
3772 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003773 };
3774
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003775 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003776 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
3777 /*GCCMultiarchTriple*/ "",
3778 /*TargetMultiarchTriple*/ "",
3779 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003780 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003781 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003782}
3783
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003784bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003785
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003786SanitizerMask Linux::getSupportedSanitizers() const {
3787 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3788 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3789 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3790 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00003791 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
3792 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003793 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
3794 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003795 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3796 Res |= SanitizerKind::Address;
3797 Res |= SanitizerKind::KernelAddress;
3798 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00003799 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003800 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003801 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00003802 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003803 Res |= SanitizerKind::Leak;
Renato Golind45c2df2015-08-05 18:42:41 +00003804 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003805 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00003806 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00003807 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003808 if (IsX86 || IsX86_64) {
3809 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003810 }
3811 return Res;
3812}
3813
Daniel Dunbarcc912342009-05-02 18:28:39 +00003814/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
3815
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003816DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
3817 const ArgList &Args)
3818 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00003819
3820 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00003821 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00003822 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00003823 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00003824
Daniel Dunbar083edf72009-12-21 18:54:17 +00003825 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00003826 getFilePaths().push_back("/usr/lib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003827 if (D.getVFS().exists("/usr/lib/gcc47"))
John McCall65b8da02013-04-11 22:55:55 +00003828 getFilePaths().push_back("/usr/lib/gcc47");
3829 else
3830 getFilePaths().push_back("/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00003831}
3832
Rafael Espindola7cf32212013-03-20 03:05:54 +00003833Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003834 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003835}
3836
3837Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003838 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00003839}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003840
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003841/// Stub for CUDA toolchain. At the moment we don't have assembler or
3842/// linker and need toolchain mainly to propagate device-side options
3843/// to CC1.
3844
3845CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
3846 const ArgList &Args)
3847 : Linux(D, Triple, Args) {}
3848
3849void
3850CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
3851 llvm::opt::ArgStringList &CC1Args) const {
3852 Linux::addClangTargetOptions(DriverArgs, CC1Args);
3853 CC1Args.push_back("-fcuda-is-device");
3854}
3855
3856llvm::opt::DerivedArgList *
3857CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
3858 const char *BoundArch) const {
3859 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
3860 const OptTable &Opts = getDriver().getOpts();
3861
3862 for (Arg *A : Args) {
3863 if (A->getOption().matches(options::OPT_Xarch__)) {
3864 // Skip this argument unless the architecture matches BoundArch
3865 if (A->getValue(0) != StringRef(BoundArch))
3866 continue;
3867
3868 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
3869 unsigned Prev = Index;
3870 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
3871
3872 // If the argument parsing failed or more than one argument was
3873 // consumed, the -Xarch_ argument's parameter tried to consume
3874 // extra arguments. Emit an error and ignore.
3875 //
3876 // We also want to disallow any options which would alter the
3877 // driver behavior; that isn't going to work in our model. We
3878 // use isDriverOption() as an approximation, although things
3879 // like -O4 are going to slip through.
3880 if (!XarchArg || Index > Prev + 1) {
3881 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
3882 << A->getAsString(Args);
3883 continue;
3884 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
3885 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
3886 << A->getAsString(Args);
3887 continue;
3888 }
3889 XarchArg->setBaseArg(A);
3890 A = XarchArg.release();
3891 DAL->AddSynthesizedArg(A);
3892 }
3893 DAL->append(A);
3894 }
3895
3896 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
3897 return DAL;
3898}
3899
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003900/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00003901XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
3902 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003903 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003904 // ProgramPaths are found via 'PATH' environment variable.
3905}
3906
Douglas Katzman54366072015-07-27 16:53:08 +00003907Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003908 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003909}
3910
Douglas Katzman54366072015-07-27 16:53:08 +00003911Tool *XCoreToolChain::buildLinker() const {
3912 return new tools::XCore::Linker(*this);
3913}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003914
Douglas Katzman54366072015-07-27 16:53:08 +00003915bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003916
Douglas Katzman54366072015-07-27 16:53:08 +00003917bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003918
Douglas Katzman54366072015-07-27 16:53:08 +00003919bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003920
Douglas Katzman54366072015-07-27 16:53:08 +00003921bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003922
Douglas Katzman54366072015-07-27 16:53:08 +00003923bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003924
Douglas Katzman54366072015-07-27 16:53:08 +00003925void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3926 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003927 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
3928 DriverArgs.hasArg(options::OPT_nostdlibinc))
3929 return;
3930 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
3931 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003932 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003933 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3934 ArrayRef<StringRef> DirVec(Dirs);
3935 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3936 }
3937}
3938
Douglas Katzman54366072015-07-27 16:53:08 +00003939void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
3940 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003941 CC1Args.push_back("-nostdsysteminc");
3942}
3943
Douglas Katzman54366072015-07-27 16:53:08 +00003944void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
3945 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003946 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00003947 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3948 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003949 return;
3950 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
3951 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003952 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003953 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3954 ArrayRef<StringRef> DirVec(Dirs);
3955 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3956 }
3957}
3958
Douglas Katzman54366072015-07-27 16:53:08 +00003959void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
3960 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003961 // We don't output any lib args. This is handled by xcc.
3962}
Douglas Katzman84a75642015-06-19 14:55:19 +00003963
Douglas Katzmand6e597c2015-09-17 19:56:40 +00003964MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
3965 const ArgList &Args)
3966 : Generic_GCC(D, Triple, Args) {
3967 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
3968 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
3969 // This won't work to find gcc. Instead we give the installation detector an
3970 // extra triple, which is preferable to further hacks of the logic that at
3971 // present is based solely on getArch(). In particular, it would be wrong to
3972 // choose the myriad installation when targeting a non-myriad sparc install.
3973 switch (Triple.getArch()) {
3974 default:
3975 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName() << "myriad";
3976 case llvm::Triple::sparc:
3977 case llvm::Triple::sparcel:
3978 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003979 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00003980 }
3981}
3982
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00003983MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00003984
Douglas Katzmanb1278f32015-09-17 21:20:16 +00003985void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3986 ArgStringList &CC1Args) const {
3987 if (!DriverArgs.hasArg(options::OPT_nostdinc))
3988 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
3989}
3990
James Y Knighta6c9ee72015-10-16 18:46:26 +00003991void MyriadToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3992 ArgStringList &CC1Args) const {
3993 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3994 DriverArgs.hasArg(options::OPT_nostdincxx))
3995 return;
3996
3997 // Only libstdc++, for now.
3998 StringRef LibDir = GCCInstallation.getParentLibPath();
3999 const GCCVersion &Version = GCCInstallation.getVersion();
4000 StringRef TripleStr = GCCInstallation.getTriple().str();
4001 const Multilib &Multilib = GCCInstallation.getMultilib();
4002
4003 addLibStdCXXIncludePaths(LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4004 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
4005}
4006
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004007// MyriadToolChain handles several triples:
4008// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
4009Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4010 // The inherited method works fine if not targeting the SHAVE.
4011 if (!isShaveCompilation(getTriple()))
4012 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004013 switch (JA.getKind()) {
4014 case Action::CompileJobClass:
4015 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004016 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004017 return Compiler.get();
4018 case Action::AssembleJobClass:
4019 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004020 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004021 return Assembler.get();
4022 default:
4023 return ToolChain::getTool(JA.getKind());
4024 }
4025}
4026
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004027void MyriadToolChain::getCompilerSupportDir(std::string &Dir) const {
4028 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4029 // These files are tied to a particular version of gcc.
4030 SmallString<128> Result(GCCInstallation.getInstallPath());
4031 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4032 // but as this toolchain is for LEON sparc, it can assume FPU.
4033 if (this->getTriple().getArch() == llvm::Triple::sparcel)
4034 llvm::sys::path::append(Result, "le");
4035 Dir.assign(Result.str());
4036}
4037void MyriadToolChain::getBuiltinLibDir(std::string &Dir) const {
4038 // The contents of LibDir are independent of the version of gcc.
4039 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4040 SmallString<128> Result(GCCInstallation.getParentLibPath());
4041 if (this->getTriple().getArch() == llvm::Triple::sparcel)
4042 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib/le");
4043 else
4044 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib");
4045 Dir.assign(Result.str());
Douglas Katzman84a75642015-06-19 14:55:19 +00004046}
4047
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004048Tool *MyriadToolChain::buildLinker() const {
4049 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004050}
Dan Gohmanc2853072015-09-03 22:51:53 +00004051
4052bool WebAssembly::IsMathErrnoDefault() const { return false; }
4053
4054bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4055
4056bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4057
4058bool WebAssembly::isPICDefault() const { return false; }
4059
4060bool WebAssembly::isPIEDefault() const { return false; }
4061
4062bool WebAssembly::isPICDefaultForced() const { return false; }
4063
4064bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4065
4066// TODO: Support Objective C stuff.
4067bool WebAssembly::SupportsObjCGC() const { return false; }
4068
4069bool WebAssembly::hasBlocksRuntime() const { return false; }
4070
4071// TODO: Support profiling.
4072bool WebAssembly::SupportsProfiling() const { return false; }
4073
4074void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4075 ArgStringList &CC1Args) const {
4076 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4077 options::OPT_fno_use_init_array, true))
4078 CC1Args.push_back("-fuse-init-array");
4079}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004080
4081PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4082 : Generic_ELF(D, Triple, Args) {
4083 if (Args.hasArg(options::OPT_static))
4084 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4085
4086 // Determine where to find the PS4 libraries. We use SCE_PS4_SDK_DIR
4087 // if it exists; otherwise use the driver's installation path, which
4088 // should be <SDK_DIR>/host_tools/bin.
4089
4090 SmallString<512> PS4SDKDir;
4091 if (const char *EnvValue = getenv("SCE_PS4_SDK_DIR")) {
4092 if (!llvm::sys::fs::exists(EnvValue))
4093 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4094 PS4SDKDir = EnvValue;
4095 } else {
4096 PS4SDKDir = getDriver().Dir;
4097 llvm::sys::path::append(PS4SDKDir, "/../../");
4098 }
4099
4100 // By default, the driver won't report a warning if it can't find
4101 // PS4's include or lib directories. This behavior could be changed if
4102 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
4103 // If -isysroot was passed, use that as the SDK base path.
4104 std::string PrefixDir;
4105 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4106 PrefixDir = A->getValue();
4107 if (!llvm::sys::fs::exists(PrefixDir))
4108 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4109 } else
4110 PrefixDir = PS4SDKDir.str();
4111
4112 SmallString<512> PS4SDKIncludeDir(PrefixDir);
4113 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4114 if (!Args.hasArg(options::OPT_nostdinc) &&
4115 !Args.hasArg(options::OPT_nostdlibinc) &&
4116 !Args.hasArg(options::OPT_isysroot) &&
4117 !Args.hasArg(options::OPT__sysroot_EQ) &&
4118 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4119 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4120 << "PS4 system headers" << PS4SDKIncludeDir;
4121 }
4122
4123 SmallString<512> PS4SDKLibDir(PS4SDKDir);
4124 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4125 if (!Args.hasArg(options::OPT_nostdlib) &&
4126 !Args.hasArg(options::OPT_nodefaultlibs) &&
4127 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
4128 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
4129 !Args.hasArg(options::OPT_emit_ast) &&
4130 !llvm::sys::fs::exists(PS4SDKLibDir)) {
4131 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4132 << "PS4 system libraries" << PS4SDKLibDir;
4133 return;
4134 }
4135 getFilePaths().push_back(PS4SDKLibDir.str());
4136}
4137
4138Tool *PS4CPU::buildAssembler() const {
4139 return new tools::PS4cpu::Assemble(*this);
4140}
4141
4142Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
4143
4144bool PS4CPU::isPICDefault() const { return true; }
4145
4146bool PS4CPU::HasNativeLLVMSupport() const { return true; }
4147
4148SanitizerMask PS4CPU::getSupportedSanitizers() const {
4149 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4150 Res |= SanitizerKind::Address;
4151 Res |= SanitizerKind::Vptr;
4152 return Res;
4153}