blob: 0687699e4a1d8c045e49debe096e8213a0c57872 [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 Gomezb5250d32015-10-20 12:52:55 +0000159Darwin::~Darwin() = default;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000160
Angel Garcia Gomezb5250d32015-10-20 12:52:55 +0000161MachO::~MachO() = default;
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 {
Justin Bognerc7701242015-05-12 05:44:36 +0000303 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
304 false) ||
305 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +0000306 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bognerc7701242015-05-12 05:44:36 +0000307 Args.hasArg(options::OPT_fprofile_instr_generate) ||
308 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
309 Args.hasArg(options::OPT_fcreate_profile) ||
310 Args.hasArg(options::OPT_coverage)))
311 return;
312
313 // Select the appropriate runtime library for the target.
314 if (isTargetIOSBased())
315 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a",
316 /*AlwaysLink*/ true);
317 else
318 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a",
319 /*AlwaysLink*/ true);
320}
321
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000322void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
323 ArgStringList &CmdArgs,
324 StringRef Sanitizer) const {
325 if (!Args.hasArg(options::OPT_dynamiclib) &&
326 !Args.hasArg(options::OPT_bundle)) {
327 // Sanitizer runtime libraries requires C++.
328 AddCXXStdlibLibArgs(Args, CmdArgs);
329 }
330 assert(isTargetMacOS() || isTargetIOSSimulator());
331 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000332 AddLinkRuntimeLib(
333 Args, CmdArgs,
334 (Twine("libclang_rt.") + Sanitizer + "_" + OS + "_dynamic.dylib").str(),
335 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
336 /*AddRPath*/ true);
Hans Wennborg10821e52015-04-09 18:47:01 +0000337
338 if (GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) {
339 // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
340 // all RTTI-related symbols that UBSan uses.
341 CmdArgs.push_back("-lc++abi");
342 }
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000343}
344
Daniel Dunbar6276f992009-09-18 08:15:13 +0000345void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
346 ArgStringList &CmdArgs) const {
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000347 // Darwin only supports the compiler-rt based runtime libraries.
348 switch (GetRuntimeLibType(Args)) {
349 case ToolChain::RLT_CompilerRT:
350 break;
351 default:
352 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000353 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000354 return;
355 }
356
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000357 // Darwin doesn't support real static executables, don't link any runtime
358 // libraries with -static.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000359 if (Args.hasArg(options::OPT_static) ||
360 Args.hasArg(options::OPT_fapple_kext) ||
361 Args.hasArg(options::OPT_mkernel))
Daniel Dunbar6276f992009-09-18 08:15:13 +0000362 return;
Daniel Dunbar6276f992009-09-18 08:15:13 +0000363
364 // Reject -static-libgcc for now, we can deal with this when and if someone
365 // cares. This is useful in situations where someone wants to statically link
366 // something like libstdc++, and needs its runtime support routines.
367 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000368 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
Daniel Dunbar6276f992009-09-18 08:15:13 +0000369 return;
370 }
371
Peter Collingbourne32701642013-11-01 18:16:25 +0000372 const SanitizerArgs &Sanitize = getSanitizerArgs();
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +0000373 if (Sanitize.needsAsanRt())
374 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
375 if (Sanitize.needsUbsanRt())
376 AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
Daniel Dunbar1d6469f2011-12-01 23:40:18 +0000377
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000378 // Otherwise link libSystem, then the dynamic runtime library, and finally any
379 // target specific static runtime library.
Daniel Dunbar6276f992009-09-18 08:15:13 +0000380 CmdArgs.push_back("-lSystem");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000381
382 // Select the dynamic runtime library and the target specific static library.
Tim Northover9c7e0352013-12-12 11:55:52 +0000383 if (isTargetIOSBased()) {
Daniel Dunbar2f31fb92011-04-30 04:25:16 +0000384 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
385 // it never went into the SDK.
Bob Wilson102be442011-10-07 17:54:41 +0000386 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
Tim Northovera2ee4332014-03-29 15:09:45 +0000387 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
Tim Northover40956e62014-07-23 12:32:58 +0000388 getTriple().getArch() != llvm::Triple::aarch64)
Bob Wilson102be442011-10-07 17:54:41 +0000389 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000390
Daniel Dunbard1076382011-04-18 23:48:36 +0000391 // We currently always need a static runtime library for iOS.
Eric Christopherc235d0c62011-06-22 17:41:40 +0000392 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000393 } else {
Tim Northover9c7e0352013-12-12 11:55:52 +0000394 assert(isTargetMacOS() && "unexpected non MacOS platform");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000395 // The dynamic runtime library was merged with libSystem for 10.6 and
396 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000397 if (isMacosxVersionLT(10, 5))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000398 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000399 else if (isMacosxVersionLT(10, 6))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000400 CmdArgs.push_back("-lgcc_s.10.5");
401
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000402 // For OS X, we thought we would only need a static runtime library when
Chris Lattner57540c52011-04-15 05:22:18 +0000403 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000404 // omitted from 10.4.dylib.
405 //
406 // Unfortunately, that turned out to not be true, because Darwin system
407 // headers can still use eprintf on i386, and it is not exported from
408 // libSystem. Therefore, we still must provide a runtime library just for
409 // the tiny tiny handful of projects that *might* use that symbol.
410 if (isMacosxVersionLT(10, 5)) {
Eric Christopherc235d0c62011-06-22 17:41:40 +0000411 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000412 } else {
413 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopherc235d0c62011-06-22 17:41:40 +0000414 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
415 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000416 }
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000417 }
Daniel Dunbar6276f992009-09-18 08:15:13 +0000418}
419
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000420void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +0000421 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000422
Daniel Dunbar455a0492012-08-17 18:43:50 +0000423 // Support allowing the SDKROOT environment variable used by xcrun and other
424 // Xcode tools to define the default sysroot, by making it the default for
425 // isysroot.
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000426 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
427 // Warn if the path does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000428 if (!getVFS().exists(A->getValue()))
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000429 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
430 } else {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000431 if (char *env = ::getenv("SDKROOT")) {
Daniel Dunbarb2543042013-01-15 20:33:56 +0000432 // We only use this value as the default if it is an absolute path,
433 // exists, and it is not the root path.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000434 if (llvm::sys::path::is_absolute(env) && getVFS().exists(env) &&
Daniel Dunbarb2543042013-01-15 20:33:56 +0000435 StringRef(env) != "/") {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000436 Args.append(Args.MakeSeparateArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000437 nullptr, Opts.getOption(options::OPT_isysroot), env));
Daniel Dunbar455a0492012-08-17 18:43:50 +0000438 }
439 }
440 }
441
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000442 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000443 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
Eli Friedman027e9c32012-01-11 02:41:15 +0000444
Bob Wilson7f294b52014-10-10 23:10:10 +0000445 if (OSXVersion && iOSVersion) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000446 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000447 << OSXVersion->getAsString(Args) << iOSVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000448 iOSVersion = nullptr;
449 } else if (!OSXVersion && !iOSVersion) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000450 // If no deployment target was specified on the command line, check for
Daniel Dunbard54669d2010-01-26 01:45:19 +0000451 // environment defines.
Alexey Samsonov905c8022015-06-18 21:46:05 +0000452 std::string OSXTarget;
453 std::string iOSTarget;
Chad Rosier64707fe2011-08-31 20:56:25 +0000454 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
455 OSXTarget = env;
456 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
457 iOSTarget = env;
Daniel Dunbarb5023e92009-04-10 21:00:07 +0000458
Steven Wu7a1372c2015-06-25 01:59:35 +0000459 // If there is no command-line argument to specify the Target version and
460 // no environment variable defined, see if we can set the default based
461 // on -isysroot.
462 if (iOSTarget.empty() && OSXTarget.empty() &&
463 Args.hasArg(options::OPT_isysroot)) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000464 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000465 StringRef isysroot = A->getValue();
Steven Wu7a1372c2015-06-25 01:59:35 +0000466 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
467 size_t BeginSDK = isysroot.rfind("SDKs/");
468 size_t EndSDK = isysroot.rfind(".sdk");
469 if (BeginSDK != StringRef::npos && EndSDK != StringRef::npos) {
470 StringRef SDK = isysroot.slice(BeginSDK + 5, EndSDK);
471 // Slice the version number out.
472 // Version number is between the first and the last number.
473 size_t StartVer = SDK.find_first_of("0123456789");
474 size_t EndVer = SDK.find_last_of("0123456789");
475 if (StartVer != StringRef::npos && EndVer > StartVer) {
476 StringRef Version = SDK.slice(StartVer, EndVer + 1);
477 if (SDK.startswith("iPhoneOS") ||
478 SDK.startswith("iPhoneSimulator"))
479 iOSTarget = Version;
480 else if (SDK.startswith("MacOSX"))
481 OSXTarget = Version;
482 }
483 }
Chad Rosier64707fe2011-08-31 20:56:25 +0000484 }
485 }
Daniel Dunbard54669d2010-01-26 01:45:19 +0000486
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000487 // If no OSX or iOS target has been specified, try to guess platform
Alexey Samsonov905c8022015-06-18 21:46:05 +0000488 // from arch name and compute the version from the triple.
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000489 if (OSXTarget.empty() && iOSTarget.empty()) {
490 StringRef MachOArchName = getMachOArchName(Args);
Alexey Samsonov905c8022015-06-18 21:46:05 +0000491 unsigned Major, Minor, Micro;
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000492 if (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
Alexey Samsonov905c8022015-06-18 21:46:05 +0000493 MachOArchName == "arm64") {
494 getTriple().getiOSVersion(Major, Minor, Micro);
495 llvm::raw_string_ostream(iOSTarget) << Major << '.' << Minor << '.'
496 << Micro;
497 } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
498 MachOArchName != "armv7em") {
499 if (!getTriple().getMacOSXVersion(Major, Minor, Micro)) {
500 getDriver().Diag(diag::err_drv_invalid_darwin_version)
501 << getTriple().getOSName();
502 }
503 llvm::raw_string_ostream(OSXTarget) << Major << '.' << Minor << '.'
504 << Micro;
505 }
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000506 }
Chad Rosierfe6fd362011-09-28 00:46:32 +0000507
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000508 // Allow conflicts among OSX and iOS for historical reasons, but choose the
509 // default platform.
Chad Rosier64707fe2011-08-31 20:56:25 +0000510 if (!OSXTarget.empty() && !iOSTarget.empty()) {
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000511 if (getTriple().getArch() == llvm::Triple::arm ||
Tim Northover573cbee2014-05-24 12:52:07 +0000512 getTriple().getArch() == llvm::Triple::aarch64 ||
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000513 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosier64707fe2011-08-31 20:56:25 +0000514 OSXTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000515 else
Chad Rosier64707fe2011-08-31 20:56:25 +0000516 iOSTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000517 }
Daniel Dunbar65969842010-01-29 17:02:25 +0000518
Chad Rosier64707fe2011-08-31 20:56:25 +0000519 if (!OSXTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000520 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000521 OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000522 Args.append(OSXVersion);
Chad Rosier64707fe2011-08-31 20:56:25 +0000523 } else if (!iOSTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000524 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000525 iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000526 Args.append(iOSVersion);
Daniel Dunbar84e727f2009-09-04 18:35:21 +0000527 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000528 }
Mike Stump11289f42009-09-09 15:08:12 +0000529
Tim Northover9c7e0352013-12-12 11:55:52 +0000530 DarwinPlatformKind Platform;
531 if (OSXVersion)
532 Platform = MacOS;
533 else if (iOSVersion)
534 Platform = IPhoneOS;
Tim Northover9c7e0352013-12-12 11:55:52 +0000535 else
Tim Northover157d9112014-01-16 08:48:16 +0000536 llvm_unreachable("Unable to infer Darwin variant");
Tim Northover9c7e0352013-12-12 11:55:52 +0000537
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000538 // Set the tool chain target information.
539 unsigned Major, Minor, Micro;
540 bool HadExtra;
Tim Northover9c7e0352013-12-12 11:55:52 +0000541 if (Platform == MacOS) {
Bob Wilson7f294b52014-10-10 23:10:10 +0000542 assert(!iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000543 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, Micro,
544 HadExtra) ||
545 HadExtra || Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000546 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000547 << OSXVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000548 } else if (Platform == IPhoneOS) {
549 assert(iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000550 if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
551 HadExtra) ||
552 HadExtra || Major >= 10 || Minor >= 100 || Micro >= 100)
Eli Friedman027e9c32012-01-11 02:41:15 +0000553 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000554 << iOSVersion->getAsString(Args);
Tim Northover157d9112014-01-16 08:48:16 +0000555 } else
556 llvm_unreachable("unknown kind of Darwin platform");
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000557
Bob Wilson7f294b52014-10-10 23:10:10 +0000558 // Recognize iOS targets with an x86 architecture as the iOS simulator.
Daniel Dunbarb1189432011-04-30 04:18:16 +0000559 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
560 getTriple().getArch() == llvm::Triple::x86_64))
Tim Northover9c7e0352013-12-12 11:55:52 +0000561 Platform = IPhoneOSSimulator;
Daniel Dunbarb1189432011-04-30 04:18:16 +0000562
Tim Northover9c7e0352013-12-12 11:55:52 +0000563 setTarget(Platform, Major, Minor, Micro);
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000564}
565
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000566void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000567 ArgStringList &CmdArgs) const {
568 CXXStdlibType Type = GetCXXStdlibType(Args);
569
570 switch (Type) {
571 case ToolChain::CST_Libcxx:
572 CmdArgs.push_back("-lc++");
573 break;
574
Hans Wennborgdcfba332015-10-06 23:40:43 +0000575 case ToolChain::CST_Libstdcxx:
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000576 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
577 // it was previously found in the gcc lib dir. However, for all the Darwin
578 // platforms we care about it was -lstdc++.6, so we search for that
579 // explicitly if we can't see an obvious -lstdc++ candidate.
580
581 // Check in the sysroot first.
582 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000583 SmallString<128> P(A->getValue());
Benjamin Kramer17381a02013-06-28 16:25:46 +0000584 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000585
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000586 if (!getVFS().exists(P)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000587 llvm::sys::path::remove_filename(P);
588 llvm::sys::path::append(P, "libstdc++.6.dylib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000589 if (getVFS().exists(P)) {
Yaron Keren92e1b622015-03-18 10:17:07 +0000590 CmdArgs.push_back(Args.MakeArgString(P));
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000591 return;
592 }
593 }
594 }
595
596 // Otherwise, look in the root.
Bob Wilson1a9ad0f2011-11-11 07:47:04 +0000597 // FIXME: This should be removed someday when we don't have to care about
598 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000599 if (!getVFS().exists("/usr/lib/libstdc++.dylib") &&
600 getVFS().exists("/usr/lib/libstdc++.6.dylib")) {
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000601 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
602 return;
603 }
604
605 // Otherwise, let the linker search.
606 CmdArgs.push_back("-lstdc++");
607 break;
608 }
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000609}
610
Shantonu Senafeb03b2010-09-17 18:39:08 +0000611void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
612 ArgStringList &CmdArgs) const {
613
614 // For Darwin platforms, use the compiler-rt-based support library
615 // instead of the gcc-provided one (which is also incidentally
616 // only present in the gcc lib dir, which makes it hard to find).
617
Rafael Espindola358256c2013-06-26 02:13:00 +0000618 SmallString<128> P(getDriver().ResourceDir);
Benjamin Kramer17381a02013-06-28 16:25:46 +0000619 llvm::sys::path::append(P, "lib", "darwin");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000620
621 // Use the newer cc_kext for iOS ARM after 6.0.
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000622 if (isTargetIPhoneOS()) {
623 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000624 } else {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000625 llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000626 }
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000627
Shantonu Senafeb03b2010-09-17 18:39:08 +0000628 // For now, allow missing resource libraries to support developers who may
629 // not have compiler-rt checked out or integrated into their build.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000630 if (getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000631 CmdArgs.push_back(Args.MakeArgString(P));
Shantonu Senafeb03b2010-09-17 18:39:08 +0000632}
633
Tim Northover157d9112014-01-16 08:48:16 +0000634DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
635 const char *BoundArch) const {
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000636 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
637 const OptTable &Opts = getDriver().getOpts();
638
639 // FIXME: We really want to get out of the tool chain level argument
640 // translation business, as it makes the driver functionality much
641 // more opaque. For now, we follow gcc closely solely for the
642 // purpose of easily achieving feature parity & testability. Once we
643 // have something that works, we should reevaluate each translation
644 // and try to push it down into tool specific logic.
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000645
Simon Atanasyan6f657c42014-05-08 19:32:46 +0000646 for (Arg *A : Args) {
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000647 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar471c4f82011-06-21 00:20:17 +0000648 // Skip this argument unless the architecture matches either the toolchain
649 // triple arch, or the arch being bound.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000650 llvm::Triple::ArchType XarchArch =
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000651 tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
652 if (!(XarchArch == getArch() ||
653 (BoundArch &&
654 XarchArch ==
655 tools::darwin::getArchTypeForMachOArchName(BoundArch))))
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000656 continue;
657
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000658 Arg *OriginalArg = A;
Richard Smithbd55daf2012-11-01 04:30:05 +0000659 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000660 unsigned Prev = Index;
Nico Webera04d5f82014-05-11 17:27:13 +0000661 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
Mike Stump11289f42009-09-09 15:08:12 +0000662
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000663 // If the argument parsing failed or more than one argument was
664 // consumed, the -Xarch_ argument's parameter tried to consume
665 // extra arguments. Emit an error and ignore.
666 //
667 // We also want to disallow any options which would alter the
668 // driver behavior; that isn't going to work in our model. We
669 // use isDriverOption() as an approximation, although things
670 // like -O4 are going to slip through.
Daniel Dunbar5a784c82011-04-21 17:41:34 +0000671 if (!XarchArg || Index > Prev + 1) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000672 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000673 << A->getAsString(Args);
Daniel Dunbar6914a982011-04-21 17:32:21 +0000674 continue;
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000675 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000676 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000677 << A->getAsString(Args);
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000678 continue;
679 }
680
Daniel Dunbar53b406f2009-03-29 22:29:05 +0000681 XarchArg->setBaseArg(A);
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000682
Nico Webera04d5f82014-05-11 17:27:13 +0000683 A = XarchArg.release();
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000684 DAL->AddSynthesizedArg(A);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000685
686 // Linker input arguments require custom handling. The problem is that we
687 // have already constructed the phase actions, so we can not treat them as
688 // "input arguments".
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000689 if (A->getOption().hasFlag(options::LinkerInput)) {
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000690 // Convert the argument into individual Zlinker_input_args.
Douglas Katzman6bbffc42015-06-25 18:51:37 +0000691 for (const char *Value : A->getValues()) {
692 DAL->AddSeparateArg(
693 OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000694 }
695 continue;
696 }
Mike Stump11289f42009-09-09 15:08:12 +0000697 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000698
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000699 // Sob. These is strictly gcc compatible for the time being. Apple
700 // gcc translates options twice, which means that self-expanding
701 // options add duplicates.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000702 switch ((options::ID)A->getOption().getID()) {
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000703 default:
704 DAL->append(A);
705 break;
706
707 case options::OPT_mkernel:
708 case options::OPT_fapple_kext:
709 DAL->append(A);
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000710 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000711 break;
Mike Stump11289f42009-09-09 15:08:12 +0000712
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000713 case options::OPT_dependency_file:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000714 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000715 break;
716
717 case options::OPT_gfull:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000718 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000719 DAL->AddFlagArg(
720 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000721 break;
722
723 case options::OPT_gused:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000724 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000725 DAL->AddFlagArg(
726 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000727 break;
728
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000729 case options::OPT_shared:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000730 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000731 break;
732
733 case options::OPT_fconstant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000734 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000735 break;
736
737 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000738 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000739 break;
740
741 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000742 DAL->AddFlagArg(A,
743 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000744 break;
745
746 case options::OPT_Wno_nonportable_cfstrings:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000747 DAL->AddFlagArg(
748 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000749 break;
750
751 case options::OPT_fpascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000752 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000753 break;
754
755 case options::OPT_fno_pascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000756 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000757 break;
758 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000759 }
760
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000761 if (getTriple().getArch() == llvm::Triple::x86 ||
762 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbarfffd1812009-11-19 04:00:53 +0000763 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000764 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
765 "core2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000766
767 // Add the arch options based on the particular spelling of -arch, to match
Chad Rosier7c5d9082012-04-27 14:58:16 +0000768 // how the driver driver works.
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000769 if (BoundArch) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000770 StringRef Name = BoundArch;
Michael J. Spencerfc790902012-10-19 22:36:40 +0000771 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
772 const Option MArch = Opts.getOption(options::OPT_march_EQ);
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000773
774 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
775 // which defines the list of which architectures we accept.
776 if (Name == "ppc")
777 ;
778 else if (Name == "ppc601")
Craig Topper92fc2df2014-05-17 16:56:41 +0000779 DAL->AddJoinedArg(nullptr, MCpu, "601");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000780 else if (Name == "ppc603")
Craig Topper92fc2df2014-05-17 16:56:41 +0000781 DAL->AddJoinedArg(nullptr, MCpu, "603");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000782 else if (Name == "ppc604")
Craig Topper92fc2df2014-05-17 16:56:41 +0000783 DAL->AddJoinedArg(nullptr, MCpu, "604");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000784 else if (Name == "ppc604e")
Craig Topper92fc2df2014-05-17 16:56:41 +0000785 DAL->AddJoinedArg(nullptr, MCpu, "604e");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000786 else if (Name == "ppc750")
Craig Topper92fc2df2014-05-17 16:56:41 +0000787 DAL->AddJoinedArg(nullptr, MCpu, "750");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000788 else if (Name == "ppc7400")
Craig Topper92fc2df2014-05-17 16:56:41 +0000789 DAL->AddJoinedArg(nullptr, MCpu, "7400");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000790 else if (Name == "ppc7450")
Craig Topper92fc2df2014-05-17 16:56:41 +0000791 DAL->AddJoinedArg(nullptr, MCpu, "7450");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000792 else if (Name == "ppc970")
Craig Topper92fc2df2014-05-17 16:56:41 +0000793 DAL->AddJoinedArg(nullptr, MCpu, "970");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000794
Bill Schmidt778d3872013-07-26 01:36:11 +0000795 else if (Name == "ppc64" || Name == "ppc64le")
Craig Topper92fc2df2014-05-17 16:56:41 +0000796 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000797
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000798 else if (Name == "i386")
799 ;
800 else if (Name == "i486")
Craig Topper92fc2df2014-05-17 16:56:41 +0000801 DAL->AddJoinedArg(nullptr, MArch, "i486");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000802 else if (Name == "i586")
Craig Topper92fc2df2014-05-17 16:56:41 +0000803 DAL->AddJoinedArg(nullptr, MArch, "i586");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000804 else if (Name == "i686")
Craig Topper92fc2df2014-05-17 16:56:41 +0000805 DAL->AddJoinedArg(nullptr, MArch, "i686");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000806 else if (Name == "pentium")
Craig Topper92fc2df2014-05-17 16:56:41 +0000807 DAL->AddJoinedArg(nullptr, MArch, "pentium");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000808 else if (Name == "pentium2")
Craig Topper92fc2df2014-05-17 16:56:41 +0000809 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000810 else if (Name == "pentpro")
Craig Topper92fc2df2014-05-17 16:56:41 +0000811 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000812 else if (Name == "pentIIm3")
Craig Topper92fc2df2014-05-17 16:56:41 +0000813 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000814
815 else if (Name == "x86_64")
Craig Topper92fc2df2014-05-17 16:56:41 +0000816 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Jim Grosbach82eee262013-11-16 00:53:35 +0000817 else if (Name == "x86_64h") {
Craig Topper92fc2df2014-05-17 16:56:41 +0000818 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
819 DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
Jim Grosbach82eee262013-11-16 00:53:35 +0000820 }
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000821
822 else if (Name == "arm")
Craig Topper92fc2df2014-05-17 16:56:41 +0000823 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000824 else if (Name == "armv4t")
Craig Topper92fc2df2014-05-17 16:56:41 +0000825 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000826 else if (Name == "armv5")
Craig Topper92fc2df2014-05-17 16:56:41 +0000827 DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000828 else if (Name == "xscale")
Craig Topper92fc2df2014-05-17 16:56:41 +0000829 DAL->AddJoinedArg(nullptr, MArch, "xscale");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000830 else if (Name == "armv6")
Craig Topper92fc2df2014-05-17 16:56:41 +0000831 DAL->AddJoinedArg(nullptr, MArch, "armv6k");
Bob Wilson743bf672013-03-04 22:37:49 +0000832 else if (Name == "armv6m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000833 DAL->AddJoinedArg(nullptr, MArch, "armv6m");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000834 else if (Name == "armv7")
Craig Topper92fc2df2014-05-17 16:56:41 +0000835 DAL->AddJoinedArg(nullptr, MArch, "armv7a");
Bob Wilson743bf672013-03-04 22:37:49 +0000836 else if (Name == "armv7em")
Craig Topper92fc2df2014-05-17 16:56:41 +0000837 DAL->AddJoinedArg(nullptr, MArch, "armv7em");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000838 else if (Name == "armv7k")
Craig Topper92fc2df2014-05-17 16:56:41 +0000839 DAL->AddJoinedArg(nullptr, MArch, "armv7k");
Bob Wilson743bf672013-03-04 22:37:49 +0000840 else if (Name == "armv7m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000841 DAL->AddJoinedArg(nullptr, MArch, "armv7m");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000842 else if (Name == "armv7s")
Craig Topper92fc2df2014-05-17 16:56:41 +0000843 DAL->AddJoinedArg(nullptr, MArch, "armv7s");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000844 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000845
Tim Northover157d9112014-01-16 08:48:16 +0000846 return DAL;
847}
848
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000849void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
850 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000851 // Embedded targets are simple at the moment, not supporting sanitizers and
852 // with different libraries for each member of the product { static, PIC } x
853 // { hard-float, soft-float }
854 llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000855 CompilerRT +=
856 (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
857 ? "hard"
858 : "soft";
Tim Northover157d9112014-01-16 08:48:16 +0000859 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
860
861 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
862}
863
Tim Northover157d9112014-01-16 08:48:16 +0000864DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
865 const char *BoundArch) const {
866 // First get the generic Apple args, before moving onto Darwin-specific ones.
867 DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
868 const OptTable &Opts = getDriver().getOpts();
869
Bob Wilsonf8cf1612014-02-21 00:20:07 +0000870 // If no architecture is bound, none of the translations here are relevant.
871 if (!BoundArch)
872 return DAL;
873
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000874 // Add an explicit version min argument for the deployment target. We do this
875 // after argument translation because -Xarch_ arguments may add a version min
876 // argument.
Bob Wilsonf8cf1612014-02-21 00:20:07 +0000877 AddDeploymentTarget(*DAL);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000878
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000879 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
880 // FIXME: It would be far better to avoid inserting those -static arguments,
881 // but we can't check the deployment target in the translation code until
882 // it is set here.
Bob Wilson5f4346d2014-12-02 00:27:35 +0000883 if (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000884 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie;) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000885 Arg *A = *it;
886 ++it;
887 if (A->getOption().getID() != options::OPT_mkernel &&
888 A->getOption().getID() != options::OPT_fapple_kext)
889 continue;
890 assert(it != ie && "unexpected argument translation");
891 A = *it;
892 assert(A->getOption().getID() == options::OPT_static &&
893 "missing expected -static argument");
894 it = DAL->getArgs().erase(it);
895 }
896 }
897
Bob Wilson0f7445b2013-11-02 23:19:53 +0000898 // Default to use libc++ on OS X 10.9+ and iOS 7+.
899 if (((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
Tim Northover9c7e0352013-12-12 11:55:52 +0000900 (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0))) &&
Bob Wilson0f7445b2013-11-02 23:19:53 +0000901 !Args.getLastArg(options::OPT_stdlib_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000902 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
903 "libc++");
Bob Wilson0f7445b2013-11-02 23:19:53 +0000904
Bob Wilson102be442011-10-07 17:54:41 +0000905 // Validate the C++ standard library choice.
906 CXXStdlibType Type = GetCXXStdlibType(*DAL);
907 if (Type == ToolChain::CST_Libcxx) {
John McCall5fb5df92012-06-20 06:18:46 +0000908 // Check whether the target provides libc++.
909 StringRef where;
910
Alp Tokerf6a24ce2013-12-05 16:25:25 +0000911 // Complain about targeting iOS < 5.0 in any way.
Tim Northover9c7e0352013-12-12 11:55:52 +0000912 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
Bob Wilson5ad5a952012-11-09 01:59:30 +0000913 where = "iOS 5.0";
John McCall5fb5df92012-06-20 06:18:46 +0000914
915 if (where != StringRef()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000916 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where;
Bob Wilson102be442011-10-07 17:54:41 +0000917 }
918 }
919
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000920 return DAL;
Mike Stump11289f42009-09-09 15:08:12 +0000921}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000922
Tim Northover157d9112014-01-16 08:48:16 +0000923bool MachO::IsUnwindTablesDefault() const {
Rafael Espindolae8bd4e52012-10-07 03:23:40 +0000924 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000925}
926
Tim Northover157d9112014-01-16 08:48:16 +0000927bool MachO::UseDwarfDebugFlags() const {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +0000928 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
929 return S[0] != '\0';
930 return false;
931}
932
Daniel Dunbar3241d402010-02-10 18:49:11 +0000933bool Darwin::UseSjLjExceptions() const {
934 // Darwin uses SjLj exceptions on ARM.
935 return (getTriple().getArch() == llvm::Triple::arm ||
936 getTriple().getArch() == llvm::Triple::thumb);
937}
938
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000939bool MachO::isPICDefault() const { return true; }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000940
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000941bool MachO::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +0000942
Tim Northover157d9112014-01-16 08:48:16 +0000943bool MachO::isPICDefaultForced() const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000944 return (getArch() == llvm::Triple::x86_64 ||
Tim Northover573cbee2014-05-24 12:52:07 +0000945 getArch() == llvm::Triple::aarch64);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000946}
947
Tim Northover157d9112014-01-16 08:48:16 +0000948bool MachO::SupportsProfiling() const {
Daniel Dunbar733b0f82011-03-01 18:49:30 +0000949 // Profiling instrumentation is only supported on x86.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000950 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
Daniel Dunbar733b0f82011-03-01 18:49:30 +0000951}
952
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000953void Darwin::addMinVersionArgs(const ArgList &Args,
954 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000955 VersionTuple TargetVersion = getTargetVersion();
956
Bob Wilson771b7cd2014-10-10 19:38:34 +0000957 if (isTargetIOSSimulator())
Tim Northover157d9112014-01-16 08:48:16 +0000958 CmdArgs.push_back("-ios_simulator_version_min");
Bob Wilson5cfc55e2014-02-01 21:06:21 +0000959 else if (isTargetIOSBased())
Tim Northover157d9112014-01-16 08:48:16 +0000960 CmdArgs.push_back("-iphoneos_version_min");
961 else {
962 assert(isTargetMacOS() && "unexpected target");
963 CmdArgs.push_back("-macosx_version_min");
964 }
965
966 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
967}
968
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000969void Darwin::addStartObjectFileArgs(const ArgList &Args,
970 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000971 // Derived from startfile spec.
972 if (Args.hasArg(options::OPT_dynamiclib)) {
973 // Derived from darwin_dylib1 spec.
974 if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +0000975 ; // iOS simulator does not need dylib1.o.
Tim Northover157d9112014-01-16 08:48:16 +0000976 } else if (isTargetIPhoneOS()) {
977 if (isIPhoneOSVersionLT(3, 1))
978 CmdArgs.push_back("-ldylib1.o");
979 } else {
980 if (isMacosxVersionLT(10, 5))
981 CmdArgs.push_back("-ldylib1.o");
982 else if (isMacosxVersionLT(10, 6))
983 CmdArgs.push_back("-ldylib1.10.5.o");
984 }
985 } else {
986 if (Args.hasArg(options::OPT_bundle)) {
987 if (!Args.hasArg(options::OPT_static)) {
988 // Derived from darwin_bundle1 spec.
989 if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +0000990 ; // iOS simulator does not need bundle1.o.
Tim Northover157d9112014-01-16 08:48:16 +0000991 } else if (isTargetIPhoneOS()) {
992 if (isIPhoneOSVersionLT(3, 1))
993 CmdArgs.push_back("-lbundle1.o");
994 } else {
995 if (isMacosxVersionLT(10, 6))
996 CmdArgs.push_back("-lbundle1.o");
997 }
998 }
999 } else {
1000 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1001 if (Args.hasArg(options::OPT_static) ||
1002 Args.hasArg(options::OPT_object) ||
1003 Args.hasArg(options::OPT_preload)) {
1004 CmdArgs.push_back("-lgcrt0.o");
1005 } else {
1006 CmdArgs.push_back("-lgcrt1.o");
1007
1008 // darwin_crt2 spec is empty.
1009 }
1010 // By default on OS X 10.8 and later, we don't link with a crt1.o
1011 // file and the linker knows to use _main as the entry point. But,
1012 // when compiling with -pg, we need to link with the gcrt1.o file,
1013 // so pass the -no_new_main option to tell the linker to use the
1014 // "start" symbol as the entry point.
1015 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1016 CmdArgs.push_back("-no_new_main");
1017 } else {
1018 if (Args.hasArg(options::OPT_static) ||
1019 Args.hasArg(options::OPT_object) ||
1020 Args.hasArg(options::OPT_preload)) {
1021 CmdArgs.push_back("-lcrt0.o");
1022 } else {
1023 // Derived from darwin_crt1 spec.
1024 if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001025 ; // iOS simulator does not need crt1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001026 } else if (isTargetIPhoneOS()) {
Tim Northover40956e62014-07-23 12:32:58 +00001027 if (getArch() == llvm::Triple::aarch64)
Tim Northovera2ee4332014-03-29 15:09:45 +00001028 ; // iOS does not need any crt1 files for arm64
1029 else if (isIPhoneOSVersionLT(3, 1))
Tim Northover157d9112014-01-16 08:48:16 +00001030 CmdArgs.push_back("-lcrt1.o");
1031 else if (isIPhoneOSVersionLT(6, 0))
1032 CmdArgs.push_back("-lcrt1.3.1.o");
1033 } else {
1034 if (isMacosxVersionLT(10, 5))
1035 CmdArgs.push_back("-lcrt1.o");
1036 else if (isMacosxVersionLT(10, 6))
1037 CmdArgs.push_back("-lcrt1.10.5.o");
1038 else if (isMacosxVersionLT(10, 8))
1039 CmdArgs.push_back("-lcrt1.10.6.o");
1040
1041 // darwin_crt2 spec is empty.
1042 }
1043 }
1044 }
1045 }
1046 }
1047
1048 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
1049 isMacosxVersionLT(10, 5)) {
1050 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1051 CmdArgs.push_back(Str);
1052 }
1053}
1054
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001055bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
Daniel Dunbar16334e12010-04-10 16:20:23 +00001056
John McCall3deb1ad2012-08-21 02:47:43 +00001057void Darwin::CheckObjCARC() const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001058 if (isTargetIOSBased() || (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
John McCall3deb1ad2012-08-21 02:47:43 +00001059 return;
John McCall93207072012-08-27 01:56:21 +00001060 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00001061}
1062
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001063SanitizerMask Darwin::getSupportedSanitizers() const {
1064 SanitizerMask Res = ToolChain::getSupportedSanitizers();
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001065 if (isTargetMacOS() || isTargetIOSSimulator())
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001066 Res |= SanitizerKind::Address;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001067 if (isTargetMacOS()) {
1068 if (!isMacosxVersionLT(10, 9))
1069 Res |= SanitizerKind::Vptr;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001070 Res |= SanitizerKind::SafeStack;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001071 }
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001072 return Res;
1073}
1074
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001075/// Generic_GCC - A tool chain using the 'gcc' command to perform
1076/// all subcommands; this relies on gcc translating the majority of
1077/// command line options.
1078
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001079/// \brief Parse a GCCVersion object out of a string of text.
1080///
1081/// This is the primary means of forming GCCVersion objects.
1082/*static*/
1083Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001084 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001085 std::pair<StringRef, StringRef> First = VersionText.split('.');
1086 std::pair<StringRef, StringRef> Second = First.second.split('.');
1087
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001088 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1089 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001090 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001091 GoodVersion.MajorStr = First.first.str();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001092 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001093 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001094 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001095
1096 // First look for a number prefix and parse that if present. Otherwise just
1097 // stash the entire patch string in the suffix, and leave the number
1098 // unspecified. This covers versions strings such as:
1099 // 4.4
1100 // 4.4.0
1101 // 4.4.x
1102 // 4.4.2-rc4
1103 // 4.4.x-patched
1104 // And retains any patch number it finds.
1105 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1106 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001107 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001108 // Try to parse the number and any suffix.
1109 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1110 GoodVersion.Patch < 0)
1111 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001112 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001113 }
1114 }
1115
1116 return GoodVersion;
1117}
1118
1119/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001120bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1121 int RHSPatch,
1122 StringRef RHSPatchSuffix) const {
1123 if (Major != RHSMajor)
1124 return Major < RHSMajor;
1125 if (Minor != RHSMinor)
1126 return Minor < RHSMinor;
1127 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001128 // Note that versions without a specified patch sort higher than those with
1129 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001130 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001131 return true;
1132 if (Patch == -1)
1133 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001134
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001135 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001136 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001137 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001138 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001139 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001140 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001141 return true;
1142 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001143 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001144
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001145 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001146 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001147 }
1148
1149 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001150 return false;
1151}
1152
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001153static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001154 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1155 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001156 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001157 return GCC_INSTALL_PREFIX;
1158}
1159
Roman Divacky326d9982013-12-06 18:32:18 +00001160/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001161///
1162/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001163/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001164///
1165/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1166/// should instead pull the target out of the driver. This is currently
1167/// necessary because the driver doesn't store the final version of the target
1168/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001169void Generic_GCC::GCCInstallationDetector::init(
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001170 const llvm::Triple &TargetTriple, const ArgList &Args,
Douglas Katzman8c39e6a2015-09-18 15:23:16 +00001171 ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001172 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1173 ? TargetTriple.get64BitArchVariant()
1174 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001175 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001176 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001177 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001178 SmallVector<StringRef, 16> CandidateTripleAliases;
1179 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001180 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1181 CandidateTripleAliases, CandidateBiarchLibDirs,
1182 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001183
1184 // Compute the set of prefixes for our search.
1185 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1186 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001187
Rafael Espindola1af7c212012-02-19 01:38:32 +00001188 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1189 if (GCCToolchainDir != "") {
1190 if (GCCToolchainDir.back() == '/')
1191 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001192
Rafael Espindola1af7c212012-02-19 01:38:32 +00001193 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001194 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001195 // If we have a SysRoot, try that first.
1196 if (!D.SysRoot.empty()) {
1197 Prefixes.push_back(D.SysRoot);
1198 Prefixes.push_back(D.SysRoot + "/usr");
1199 }
1200
1201 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001202 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001203
1204 // And finally in /usr.
1205 if (D.SysRoot.empty())
1206 Prefixes.push_back("/usr");
Rafael Espindolac29af942012-02-03 01:01:20 +00001207 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001208
1209 // Loop over the various components which exist and select the best GCC
1210 // installation available. GCC installs are ranked by version number.
1211 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001212 for (const std::string &Prefix : Prefixes) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001213 if (!D.getVFS().exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001214 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001215 for (StringRef Suffix : CandidateLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001216 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001217 if (!D.getVFS().exists(LibDir))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001218 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001219 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001220 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Benjamin Kramer72e64312015-09-24 14:48:49 +00001221 for (StringRef Candidate : CandidateTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001222 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001223 }
Benjamin Kramer72e64312015-09-24 14:48:49 +00001224 for (StringRef Suffix : CandidateBiarchLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001225 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001226 if (!D.getVFS().exists(LibDir))
Chandler Carruth866faab2012-01-25 07:21:38 +00001227 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001228 for (StringRef Candidate : CandidateBiarchTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001229 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001230 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001231 }
1232 }
1233}
1234
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001235void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001236 for (const auto &InstallPath : CandidateGCCInstallPaths)
1237 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001238
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001239 if (!GCCInstallPath.empty())
1240 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1241
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001242 for (const auto &Multilib : Multilibs)
1243 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001244
1245 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1246 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001247}
1248
1249bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1250 if (BiarchSibling.hasValue()) {
1251 M = BiarchSibling.getValue();
1252 return true;
1253 }
1254 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001255}
1256
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001257/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001258 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001259 SmallVectorImpl<StringRef> &LibDirs,
1260 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001261 SmallVectorImpl<StringRef> &BiarchLibDirs,
1262 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001263 // Declare a bunch of static data sets that we'll select between below. These
1264 // are specifically designed to always refer to string literals to avoid any
1265 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001266 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1267 static const char *const AArch64Triples[] = {
1268 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1269 "aarch64-redhat-linux"};
1270 static const char *const AArch64beLibDirs[] = {"/lib"};
1271 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1272 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001273
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001274 static const char *const ARMLibDirs[] = {"/lib"};
1275 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1276 "arm-linux-androideabi"};
1277 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1278 "armv7hl-redhat-linux-gnueabi"};
1279 static const char *const ARMebLibDirs[] = {"/lib"};
1280 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1281 "armeb-linux-androideabi"};
1282 static const char *const ARMebHFTriples[] = {
1283 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001284
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001285 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001286 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001287 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1288 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1289 "x86_64-redhat-linux", "x86_64-suse-linux",
1290 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1291 "x86_64-slackware-linux", "x86_64-linux-android",
1292 "x86_64-unknown-linux"};
1293 static const char *const X32LibDirs[] = {"/libx32"};
1294 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001295 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001296 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1297 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1298 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1299 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1300 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001301
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001302 static const char *const MIPSLibDirs[] = {"/lib"};
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00001303 static const char *const MIPSTriples[] = {
1304 "mips-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001305 static const char *const MIPSELLibDirs[] = {"/lib"};
1306 static const char *const MIPSELTriples[] = {
1307 "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001308
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001309 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1310 static const char *const MIPS64Triples[] = {
1311 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1312 "mips64-linux-gnuabi64"};
1313 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1314 static const char *const MIPS64ELTriples[] = {
1315 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1316 "mips64el-linux-android", "mips64el-linux-gnuabi64"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001317
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001318 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001319 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001320 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1321 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1322 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1323 static const char *const PPC64Triples[] = {
1324 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1325 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1326 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1327 static const char *const PPC64LETriples[] = {
1328 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1329 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001330
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001331 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1332 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1333 "sparcv8-linux-gnu"};
1334 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1335 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1336 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001337
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001338 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001339 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001340 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1341 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001342
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001343 // Solaris.
1344 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1345 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1346 "i386-pc-solaris2.11"};
1347
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001348 using std::begin;
1349 using std::end;
1350
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001351 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1352 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1353 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001354 return;
1355 }
1356
Chandler Carruth866faab2012-01-25 07:21:38 +00001357 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001358 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001359 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1360 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1361 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1362 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001363 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001364 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001365 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1366 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1367 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1368 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001369 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001370 case llvm::Triple::arm:
1371 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001372 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001373 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001374 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001375 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001376 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001377 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001378 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001379 case llvm::Triple::armeb:
1380 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001381 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001382 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001383 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001384 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001385 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001386 }
1387 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001388 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001389 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1390 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1391 // x32 is always available when x86_64 is available, so adding it as
1392 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001393 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001394 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1395 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001396 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001397 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1398 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001399 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001400 break;
1401 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001402 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1403 TripleAliases.append(begin(X86Triples), end(X86Triples));
1404 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1405 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001406 break;
1407 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001408 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1409 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1410 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1411 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001412 break;
1413 case llvm::Triple::mipsel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001414 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1415 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1416 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1417 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1418 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001419 break;
1420 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001421 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1422 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1423 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1424 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001425 break;
1426 case llvm::Triple::mips64el:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001427 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1428 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1429 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1430 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1431 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001432 break;
1433 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001434 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1435 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1436 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1437 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001438 break;
1439 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001440 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1441 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1442 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1443 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001444 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001445 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001446 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1447 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001448 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001449 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001450 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001451 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1452 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1453 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1454 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001455 break;
1456 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001457 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1458 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1459 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1460 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001461 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001462 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001463 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1464 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001465 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001466 default:
1467 // By default, just rely on the standard lib directories and the original
1468 // triple.
1469 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001470 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001471
1472 // Always append the drivers target triple to the end, in case it doesn't
1473 // match any of our aliases.
1474 TripleAliases.push_back(TargetTriple.str());
1475
1476 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001477 if (TargetTriple.str() != BiarchTriple.str())
1478 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001479}
1480
Artem Belevich98607b62015-09-23 21:49:39 +00001481// \brief -- try common CUDA installation paths looking for files we need for
1482// CUDA compilation.
1483
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001484void Generic_GCC::CudaInstallationDetector::init(
1485 const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001486 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001487
1488 if (Args.hasArg(options::OPT_cuda_path_EQ))
1489 CudaPathCandidates.push_back(
1490 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1491 else {
1492 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
1493 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1494 }
1495
Benjamin Kramere8b76412015-09-24 14:48:37 +00001496 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001497 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001498 continue;
1499
1500 CudaInstallPath = CudaPath;
1501 CudaIncludePath = CudaInstallPath + "/include";
1502 CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1503 CudaLibPath =
1504 CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1505
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001506 if (!(D.getVFS().exists(CudaIncludePath) &&
1507 D.getVFS().exists(CudaLibPath) &&
1508 D.getVFS().exists(CudaLibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001509 continue;
1510
1511 IsValid = true;
1512 break;
1513 }
1514}
1515
1516void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1517 if (isValid())
1518 OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1519}
1520
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001521namespace {
1522// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001523class FilterNonExistent {
1524 StringRef Base;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001525 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001526
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001527public:
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001528 FilterNonExistent(StringRef Base, vfs::FileSystem &VFS)
1529 : Base(Base), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001530 bool operator()(const Multilib &M) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001531 return !VFS.exists(Base + M.gccSuffix() + "/crtbegin.o");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001532 }
1533};
1534} // end anonymous namespace
1535
1536static void addMultilibFlag(bool Enabled, const char *const Flag,
1537 std::vector<std::string> &Flags) {
1538 if (Enabled)
1539 Flags.push_back(std::string("+") + Flag);
1540 else
1541 Flags.push_back(std::string("-") + Flag);
1542}
1543
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001544static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001545 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1546 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1547}
1548
1549static bool isMips32(llvm::Triple::ArchType Arch) {
1550 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1551}
1552
1553static bool isMips64(llvm::Triple::ArchType Arch) {
1554 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1555}
1556
1557static bool isMipsEL(llvm::Triple::ArchType Arch) {
1558 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1559}
1560
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001561static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001562 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001563 return A && A->getOption().matches(options::OPT_mips16);
1564}
1565
1566static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001567 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001568 return A && A->getOption().matches(options::OPT_mmicromips);
1569}
1570
Simon Atanasyan60280b42014-05-12 07:37:51 +00001571struct DetectedMultilibs {
1572 /// The set of multilibs that the detected installation supports.
1573 MultilibSet Multilibs;
1574
1575 /// The primary multilib appropriate for the given flags.
1576 Multilib SelectedMultilib;
1577
1578 /// On Biarch systems, this corresponds to the default multilib when
1579 /// targeting the non-default multilib. Otherwise, it is empty.
1580 llvm::Optional<Multilib> BiarchSibling;
1581};
1582
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001583static Multilib makeMultilib(StringRef commonSuffix) {
1584 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1585}
1586
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001587static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
1588 StringRef Path, const ArgList &Args,
1589 DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001590 // Some MIPS toolchains put libraries and object files compiled
1591 // using different options in to the sub-directoris which names
1592 // reflects the flags used for compilation. For example sysroot
1593 // directory might looks like the following examples:
1594 //
1595 // /usr
1596 // /lib <= crt*.o files compiled with '-mips32'
1597 // /mips16
1598 // /usr
1599 // /lib <= crt*.o files compiled with '-mips16'
1600 // /el
1601 // /usr
1602 // /lib <= crt*.o files compiled with '-mips16 -EL'
1603 //
1604 // or
1605 //
1606 // /usr
1607 // /lib <= crt*.o files compiled with '-mips32r2'
1608 // /mips16
1609 // /usr
1610 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1611 // /mips32
1612 // /usr
1613 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001614
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001615 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001616
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001617 // Check for FSF toolchain multilibs
1618 MultilibSet FSFMipsMultilibs;
1619 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001620 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001621 .flag("+m32")
1622 .flag("-m64")
1623 .flag("-mmicromips")
1624 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001625
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001626 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001627 .flag("+m32")
1628 .flag("-m64")
1629 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001630
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001631 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001632 .flag("-m32")
1633 .flag("+m64")
1634 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001635
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001636 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1637 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001638
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001639 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001640 .flag("+m32")
1641 .flag("-m64")
1642 .flag("-mmicromips")
1643 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001644
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001645 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001646
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001647 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001648
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001649 auto MAbi64 =
1650 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001651
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001652 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001653
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001654 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001655
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001656 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001657
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001658 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001659
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001660 FSFMipsMultilibs =
1661 MultilibSet()
1662 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1663 MArchDefault)
1664 .Maybe(UCLibc)
1665 .Maybe(Mips16)
1666 .FilterOut("/mips64/mips16")
1667 .FilterOut("/mips64r2/mips16")
1668 .FilterOut("/micromips/mips16")
1669 .Maybe(MAbi64)
1670 .FilterOut("/micromips/64")
1671 .FilterOut("/mips32/64")
1672 .FilterOut("^/64")
1673 .FilterOut("/mips16/64")
1674 .Either(BigEndian, LittleEndian)
1675 .Maybe(SoftFloat)
1676 .Maybe(Nan2008)
1677 .FilterOut(".*sof/nan2008")
1678 .FilterOut(NonExistent)
1679 .setIncludeDirsCallback([](StringRef InstallDir,
1680 StringRef TripleStr, const Multilib &M) {
1681 std::vector<std::string> Dirs;
1682 Dirs.push_back((InstallDir + "/include").str());
1683 std::string SysRootInc =
1684 InstallDir.str() + "/../../../../sysroot";
1685 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1686 Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1687 else
1688 Dirs.push_back(SysRootInc + "/usr/include");
1689 return Dirs;
1690 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001691 }
1692
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001693 // Check for Code Sourcery toolchain multilibs
1694 MultilibSet CSMipsMultilibs;
1695 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001696 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001697
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001698 auto MArchMicroMips =
1699 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001700
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001701 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001702
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001703 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001704
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001705 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001706
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001707 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001708
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001709 auto DefaultFloat =
1710 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001711
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001712 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001713
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001714 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001715
1716 // Note that this one's osSuffix is ""
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001717 auto MAbi64 = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001718 .gccSuffix("/64")
1719 .includeSuffix("/64")
1720 .flag("+mabi=n64")
1721 .flag("-mabi=n32")
1722 .flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001723
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001724 CSMipsMultilibs =
1725 MultilibSet()
1726 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1727 .Maybe(UCLibc)
1728 .Either(SoftFloat, Nan2008, DefaultFloat)
1729 .FilterOut("/micromips/nan2008")
1730 .FilterOut("/mips16/nan2008")
1731 .Either(BigEndian, LittleEndian)
1732 .Maybe(MAbi64)
1733 .FilterOut("/mips16.*/64")
1734 .FilterOut("/micromips.*/64")
1735 .FilterOut(NonExistent)
1736 .setIncludeDirsCallback([](StringRef InstallDir,
1737 StringRef TripleStr, const Multilib &M) {
1738 std::vector<std::string> Dirs;
1739 Dirs.push_back((InstallDir + "/include").str());
1740 std::string SysRootInc =
1741 InstallDir.str() + "/../../../../" + TripleStr.str();
1742 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1743 Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1744 else
1745 Dirs.push_back(SysRootInc + "/libc/usr/include");
1746 return Dirs;
1747 });
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001748 }
1749
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001750 MultilibSet AndroidMipsMultilibs =
1751 MultilibSet()
1752 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1753 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1754 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001755
1756 MultilibSet DebianMipsMultilibs;
1757 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001758 Multilib MAbiN32 =
1759 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001760
1761 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001762 .gccSuffix("/64")
1763 .includeSuffix("/64")
1764 .flag("+m64")
1765 .flag("-m32")
1766 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001767
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001768 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001769
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001770 DebianMipsMultilibs =
1771 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001772 }
1773
Daniel Sanders2bf13662014-07-10 14:40:57 +00001774 MultilibSet ImgMultilibs;
1775 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001776 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001777
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001778 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001779
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001780 auto MAbi64 =
1781 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001782
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001783 ImgMultilibs =
1784 MultilibSet()
1785 .Maybe(Mips64r6)
1786 .Maybe(MAbi64)
1787 .Maybe(LittleEndian)
1788 .FilterOut(NonExistent)
1789 .setIncludeDirsCallback([](StringRef InstallDir,
1790 StringRef TripleStr, const Multilib &M) {
1791 std::vector<std::string> Dirs;
1792 Dirs.push_back((InstallDir + "/include").str());
1793 Dirs.push_back(
1794 (InstallDir + "/../../../../sysroot/usr/include").str());
1795 return Dirs;
1796 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00001797 }
1798
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001799 StringRef CPUName;
1800 StringRef ABIName;
1801 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
1802
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001803 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1804
1805 Multilib::flags_list Flags;
1806 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
1807 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
1808 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001809 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001810 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00001811 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001812 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00001813 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001814 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001815 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
1816 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001817 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001818 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001819 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00001820 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
1821 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001822 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
1823 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001824 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001825 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001826 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001827 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001828
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001829 if (TargetTriple.isAndroid()) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001830 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00001831 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
1832 Result.Multilibs = AndroidMipsMultilibs;
1833 return true;
1834 }
1835 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001836 }
1837
Daniel Sanders2bf13662014-07-10 14:40:57 +00001838 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1839 TargetTriple.getOS() == llvm::Triple::Linux &&
1840 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
1841 // Select mips-img-linux-gnu toolchain.
1842 if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
1843 Result.Multilibs = ImgMultilibs;
1844 return true;
1845 }
1846 return false;
1847 }
1848
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001849 // Sort candidates. Toolchain that best meets the directories goes first.
1850 // Then select the first toolchains matches command line flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001851 MultilibSet *candidates[] = {&DebianMipsMultilibs, &FSFMipsMultilibs,
1852 &CSMipsMultilibs};
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001853 std::sort(
1854 std::begin(candidates), std::end(candidates),
1855 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
1856 for (const auto &candidate : candidates) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001857 if (candidate->select(Flags, Result.SelectedMultilib)) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001858 if (candidate == &DebianMipsMultilibs)
Simon Atanasyan60280b42014-05-12 07:37:51 +00001859 Result.BiarchSibling = Multilib();
1860 Result.Multilibs = *candidate;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001861 return true;
1862 }
1863 }
1864
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00001865 {
1866 // Fallback to the regular toolchain-tree structure.
1867 Multilib Default;
1868 Result.Multilibs.push_back(Default);
1869 Result.Multilibs.FilterOut(NonExistent);
1870
1871 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
1872 Result.BiarchSibling = Multilib();
1873 return true;
1874 }
1875 }
1876
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001877 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001878}
1879
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001880static bool findBiarchMultilibs(const Driver &D,
1881 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00001882 StringRef Path, const ArgList &Args,
1883 bool NeedsBiarchSuffix,
1884 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001885 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
1886 // in what would normally be GCCInstallPath and put the 64-bit
1887 // libs in a subdirectory named 64. The simple logic we follow is that
1888 // *if* there is a subdirectory of the right name with crtbegin.o in it,
1889 // we use that. If not, and if not a biarch triple alias, we look for
1890 // crtbegin.o without the subdirectory.
1891
1892 Multilib Default;
1893 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001894 .gccSuffix("/64")
1895 .includeSuffix("/64")
1896 .flag("-m32")
1897 .flag("+m64")
1898 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001899 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001900 .gccSuffix("/32")
1901 .includeSuffix("/32")
1902 .flag("+m32")
1903 .flag("-m64")
1904 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00001905 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001906 .gccSuffix("/x32")
1907 .includeSuffix("/x32")
1908 .flag("-m32")
1909 .flag("-m64")
1910 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001911
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001912 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001913
Zinovy Nis1db95732014-07-10 15:27:19 +00001914 // Determine default multilib from: 32, 64, x32
1915 // Also handle cases such as 64 on 32, 32 on 64, etc.
1916 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00001917 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00001918 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00001919 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001920 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00001921 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001922 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00001923 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001924 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00001925 if (TargetTriple.isArch32Bit())
1926 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001927 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00001928 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001929 else
Zinovy Nis1db95732014-07-10 15:27:19 +00001930 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00001931 }
1932
Zinovy Nis1db95732014-07-10 15:27:19 +00001933 if (Want == WANT32)
1934 Default.flag("+m32").flag("-m64").flag("-mx32");
1935 else if (Want == WANT64)
1936 Default.flag("-m32").flag("+m64").flag("-mx32");
1937 else if (Want == WANTX32)
1938 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001939 else
Zinovy Nis1db95732014-07-10 15:27:19 +00001940 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001941
Simon Atanasyan60280b42014-05-12 07:37:51 +00001942 Result.Multilibs.push_back(Default);
1943 Result.Multilibs.push_back(Alt64);
1944 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00001945 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001946
Simon Atanasyan60280b42014-05-12 07:37:51 +00001947 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001948
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001949 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001950 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001951 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001952 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001953
Simon Atanasyan60280b42014-05-12 07:37:51 +00001954 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001955 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001956
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001957 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00001958 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00001959 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001960
1961 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001962}
1963
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001964void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
1965 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
1966 const std::string &LibDir, StringRef CandidateTriple,
1967 bool NeedsBiarchSuffix) {
1968 // Solaris is a special case. The GCC installation is under
1969 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
1970 // need to iterate twice.
1971 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001972 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
1973 !EC && LI != LE; LI = LI.increment(EC)) {
1974 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001975 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
1976
1977 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001978 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001979 continue; // Saw this path before; no need to look at it again.
1980 if (CandidateVersion.isOlderThan(4, 1, 1))
1981 continue;
1982 if (CandidateVersion <= Version)
1983 continue;
1984
1985 GCCInstallPath =
1986 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001987 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001988 continue;
1989
1990 // If we make it here there has to be at least one GCC version, let's just
1991 // use the latest one.
1992 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001993 for (vfs::directory_iterator
1994 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
1995 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001996 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
1997
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001998 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001999 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2000
2001 if (CandidateSubVersion > Version)
2002 Version = CandidateSubVersion;
2003 }
2004
2005 GCCTriple.setTriple(CandidateTriple);
2006
2007 GCCInstallPath += "/" + Version.Text;
2008 GCCParentLibPath = GCCInstallPath + "/../../../../";
2009
2010 IsValid = true;
2011 }
2012}
2013
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002014void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002015 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002016 const std::string &LibDir, StringRef CandidateTriple,
2017 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002018 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002019 // There are various different suffixes involving the triple we
2020 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002021 // up to the lib directory. Specifically, the number of "up" steps
2022 // in the second half of each row is 1 + the number of path separators
2023 // in the first half.
2024 const std::string LibAndInstallSuffixes[][2] = {
2025 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2026
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002027 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002028 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2029
2030 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2031 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002032
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002033 // The Freescale PPC SDK has the gcc libraries in
2034 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002035 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002036
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002037 // Ubuntu has a strange mis-matched pair of triples that this happens to
2038 // match.
2039 // FIXME: It may be worthwhile to generalize this and look for a second
2040 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002041 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2042
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002043 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2044 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2045 NeedsBiarchSuffix);
2046 return;
2047 }
2048
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002049 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002050 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2051 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002052 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002053 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002054 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002055 for (vfs::directory_iterator
2056 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2057 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002058 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002059 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002060 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002061 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002062 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002063 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002064 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002065 continue;
2066 if (CandidateVersion <= Version)
2067 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002068
Simon Atanasyan60280b42014-05-12 07:37:51 +00002069 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002070
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002071 // Debian mips multilibs behave more like the rest of the biarch ones,
2072 // so handle them there
2073 if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002074 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002075 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002076 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002077 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002078 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002079 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002080
Simon Atanasyan60280b42014-05-12 07:37:51 +00002081 Multilibs = Detected.Multilibs;
2082 SelectedMultilib = Detected.SelectedMultilib;
2083 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002084 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002085 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002086 // FIXME: We hack together the directory name here instead of
2087 // using LI to ensure stable path separators across Windows and
2088 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002089 GCCInstallPath =
2090 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2091 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002092 IsValid = true;
2093 }
2094 }
2095}
2096
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002097Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002098 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002099 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002100 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002101 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002102 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002103}
2104
Angel Garcia Gomezb5250d32015-10-20 12:52:55 +00002105Generic_GCC::~Generic_GCC() = default;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002106
Rafael Espindola7cf32212013-03-20 03:05:54 +00002107Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002108 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002109 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002110 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002111 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002112 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002113 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002114 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002115 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002116 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002117 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002118 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002119 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002120}
2121
Rafael Espindola7cf32212013-03-20 03:05:54 +00002122Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002123 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002124}
2125
Douglas Katzman95354292015-06-23 20:42:09 +00002126Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002127
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002128void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2129 // Print the information about how we detected the GCC installation.
2130 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002131 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002132}
2133
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002134bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002135 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002136}
2137
David Majnemer17f448b2015-06-28 04:23:33 +00002138bool Generic_GCC::isPICDefault() const {
2139 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2140}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002141
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002142bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002143
David Majnemer17f448b2015-06-28 04:23:33 +00002144bool Generic_GCC::isPICDefaultForced() const {
2145 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2146}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002147
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002148bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002149 switch (getTriple().getArch()) {
2150 case llvm::Triple::x86:
2151 case llvm::Triple::x86_64:
2152 case llvm::Triple::aarch64:
2153 case llvm::Triple::aarch64_be:
2154 case llvm::Triple::arm:
2155 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002156 case llvm::Triple::bpfel:
2157 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002158 case llvm::Triple::thumb:
2159 case llvm::Triple::thumbeb:
2160 case llvm::Triple::ppc:
2161 case llvm::Triple::ppc64:
2162 case llvm::Triple::ppc64le:
2163 case llvm::Triple::sparc:
2164 case llvm::Triple::sparcel:
2165 case llvm::Triple::sparcv9:
2166 case llvm::Triple::systemz:
2167 return true;
2168 default:
2169 return false;
2170 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002171}
2172
James Y Knighta6c9ee72015-10-16 18:46:26 +00002173/// \brief Helper to add the variant paths of a libstdc++ installation.
2174bool Generic_GCC::addLibStdCXXIncludePaths(
2175 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2176 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2177 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2178 if (!getVFS().exists(Base + Suffix))
2179 return false;
2180
2181 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2182
2183 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2184 // that path exists or we have neither a GCC nor target multiarch triple, use
2185 // this vanilla search path.
2186 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2187 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2188 addSystemInclude(DriverArgs, CC1Args,
2189 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2190 } else {
2191 // Otherwise try to use multiarch naming schemes which have normalized the
2192 // triples and put the triple before the suffix.
2193 //
2194 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2195 // the target triple, so we support that here.
2196 addSystemInclude(DriverArgs, CC1Args,
2197 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2198 addSystemInclude(DriverArgs, CC1Args,
2199 Base + "/" + TargetMultiarchTriple + Suffix);
2200 }
2201
2202 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2203 return true;
2204}
2205
2206
Kristof Beylsfb387292014-01-10 13:44:34 +00002207void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2208 ArgStringList &CC1Args) const {
2209 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002210 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002211 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002212 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002213 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002214 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00002215 getTriple().getOS() == llvm::Triple::NaCl;
Kristof Beylsfb387292014-01-10 13:44:34 +00002216
2217 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002218 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002219 CC1Args.push_back("-fuse-init-array");
2220}
2221
Tony Linthicum76329bf2011-12-12 21:14:55 +00002222/// Hexagon Toolchain
2223
Douglas Katzman54366072015-07-27 16:53:08 +00002224std::string HexagonToolChain::GetGnuDir(const std::string &InstalledDir,
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002225 const ArgList &Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002226 // Locate the rest of the toolchain ...
Samuel Antaoc909c992014-11-07 17:48:03 +00002227 std::string GccToolchain = getGCCToolchainDir(Args);
2228
2229 if (!GccToolchain.empty())
2230 return GccToolchain;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002231
2232 std::string InstallRelDir = InstalledDir + "/../../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002233 if (getVFS().exists(InstallRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002234 return InstallRelDir;
2235
2236 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002237 if (getVFS().exists(PrefixRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002238 return PrefixRelDir;
2239
2240 return InstallRelDir;
2241}
2242
Douglas Katzman54366072015-07-27 16:53:08 +00002243const char *HexagonToolChain::GetSmallDataThreshold(const ArgList &Args) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002244 Arg *A;
2245
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002246 A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002247 options::OPT_msmall_data_threshold_EQ);
2248 if (A)
2249 return A->getValue();
2250
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002251 A = Args.getLastArg(options::OPT_shared, options::OPT_fpic,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002252 options::OPT_fPIC);
2253 if (A)
2254 return "0";
2255
Hans Wennborgdcfba332015-10-06 23:40:43 +00002256 return nullptr;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002257}
2258
Douglas Katzman54366072015-07-27 16:53:08 +00002259bool HexagonToolChain::UsesG0(const char *smallDataThreshold) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002260 return smallDataThreshold && smallDataThreshold[0] == '0';
2261}
2262
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002263static void GetHexagonLibraryPaths(const HexagonToolChain &TC,
2264 const ArgList &Args, const std::string &Ver,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002265 const std::string &MarchString,
2266 const std::string &InstalledDir,
2267 ToolChain::path_list *LibPaths) {
Matthew Curtise689b052012-12-06 15:46:07 +00002268 bool buildingLib = Args.hasArg(options::OPT_shared);
2269
2270 //----------------------------------------------------------------------------
2271 // -L Args
2272 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002273 for (Arg *A : Args.filtered(options::OPT_L))
2274 for (const char *Value : A->getValues())
2275 LibPaths->push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002276
2277 //----------------------------------------------------------------------------
2278 // Other standard paths
2279 //----------------------------------------------------------------------------
2280 const std::string MarchSuffix = "/" + MarchString;
2281 const std::string G0Suffix = "/G0";
2282 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002283 const std::string RootDir = TC.GetGnuDir(InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00002284
2285 // lib/gcc/hexagon/...
2286 std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
2287 if (buildingLib) {
2288 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
2289 LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
2290 }
2291 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
2292 LibPaths->push_back(LibGCCHexagonDir + Ver);
2293
2294 // lib/gcc/...
2295 LibPaths->push_back(RootDir + "lib/gcc");
2296
2297 // hexagon/lib/...
2298 std::string HexagonLibDir = RootDir + "hexagon/lib";
2299 if (buildingLib) {
2300 LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
2301 LibPaths->push_back(HexagonLibDir + G0Suffix);
2302 }
2303 LibPaths->push_back(HexagonLibDir + MarchSuffix);
2304 LibPaths->push_back(HexagonLibDir);
2305}
2306
Douglas Katzman54366072015-07-27 16:53:08 +00002307HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
2308 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002309 : Linux(D, Triple, Args) {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002310 const std::string InstalledDir(getDriver().getInstalledDir());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002311 const std::string GnuDir = GetGnuDir(InstalledDir, Args);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002312
2313 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2314 // program paths
2315 const std::string BinDir(GnuDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002316 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002317 getProgramPaths().push_back(BinDir);
2318
2319 // Determine version of GCC libraries and headers to use.
2320 const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
Rafael Espindolac0809172014-06-12 14:02:15 +00002321 std::error_code ec;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002322 GCCVersion MaxVersion = GCCVersion::Parse("0.0.0");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002323 for (vfs::directory_iterator di = D.getVFS().dir_begin(HexagonDir, ec), de;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002324 !ec && di != de; di = di.increment(ec)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002325 GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->getName()));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002326 if (MaxVersion < cv)
2327 MaxVersion = cv;
2328 }
2329 GCCLibAndIncVersion = MaxVersion;
Matthew Curtise689b052012-12-06 15:46:07 +00002330
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002331 ToolChain::path_list *LibPaths = &getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002332
2333 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2334 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2335 // support 'linux' we'll need to fix this up
2336 LibPaths->clear();
2337
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002338 GetHexagonLibraryPaths(*this, Args, GetGCCLibAndIncVersion(),
2339 GetTargetCPU(Args), InstalledDir, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002340}
2341
Angel Garcia Gomezb5250d32015-10-20 12:52:55 +00002342HexagonToolChain::~HexagonToolChain() = default;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002343
Douglas Katzman54366072015-07-27 16:53:08 +00002344Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002345 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002346}
2347
Douglas Katzman54366072015-07-27 16:53:08 +00002348Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002349 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002350}
2351
Douglas Katzman54366072015-07-27 16:53:08 +00002352void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2353 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002354 const Driver &D = getDriver();
2355
2356 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2357 DriverArgs.hasArg(options::OPT_nostdlibinc))
2358 return;
2359
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002360 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002361 std::string GnuDir = GetGnuDir(D.InstalledDir, DriverArgs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002362 std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
2363 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
2364 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
2365 addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002366}
2367
Douglas Katzman54366072015-07-27 16:53:08 +00002368void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2369 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002370 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2371 DriverArgs.hasArg(options::OPT_nostdincxx))
2372 return;
2373
2374 const Driver &D = getDriver();
2375 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002376 SmallString<128> IncludeDir(GetGnuDir(D.InstalledDir, DriverArgs));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002377
Rafael Espindola358256c2013-06-26 02:13:00 +00002378 llvm::sys::path::append(IncludeDir, "hexagon/include/c++/");
2379 llvm::sys::path::append(IncludeDir, Ver);
Yaron Keren92e1b622015-03-18 10:17:07 +00002380 addSystemInclude(DriverArgs, CC1Args, IncludeDir);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002381}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002382
Matthew Curtise689b052012-12-06 15:46:07 +00002383ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002384HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002385 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2386 if (!A)
2387 return ToolChain::CST_Libstdcxx;
2388
2389 StringRef Value = A->getValue();
2390 if (Value != "libstdc++") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002391 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002392 }
2393
2394 return ToolChain::CST_Libstdcxx;
2395}
2396
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002397static int getHexagonVersion(const ArgList &Args) {
2398 Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ);
2399 // Select the default CPU (v4) if none was given.
2400 if (!A)
2401 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002402
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002403 // FIXME: produce errors if we cannot parse the version.
2404 StringRef WhichHexagon = A->getValue();
2405 if (WhichHexagon.startswith("hexagonv")) {
2406 int Val;
2407 if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val))
2408 return Val;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002409 }
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002410 if (WhichHexagon.startswith("v")) {
2411 int Val;
2412 if (!WhichHexagon.substr(1).getAsInteger(10, Val))
2413 return Val;
2414 }
2415
2416 // FIXME: should probably be an error.
2417 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002418}
2419
Douglas Katzman54366072015-07-27 16:53:08 +00002420StringRef HexagonToolChain::GetTargetCPU(const ArgList &Args) {
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002421 int V = getHexagonVersion(Args);
2422 // FIXME: We don't support versions < 4. We should error on them.
2423 switch (V) {
2424 default:
2425 llvm_unreachable("Unexpected version");
2426 case 5:
2427 return "v5";
2428 case 4:
2429 return "v4";
2430 case 3:
2431 return "v3";
2432 case 2:
2433 return "v2";
2434 case 1:
2435 return "v1";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002436 }
Matthew Curtisf10a5952012-12-06 14:16:43 +00002437}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002438// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002439
Tom Stellard8fa33092015-07-18 01:49:05 +00002440/// AMDGPU Toolchain
2441AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2442 const ArgList &Args)
2443 : Generic_ELF(D, Triple, Args) { }
2444
2445Tool *AMDGPUToolChain::buildLinker() const {
2446 return new tools::amdgpu::Linker(*this);
2447}
2448// End AMDGPU
2449
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002450/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00002451NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2452 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002453 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002454
2455 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2456 // default paths, and must instead only use the paths provided
2457 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002458 path_list &file_paths = getFilePaths();
2459 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002460
2461 file_paths.clear();
2462 prog_paths.clear();
2463
2464 // Path for library files (libc.a, ...)
2465 std::string FilePath(getDriver().Dir + "/../");
2466
2467 // Path for tools (clang, ld, etc..)
2468 std::string ProgPath(getDriver().Dir + "/../");
2469
2470 // Path for toolchain libraries (libgcc.a, ...)
2471 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2472
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002473 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00002474 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002475 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00002476 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002477 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2478 file_paths.push_back(ToolPath + "i686-nacl");
2479 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002480 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002481 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2482 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2483 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2484 file_paths.push_back(ToolPath + "x86_64-nacl");
2485 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002486 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002487 file_paths.push_back(FilePath + "arm-nacl/lib");
2488 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2489 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2490 file_paths.push_back(ToolPath + "arm-nacl");
2491 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002492 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002493 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2494 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2495 prog_paths.push_back(ProgPath + "bin");
2496 file_paths.push_back(ToolPath + "mipsel-nacl");
2497 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002498 default:
2499 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002500 }
2501
2502 // Use provided linker, not system linker
Derek Schuffef465d72015-08-24 23:53:25 +00002503 Linker = GetLinkerPath();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002504 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2505}
2506
Douglas Katzman54366072015-07-27 16:53:08 +00002507void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2508 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002509 const Driver &D = getDriver();
2510 if (DriverArgs.hasArg(options::OPT_nostdinc))
2511 return;
2512
2513 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2514 SmallString<128> P(D.ResourceDir);
2515 llvm::sys::path::append(P, "include");
2516 addSystemInclude(DriverArgs, CC1Args, P.str());
2517 }
2518
2519 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2520 return;
2521
2522 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002523 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00002524 case llvm::Triple::x86:
2525 // x86 is special because multilib style uses x86_64-nacl/include for libc
2526 // headers but the SDK wants i686-nacl/usr/include. The other architectures
2527 // have the same substring.
2528 llvm::sys::path::append(P, "i686-nacl/usr/include");
2529 addSystemInclude(DriverArgs, CC1Args, P.str());
2530 llvm::sys::path::remove_filename(P);
2531 llvm::sys::path::remove_filename(P);
2532 llvm::sys::path::remove_filename(P);
2533 llvm::sys::path::append(P, "x86_64-nacl/include");
2534 addSystemInclude(DriverArgs, CC1Args, P.str());
2535 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002536 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002537 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002538 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002539 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002540 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002541 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002542 case llvm::Triple::mipsel:
2543 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2544 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002545 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002546 return;
2547 }
2548
2549 addSystemInclude(DriverArgs, CC1Args, P.str());
2550 llvm::sys::path::remove_filename(P);
2551 llvm::sys::path::remove_filename(P);
2552 llvm::sys::path::append(P, "include");
2553 addSystemInclude(DriverArgs, CC1Args, P.str());
2554}
2555
Douglas Katzman54366072015-07-27 16:53:08 +00002556void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2557 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002558 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2559 // if the value is libc++, and emits an error for other values.
2560 GetCXXStdlibType(Args);
2561 CmdArgs.push_back("-lc++");
2562}
2563
Douglas Katzman54366072015-07-27 16:53:08 +00002564void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2565 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002566 const Driver &D = getDriver();
2567 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2568 DriverArgs.hasArg(options::OPT_nostdincxx))
2569 return;
2570
2571 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2572 // if the value is libc++, and emits an error for other values.
2573 GetCXXStdlibType(DriverArgs);
2574
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002575 SmallString<128> P(D.Dir + "/../");
2576 switch (getTriple().getArch()) {
2577 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002578 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2579 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002580 break;
2581 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002582 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2583 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002584 break;
2585 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002586 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2587 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002588 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002589 case llvm::Triple::mipsel:
2590 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2591 addSystemInclude(DriverArgs, CC1Args, P.str());
2592 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002593 default:
2594 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002595 }
2596}
2597
Douglas Katzman54366072015-07-27 16:53:08 +00002598ToolChain::CXXStdlibType
2599NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002600 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2601 StringRef Value = A->getValue();
2602 if (Value == "libc++")
2603 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002604 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002605 }
2606
2607 return ToolChain::CST_Libcxx;
2608}
2609
Douglas Katzman54366072015-07-27 16:53:08 +00002610std::string
2611NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2612 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002613 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2614 if (TheTriple.getArch() == llvm::Triple::arm &&
2615 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2616 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2617 return TheTriple.getTriple();
2618}
2619
Douglas Katzman54366072015-07-27 16:53:08 +00002620Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002621 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002622}
2623
Douglas Katzman54366072015-07-27 16:53:08 +00002624Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002625 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002626 return new tools::nacltools::AssemblerARM(*this);
2627 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002628}
2629// End NaCl
2630
Chris Lattner09797542010-03-04 21:07:38 +00002631/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2632/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2633/// Currently does not support anything else but compilation.
2634
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002635TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002636 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002637 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002638 // Path mangling to find libexec
2639 std::string Path(getDriver().Dir);
2640
2641 Path += "/../libexec";
2642 getProgramPaths().push_back(Path);
2643}
2644
Angel Garcia Gomezb5250d32015-10-20 12:52:55 +00002645TCEToolChain::~TCEToolChain() = default;
Chris Lattner09797542010-03-04 21:07:38 +00002646
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002647bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002648
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002649bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002650
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002651bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002652
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002653bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002654
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002655// CloudABI - CloudABI tool chain which can call ld(1) directly.
2656
2657CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2658 const ArgList &Args)
2659 : Generic_ELF(D, Triple, Args) {
2660 SmallString<128> P(getDriver().Dir);
2661 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2662 getFilePaths().push_back(P.str());
2663}
2664
2665void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2666 ArgStringList &CC1Args) const {
2667 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2668 DriverArgs.hasArg(options::OPT_nostdincxx))
2669 return;
2670
2671 SmallString<128> P(getDriver().Dir);
2672 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2673 addSystemInclude(DriverArgs, CC1Args, P.str());
2674}
2675
2676void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
2677 ArgStringList &CmdArgs) const {
2678 CmdArgs.push_back("-lc++");
2679 CmdArgs.push_back("-lc++abi");
2680 CmdArgs.push_back("-lunwind");
2681}
2682
Douglas Katzman95354292015-06-23 20:42:09 +00002683Tool *CloudABI::buildLinker() const {
2684 return new tools::cloudabi::Linker(*this);
2685}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002686
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002687/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
2688
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002689OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
2690 const ArgList &Args)
2691 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00002692 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002693 getFilePaths().push_back("/usr/lib");
2694}
2695
Rafael Espindola7cf32212013-03-20 03:05:54 +00002696Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002697 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002698}
2699
Douglas Katzman95354292015-06-23 20:42:09 +00002700Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002701
Eli Friedman9fa28852012-08-08 23:57:20 +00002702/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
2703
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002704Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2705 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00002706 getFilePaths().push_back(getDriver().Dir + "/../lib");
2707 getFilePaths().push_back("/usr/lib");
2708}
2709
Rafael Espindola7cf32212013-03-20 03:05:54 +00002710Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002711 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002712}
2713
Douglas Katzman95354292015-06-23 20:42:09 +00002714Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00002715
Douglas Katzman95354292015-06-23 20:42:09 +00002716ToolChain::CXXStdlibType Bitrig::GetCXXStdlibType(const ArgList &Args) const {
Richard Smith51af5192014-05-01 23:24:24 +00002717 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2718 StringRef Value = A->getValue();
2719 if (Value == "libstdc++")
2720 return ToolChain::CST_Libstdcxx;
2721 if (Value == "libc++")
2722 return ToolChain::CST_Libcxx;
2723
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002724 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Richard Smith51af5192014-05-01 23:24:24 +00002725 }
2726 return ToolChain::CST_Libcxx;
2727}
2728
Eli Friedman9fa28852012-08-08 23:57:20 +00002729void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2730 ArgStringList &CC1Args) const {
2731 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2732 DriverArgs.hasArg(options::OPT_nostdincxx))
2733 return;
2734
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002735 switch (GetCXXStdlibType(DriverArgs)) {
2736 case ToolChain::CST_Libcxx:
2737 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00002738 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002739 break;
2740 case ToolChain::CST_Libstdcxx:
2741 addSystemInclude(DriverArgs, CC1Args,
2742 getDriver().SysRoot + "/usr/include/c++/stdc++");
2743 addSystemInclude(DriverArgs, CC1Args,
2744 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00002745
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002746 StringRef Triple = getTriple().str();
2747 if (Triple.startswith("amd64"))
2748 addSystemInclude(DriverArgs, CC1Args,
2749 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002750 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002751 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002752 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
2753 "/usr/include/c++/stdc++/" +
2754 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002755 break;
2756 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002757}
2758
2759void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
2760 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002761 switch (GetCXXStdlibType(Args)) {
2762 case ToolChain::CST_Libcxx:
2763 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00002764 CmdArgs.push_back("-lc++abi");
2765 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002766 break;
2767 case ToolChain::CST_Libstdcxx:
2768 CmdArgs.push_back("-lstdc++");
2769 break;
2770 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002771}
2772
Daniel Dunbare24297c2009-03-30 21:06:03 +00002773/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
2774
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002775FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
2776 const ArgList &Args)
2777 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00002778
Chandler Carruth0b1756b2012-01-26 01:35:15 +00002779 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
2780 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002781 if ((Triple.getArch() == llvm::Triple::x86 ||
2782 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002783 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002784 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
2785 else
2786 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00002787}
2788
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002789ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
David Chisnall867ccd82013-11-09 15:10:56 +00002790 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2791 StringRef Value = A->getValue();
2792 if (Value == "libstdc++")
2793 return ToolChain::CST_Libstdcxx;
2794 if (Value == "libc++")
2795 return ToolChain::CST_Libcxx;
2796
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002797 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
David Chisnall867ccd82013-11-09 15:10:56 +00002798 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002799 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00002800 return ToolChain::CST_Libcxx;
2801 return ToolChain::CST_Libstdcxx;
2802}
2803
2804void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2805 ArgStringList &CC1Args) const {
2806 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2807 DriverArgs.hasArg(options::OPT_nostdincxx))
2808 return;
2809
2810 switch (GetCXXStdlibType(DriverArgs)) {
2811 case ToolChain::CST_Libcxx:
2812 addSystemInclude(DriverArgs, CC1Args,
2813 getDriver().SysRoot + "/usr/include/c++/v1");
2814 break;
2815 case ToolChain::CST_Libstdcxx:
2816 addSystemInclude(DriverArgs, CC1Args,
2817 getDriver().SysRoot + "/usr/include/c++/4.2");
2818 addSystemInclude(DriverArgs, CC1Args,
2819 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
2820 break;
2821 }
2822}
2823
Rafael Espindola7cf32212013-03-20 03:05:54 +00002824Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002825 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002826}
2827
Douglas Katzman95354292015-06-23 20:42:09 +00002828Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00002829
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002830bool FreeBSD::UseSjLjExceptions() const {
2831 // FreeBSD uses SjLj exceptions on ARM oabi.
2832 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00002833 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002834 case llvm::Triple::GNUEABI:
2835 case llvm::Triple::EABI:
2836 return false;
2837
2838 default:
2839 return (getTriple().getArch() == llvm::Triple::arm ||
2840 getTriple().getArch() == llvm::Triple::thumb);
2841 }
2842}
2843
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002844bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002845
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002846bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002847
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00002848SanitizerMask FreeBSD::getSupportedSanitizers() const {
2849 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
2850 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
2851 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
2852 getTriple().getArch() == llvm::Triple::mips64el;
2853 SanitizerMask Res = ToolChain::getSupportedSanitizers();
2854 Res |= SanitizerKind::Address;
2855 Res |= SanitizerKind::Vptr;
2856 if (IsX86_64 || IsMIPS64) {
2857 Res |= SanitizerKind::Leak;
2858 Res |= SanitizerKind::Thread;
2859 }
2860 if (IsX86 || IsX86_64) {
2861 Res |= SanitizerKind::SafeStack;
2862 }
2863 return Res;
2864}
2865
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002866/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
2867
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002868NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2869 : Generic_ELF(D, Triple, Args) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002870
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00002871 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00002872 // When targeting a 32-bit platform, try the special directory used on
2873 // 64-bit hosts, and only fall back to the main library directory if that
2874 // doesn't work.
2875 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
2876 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002877 switch (Triple.getArch()) {
2878 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00002879 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002880 break;
2881 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00002882 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002883 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00002884 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002885 switch (Triple.getEnvironment()) {
2886 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002887 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002888 getFilePaths().push_back("=/usr/lib/eabi");
2889 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00002890 case llvm::Triple::EABIHF:
2891 case llvm::Triple::GNUEABIHF:
2892 getFilePaths().push_back("=/usr/lib/eabihf");
2893 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002894 default:
2895 getFilePaths().push_back("=/usr/lib/oabi");
2896 break;
2897 }
2898 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002899 case llvm::Triple::mips64:
2900 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002901 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002902 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002903 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002904 getFilePaths().push_back("=/usr/lib/64");
2905 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00002906 case llvm::Triple::ppc:
2907 getFilePaths().push_back("=/usr/lib/powerpc");
2908 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00002909 case llvm::Triple::sparc:
2910 getFilePaths().push_back("=/usr/lib/sparc");
2911 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002912 default:
2913 break;
2914 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00002915
2916 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002917 }
2918}
2919
Rafael Espindola7cf32212013-03-20 03:05:54 +00002920Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002921 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002922}
2923
Douglas Katzman95354292015-06-23 20:42:09 +00002924Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002925
Douglas Katzman95354292015-06-23 20:42:09 +00002926ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002927 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2928 StringRef Value = A->getValue();
2929 if (Value == "libstdc++")
2930 return ToolChain::CST_Libstdcxx;
2931 if (Value == "libc++")
2932 return ToolChain::CST_Libcxx;
2933
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002934 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002935 }
2936
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002937 unsigned Major, Minor, Micro;
2938 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00002939 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002940 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00002941 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00002942 case llvm::Triple::arm:
2943 case llvm::Triple::armeb:
2944 case llvm::Triple::thumb:
2945 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00002946 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00002947 case llvm::Triple::ppc64:
2948 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002949 case llvm::Triple::x86:
2950 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002951 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002952 default:
2953 break;
2954 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002955 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002956 return ToolChain::CST_Libstdcxx;
2957}
2958
2959void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2960 ArgStringList &CC1Args) const {
2961 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2962 DriverArgs.hasArg(options::OPT_nostdincxx))
2963 return;
2964
2965 switch (GetCXXStdlibType(DriverArgs)) {
2966 case ToolChain::CST_Libcxx:
2967 addSystemInclude(DriverArgs, CC1Args,
2968 getDriver().SysRoot + "/usr/include/c++/");
2969 break;
2970 case ToolChain::CST_Libstdcxx:
2971 addSystemInclude(DriverArgs, CC1Args,
2972 getDriver().SysRoot + "/usr/include/g++");
2973 addSystemInclude(DriverArgs, CC1Args,
2974 getDriver().SysRoot + "/usr/include/g++/backward");
2975 break;
2976 }
2977}
2978
Chris Lattner3e2ee142010-07-07 16:01:42 +00002979/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
2980
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002981Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2982 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00002983 getFilePaths().push_back(getDriver().Dir + "/../lib");
2984 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00002985}
2986
Rafael Espindola7cf32212013-03-20 03:05:54 +00002987Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002988 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002989}
2990
Douglas Katzman95354292015-06-23 20:42:09 +00002991Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00002992
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002993static void addPathIfExists(const Driver &D, const Twine &Path,
2994 ToolChain::path_list &Paths) {
2995 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002996 Paths.push_back(Path.str());
2997}
2998
David Chisnallf571cde2012-02-15 13:39:01 +00002999/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3000
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003001Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003002 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003003 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003004
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003005 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003006
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003007 path_list &Paths = getFilePaths();
3008 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003009 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003010
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003011 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003012 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003013 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003014
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003015 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003016
3017 std::string LibPath = "/usr/lib/";
3018 switch (Triple.getArch()) {
3019 case llvm::Triple::x86:
3020 case llvm::Triple::sparc:
3021 break;
3022 case llvm::Triple::x86_64:
3023 LibPath += "amd64/";
3024 break;
3025 case llvm::Triple::sparcv9:
3026 LibPath += "sparcv9/";
3027 break;
3028 default:
3029 llvm_unreachable("Unsupported architecture");
3030 }
3031
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003032 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003033}
3034
Rafael Espindola7cf32212013-03-20 03:05:54 +00003035Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003036 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003037}
3038
Douglas Katzman95354292015-06-23 20:42:09 +00003039Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003040
Rafael Espindolad5117262015-09-09 13:36:00 +00003041void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3042 ArgStringList &CC1Args) const {
3043 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3044 DriverArgs.hasArg(options::OPT_nostdincxx))
3045 return;
3046
3047 // Include the support directory for things like xlocale and fudged system
3048 // headers.
3049 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3050
3051 if (GCCInstallation.isValid()) {
3052 GCCVersion Version = GCCInstallation.getVersion();
3053 addSystemInclude(DriverArgs, CC1Args,
3054 getDriver().SysRoot + "/usr/gcc/" +
3055 Version.MajorStr + "." +
3056 Version.MinorStr +
3057 "/include/c++/" + Version.Text);
3058 addSystemInclude(DriverArgs, CC1Args,
3059 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3060 "." + Version.MinorStr + "/include/c++/" +
3061 Version.Text + "/" +
3062 GCCInstallation.getTriple().str());
3063 }
3064}
3065
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003066/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003067
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003068enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003069 // NB: Releases of a particular Linux distro should be kept together
3070 // in this enum, because some tests are done by integer comparison against
3071 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003072 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003073 DebianLenny,
3074 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003075 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003076 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003077 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003078 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003079 RHEL4,
3080 RHEL5,
3081 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003082 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003083 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003084 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003085 UbuntuHardy,
3086 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003087 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003088 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003089 UbuntuLucid,
3090 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003091 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003092 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003093 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003094 UbuntuQuantal,
3095 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003096 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003097 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003098 UbuntuUtopic,
3099 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003100 UbuntuWily,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003101 UnknownDistro
3102};
3103
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003104static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003105 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003106}
3107
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003108static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003109
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003110static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003111 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003112}
3113
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003114static bool IsUbuntu(enum Distro Distro) {
Benjamin Kramer2d469802015-07-09 15:31:17 +00003115 return Distro >= UbuntuHardy && Distro <= UbuntuWily;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003116}
3117
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003118static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003119 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3120 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3121 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003122 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003123 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003124 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003125 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003126 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003127 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3128 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3129 .Case("hardy", UbuntuHardy)
3130 .Case("intrepid", UbuntuIntrepid)
3131 .Case("jaunty", UbuntuJaunty)
3132 .Case("karmic", UbuntuKarmic)
3133 .Case("lucid", UbuntuLucid)
3134 .Case("maverick", UbuntuMaverick)
3135 .Case("natty", UbuntuNatty)
3136 .Case("oneiric", UbuntuOneiric)
3137 .Case("precise", UbuntuPrecise)
3138 .Case("quantal", UbuntuQuantal)
3139 .Case("raring", UbuntuRaring)
3140 .Case("saucy", UbuntuSaucy)
3141 .Case("trusty", UbuntuTrusty)
3142 .Case("utopic", UbuntuUtopic)
3143 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003144 .Case("wily", UbuntuWily)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003145 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003146 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003147 }
3148
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003149 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3150 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003151 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003152 if (Data.startswith("Fedora release"))
3153 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003154 if (Data.startswith("Red Hat Enterprise Linux") ||
3155 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003156 if (Data.find("release 7") != StringRef::npos)
3157 return RHEL7;
3158 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003159 return RHEL6;
3160 else if (Data.find("release 5") != StringRef::npos)
3161 return RHEL5;
3162 else if (Data.find("release 4") != StringRef::npos)
3163 return RHEL4;
3164 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003165 return UnknownDistro;
3166 }
3167
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003168 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3169 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003170 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003171 if (Data[0] == '5')
3172 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003173 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003174 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003175 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003176 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003177 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003178 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003179 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3180 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003181 return UnknownDistro;
3182 }
3183
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003184 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003185 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003186
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003187 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003188 return Exherbo;
3189
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003190 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003191 return ArchLinux;
3192
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003193 return UnknownDistro;
3194}
3195
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003196/// \brief Get our best guess at the multiarch triple for a target.
3197///
3198/// Debian-based systems are starting to use a multiarch setup where they use
3199/// a target-triple directory in the library and header search paths.
3200/// Unfortunately, this triple does not align with the vanilla target triple,
3201/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003202static std::string getMultiarchTriple(const Driver &D,
3203 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003204 StringRef SysRoot) {
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003205 llvm::Triple::EnvironmentType TargetEnvironment = TargetTriple.getEnvironment();
3206
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003207 // For most architectures, just use whatever we have rather than trying to be
3208 // clever.
3209 switch (TargetTriple.getArch()) {
3210 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003211 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003212
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003213 // We use the existence of '/lib/<triple>' as a directory to detect some
3214 // common linux triples that don't quite match the Clang triple for both
3215 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3216 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003217 case llvm::Triple::arm:
3218 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003219 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003220 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003221 return "arm-linux-gnueabihf";
3222 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003223 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003224 return "arm-linux-gnueabi";
3225 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003226 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003227 case llvm::Triple::armeb:
3228 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003229 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003230 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003231 return "armeb-linux-gnueabihf";
3232 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003233 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003234 return "armeb-linux-gnueabi";
3235 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003236 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003237 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003238 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003239 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003240 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003241 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003242 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003243 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003244 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003245 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003246 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003247 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003248 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003249 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003250 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003251 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003252 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003253 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003254 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003255 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003256 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003257 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003258 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003259 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003260 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003261 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003262 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003263 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003264 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003265 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003266 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003267 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003268 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003269 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003270 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003271 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003272 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003273 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003274 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003275 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003276 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003277 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003278 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003279 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003280 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003281 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003282 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003283 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003284 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003285 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003286 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003287 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003288 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003289 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003290 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003291 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003292 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003293 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003294 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003295 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003296 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003297 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003298 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003299 return "s390x-linux-gnu";
3300 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003301 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003302 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003303}
3304
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003305static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003306 if (isMipsArch(Triple.getArch())) {
3307 // lib32 directory has a special meaning on MIPS targets.
3308 // It contains N32 ABI binaries. Use this folder if produce
3309 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003310 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003311 return "lib32";
3312 return Triple.isArch32Bit() ? "lib" : "lib64";
3313 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003314
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003315 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003316 // using that variant while targeting other architectures causes problems
3317 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003318 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003319 // them when we know we may need it.
3320 //
3321 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003322 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003323 // GCCInstallationDetector, but that is a more significant refactoring.
3324 if (Triple.getArch() == llvm::Triple::x86 ||
3325 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003326 return "lib32";
3327
Zinovy Nis1db95732014-07-10 15:27:19 +00003328 if (Triple.getArch() == llvm::Triple::x86_64 &&
3329 Triple.getEnvironment() == llvm::Triple::GNUX32)
3330 return "libx32";
3331
Simon Atanasyand4413882012-09-14 11:27:24 +00003332 return Triple.isArch32Bit() ? "lib" : "lib64";
3333}
3334
Rafael Espindola1af7c212012-02-19 01:38:32 +00003335Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003336 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003337 GCCInstallation.init(Triple, Args);
3338 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003339 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003340 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003341 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003342
Rafael Espindola10a63c22013-07-03 14:14:00 +00003343 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003344 // least) put various tools in a triple-prefixed directory off of the parent
3345 // of the GCC installation. We use the GCC triple here to ensure that we end
3346 // up with tools that support the same amount of cross compiling as the
3347 // detected GCC installation. For example, if we find a GCC installation
3348 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3349 // used to target i386.
3350 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003351 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003352 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003353 GCCInstallation.getTriple().str() + "/bin")
3354 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003355
Logan Chieneb9162f2014-06-26 14:23:45 +00003356 Linker = GetLinkerPath();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003357
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003358 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003359
Rafael Espindola10a63c22013-07-03 14:14:00 +00003360 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003361 ExtraOpts.push_back("-z");
3362 ExtraOpts.push_back("relro");
3363 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003364
Douglas Gregord9bb1522011-03-06 19:11:49 +00003365 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003366 ExtraOpts.push_back("-X");
3367
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003368 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003369 const bool IsMips = isMipsArch(Arch);
3370
3371 if (IsMips && !SysRoot.empty())
3372 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003373
Chandler Carruth0b842912011-12-09 04:45:18 +00003374 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3375 // and the MIPS ABI require .dynsym to be sorted in different ways.
3376 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3377 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003378 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003379 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003380 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003381 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003382 ExtraOpts.push_back("--hash-style=gnu");
3383
Rafael Espindola10a63c22013-07-03 14:14:00 +00003384 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003385 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3386 ExtraOpts.push_back("--hash-style=both");
3387 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003388
Chris Lattner84e38552011-05-22 05:36:06 +00003389 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003390 ExtraOpts.push_back("--no-add-needed");
3391
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003392 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003393 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003394 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003395 ExtraOpts.push_back("--build-id");
3396
Rafael Espindola10a63c22013-07-03 14:14:00 +00003397 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003398 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003399
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003400 // The selection of paths to try here is designed to match the patterns which
3401 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3402 // This was determined by running GCC in a fake filesystem, creating all
3403 // possible permutations of these directories, and seeing which ones it added
3404 // to the link paths.
3405 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003406
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003407 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003408 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003409
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003410 // Add the multilib suffixed paths where they are available.
3411 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003412 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003413 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003414 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003415
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003416 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003417 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003418 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003419 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003420
3421 // GCC cross compiling toolchains will install target libraries which ship
3422 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3423 // any part of the GCC installation in
3424 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3425 // debatable, but is the reality today. We need to search this tree even
3426 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003427 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003428 // installation that is *not* within the system root to ensure two things:
3429 //
3430 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003431 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003432 // appropriate rpath.
3433 // 2) There must not be libraries installed into
3434 // <prefix>/<triple>/<libdir> unless they should be preferred over
3435 // those within the system root.
3436 //
3437 // Note that this matches the GCC behavior. See the below comment for where
3438 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003439 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
3440 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003441 Paths);
3442
Chandler Carruth69a125b2012-04-06 16:32:06 +00003443 // If the GCC installation we found is inside of the sysroot, we want to
3444 // prefer libraries installed in the parent prefix of the GCC installation.
3445 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003446 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003447 // This usually happens when there is an external cross compiler on the
3448 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003449 // the cross. Note that GCC does include some of these directories in some
3450 // configurations but this seems somewhere between questionable and simply
3451 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003452 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003453 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
3454 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003455 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003456 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003457
3458 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003459 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003460 // those searched.
3461 // FIXME: It's not clear whether we should use the driver's installed
3462 // directory ('Dir' below) or the ResourceDir.
3463 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003464 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
3465 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003466 }
3467
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003468 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
3469 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
3470 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3471 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003472
Chandler Carruthb427c562013-06-22 11:35:51 +00003473 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003474 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003475 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003476 addPathIfExists(D,
3477 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003478 "/../../" + OSLibDir,
3479 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003480
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003481 // Add the 'other' biarch variant path
3482 Multilib BiarchSibling;
3483 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003484 addPathIfExists(D, GCCInstallation.getInstallPath() +
3485 BiarchSibling.gccSuffix(),
3486 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003487 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003488
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003489 // See comments above on the multilib variant for details of why this is
3490 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003491 const std::string &LibPath = GCCInstallation.getParentLibPath();
3492 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3493 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003494 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
3495 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003496 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003497
3498 // See comments above on the multilib variant for details of why this is
3499 // only included from within the sysroot.
3500 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003501 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003502 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003503
3504 // Similar to the logic for GCC above, if we are currently running Clang
3505 // inside of the requested system root, add its parent library path to those
3506 // searched.
3507 // FIXME: It's not clear whether we should use the driver's installed
3508 // directory ('Dir' below) or the ResourceDir.
3509 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003510 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003511
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003512 addPathIfExists(D, SysRoot + "/lib", Paths);
3513 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003514}
3515
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003516bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003517
Douglas Katzman95354292015-06-23 20:42:09 +00003518Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003519
3520Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003521 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003522}
3523
Simon Atanasyana0d89572013-10-05 14:37:55 +00003524std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003525 if (!getDriver().SysRoot.empty())
3526 return getDriver().SysRoot;
3527
3528 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3529 return std::string();
3530
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003531 // Standalone MIPS toolchains use different names for sysroot folder
3532 // and put it into different places. Here we try to check some known
3533 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003534
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003535 const StringRef InstallDir = GCCInstallation.getInstallPath();
3536 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003537 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003538
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003539 std::string Path =
3540 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3541 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003542
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003543 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003544 return Path;
3545
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003546 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003547
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003548 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003549 return Path;
3550
3551 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003552}
3553
Chandler Carrutha796f532011-11-05 20:17:13 +00003554void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3555 ArgStringList &CC1Args) const {
3556 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003557 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003558
3559 if (DriverArgs.hasArg(options::OPT_nostdinc))
3560 return;
3561
3562 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003563 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003564
3565 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003566 SmallString<128> P(D.ResourceDir);
3567 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003568 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003569 }
3570
3571 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3572 return;
3573
3574 // Check for configure-time C include directories.
3575 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3576 if (CIncludeDirs != "") {
3577 SmallVector<StringRef, 5> dirs;
3578 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003579 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003580 StringRef Prefix =
3581 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003582 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003583 }
3584 return;
3585 }
3586
3587 // Lacking those, try to detect the correct set of system includes for the
3588 // target triple.
3589
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003590 // Add include directories specific to the selected multilib set and multilib.
3591 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003592 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003593 if (Callback) {
3594 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3595 GCCInstallation.getTriple().str(),
3596 GCCInstallation.getMultilib());
3597 for (const auto &Path : IncludePaths)
3598 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3599 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003600 }
3601
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003602 // Implement generic Debian multiarch support.
3603 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003604 "/usr/include/x86_64-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/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003610 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003611 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003612
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003613 // FIXME: These are older forms of multiarch. It's not clear that they're
3614 // in use in any released version of Debian, so we should consider
3615 // removing them.
3616 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3617 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003618 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003619 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003620 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003621 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003622 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003623 "/usr/include/arm-linux-gnueabihf"};
3624 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003625 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003626 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003627 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003628 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003629 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003630 "/usr/include/mips64el-linux-gnu",
3631 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003632 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003633 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003634 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003635 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003636 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003637 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003638 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003639 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003640 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003641 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003642 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
3643 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003644 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003645 switch (getTriple().getArch()) {
3646 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003647 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003648 break;
3649 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003650 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003651 break;
3652 case llvm::Triple::aarch64:
3653 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003654 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003655 break;
3656 case llvm::Triple::arm:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003657 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3658 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3659 else
3660 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003661 break;
3662 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00003663 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003664 break;
3665 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00003666 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003667 break;
3668 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003669 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003670 break;
3671 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003672 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003673 break;
3674 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003675 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003676 break;
3677 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003678 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003679 break;
3680 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003681 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003682 break;
3683 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00003684 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003685 break;
3686 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00003687 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003688 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003689 case llvm::Triple::systemz:
3690 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
3691 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003692 default:
3693 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003694 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003695 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003696 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003697 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003698 break;
3699 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003700 }
3701
3702 if (getTriple().getOS() == llvm::Triple::RTEMS)
3703 return;
3704
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003705 // Add an include of '/include' directly. This isn't provided by default by
3706 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
3707 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003708 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003709
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003710 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003711}
3712
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003713
Chandler Carrutha796f532011-11-05 20:17:13 +00003714void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3715 ArgStringList &CC1Args) const {
3716 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3717 DriverArgs.hasArg(options::OPT_nostdincxx))
3718 return;
3719
Chandler Carruthf4701732011-11-07 09:01:17 +00003720 // Check if libc++ has been enabled and provide its include paths if so.
3721 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003722 const std::string LibCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003723 // The primary location is within the Clang installation.
3724 // FIXME: We shouldn't hard code 'v1' here to make Clang future proof to
3725 // newer ABI versions.
3726 getDriver().Dir + "/../include/c++/v1",
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003727
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003728 // We also check the system as for a long time this is the only place
3729 // Clang looked.
3730 // FIXME: We should really remove this. It doesn't make any sense.
3731 getDriver().SysRoot + "/usr/include/c++/v1"};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003732 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003733 if (!getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003734 continue;
3735 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003736 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003737 break;
3738 }
Chandler Carruthf4701732011-11-07 09:01:17 +00003739 return;
3740 }
3741
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00003742 // We need a detected GCC installation on Linux to provide libstdc++'s
3743 // headers. We handled the libc++ case above.
3744 if (!GCCInstallation.isValid())
3745 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00003746
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003747 // By default, look for the C++ headers in an include directory adjacent to
3748 // the lib directory of the GCC installation. Note that this is expect to be
3749 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
3750 StringRef LibDir = GCCInstallation.getParentLibPath();
3751 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003752 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003753 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003754 const std::string GCCMultiarchTriple = getMultiarchTriple(
3755 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003756 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003757 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00003758 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003759
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003760 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00003761 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003762 "/c++/" + Version.Text, TripleStr,
3763 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003764 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003765 return;
3766
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003767 // Otherwise, fall back on a bunch of options which don't use multiarch
3768 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003769 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003770 // Gentoo is weird and places its headers inside the GCC install,
3771 // so if the first attempt to find the headers fails, try these patterns.
3772 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
3773 Version.MinorStr,
3774 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
3775 // Android standalone toolchain has C++ headers in yet another place.
3776 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
3777 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
3778 // without a subdirectory corresponding to the gcc version.
3779 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003780 };
3781
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003782 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003783 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
3784 /*GCCMultiarchTriple*/ "",
3785 /*TargetMultiarchTriple*/ "",
3786 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003787 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003788 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003789}
3790
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003791bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003792
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003793SanitizerMask Linux::getSupportedSanitizers() const {
3794 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3795 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3796 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3797 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00003798 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
3799 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003800 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
3801 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003802 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3803 Res |= SanitizerKind::Address;
3804 Res |= SanitizerKind::KernelAddress;
3805 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00003806 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003807 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003808 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00003809 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003810 Res |= SanitizerKind::Leak;
Renato Golind45c2df2015-08-05 18:42:41 +00003811 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003812 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00003813 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00003814 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003815 if (IsX86 || IsX86_64) {
3816 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003817 }
3818 return Res;
3819}
3820
Daniel Dunbarcc912342009-05-02 18:28:39 +00003821/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
3822
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003823DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
3824 const ArgList &Args)
3825 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00003826
3827 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00003828 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00003829 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00003830 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00003831
Daniel Dunbar083edf72009-12-21 18:54:17 +00003832 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00003833 getFilePaths().push_back("/usr/lib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003834 if (D.getVFS().exists("/usr/lib/gcc47"))
John McCall65b8da02013-04-11 22:55:55 +00003835 getFilePaths().push_back("/usr/lib/gcc47");
3836 else
3837 getFilePaths().push_back("/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00003838}
3839
Rafael Espindola7cf32212013-03-20 03:05:54 +00003840Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003841 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003842}
3843
3844Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003845 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00003846}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003847
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003848/// Stub for CUDA toolchain. At the moment we don't have assembler or
3849/// linker and need toolchain mainly to propagate device-side options
3850/// to CC1.
3851
3852CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
3853 const ArgList &Args)
3854 : Linux(D, Triple, Args) {}
3855
3856void
3857CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
3858 llvm::opt::ArgStringList &CC1Args) const {
3859 Linux::addClangTargetOptions(DriverArgs, CC1Args);
3860 CC1Args.push_back("-fcuda-is-device");
3861}
3862
3863llvm::opt::DerivedArgList *
3864CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
3865 const char *BoundArch) const {
3866 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
3867 const OptTable &Opts = getDriver().getOpts();
3868
3869 for (Arg *A : Args) {
3870 if (A->getOption().matches(options::OPT_Xarch__)) {
3871 // Skip this argument unless the architecture matches BoundArch
3872 if (A->getValue(0) != StringRef(BoundArch))
3873 continue;
3874
3875 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
3876 unsigned Prev = Index;
3877 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
3878
3879 // If the argument parsing failed or more than one argument was
3880 // consumed, the -Xarch_ argument's parameter tried to consume
3881 // extra arguments. Emit an error and ignore.
3882 //
3883 // We also want to disallow any options which would alter the
3884 // driver behavior; that isn't going to work in our model. We
3885 // use isDriverOption() as an approximation, although things
3886 // like -O4 are going to slip through.
3887 if (!XarchArg || Index > Prev + 1) {
3888 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
3889 << A->getAsString(Args);
3890 continue;
3891 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
3892 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
3893 << A->getAsString(Args);
3894 continue;
3895 }
3896 XarchArg->setBaseArg(A);
3897 A = XarchArg.release();
3898 DAL->AddSynthesizedArg(A);
3899 }
3900 DAL->append(A);
3901 }
3902
3903 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
3904 return DAL;
3905}
3906
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003907/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00003908XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
3909 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003910 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003911 // ProgramPaths are found via 'PATH' environment variable.
3912}
3913
Douglas Katzman54366072015-07-27 16:53:08 +00003914Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003915 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003916}
3917
Douglas Katzman54366072015-07-27 16:53:08 +00003918Tool *XCoreToolChain::buildLinker() const {
3919 return new tools::XCore::Linker(*this);
3920}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003921
Douglas Katzman54366072015-07-27 16:53:08 +00003922bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003923
Douglas Katzman54366072015-07-27 16:53:08 +00003924bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003925
Douglas Katzman54366072015-07-27 16:53:08 +00003926bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003927
Douglas Katzman54366072015-07-27 16:53:08 +00003928bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003929
Douglas Katzman54366072015-07-27 16:53:08 +00003930bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003931
Douglas Katzman54366072015-07-27 16:53:08 +00003932void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3933 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003934 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
3935 DriverArgs.hasArg(options::OPT_nostdlibinc))
3936 return;
3937 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
3938 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003939 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003940 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3941 ArrayRef<StringRef> DirVec(Dirs);
3942 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3943 }
3944}
3945
Douglas Katzman54366072015-07-27 16:53:08 +00003946void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
3947 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003948 CC1Args.push_back("-nostdsysteminc");
3949}
3950
Douglas Katzman54366072015-07-27 16:53:08 +00003951void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
3952 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003953 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00003954 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3955 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003956 return;
3957 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
3958 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003959 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003960 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3961 ArrayRef<StringRef> DirVec(Dirs);
3962 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3963 }
3964}
3965
Douglas Katzman54366072015-07-27 16:53:08 +00003966void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
3967 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003968 // We don't output any lib args. This is handled by xcc.
3969}
Douglas Katzman84a75642015-06-19 14:55:19 +00003970
Douglas Katzmand6e597c2015-09-17 19:56:40 +00003971MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
3972 const ArgList &Args)
3973 : Generic_GCC(D, Triple, Args) {
3974 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
3975 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
3976 // This won't work to find gcc. Instead we give the installation detector an
3977 // extra triple, which is preferable to further hacks of the logic that at
3978 // present is based solely on getArch(). In particular, it would be wrong to
3979 // choose the myriad installation when targeting a non-myriad sparc install.
3980 switch (Triple.getArch()) {
3981 default:
3982 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName() << "myriad";
3983 case llvm::Triple::sparc:
3984 case llvm::Triple::sparcel:
3985 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003986 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00003987 }
3988}
3989
Angel Garcia Gomezb5250d32015-10-20 12:52:55 +00003990MyriadToolChain::~MyriadToolChain() = default;
Douglas Katzmand6e597c2015-09-17 19:56:40 +00003991
Douglas Katzmanb1278f32015-09-17 21:20:16 +00003992void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3993 ArgStringList &CC1Args) const {
3994 if (!DriverArgs.hasArg(options::OPT_nostdinc))
3995 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
3996}
3997
James Y Knighta6c9ee72015-10-16 18:46:26 +00003998void MyriadToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3999 ArgStringList &CC1Args) const {
4000 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4001 DriverArgs.hasArg(options::OPT_nostdincxx))
4002 return;
4003
4004 // Only libstdc++, for now.
4005 StringRef LibDir = GCCInstallation.getParentLibPath();
4006 const GCCVersion &Version = GCCInstallation.getVersion();
4007 StringRef TripleStr = GCCInstallation.getTriple().str();
4008 const Multilib &Multilib = GCCInstallation.getMultilib();
4009
4010 addLibStdCXXIncludePaths(LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4011 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
4012}
4013
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004014// MyriadToolChain handles several triples:
4015// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
4016Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4017 // The inherited method works fine if not targeting the SHAVE.
4018 if (!isShaveCompilation(getTriple()))
4019 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004020 switch (JA.getKind()) {
4021 case Action::CompileJobClass:
4022 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004023 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004024 return Compiler.get();
4025 case Action::AssembleJobClass:
4026 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004027 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004028 return Assembler.get();
4029 default:
4030 return ToolChain::getTool(JA.getKind());
4031 }
4032}
4033
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004034void MyriadToolChain::getCompilerSupportDir(std::string &Dir) const {
4035 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4036 // These files are tied to a particular version of gcc.
4037 SmallString<128> Result(GCCInstallation.getInstallPath());
4038 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4039 // but as this toolchain is for LEON sparc, it can assume FPU.
4040 if (this->getTriple().getArch() == llvm::Triple::sparcel)
4041 llvm::sys::path::append(Result, "le");
4042 Dir.assign(Result.str());
4043}
4044void MyriadToolChain::getBuiltinLibDir(std::string &Dir) const {
4045 // The contents of LibDir are independent of the version of gcc.
4046 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4047 SmallString<128> Result(GCCInstallation.getParentLibPath());
4048 if (this->getTriple().getArch() == llvm::Triple::sparcel)
4049 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib/le");
4050 else
4051 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib");
4052 Dir.assign(Result.str());
Douglas Katzman84a75642015-06-19 14:55:19 +00004053}
4054
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004055Tool *MyriadToolChain::buildLinker() const {
4056 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004057}
Dan Gohmanc2853072015-09-03 22:51:53 +00004058
4059bool WebAssembly::IsMathErrnoDefault() const { return false; }
4060
4061bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4062
4063bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4064
4065bool WebAssembly::isPICDefault() const { return false; }
4066
4067bool WebAssembly::isPIEDefault() const { return false; }
4068
4069bool WebAssembly::isPICDefaultForced() const { return false; }
4070
4071bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4072
4073// TODO: Support Objective C stuff.
4074bool WebAssembly::SupportsObjCGC() const { return false; }
4075
4076bool WebAssembly::hasBlocksRuntime() const { return false; }
4077
4078// TODO: Support profiling.
4079bool WebAssembly::SupportsProfiling() const { return false; }
4080
4081void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4082 ArgStringList &CC1Args) const {
4083 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4084 options::OPT_fno_use_init_array, true))
4085 CC1Args.push_back("-fuse-init-array");
4086}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004087
4088PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4089 : Generic_ELF(D, Triple, Args) {
4090 if (Args.hasArg(options::OPT_static))
4091 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4092
4093 // Determine where to find the PS4 libraries. We use SCE_PS4_SDK_DIR
4094 // if it exists; otherwise use the driver's installation path, which
4095 // should be <SDK_DIR>/host_tools/bin.
4096
4097 SmallString<512> PS4SDKDir;
4098 if (const char *EnvValue = getenv("SCE_PS4_SDK_DIR")) {
4099 if (!llvm::sys::fs::exists(EnvValue))
4100 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4101 PS4SDKDir = EnvValue;
4102 } else {
4103 PS4SDKDir = getDriver().Dir;
4104 llvm::sys::path::append(PS4SDKDir, "/../../");
4105 }
4106
4107 // By default, the driver won't report a warning if it can't find
4108 // PS4's include or lib directories. This behavior could be changed if
4109 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
4110 // If -isysroot was passed, use that as the SDK base path.
4111 std::string PrefixDir;
4112 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4113 PrefixDir = A->getValue();
4114 if (!llvm::sys::fs::exists(PrefixDir))
4115 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4116 } else
4117 PrefixDir = PS4SDKDir.str();
4118
4119 SmallString<512> PS4SDKIncludeDir(PrefixDir);
4120 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4121 if (!Args.hasArg(options::OPT_nostdinc) &&
4122 !Args.hasArg(options::OPT_nostdlibinc) &&
4123 !Args.hasArg(options::OPT_isysroot) &&
4124 !Args.hasArg(options::OPT__sysroot_EQ) &&
4125 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4126 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4127 << "PS4 system headers" << PS4SDKIncludeDir;
4128 }
4129
4130 SmallString<512> PS4SDKLibDir(PS4SDKDir);
4131 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4132 if (!Args.hasArg(options::OPT_nostdlib) &&
4133 !Args.hasArg(options::OPT_nodefaultlibs) &&
4134 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
4135 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
4136 !Args.hasArg(options::OPT_emit_ast) &&
4137 !llvm::sys::fs::exists(PS4SDKLibDir)) {
4138 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4139 << "PS4 system libraries" << PS4SDKLibDir;
4140 return;
4141 }
4142 getFilePaths().push_back(PS4SDKLibDir.str());
4143}
4144
4145Tool *PS4CPU::buildAssembler() const {
4146 return new tools::PS4cpu::Assemble(*this);
4147}
4148
4149Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
4150
4151bool PS4CPU::isPICDefault() const { return true; }
4152
4153bool PS4CPU::HasNativeLLVMSupport() const { return true; }
4154
4155SanitizerMask PS4CPU::getSupportedSanitizers() const {
4156 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4157 Res |= SanitizerKind::Address;
4158 Res |= SanitizerKind::Vptr;
4159 return Res;
4160}