blob: 5ed4b7f4d3f121b6658091e09e510a7bcf724bbb [file] [log] [blame]
Nick Lewycky3fdcc6f2010-12-31 17:31:54 +00001//===--- ToolChains.cpp - ToolChain Implementations -----------------------===//
Daniel Dunbar39176082009-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"
11
Rafael Espindola14ea13c2011-06-02 22:18:46 +000012#ifdef HAVE_CLANG_CONFIG_H
13# include "clang/Config/config.h"
14#endif
15
Daniel Dunbarf3cad362009-03-25 04:13:45 +000016#include "clang/Driver/Arg.h"
17#include "clang/Driver/ArgList.h"
Daniel Dunbar0f602de2010-05-20 21:48:38 +000018#include "clang/Driver/Compilation.h"
Daniel Dunbarc50b00d2009-03-23 16:15:50 +000019#include "clang/Driver/Driver.h"
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +000020#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbarc50b00d2009-03-23 16:15:50 +000021#include "clang/Driver/HostInfo.h"
John McCall9f084a32011-07-06 00:26:06 +000022#include "clang/Driver/ObjCRuntime.h"
Daniel Dunbar27e738d2009-11-19 00:15:11 +000023#include "clang/Driver/OptTable.h"
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +000024#include "clang/Driver/Option.h"
Daniel Dunbar265e9ef2009-11-19 04:25:22 +000025#include "clang/Driver/Options.h"
Douglas Gregor34916db2010-09-03 17:16:03 +000026#include "clang/Basic/Version.h"
Daniel Dunbarc50b00d2009-03-23 16:15:50 +000027
Daniel Dunbar00577ad2010-08-23 22:35:37 +000028#include "llvm/ADT/SmallString.h"
Daniel Dunbarc50b00d2009-03-23 16:15:50 +000029#include "llvm/ADT/StringExtras.h"
John McCallf85e1932011-06-15 23:02:42 +000030#include "llvm/ADT/STLExtras.h"
Daniel Dunbar84ec96c2009-09-09 22:33:15 +000031#include "llvm/Support/ErrorHandling.h"
Michael J. Spencer32bef4e2011-01-10 02:34:13 +000032#include "llvm/Support/FileSystem.h"
Rafael Espindolac1da9812010-11-07 20:14:31 +000033#include "llvm/Support/MemoryBuffer.h"
Daniel Dunbarec069ed2009-03-25 06:58:31 +000034#include "llvm/Support/raw_ostream.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000035#include "llvm/Support/Path.h"
Michael J. Spencer3a321e22010-12-09 17:36:38 +000036#include "llvm/Support/system_error.h"
Daniel Dunbarc50b00d2009-03-23 16:15:50 +000037
Daniel Dunbarf36a06a2009-04-10 21:00:07 +000038#include <cstdlib> // ::getenv
39
Dylan Noblesmith89bb6142011-06-23 13:50:47 +000040#include "llvm/Config/config.h" // for CXX_INCLUDE_ROOT
41
Daniel Dunbar39176082009-03-20 00:20:03 +000042using namespace clang::driver;
43using namespace clang::driver::toolchains;
Chris Lattner5f9e2722011-07-23 10:55:15 +000044using namespace clang;
Daniel Dunbar39176082009-03-20 00:20:03 +000045
Daniel Dunbarf3955282009-09-04 18:34:51 +000046/// Darwin - Darwin tool chain for i386 and x86_64.
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +000047
Daniel Dunbar25b58eb2010-08-02 05:44:07 +000048Darwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple)
John McCallf85e1932011-06-15 23:02:42 +000049 : ToolChain(Host, Triple), TargetInitialized(false),
50 ARCRuntimeForSimulator(ARCSimulator_None)
Daniel Dunbar1d4612b2009-09-18 08:15:13 +000051{
Daniel Dunbar25b58eb2010-08-02 05:44:07 +000052 // Compute the initial Darwin version based on the host.
53 bool HadExtra;
54 std::string OSName = Triple.getOSName();
Daniel Dunbar34f9e292011-02-25 21:20:15 +000055 if (!Driver::GetReleaseVersion(&OSName.c_str()[6],
Daniel Dunbar25b58eb2010-08-02 05:44:07 +000056 DarwinVersion[0], DarwinVersion[1],
57 DarwinVersion[2], HadExtra))
Chris Lattner5f9e2722011-07-23 10:55:15 +000058 getDriver().Diag(diag::err_drv_invalid_darwin_version) << OSName;
Daniel Dunbar25b58eb2010-08-02 05:44:07 +000059
Daniel Dunbar02633b52009-03-26 16:23:12 +000060 llvm::raw_string_ostream(MacosxVersionMin)
Daniel Dunbar25b58eb2010-08-02 05:44:07 +000061 << "10." << std::max(0, (int)DarwinVersion[0] - 4) << '.'
62 << DarwinVersion[1];
Daniel Dunbar1d4612b2009-09-18 08:15:13 +000063}
64
Daniel Dunbar41800112010-08-02 05:43:56 +000065types::ID Darwin::LookupTypeForExtension(const char *Ext) const {
66 types::ID Ty = types::lookupTypeForExtension(Ext);
67
68 // Darwin always preprocesses assembly files (unless -x is used explicitly).
69 if (Ty == types::TY_PP_Asm)
70 return types::TY_Asm;
71
72 return Ty;
73}
74
Daniel Dunbarb993f5d2010-09-17 00:24:52 +000075bool Darwin::HasNativeLLVMSupport() const {
76 return true;
77}
78
John McCall9f084a32011-07-06 00:26:06 +000079bool Darwin::hasARCRuntime() const {
John McCallf85e1932011-06-15 23:02:42 +000080 // FIXME: Remove this once there is a proper way to detect an ARC runtime
81 // for the simulator.
82 switch (ARCRuntimeForSimulator) {
83 case ARCSimulator_None:
84 break;
85 case ARCSimulator_HasARCRuntime:
86 return true;
87 case ARCSimulator_NoARCRuntime:
88 return false;
89 }
90
91 if (isTargetIPhoneOS())
92 return !isIPhoneOSVersionLT(5);
93 else
94 return !isMacosxVersionLT(10, 7);
95}
96
John McCall9f084a32011-07-06 00:26:06 +000097/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
98void Darwin::configureObjCRuntime(ObjCRuntime &runtime) const {
99 if (runtime.getKind() != ObjCRuntime::NeXT)
100 return ToolChain::configureObjCRuntime(runtime);
101
102 runtime.HasARC = runtime.HasWeak = hasARCRuntime();
John McCall256a76e2011-07-06 01:22:26 +0000103
104 // So far, objc_terminate is only available in iOS 5.
105 // FIXME: do the simulator logic properly.
106 if (!ARCRuntimeForSimulator && isTargetIPhoneOS())
107 runtime.HasTerminate = !isIPhoneOSVersionLT(5);
108 else
109 runtime.HasTerminate = false;
John McCall9f084a32011-07-06 00:26:06 +0000110}
111
Daniel Dunbareeff4062010-01-22 02:04:58 +0000112// FIXME: Can we tablegen this?
Chris Lattner5f9e2722011-07-23 10:55:15 +0000113static const char *GetArmArchForMArch(StringRef Value) {
Daniel Dunbareeff4062010-01-22 02:04:58 +0000114 if (Value == "armv6k")
115 return "armv6";
116
117 if (Value == "armv5tej")
118 return "armv5";
119
120 if (Value == "xscale")
121 return "xscale";
122
123 if (Value == "armv4t")
124 return "armv4t";
125
126 if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" ||
127 Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" ||
128 Value == "armv7m")
129 return "armv7";
130
131 return 0;
132}
133
134// FIXME: Can we tablegen this?
Chris Lattner5f9e2722011-07-23 10:55:15 +0000135static const char *GetArmArchForMCpu(StringRef Value) {
Daniel Dunbareeff4062010-01-22 02:04:58 +0000136 if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" ||
137 Value == "arm946e-s" || Value == "arm966e-s" ||
138 Value == "arm968e-s" || Value == "arm10e" ||
139 Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" ||
140 Value == "arm1026ej-s")
141 return "armv5";
142
143 if (Value == "xscale")
144 return "xscale";
145
146 if (Value == "arm1136j-s" || Value == "arm1136jf-s" ||
Bob Wilson1ec0ade2011-03-21 20:40:05 +0000147 Value == "arm1176jz-s" || Value == "arm1176jzf-s" ||
148 Value == "cortex-m0" )
Daniel Dunbareeff4062010-01-22 02:04:58 +0000149 return "armv6";
150
151 if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3")
152 return "armv7";
153
154 return 0;
155}
156
Chris Lattner5f9e2722011-07-23 10:55:15 +0000157StringRef Darwin::getDarwinArchName(const ArgList &Args) const {
Daniel Dunbareeff4062010-01-22 02:04:58 +0000158 switch (getTriple().getArch()) {
159 default:
160 return getArchName();
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000161
Douglas Gregorf0594d82011-03-06 19:11:49 +0000162 case llvm::Triple::thumb:
Daniel Dunbareeff4062010-01-22 02:04:58 +0000163 case llvm::Triple::arm: {
164 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
165 if (const char *Arch = GetArmArchForMArch(A->getValue(Args)))
166 return Arch;
167
168 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
169 if (const char *Arch = GetArmArchForMCpu(A->getValue(Args)))
170 return Arch;
171
172 return "arm";
173 }
174 }
175}
176
Daniel Dunbarf3955282009-09-04 18:34:51 +0000177Darwin::~Darwin() {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000178 // Free tool implementations.
179 for (llvm::DenseMap<unsigned, Tool*>::iterator
180 it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
181 delete it->second;
182}
183
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000184std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args) const {
185 llvm::Triple Triple(ComputeLLVMTriple(Args));
186
187 // If the target isn't initialized (e.g., an unknown Darwin platform, return
188 // the default triple).
189 if (!isTargetInitialized())
190 return Triple.getTriple();
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000191
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000192 unsigned Version[3];
193 getTargetVersion(Version);
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000194
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000195 llvm::SmallString<16> Str;
Daniel Dunbar729f38e2011-04-19 21:45:47 +0000196 llvm::raw_svector_ostream(Str)
Daniel Dunbar659d23a2011-04-19 23:34:17 +0000197 << (isTargetIPhoneOS() ? "ios" : "macosx")
Daniel Dunbar729f38e2011-04-19 21:45:47 +0000198 << Version[0] << "." << Version[1] << "." << Version[2];
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000199 Triple.setOSName(Str.str());
200
201 return Triple.getTriple();
202}
203
Daniel Dunbarac0659a2011-03-18 20:14:00 +0000204Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA,
205 const ActionList &Inputs) const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000206 Action::ActionClass Key;
Daniel Dunbar5ce872f2011-03-18 20:14:03 +0000207
208 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) {
209 // Fallback to llvm-gcc for i386 kext compiles, we don't support that ABI.
210 if (Inputs.size() == 1 &&
211 types::isCXX(Inputs[0]->getType()) &&
212 getTriple().getOS() == llvm::Triple::Darwin &&
213 getTriple().getArch() == llvm::Triple::x86 &&
214 C.getArgs().getLastArg(options::OPT_fapple_kext))
215 Key = JA.getKind();
216 else
217 Key = Action::AnalyzeJobClass;
218 } else
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000219 Key = JA.getKind();
220
Daniel Dunbar0f602de2010-05-20 21:48:38 +0000221 // FIXME: This doesn't belong here, but ideally we will support static soon
222 // anyway.
223 bool HasStatic = (C.getArgs().hasArg(options::OPT_mkernel) ||
224 C.getArgs().hasArg(options::OPT_static) ||
225 C.getArgs().hasArg(options::OPT_fapple_kext));
226 bool IsIADefault = IsIntegratedAssemblerDefault() && !HasStatic;
227 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
228 options::OPT_no_integrated_as,
229 IsIADefault);
230
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000231 Tool *&T = Tools[Key];
232 if (!T) {
233 switch (Key) {
234 case Action::InputClass:
235 case Action::BindArchClass:
236 assert(0 && "Invalid tool kind.");
237 case Action::PreprocessJobClass:
Daniel Dunbar9120f172009-03-29 22:27:40 +0000238 T = new tools::darwin::Preprocess(*this); break;
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000239 case Action::AnalyzeJobClass:
240 T = new tools::Clang(*this); break;
Daniel Dunbar9120f172009-03-29 22:27:40 +0000241 case Action::PrecompileJobClass:
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000242 case Action::CompileJobClass:
Daniel Dunbar9120f172009-03-29 22:27:40 +0000243 T = new tools::darwin::Compile(*this); break;
Daniel Dunbar0f602de2010-05-20 21:48:38 +0000244 case Action::AssembleJobClass: {
245 if (UseIntegratedAs)
246 T = new tools::ClangAs(*this);
247 else
248 T = new tools::darwin::Assemble(*this);
249 break;
250 }
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000251 case Action::LinkJobClass:
Daniel Dunbar8f289622009-09-04 17:39:02 +0000252 T = new tools::darwin::Link(*this); break;
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000253 case Action::LipoJobClass:
254 T = new tools::darwin::Lipo(*this); break;
Daniel Dunbar6e0f2542010-06-04 18:28:36 +0000255 case Action::DsymutilJobClass:
256 T = new tools::darwin::Dsymutil(*this); break;
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000257 }
258 }
259
260 return *T;
261}
262
Daniel Dunbar6cd41542009-09-18 08:15:03 +0000263
Daniel Dunbar25b58eb2010-08-02 05:44:07 +0000264DarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple)
265 : Darwin(Host, Triple)
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000266{
Daniel Dunbar47023092011-03-18 19:25:15 +0000267 std::string UsrPrefix = "llvm-gcc-4.2/";
268
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000269 getProgramPaths().push_back(getDriver().getInstalledDir());
270 if (getDriver().getInstalledDir() != getDriver().Dir)
271 getProgramPaths().push_back(getDriver().Dir);
272
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000273 // We expect 'as', 'ld', etc. to be adjacent to our install dir.
Daniel Dunbaredf29b02010-08-01 22:29:51 +0000274 getProgramPaths().push_back(getDriver().getInstalledDir());
275 if (getDriver().getInstalledDir() != getDriver().Dir)
276 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000277
278 // For fallback, we need to know how to find the GCC cc1 executables, so we
Daniel Dunbar47023092011-03-18 19:25:15 +0000279 // also add the GCC libexec paths. This is legacy code that can be removed
280 // once fallback is no longer useful.
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000281 std::string ToolChainDir = "i686-apple-darwin";
282 ToolChainDir += llvm::utostr(DarwinVersion[0]);
283 ToolChainDir += "/4.2.1";
284
285 std::string Path = getDriver().Dir;
Daniel Dunbar47023092011-03-18 19:25:15 +0000286 Path += "/../" + UsrPrefix + "libexec/gcc/";
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000287 Path += ToolChainDir;
288 getProgramPaths().push_back(Path);
289
Daniel Dunbar47023092011-03-18 19:25:15 +0000290 Path = "/usr/" + UsrPrefix + "libexec/gcc/";
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000291 Path += ToolChainDir;
292 getProgramPaths().push_back(Path);
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000293}
294
295void DarwinClang::AddLinkSearchPathArgs(const ArgList &Args,
296 ArgStringList &CmdArgs) const {
297 // The Clang toolchain uses explicit paths for internal libraries.
Daniel Dunbar424b6612010-06-30 23:56:13 +0000298
299 // Unfortunately, we still might depend on a few of the libraries that are
300 // only available in the gcc library directory (in particular
301 // libstdc++.dylib). For now, hardcode the path to the known install location.
302 llvm::sys::Path P(getDriver().Dir);
303 P.eraseComponent(); // .../usr/bin -> ../usr
304 P.appendComponent("lib");
305 P.appendComponent("gcc");
306 switch (getTriple().getArch()) {
307 default:
308 assert(0 && "Invalid Darwin arch!");
309 case llvm::Triple::x86:
310 case llvm::Triple::x86_64:
311 P.appendComponent("i686-apple-darwin10");
312 break;
313 case llvm::Triple::arm:
314 case llvm::Triple::thumb:
315 P.appendComponent("arm-apple-darwin10");
316 break;
317 case llvm::Triple::ppc:
318 case llvm::Triple::ppc64:
319 P.appendComponent("powerpc-apple-darwin10");
320 break;
321 }
322 P.appendComponent("4.2.1");
Daniel Dunbareab3bc42010-08-23 20:58:52 +0000323
324 // Determine the arch specific GCC subdirectory.
325 const char *ArchSpecificDir = 0;
326 switch (getTriple().getArch()) {
327 default:
328 break;
329 case llvm::Triple::arm:
Daniel Dunbar3a0e3922010-08-26 00:55:52 +0000330 case llvm::Triple::thumb: {
331 std::string Triple = ComputeLLVMTriple(Args);
Chris Lattner5f9e2722011-07-23 10:55:15 +0000332 StringRef TripleStr = Triple;
Daniel Dunbar3a0e3922010-08-26 00:55:52 +0000333 if (TripleStr.startswith("armv5") || TripleStr.startswith("thumbv5"))
334 ArchSpecificDir = "v5";
335 else if (TripleStr.startswith("armv6") || TripleStr.startswith("thumbv6"))
336 ArchSpecificDir = "v6";
337 else if (TripleStr.startswith("armv7") || TripleStr.startswith("thumbv7"))
338 ArchSpecificDir = "v7";
Daniel Dunbareab3bc42010-08-23 20:58:52 +0000339 break;
Daniel Dunbar3a0e3922010-08-26 00:55:52 +0000340 }
Daniel Dunbareab3bc42010-08-23 20:58:52 +0000341 case llvm::Triple::ppc64:
342 ArchSpecificDir = "ppc64";
343 break;
344 case llvm::Triple::x86_64:
345 ArchSpecificDir = "x86_64";
346 break;
347 }
348
349 if (ArchSpecificDir) {
350 P.appendComponent(ArchSpecificDir);
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000351 bool Exists;
352 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Daniel Dunbareab3bc42010-08-23 20:58:52 +0000353 CmdArgs.push_back(Args.MakeArgString("-L" + P.str()));
354 P.eraseComponent();
355 }
356
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000357 bool Exists;
358 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Daniel Dunbar424b6612010-06-30 23:56:13 +0000359 CmdArgs.push_back(Args.MakeArgString("-L" + P.str()));
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000360}
361
John McCallf85e1932011-06-15 23:02:42 +0000362void DarwinClang::AddLinkARCArgs(const ArgList &Args,
363 ArgStringList &CmdArgs) const {
364
365 CmdArgs.push_back("-force_load");
366 llvm::sys::Path P(getDriver().ClangExecutable);
367 P.eraseComponent(); // 'clang'
368 P.eraseComponent(); // 'bin'
369 P.appendComponent("lib");
370 P.appendComponent("arc");
371 P.appendComponent("libarclite_");
372 std::string s = P.str();
373 // Mash in the platform.
374 if (isTargetIPhoneOS())
375 s += "iphoneos";
376 // FIXME: isTargetIphoneOSSimulator() is not returning true.
377 else if (ARCRuntimeForSimulator != ARCSimulator_None)
378 s += "iphonesimulator";
379 else
380 s += "macosx";
381 s += ".a";
382
383 CmdArgs.push_back(Args.MakeArgString(s));
384}
385
Eric Christopher3404fe72011-06-22 17:41:40 +0000386void DarwinClang::AddLinkRuntimeLib(const ArgList &Args,
387 ArgStringList &CmdArgs,
388 const char *DarwinStaticLib) const {
389 llvm::sys::Path P(getDriver().ResourceDir);
390 P.appendComponent("lib");
391 P.appendComponent("darwin");
392 P.appendComponent(DarwinStaticLib);
393
394 // For now, allow missing resource libraries to support developers who may
395 // not have compiler-rt checked out or integrated into their build.
396 bool Exists;
397 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
398 CmdArgs.push_back(Args.MakeArgString(P.str()));
399}
400
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000401void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
402 ArgStringList &CmdArgs) const {
Daniel Dunbareec99102010-01-22 03:38:14 +0000403 // Darwin doesn't support real static executables, don't link any runtime
404 // libraries with -static.
405 if (Args.hasArg(options::OPT_static))
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000406 return;
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000407
408 // Reject -static-libgcc for now, we can deal with this when and if someone
409 // cares. This is useful in situations where someone wants to statically link
410 // something like libstdc++, and needs its runtime support routines.
411 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000412 getDriver().Diag(diag::err_drv_unsupported_opt)
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000413 << A->getAsString(Args);
414 return;
415 }
416
Daniel Dunbareec99102010-01-22 03:38:14 +0000417 // Otherwise link libSystem, then the dynamic runtime library, and finally any
418 // target specific static runtime library.
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000419 CmdArgs.push_back("-lSystem");
Daniel Dunbareec99102010-01-22 03:38:14 +0000420
421 // Select the dynamic runtime library and the target specific static library.
Daniel Dunbar251ca6c2010-01-27 00:56:37 +0000422 if (isTargetIPhoneOS()) {
Daniel Dunbar87e945f2011-04-30 04:25:16 +0000423 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
424 // it never went into the SDK.
425 if (!isTargetIOSSimulator())
426 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbareec99102010-01-22 03:38:14 +0000427
Daniel Dunbar3cceec52011-04-18 23:48:36 +0000428 // We currently always need a static runtime library for iOS.
Eric Christopher3404fe72011-06-22 17:41:40 +0000429 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbareec99102010-01-22 03:38:14 +0000430 } else {
Daniel Dunbareec99102010-01-22 03:38:14 +0000431 // The dynamic runtime library was merged with libSystem for 10.6 and
432 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbarce3fdf22010-01-27 00:57:03 +0000433 if (isMacosxVersionLT(10, 5))
Daniel Dunbareec99102010-01-22 03:38:14 +0000434 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +0000435 else if (isMacosxVersionLT(10, 6))
Daniel Dunbareec99102010-01-22 03:38:14 +0000436 CmdArgs.push_back("-lgcc_s.10.5");
437
Daniel Dunbar885b1db2010-09-22 00:03:52 +0000438 // For OS X, we thought we would only need a static runtime library when
Chris Lattnerfc8f0e12011-04-15 05:22:18 +0000439 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbar885b1db2010-09-22 00:03:52 +0000440 // omitted from 10.4.dylib.
441 //
442 // Unfortunately, that turned out to not be true, because Darwin system
443 // headers can still use eprintf on i386, and it is not exported from
444 // libSystem. Therefore, we still must provide a runtime library just for
445 // the tiny tiny handful of projects that *might* use that symbol.
446 if (isMacosxVersionLT(10, 5)) {
Eric Christopher3404fe72011-06-22 17:41:40 +0000447 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbar885b1db2010-09-22 00:03:52 +0000448 } else {
449 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopher3404fe72011-06-22 17:41:40 +0000450 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
451 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbar885b1db2010-09-22 00:03:52 +0000452 }
Daniel Dunbareec99102010-01-22 03:38:14 +0000453 }
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000454}
455
Chris Lattner5f9e2722011-07-23 10:55:15 +0000456static inline StringRef SimulatorVersionDefineName() {
John McCallf85e1932011-06-15 23:02:42 +0000457 return "__IPHONE_OS_VERSION_MIN_REQUIRED";
458}
459
460/// \brief Parse the simulator version define:
461/// __IPHONE_OS_VERSION_MIN_REQUIRED=([0-9])([0-9][0-9])([0-9][0-9])
462// and return the grouped values as integers, e.g:
463// __IPHONE_OS_VERSION_MIN_REQUIRED=40201
464// will return Major=4, Minor=2, Micro=1.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000465static bool GetVersionFromSimulatorDefine(StringRef define,
John McCallf85e1932011-06-15 23:02:42 +0000466 unsigned &Major, unsigned &Minor,
467 unsigned &Micro) {
468 assert(define.startswith(SimulatorVersionDefineName()));
Chris Lattner5f9e2722011-07-23 10:55:15 +0000469 StringRef name, version;
John McCallf85e1932011-06-15 23:02:42 +0000470 llvm::tie(name, version) = define.split('=');
471 if (version.empty())
472 return false;
473 std::string verstr = version.str();
474 char *end;
475 unsigned num = (unsigned) strtol(verstr.c_str(), &end, 10);
476 if (*end != '\0')
477 return false;
478 Major = num / 10000;
479 num = num % 10000;
480 Minor = num / 100;
481 Micro = num % 100;
482 return true;
483}
484
Daniel Dunbar60baf0f2010-07-19 17:11:36 +0000485void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +0000486 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000487
Daniel Dunbar26031372010-01-27 00:56:25 +0000488 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000489 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
490 Arg *iOSSimVersion = Args.getLastArg(
491 options::OPT_mios_simulator_version_min_EQ);
John McCallf85e1932011-06-15 23:02:42 +0000492
493 // FIXME: HACK! When compiling for the simulator we don't get a
494 // '-miphoneos-version-min' to help us know whether there is an ARC runtime
495 // or not; try to parse a __IPHONE_OS_VERSION_MIN_REQUIRED
496 // define passed in command-line.
497 if (!iOSVersion) {
498 for (arg_iterator it = Args.filtered_begin(options::OPT_D),
499 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000500 StringRef define = (*it)->getValue(Args);
John McCallf85e1932011-06-15 23:02:42 +0000501 if (define.startswith(SimulatorVersionDefineName())) {
502 unsigned Major, Minor, Micro;
503 if (GetVersionFromSimulatorDefine(define, Major, Minor, Micro) &&
504 Major < 10 && Minor < 100 && Micro < 100) {
505 ARCRuntimeForSimulator = Major < 5 ? ARCSimulator_NoARCRuntime
506 : ARCSimulator_HasARCRuntime;
507 }
508 break;
509 }
510 }
511 }
512
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000513 if (OSXVersion && (iOSVersion || iOSSimVersion)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000514 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarff8857a2009-04-10 20:11:50 +0000515 << OSXVersion->getAsString(Args)
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000516 << (iOSVersion ? iOSVersion : iOSSimVersion)->getAsString(Args);
517 iOSVersion = iOSSimVersion = 0;
518 } else if (iOSVersion && iOSSimVersion) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000519 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000520 << iOSVersion->getAsString(Args)
521 << iOSSimVersion->getAsString(Args);
522 iOSSimVersion = 0;
523 } else if (!OSXVersion && !iOSVersion && !iOSSimVersion) {
524 // If not deployment target was specified on the command line, check for
Daniel Dunbar816bc312010-01-26 01:45:19 +0000525 // environment defines.
526 const char *OSXTarget = ::getenv("MACOSX_DEPLOYMENT_TARGET");
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000527 const char *iOSTarget = ::getenv("IPHONEOS_DEPLOYMENT_TARGET");
528 const char *iOSSimTarget = ::getenv("IOS_SIMULATOR_DEPLOYMENT_TARGET");
Daniel Dunbarf36a06a2009-04-10 21:00:07 +0000529
Daniel Dunbar816bc312010-01-26 01:45:19 +0000530 // Ignore empty strings.
531 if (OSXTarget && OSXTarget[0] == '\0')
532 OSXTarget = 0;
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000533 if (iOSTarget && iOSTarget[0] == '\0')
534 iOSTarget = 0;
535 if (iOSSimTarget && iOSSimTarget[0] == '\0')
536 iOSSimTarget = 0;
Daniel Dunbar816bc312010-01-26 01:45:19 +0000537
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000538 // Handle conflicting deployment targets
Daniel Dunbar39053672010-02-02 17:31:12 +0000539 //
540 // FIXME: Don't hardcode default here.
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000541
542 // Do not allow conflicts with the iOS simulator target.
543 if (iOSSimTarget && (OSXTarget || iOSTarget)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000544 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000545 << "IOS_SIMULATOR_DEPLOYMENT_TARGET"
546 << (OSXTarget ? "MACOSX_DEPLOYMENT_TARGET" :
547 "IPHONEOS_DEPLOYMENT_TARGET");
548 }
549
550 // Allow conflicts among OSX and iOS for historical reasons, but choose the
551 // default platform.
552 if (OSXTarget && iOSTarget) {
Daniel Dunbar39053672010-02-02 17:31:12 +0000553 if (getTriple().getArch() == llvm::Triple::arm ||
554 getTriple().getArch() == llvm::Triple::thumb)
Daniel Dunbar84d1e6e2010-03-20 08:47:42 +0000555 OSXTarget = 0;
Daniel Dunbar39053672010-02-02 17:31:12 +0000556 else
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000557 iOSTarget = 0;
Daniel Dunbar39053672010-02-02 17:31:12 +0000558 }
Daniel Dunbar1a3c1d92010-01-29 17:02:25 +0000559
Daniel Dunbar39053672010-02-02 17:31:12 +0000560 if (OSXTarget) {
Daniel Dunbar30392de2009-09-04 18:35:21 +0000561 const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar60baf0f2010-07-19 17:11:36 +0000562 OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget);
563 Args.append(OSXVersion);
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000564 } else if (iOSTarget) {
Daniel Dunbar30392de2009-09-04 18:35:21 +0000565 const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000566 iOSVersion = Args.MakeJoinedArg(0, O, iOSTarget);
567 Args.append(iOSVersion);
568 } else if (iOSSimTarget) {
569 const Option *O = Opts.getOption(
570 options::OPT_mios_simulator_version_min_EQ);
571 iOSSimVersion = Args.MakeJoinedArg(0, O, iOSSimTarget);
572 Args.append(iOSSimVersion);
Daniel Dunbar816bc312010-01-26 01:45:19 +0000573 } else {
Daniel Dunbar2bb38d02010-07-15 16:18:06 +0000574 // Otherwise, assume we are targeting OS X.
575 const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar60baf0f2010-07-19 17:11:36 +0000576 OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin);
577 Args.append(OSXVersion);
Daniel Dunbar30392de2009-09-04 18:35:21 +0000578 }
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000579 }
Mike Stump1eb44332009-09-09 15:08:12 +0000580
Daniel Dunbar3fd823b2011-04-30 04:20:40 +0000581 // Reject invalid architecture combinations.
582 if (iOSSimVersion && (getTriple().getArch() != llvm::Triple::x86 &&
583 getTriple().getArch() != llvm::Triple::x86_64)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000584 getDriver().Diag(diag::err_drv_invalid_arch_for_deployment_target)
Daniel Dunbar3fd823b2011-04-30 04:20:40 +0000585 << getTriple().getArchName() << iOSSimVersion->getAsString(Args);
586 }
587
Daniel Dunbar26031372010-01-27 00:56:25 +0000588 // Set the tool chain target information.
589 unsigned Major, Minor, Micro;
590 bool HadExtra;
591 if (OSXVersion) {
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000592 assert((!iOSVersion && !iOSSimVersion) && "Unknown target platform!");
Daniel Dunbar26031372010-01-27 00:56:25 +0000593 if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor,
594 Micro, HadExtra) || HadExtra ||
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000595 Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000596 getDriver().Diag(diag::err_drv_invalid_version_number)
Daniel Dunbar26031372010-01-27 00:56:25 +0000597 << OSXVersion->getAsString(Args);
598 } else {
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000599 const Arg *Version = iOSVersion ? iOSVersion : iOSSimVersion;
600 assert(Version && "Unknown target platform!");
601 if (!Driver::GetReleaseVersion(Version->getValue(Args), Major, Minor,
Daniel Dunbar26031372010-01-27 00:56:25 +0000602 Micro, HadExtra) || HadExtra ||
603 Major >= 10 || Minor >= 100 || Micro >= 100)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000604 getDriver().Diag(diag::err_drv_invalid_version_number)
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000605 << Version->getAsString(Args);
Daniel Dunbar26031372010-01-27 00:56:25 +0000606 }
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000607
Daniel Dunbar5f5c37b2011-04-30 04:18:16 +0000608 bool IsIOSSim = bool(iOSSimVersion);
609
610 // In GCC, the simulator historically was treated as being OS X in some
611 // contexts, like determining the link logic, despite generally being called
612 // with an iOS deployment target. For compatibility, we detect the
613 // simulator as iOS + x86, and treat it differently in a few contexts.
614 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
615 getTriple().getArch() == llvm::Triple::x86_64))
616 IsIOSSim = true;
617
618 setTarget(/*IsIPhoneOS=*/ !OSXVersion, Major, Minor, Micro, IsIOSSim);
Daniel Dunbarc0e665e2010-07-19 17:11:33 +0000619}
620
Daniel Dunbar132e35d2010-09-17 01:20:05 +0000621void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000622 ArgStringList &CmdArgs) const {
623 CXXStdlibType Type = GetCXXStdlibType(Args);
624
625 switch (Type) {
626 case ToolChain::CST_Libcxx:
627 CmdArgs.push_back("-lc++");
628 break;
629
630 case ToolChain::CST_Libstdcxx: {
631 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
632 // it was previously found in the gcc lib dir. However, for all the Darwin
633 // platforms we care about it was -lstdc++.6, so we search for that
634 // explicitly if we can't see an obvious -lstdc++ candidate.
635
636 // Check in the sysroot first.
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000637 bool Exists;
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000638 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
639 llvm::sys::Path P(A->getValue(Args));
640 P.appendComponent("usr");
641 P.appendComponent("lib");
642 P.appendComponent("libstdc++.dylib");
643
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000644 if (llvm::sys::fs::exists(P.str(), Exists) || !Exists) {
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000645 P.eraseComponent();
646 P.appendComponent("libstdc++.6.dylib");
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000647 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000648 CmdArgs.push_back(Args.MakeArgString(P.str()));
649 return;
650 }
651 }
652 }
653
654 // Otherwise, look in the root.
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000655 if ((llvm::sys::fs::exists("/usr/lib/libstdc++.dylib", Exists) || !Exists)&&
656 (!llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib", Exists) && Exists)){
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000657 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
658 return;
659 }
660
661 // Otherwise, let the linker search.
662 CmdArgs.push_back("-lstdc++");
663 break;
664 }
665 }
666}
667
Shantonu Sen7433fed2010-09-17 18:39:08 +0000668void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
669 ArgStringList &CmdArgs) const {
670
671 // For Darwin platforms, use the compiler-rt-based support library
672 // instead of the gcc-provided one (which is also incidentally
673 // only present in the gcc lib dir, which makes it hard to find).
674
675 llvm::sys::Path P(getDriver().ResourceDir);
676 P.appendComponent("lib");
677 P.appendComponent("darwin");
678 P.appendComponent("libclang_rt.cc_kext.a");
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000679
Shantonu Sen7433fed2010-09-17 18:39:08 +0000680 // For now, allow missing resource libraries to support developers who may
681 // not have compiler-rt checked out or integrated into their build.
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000682 bool Exists;
683 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Shantonu Sen7433fed2010-09-17 18:39:08 +0000684 CmdArgs.push_back(Args.MakeArgString(P.str()));
685}
686
Daniel Dunbarc0e665e2010-07-19 17:11:33 +0000687DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
688 const char *BoundArch) const {
689 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
690 const OptTable &Opts = getDriver().getOpts();
691
692 // FIXME: We really want to get out of the tool chain level argument
693 // translation business, as it makes the driver functionality much
694 // more opaque. For now, we follow gcc closely solely for the
695 // purpose of easily achieving feature parity & testability. Once we
696 // have something that works, we should reevaluate each translation
697 // and try to push it down into tool specific logic.
Daniel Dunbar26031372010-01-27 00:56:25 +0000698
Daniel Dunbar279c1db2010-06-11 22:00:26 +0000699 for (ArgList::const_iterator it = Args.begin(),
700 ie = Args.end(); it != ie; ++it) {
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000701 Arg *A = *it;
702
703 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar2a45fa72011-06-21 00:20:17 +0000704 // Skip this argument unless the architecture matches either the toolchain
705 // triple arch, or the arch being bound.
706 //
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000707 // FIXME: Canonicalize name.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000708 StringRef XarchArch = A->getValue(Args, 0);
Daniel Dunbar2a45fa72011-06-21 00:20:17 +0000709 if (!(XarchArch == getArchName() ||
710 (BoundArch && XarchArch == BoundArch)))
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000711 continue;
712
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000713 Arg *OriginalArg = A;
Daniel Dunbar0e100312010-06-14 21:23:08 +0000714 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(Args, 1));
715 unsigned Prev = Index;
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000716 Arg *XarchArg = Opts.ParseOneArg(Args, Index);
Mike Stump1eb44332009-09-09 15:08:12 +0000717
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000718 // If the argument parsing failed or more than one argument was
719 // consumed, the -Xarch_ argument's parameter tried to consume
720 // extra arguments. Emit an error and ignore.
721 //
722 // We also want to disallow any options which would alter the
723 // driver behavior; that isn't going to work in our model. We
724 // use isDriverOption() as an approximation, although things
725 // like -O4 are going to slip through.
Daniel Dunbar0e02f6e2011-04-21 17:41:34 +0000726 if (!XarchArg || Index > Prev + 1) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000727 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Daniel Dunbar7e9293b2011-04-21 17:32:21 +0000728 << A->getAsString(Args);
729 continue;
730 } else if (XarchArg->getOption().isDriverOption()) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000731 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000732 << A->getAsString(Args);
733 continue;
734 }
735
Daniel Dunbar478edc22009-03-29 22:29:05 +0000736 XarchArg->setBaseArg(A);
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000737 A = XarchArg;
Daniel Dunbar0e100312010-06-14 21:23:08 +0000738
739 DAL->AddSynthesizedArg(A);
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000740
741 // Linker input arguments require custom handling. The problem is that we
742 // have already constructed the phase actions, so we can not treat them as
743 // "input arguments".
744 if (A->getOption().isLinkerInput()) {
745 // Convert the argument into individual Zlinker_input_args.
746 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
747 DAL->AddSeparateArg(OriginalArg,
748 Opts.getOption(options::OPT_Zlinker_input),
749 A->getValue(Args, i));
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000750
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000751 }
752 continue;
753 }
Mike Stump1eb44332009-09-09 15:08:12 +0000754 }
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000755
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000756 // Sob. These is strictly gcc compatible for the time being. Apple
757 // gcc translates options twice, which means that self-expanding
758 // options add duplicates.
Daniel Dunbar9e1f9822009-11-19 04:14:53 +0000759 switch ((options::ID) A->getOption().getID()) {
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000760 default:
761 DAL->append(A);
762 break;
763
764 case options::OPT_mkernel:
765 case options::OPT_fapple_kext:
766 DAL->append(A);
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000767 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
768 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000769 break;
Mike Stump1eb44332009-09-09 15:08:12 +0000770
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000771 case options::OPT_dependency_file:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000772 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF),
773 A->getValue(Args));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000774 break;
775
776 case options::OPT_gfull:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000777 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
778 DAL->AddFlagArg(A,
779 Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000780 break;
781
782 case options::OPT_gused:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000783 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
784 DAL->AddFlagArg(A,
785 Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000786 break;
787
788 case options::OPT_fterminated_vtables:
789 case options::OPT_findirect_virtual_calls:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000790 DAL->AddFlagArg(A, Opts.getOption(options::OPT_fapple_kext));
791 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000792 break;
793
794 case options::OPT_shared:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000795 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000796 break;
797
798 case options::OPT_fconstant_cfstrings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000799 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000800 break;
801
802 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000803 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000804 break;
805
806 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000807 DAL->AddFlagArg(A,
808 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000809 break;
810
811 case options::OPT_Wno_nonportable_cfstrings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000812 DAL->AddFlagArg(A,
813 Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000814 break;
815
816 case options::OPT_fpascal_strings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000817 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000818 break;
819
820 case options::OPT_fno_pascal_strings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000821 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000822 break;
823 }
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000824 }
825
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000826 if (getTriple().getArch() == llvm::Triple::x86 ||
827 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbare4bdae72009-11-19 04:00:53 +0000828 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000829 DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000830
831 // Add the arch options based on the particular spelling of -arch, to match
832 // how the driver driver works.
833 if (BoundArch) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000834 StringRef Name = BoundArch;
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000835 const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ);
836 const Option *MArch = Opts.getOption(options::OPT_march_EQ);
837
838 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
839 // which defines the list of which architectures we accept.
840 if (Name == "ppc")
841 ;
842 else if (Name == "ppc601")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000843 DAL->AddJoinedArg(0, MCpu, "601");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000844 else if (Name == "ppc603")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000845 DAL->AddJoinedArg(0, MCpu, "603");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000846 else if (Name == "ppc604")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000847 DAL->AddJoinedArg(0, MCpu, "604");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000848 else if (Name == "ppc604e")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000849 DAL->AddJoinedArg(0, MCpu, "604e");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000850 else if (Name == "ppc750")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000851 DAL->AddJoinedArg(0, MCpu, "750");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000852 else if (Name == "ppc7400")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000853 DAL->AddJoinedArg(0, MCpu, "7400");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000854 else if (Name == "ppc7450")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000855 DAL->AddJoinedArg(0, MCpu, "7450");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000856 else if (Name == "ppc970")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000857 DAL->AddJoinedArg(0, MCpu, "970");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000858
859 else if (Name == "ppc64")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000860 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000861
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000862 else if (Name == "i386")
863 ;
864 else if (Name == "i486")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000865 DAL->AddJoinedArg(0, MArch, "i486");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000866 else if (Name == "i586")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000867 DAL->AddJoinedArg(0, MArch, "i586");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000868 else if (Name == "i686")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000869 DAL->AddJoinedArg(0, MArch, "i686");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000870 else if (Name == "pentium")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000871 DAL->AddJoinedArg(0, MArch, "pentium");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000872 else if (Name == "pentium2")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000873 DAL->AddJoinedArg(0, MArch, "pentium2");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000874 else if (Name == "pentpro")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000875 DAL->AddJoinedArg(0, MArch, "pentiumpro");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000876 else if (Name == "pentIIm3")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000877 DAL->AddJoinedArg(0, MArch, "pentium2");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000878
879 else if (Name == "x86_64")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000880 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000881
882 else if (Name == "arm")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000883 DAL->AddJoinedArg(0, MArch, "armv4t");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000884 else if (Name == "armv4t")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000885 DAL->AddJoinedArg(0, MArch, "armv4t");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000886 else if (Name == "armv5")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000887 DAL->AddJoinedArg(0, MArch, "armv5tej");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000888 else if (Name == "xscale")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000889 DAL->AddJoinedArg(0, MArch, "xscale");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000890 else if (Name == "armv6")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000891 DAL->AddJoinedArg(0, MArch, "armv6k");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000892 else if (Name == "armv7")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000893 DAL->AddJoinedArg(0, MArch, "armv7a");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000894
895 else
Jeffrey Yasskin9f61aa92009-12-12 05:05:38 +0000896 llvm_unreachable("invalid Darwin arch");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000897 }
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000898
Daniel Dunbar60baf0f2010-07-19 17:11:36 +0000899 // Add an explicit version min argument for the deployment target. We do this
900 // after argument translation because -Xarch_ arguments may add a version min
901 // argument.
902 AddDeploymentTarget(*DAL);
903
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000904 return DAL;
Mike Stump1eb44332009-09-09 15:08:12 +0000905}
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000906
Daniel Dunbarf3955282009-09-04 18:34:51 +0000907bool Darwin::IsUnwindTablesDefault() const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000908 // FIXME: Gross; we should probably have some separate target
909 // definition, possibly even reusing the one in clang.
910 return getArchName() == "x86_64";
911}
912
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +0000913bool Darwin::UseDwarfDebugFlags() const {
914 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
915 return S[0] != '\0';
916 return false;
917}
918
Daniel Dunbarb2987d12010-02-10 18:49:11 +0000919bool Darwin::UseSjLjExceptions() const {
920 // Darwin uses SjLj exceptions on ARM.
921 return (getTriple().getArch() == llvm::Triple::arm ||
922 getTriple().getArch() == llvm::Triple::thumb);
923}
924
Daniel Dunbarf3955282009-09-04 18:34:51 +0000925const char *Darwin::GetDefaultRelocationModel() const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000926 return "pic";
927}
928
Daniel Dunbarf3955282009-09-04 18:34:51 +0000929const char *Darwin::GetForcedPicModel() const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000930 if (getArchName() == "x86_64")
931 return "pic";
932 return 0;
933}
934
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +0000935bool Darwin::SupportsProfiling() const {
936 // Profiling instrumentation is only supported on x86.
937 return getArchName() == "i386" || getArchName() == "x86_64";
938}
939
Daniel Dunbar43a9b322010-04-10 16:20:23 +0000940bool Darwin::SupportsObjCGC() const {
941 // Garbage collection is supported everywhere except on iPhone OS.
942 return !isTargetIPhoneOS();
943}
944
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000945std::string
946Darwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args) const {
947 return ComputeLLVMTriple(Args);
948}
949
Daniel Dunbar39176082009-03-20 00:20:03 +0000950/// Generic_GCC - A tool chain using the 'gcc' command to perform
951/// all subcommands; this relies on gcc translating the majority of
952/// command line options.
953
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000954Generic_GCC::Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple)
Mike Stump1eb44332009-09-09 15:08:12 +0000955 : ToolChain(Host, Triple) {
Daniel Dunbaredf29b02010-08-01 22:29:51 +0000956 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer86643b82011-03-01 22:50:47 +0000957 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbaredf29b02010-08-01 22:29:51 +0000958 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarc50b00d2009-03-23 16:15:50 +0000959}
960
Daniel Dunbar39176082009-03-20 00:20:03 +0000961Generic_GCC::~Generic_GCC() {
962 // Free tool implementations.
963 for (llvm::DenseMap<unsigned, Tool*>::iterator
964 it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
965 delete it->second;
966}
967
Mike Stump1eb44332009-09-09 15:08:12 +0000968Tool &Generic_GCC::SelectTool(const Compilation &C,
Daniel Dunbarac0659a2011-03-18 20:14:00 +0000969 const JobAction &JA,
970 const ActionList &Inputs) const {
Daniel Dunbar39176082009-03-20 00:20:03 +0000971 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +0000972 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Daniel Dunbar39176082009-03-20 00:20:03 +0000973 Key = Action::AnalyzeJobClass;
974 else
975 Key = JA.getKind();
976
977 Tool *&T = Tools[Key];
978 if (!T) {
979 switch (Key) {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000980 case Action::InputClass:
981 case Action::BindArchClass:
Daniel Dunbar39176082009-03-20 00:20:03 +0000982 assert(0 && "Invalid tool kind.");
983 case Action::PreprocessJobClass:
984 T = new tools::gcc::Preprocess(*this); break;
985 case Action::PrecompileJobClass:
986 T = new tools::gcc::Precompile(*this); break;
987 case Action::AnalyzeJobClass:
988 T = new tools::Clang(*this); break;
989 case Action::CompileJobClass:
990 T = new tools::gcc::Compile(*this); break;
991 case Action::AssembleJobClass:
992 T = new tools::gcc::Assemble(*this); break;
993 case Action::LinkJobClass:
994 T = new tools::gcc::Link(*this); break;
Mike Stump1eb44332009-09-09 15:08:12 +0000995
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000996 // This is a bit ungeneric, but the only platform using a driver
997 // driver is Darwin.
998 case Action::LipoJobClass:
999 T = new tools::darwin::Lipo(*this); break;
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00001000 case Action::DsymutilJobClass:
1001 T = new tools::darwin::Dsymutil(*this); break;
Daniel Dunbar39176082009-03-20 00:20:03 +00001002 }
1003 }
1004
1005 return *T;
1006}
1007
Daniel Dunbar39176082009-03-20 00:20:03 +00001008bool Generic_GCC::IsUnwindTablesDefault() const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +00001009 // FIXME: Gross; we should probably have some separate target
1010 // definition, possibly even reusing the one in clang.
Daniel Dunbar39176082009-03-20 00:20:03 +00001011 return getArchName() == "x86_64";
1012}
1013
1014const char *Generic_GCC::GetDefaultRelocationModel() const {
1015 return "static";
1016}
1017
1018const char *Generic_GCC::GetForcedPicModel() const {
1019 return 0;
1020}
Daniel Dunbarf3cad362009-03-25 04:13:45 +00001021
Chris Lattner3a47c4e2010-03-04 21:07:38 +00001022/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
1023/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
1024/// Currently does not support anything else but compilation.
1025
1026TCEToolChain::TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple)
1027 : ToolChain(Host, Triple) {
1028 // Path mangling to find libexec
1029 std::string Path(getDriver().Dir);
1030
1031 Path += "/../libexec";
1032 getProgramPaths().push_back(Path);
1033}
1034
1035TCEToolChain::~TCEToolChain() {
1036 for (llvm::DenseMap<unsigned, Tool*>::iterator
1037 it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
1038 delete it->second;
1039}
1040
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001041bool TCEToolChain::IsMathErrnoDefault() const {
1042 return true;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00001043}
1044
1045bool TCEToolChain::IsUnwindTablesDefault() const {
1046 return false;
1047}
1048
1049const char *TCEToolChain::GetDefaultRelocationModel() const {
1050 return "static";
1051}
1052
1053const char *TCEToolChain::GetForcedPicModel() const {
1054 return 0;
1055}
1056
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001057Tool &TCEToolChain::SelectTool(const Compilation &C,
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001058 const JobAction &JA,
1059 const ActionList &Inputs) const {
Chris Lattner3a47c4e2010-03-04 21:07:38 +00001060 Action::ActionClass Key;
1061 Key = Action::AnalyzeJobClass;
1062
1063 Tool *&T = Tools[Key];
1064 if (!T) {
1065 switch (Key) {
1066 case Action::PreprocessJobClass:
1067 T = new tools::gcc::Preprocess(*this); break;
1068 case Action::AnalyzeJobClass:
1069 T = new tools::Clang(*this); break;
1070 default:
1071 assert(false && "Unsupported action for TCE target.");
1072 }
1073 }
1074 return *T;
1075}
1076
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001077/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
1078
1079OpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple)
Rafael Espindolae43cfa12010-10-29 20:14:02 +00001080 : Generic_ELF(Host, Triple) {
Daniel Dunbaree788e72009-12-21 18:54:17 +00001081 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001082 getFilePaths().push_back("/usr/lib");
1083}
1084
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001085Tool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA,
1086 const ActionList &Inputs) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001087 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00001088 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001089 Key = Action::AnalyzeJobClass;
1090 else
1091 Key = JA.getKind();
1092
Rafael Espindoladda5b922010-11-07 23:13:01 +00001093 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1094 options::OPT_no_integrated_as,
1095 IsIntegratedAssemblerDefault());
1096
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001097 Tool *&T = Tools[Key];
1098 if (!T) {
1099 switch (Key) {
Rafael Espindoladda5b922010-11-07 23:13:01 +00001100 case Action::AssembleJobClass: {
1101 if (UseIntegratedAs)
1102 T = new tools::ClangAs(*this);
1103 else
1104 T = new tools::openbsd::Assemble(*this);
1105 break;
1106 }
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001107 case Action::LinkJobClass:
1108 T = new tools::openbsd::Link(*this); break;
1109 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001110 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001111 }
1112 }
1113
1114 return *T;
1115}
1116
Daniel Dunbar75358d22009-03-30 21:06:03 +00001117/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
1118
Daniel Dunbar214afe92010-08-02 05:43:59 +00001119FreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple)
Rafael Espindolae43cfa12010-10-29 20:14:02 +00001120 : Generic_ELF(Host, Triple) {
Daniel Dunbar214afe92010-08-02 05:43:59 +00001121
1122 // Determine if we are compiling 32-bit code on an x86_64 platform.
1123 bool Lib32 = false;
1124 if (Triple.getArch() == llvm::Triple::x86 &&
1125 llvm::Triple(getDriver().DefaultHostTriple).getArch() ==
1126 llvm::Triple::x86_64)
1127 Lib32 = true;
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001128
Roman Divacky3393cef2011-06-04 07:37:31 +00001129 if (Triple.getArch() == llvm::Triple::ppc &&
1130 llvm::Triple(getDriver().DefaultHostTriple).getArch() ==
1131 llvm::Triple::ppc64)
1132 Lib32 = true;
1133
Daniel Dunbarbc534662009-04-02 18:30:04 +00001134 if (Lib32) {
Daniel Dunbarbc534662009-04-02 18:30:04 +00001135 getFilePaths().push_back("/usr/lib32");
1136 } else {
Daniel Dunbarbc534662009-04-02 18:30:04 +00001137 getFilePaths().push_back("/usr/lib");
1138 }
Daniel Dunbar75358d22009-03-30 21:06:03 +00001139}
1140
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001141Tool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA,
1142 const ActionList &Inputs) const {
Daniel Dunbar75358d22009-03-30 21:06:03 +00001143 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00001144 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Daniel Dunbar75358d22009-03-30 21:06:03 +00001145 Key = Action::AnalyzeJobClass;
1146 else
1147 Key = JA.getKind();
1148
Roman Divacky67dece72010-11-08 17:46:39 +00001149 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1150 options::OPT_no_integrated_as,
1151 IsIntegratedAssemblerDefault());
1152
Daniel Dunbar75358d22009-03-30 21:06:03 +00001153 Tool *&T = Tools[Key];
1154 if (!T) {
1155 switch (Key) {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00001156 case Action::AssembleJobClass:
Roman Divacky67dece72010-11-08 17:46:39 +00001157 if (UseIntegratedAs)
1158 T = new tools::ClangAs(*this);
1159 else
1160 T = new tools::freebsd::Assemble(*this);
Roman Divackyfe3a7ea2010-11-08 19:39:10 +00001161 break;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00001162 case Action::LinkJobClass:
1163 T = new tools::freebsd::Link(*this); break;
Daniel Dunbar75358d22009-03-30 21:06:03 +00001164 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001165 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Daniel Dunbar75358d22009-03-30 21:06:03 +00001166 }
1167 }
1168
1169 return *T;
1170}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001171
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001172/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
1173
Joerg Sonnenberger182564c2011-05-16 13:35:02 +00001174NetBSD::NetBSD(const HostInfo &Host, const llvm::Triple& Triple,
1175 const llvm::Triple& ToolTriple)
1176 : Generic_ELF(Host, Triple), ToolTriple(ToolTriple) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001177
1178 // Determine if we are compiling 32-bit code on an x86_64 platform.
1179 bool Lib32 = false;
Joerg Sonnenberger182564c2011-05-16 13:35:02 +00001180 if (ToolTriple.getArch() == llvm::Triple::x86_64 &&
1181 Triple.getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001182 Lib32 = true;
1183
Joerg Sonnenberger05e59302011-03-21 13:59:26 +00001184 if (getDriver().UseStdLib) {
1185 if (Lib32)
1186 getFilePaths().push_back("=/usr/lib/i386");
1187 else
1188 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001189 }
1190}
1191
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001192Tool &NetBSD::SelectTool(const Compilation &C, const JobAction &JA,
1193 const ActionList &Inputs) const {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001194 Action::ActionClass Key;
1195 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1196 Key = Action::AnalyzeJobClass;
1197 else
1198 Key = JA.getKind();
1199
1200 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1201 options::OPT_no_integrated_as,
1202 IsIntegratedAssemblerDefault());
1203
1204 Tool *&T = Tools[Key];
1205 if (!T) {
1206 switch (Key) {
1207 case Action::AssembleJobClass:
1208 if (UseIntegratedAs)
1209 T = new tools::ClangAs(*this);
1210 else
Joerg Sonnenberger182564c2011-05-16 13:35:02 +00001211 T = new tools::netbsd::Assemble(*this, ToolTriple);
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001212 break;
1213 case Action::LinkJobClass:
Joerg Sonnenberger182564c2011-05-16 13:35:02 +00001214 T = new tools::netbsd::Link(*this, ToolTriple);
1215 break;
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001216 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001217 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001218 }
1219 }
1220
1221 return *T;
1222}
1223
Chris Lattner38e317d2010-07-07 16:01:42 +00001224/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
1225
1226Minix::Minix(const HostInfo &Host, const llvm::Triple& Triple)
1227 : Generic_GCC(Host, Triple) {
1228 getFilePaths().push_back(getDriver().Dir + "/../lib");
1229 getFilePaths().push_back("/usr/lib");
1230 getFilePaths().push_back("/usr/gnu/lib");
1231 getFilePaths().push_back("/usr/gnu/lib/gcc/i686-pc-minix/4.4.3");
1232}
1233
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001234Tool &Minix::SelectTool(const Compilation &C, const JobAction &JA,
1235 const ActionList &Inputs) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00001236 Action::ActionClass Key;
1237 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1238 Key = Action::AnalyzeJobClass;
1239 else
1240 Key = JA.getKind();
1241
1242 Tool *&T = Tools[Key];
1243 if (!T) {
1244 switch (Key) {
1245 case Action::AssembleJobClass:
1246 T = new tools::minix::Assemble(*this); break;
1247 case Action::LinkJobClass:
1248 T = new tools::minix::Link(*this); break;
1249 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001250 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Chris Lattner38e317d2010-07-07 16:01:42 +00001251 }
1252 }
1253
1254 return *T;
1255}
1256
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001257/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
1258
1259AuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple)
1260 : Generic_GCC(Host, Triple) {
1261
Daniel Dunbaredf29b02010-08-01 22:29:51 +00001262 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer86643b82011-03-01 22:50:47 +00001263 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbaredf29b02010-08-01 22:29:51 +00001264 getProgramPaths().push_back(getDriver().Dir);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001265
Daniel Dunbaree788e72009-12-21 18:54:17 +00001266 getFilePaths().push_back(getDriver().Dir + "/../lib");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001267 getFilePaths().push_back("/usr/lib");
1268 getFilePaths().push_back("/usr/sfw/lib");
1269 getFilePaths().push_back("/opt/gcc4/lib");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00001270 getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001271
1272}
1273
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001274Tool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA,
1275 const ActionList &Inputs) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001276 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00001277 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001278 Key = Action::AnalyzeJobClass;
1279 else
1280 Key = JA.getKind();
1281
1282 Tool *&T = Tools[Key];
1283 if (!T) {
1284 switch (Key) {
1285 case Action::AssembleJobClass:
1286 T = new tools::auroraux::Assemble(*this); break;
1287 case Action::LinkJobClass:
1288 T = new tools::auroraux::Link(*this); break;
1289 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001290 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001291 }
1292 }
1293
1294 return *T;
1295}
1296
1297
Eli Friedman6b3454a2009-05-26 07:52:18 +00001298/// Linux toolchain (very bare-bones at the moment).
1299
Rafael Espindolac1da9812010-11-07 20:14:31 +00001300enum LinuxDistro {
Chandler Carruth3fd345a2011-02-25 06:39:53 +00001301 ArchLinux,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001302 DebianLenny,
1303 DebianSqueeze,
Eli Friedman0b200f62011-06-02 21:36:53 +00001304 DebianWheezy,
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001305 Exherbo,
Chris Lattnerd753b562011-05-22 05:36:06 +00001306 RHEL4,
1307 RHEL5,
1308 RHEL6,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001309 Fedora13,
1310 Fedora14,
Eric Christopher8f1cc072011-04-06 18:22:53 +00001311 Fedora15,
1312 FedoraRawhide,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001313 OpenSuse11_3,
David Chisnallde5c0482011-05-19 13:26:33 +00001314 OpenSuse11_4,
1315 OpenSuse12_1,
Douglas Gregor814638e2011-03-14 15:39:50 +00001316 UbuntuHardy,
1317 UbuntuIntrepid,
Rafael Espindola021aaa42010-11-10 05:00:22 +00001318 UbuntuJaunty,
Zhongxing Xu5ede8072010-11-15 09:01:52 +00001319 UbuntuKarmic,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001320 UbuntuLucid,
1321 UbuntuMaverick,
Ted Kremenek43ac2972011-04-05 22:04:27 +00001322 UbuntuNatty,
Benjamin Kramer25a857b2011-06-05 16:08:59 +00001323 UbuntuOneiric,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001324 UnknownDistro
1325};
1326
Chris Lattnerd753b562011-05-22 05:36:06 +00001327static bool IsRedhat(enum LinuxDistro Distro) {
Eric Christopher8f1cc072011-04-06 18:22:53 +00001328 return Distro == Fedora13 || Distro == Fedora14 ||
Rafael Espindola5a640ef2011-06-03 15:23:24 +00001329 Distro == Fedora15 || Distro == FedoraRawhide ||
1330 Distro == RHEL4 || Distro == RHEL5 || Distro == RHEL6;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001331}
1332
1333static bool IsOpenSuse(enum LinuxDistro Distro) {
David Chisnallde5c0482011-05-19 13:26:33 +00001334 return Distro == OpenSuse11_3 || Distro == OpenSuse11_4 ||
1335 Distro == OpenSuse12_1;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001336}
1337
1338static bool IsDebian(enum LinuxDistro Distro) {
Eli Friedman0b200f62011-06-02 21:36:53 +00001339 return Distro == DebianLenny || Distro == DebianSqueeze ||
1340 Distro == DebianWheezy;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001341}
1342
1343static bool IsUbuntu(enum LinuxDistro Distro) {
Douglas Gregor814638e2011-03-14 15:39:50 +00001344 return Distro == UbuntuHardy || Distro == UbuntuIntrepid ||
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001345 Distro == UbuntuLucid || Distro == UbuntuMaverick ||
Ted Kremenek43ac2972011-04-05 22:04:27 +00001346 Distro == UbuntuJaunty || Distro == UbuntuKarmic ||
Benjamin Kramer25a857b2011-06-05 16:08:59 +00001347 Distro == UbuntuNatty || Distro == UbuntuOneiric;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001348}
1349
1350static bool IsDebianBased(enum LinuxDistro Distro) {
1351 return IsDebian(Distro) || IsUbuntu(Distro);
1352}
1353
1354static bool HasMultilib(llvm::Triple::ArchType Arch, enum LinuxDistro Distro) {
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001355 if (Arch == llvm::Triple::x86_64) {
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001356 bool Exists;
1357 if (Distro == Exherbo &&
1358 (llvm::sys::fs::exists("/usr/lib32/libc.so", Exists) || !Exists))
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001359 return false;
1360
Rafael Espindolac1da9812010-11-07 20:14:31 +00001361 return true;
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001362 }
Ted Kremenek43ac2972011-04-05 22:04:27 +00001363 if (Arch == llvm::Triple::ppc64)
1364 return true;
Eric Christopher9af535a2011-06-03 13:28:31 +00001365 if ((Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc) &&
1366 IsDebianBased(Distro))
Rafael Espindolac1da9812010-11-07 20:14:31 +00001367 return true;
1368 return false;
1369}
1370
1371static LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) {
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001372 llvm::OwningPtr<llvm::MemoryBuffer> File;
1373 if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001374 StringRef Data = File.get()->getBuffer();
1375 SmallVector<StringRef, 8> Lines;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001376 Data.split(Lines, "\n");
1377 for (unsigned int i = 0, s = Lines.size(); i < s; ++ i) {
Douglas Gregor814638e2011-03-14 15:39:50 +00001378 if (Lines[i] == "DISTRIB_CODENAME=hardy")
1379 return UbuntuHardy;
Ted Kremenek43ac2972011-04-05 22:04:27 +00001380 else if (Lines[i] == "DISTRIB_CODENAME=intrepid")
1381 return UbuntuIntrepid;
Rafael Espindola021aaa42010-11-10 05:00:22 +00001382 else if (Lines[i] == "DISTRIB_CODENAME=jaunty")
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001383 return UbuntuJaunty;
Zhongxing Xu5ede8072010-11-15 09:01:52 +00001384 else if (Lines[i] == "DISTRIB_CODENAME=karmic")
1385 return UbuntuKarmic;
Ted Kremenek43ac2972011-04-05 22:04:27 +00001386 else if (Lines[i] == "DISTRIB_CODENAME=lucid")
1387 return UbuntuLucid;
1388 else if (Lines[i] == "DISTRIB_CODENAME=maverick")
1389 return UbuntuMaverick;
1390 else if (Lines[i] == "DISTRIB_CODENAME=natty")
1391 return UbuntuNatty;
Benjamin Kramer25a857b2011-06-05 16:08:59 +00001392 else if (Lines[i] == "DISTRIB_CODENAME=oneiric")
1393 return UbuntuOneiric;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001394 }
1395 return UnknownDistro;
1396 }
1397
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001398 if (!llvm::MemoryBuffer::getFile("/etc/redhat-release", File)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001399 StringRef Data = File.get()->getBuffer();
Eric Christopher8f1cc072011-04-06 18:22:53 +00001400 if (Data.startswith("Fedora release 15"))
1401 return Fedora15;
1402 else if (Data.startswith("Fedora release 14"))
Rafael Espindolac1da9812010-11-07 20:14:31 +00001403 return Fedora14;
Eric Christopher8f1cc072011-04-06 18:22:53 +00001404 else if (Data.startswith("Fedora release 13"))
Rafael Espindolac1da9812010-11-07 20:14:31 +00001405 return Fedora13;
Eric Christopher8f1cc072011-04-06 18:22:53 +00001406 else if (Data.startswith("Fedora release") &&
Chris Lattner5f9e2722011-07-23 10:55:15 +00001407 Data.find("Rawhide") != StringRef::npos)
Eric Christopher8f1cc072011-04-06 18:22:53 +00001408 return FedoraRawhide;
Chris Lattnerd753b562011-05-22 05:36:06 +00001409 else if (Data.startswith("Red Hat Enterprise Linux") &&
Chris Lattner5f9e2722011-07-23 10:55:15 +00001410 Data.find("release 6") != StringRef::npos)
Chris Lattnerd753b562011-05-22 05:36:06 +00001411 return RHEL6;
Rafael Espindola5a640ef2011-06-03 15:23:24 +00001412 else if ((Data.startswith("Red Hat Enterprise Linux") ||
1413 Data.startswith("CentOS")) &&
Chris Lattner5f9e2722011-07-23 10:55:15 +00001414 Data.find("release 5") != StringRef::npos)
Chris Lattnerd753b562011-05-22 05:36:06 +00001415 return RHEL5;
Rafael Espindola5a640ef2011-06-03 15:23:24 +00001416 else if ((Data.startswith("Red Hat Enterprise Linux") ||
1417 Data.startswith("CentOS")) &&
Chris Lattner5f9e2722011-07-23 10:55:15 +00001418 Data.find("release 4") != StringRef::npos)
Chris Lattnerd753b562011-05-22 05:36:06 +00001419 return RHEL4;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001420 return UnknownDistro;
1421 }
1422
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001423 if (!llvm::MemoryBuffer::getFile("/etc/debian_version", File)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001424 StringRef Data = File.get()->getBuffer();
Rafael Espindolac1da9812010-11-07 20:14:31 +00001425 if (Data[0] == '5')
1426 return DebianLenny;
1427 else if (Data.startswith("squeeze/sid"))
1428 return DebianSqueeze;
Eli Friedman0b200f62011-06-02 21:36:53 +00001429 else if (Data.startswith("wheezy/sid"))
1430 return DebianWheezy;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001431 return UnknownDistro;
1432 }
1433
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001434 if (!llvm::MemoryBuffer::getFile("/etc/SuSE-release", File)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001435 StringRef Data = File.get()->getBuffer();
Rafael Espindolac1da9812010-11-07 20:14:31 +00001436 if (Data.startswith("openSUSE 11.3"))
1437 return OpenSuse11_3;
David Chisnallde5c0482011-05-19 13:26:33 +00001438 else if (Data.startswith("openSUSE 11.4"))
1439 return OpenSuse11_4;
1440 else if (Data.startswith("openSUSE 12.1"))
1441 return OpenSuse12_1;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001442 return UnknownDistro;
1443 }
1444
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001445 bool Exists;
1446 if (!llvm::sys::fs::exists("/etc/exherbo-release", Exists) && Exists)
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001447 return Exherbo;
1448
Chandler Carruth3fd345a2011-02-25 06:39:53 +00001449 if (!llvm::sys::fs::exists("/etc/arch-release", Exists) && Exists)
1450 return ArchLinux;
1451
Rafael Espindolac1da9812010-11-07 20:14:31 +00001452 return UnknownDistro;
1453}
1454
Rafael Espindola14ea13c2011-06-02 22:18:46 +00001455static std::string findGCCBaseLibDir(const std::string &GccTriple) {
Chandler Carruth169dd312011-06-08 10:14:38 +00001456 // FIXME: Using CXX_INCLUDE_ROOT is here is a bit of a hack, but
1457 // avoids adding yet another option to configure/cmake.
1458 // It would probably be cleaner to break it in two variables
1459 // CXX_GCC_ROOT with just /foo/bar
1460 // CXX_GCC_VER with 4.5.2
1461 // Then we would have
1462 // CXX_INCLUDE_ROOT = CXX_GCC_ROOT/include/c++/CXX_GCC_VER
1463 // and this function would return
1464 // CXX_GCC_ROOT/lib/gcc/CXX_INCLUDE_ARCH/CXX_GCC_VER
1465 llvm::SmallString<128> CxxIncludeRoot(CXX_INCLUDE_ROOT);
1466 if (CxxIncludeRoot != "") {
1467 // This is of the form /foo/bar/include/c++/4.5.2/
1468 if (CxxIncludeRoot.back() == '/')
1469 llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the /
Chris Lattner5f9e2722011-07-23 10:55:15 +00001470 StringRef Version = llvm::sys::path::filename(CxxIncludeRoot);
Chandler Carruth169dd312011-06-08 10:14:38 +00001471 llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the version
1472 llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the c++
1473 llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the include
1474 std::string ret(CxxIncludeRoot.c_str());
1475 ret.append("/lib/gcc/");
1476 ret.append(CXX_INCLUDE_ARCH);
1477 ret.append("/");
1478 ret.append(Version);
1479 return ret;
Rafael Espindola14ea13c2011-06-02 22:18:46 +00001480 }
Chandler Carruth37187cc2011-07-02 00:51:03 +00001481 static const char* GccVersions[] = {"4.6.1", "4.6.0", "4.6",
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001482 "4.5.2", "4.5.1", "4.5",
1483 "4.4.5", "4.4.4", "4.4.3", "4.4",
1484 "4.3.4", "4.3.3", "4.3.2", "4.3",
1485 "4.2.4", "4.2.3", "4.2.2", "4.2.1",
1486 "4.2", "4.1.1"};
Rafael Espindola14ea13c2011-06-02 22:18:46 +00001487 bool Exists;
1488 for (unsigned i = 0; i < sizeof(GccVersions)/sizeof(char*); ++i) {
1489 std::string Suffix = GccTriple + "/" + GccVersions[i];
1490 std::string t1 = "/usr/lib/gcc/" + Suffix;
1491 if (!llvm::sys::fs::exists(t1 + "/crtbegin.o", Exists) && Exists)
1492 return t1;
1493 std::string t2 = "/usr/lib64/gcc/" + Suffix;
1494 if (!llvm::sys::fs::exists(t2 + "/crtbegin.o", Exists) && Exists)
1495 return t2;
1496 std::string t3 = "/usr/lib/" + GccTriple + "/gcc/" + Suffix;
1497 if (!llvm::sys::fs::exists(t3 + "/crtbegin.o", Exists) && Exists)
1498 return t3;
1499 }
1500 return "";
1501}
1502
Nick Lewycky3fdcc6f2010-12-31 17:31:54 +00001503Linux::Linux(const HostInfo &Host, const llvm::Triple &Triple)
Rafael Espindolae43cfa12010-10-29 20:14:02 +00001504 : Generic_ELF(Host, Triple) {
Rafael Espindolac1da9812010-11-07 20:14:31 +00001505 llvm::Triple::ArchType Arch =
1506 llvm::Triple(getDriver().DefaultHostTriple).getArch();
Daniel Dunbara9822de2009-08-06 01:47:11 +00001507
Rafael Espindolac1da9812010-11-07 20:14:31 +00001508 std::string Suffix32 = "";
1509 if (Arch == llvm::Triple::x86_64)
1510 Suffix32 = "/32";
Daniel Dunbara9822de2009-08-06 01:47:11 +00001511
Rafael Espindolac1da9812010-11-07 20:14:31 +00001512 std::string Suffix64 = "";
Ted Kremenek43ac2972011-04-05 22:04:27 +00001513 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001514 Suffix64 = "/64";
1515
1516 std::string Lib32 = "lib";
1517
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001518 bool Exists;
1519 if (!llvm::sys::fs::exists("/lib32", Exists) && Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001520 Lib32 = "lib32";
1521
1522 std::string Lib64 = "lib";
Michael J. Spencer2dea7c72011-01-12 23:54:48 +00001523 bool Symlink;
Chris Lattner48aef362011-01-13 01:35:58 +00001524 if (!llvm::sys::fs::exists("/lib64", Exists) && Exists &&
1525 (llvm::sys::fs::is_symlink("/lib64", Symlink) || !Symlink))
Rafael Espindolac1da9812010-11-07 20:14:31 +00001526 Lib64 = "lib64";
1527
1528 std::string GccTriple = "";
Douglas Gregorf0594d82011-03-06 19:11:49 +00001529 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001530 if (!llvm::sys::fs::exists("/usr/lib/gcc/arm-linux-gnueabi", Exists) &&
1531 Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001532 GccTriple = "arm-linux-gnueabi";
1533 } else if (Arch == llvm::Triple::x86_64) {
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001534 if (!llvm::sys::fs::exists("/usr/lib/gcc/x86_64-linux-gnu", Exists) &&
1535 Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001536 GccTriple = "x86_64-linux-gnu";
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001537 else if (!llvm::sys::fs::exists("/usr/lib/gcc/x86_64-unknown-linux-gnu",
1538 Exists) && Exists)
Rafael Espindola53dd00b2010-11-17 00:25:26 +00001539 GccTriple = "x86_64-unknown-linux-gnu";
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001540 else if (!llvm::sys::fs::exists("/usr/lib/gcc/x86_64-pc-linux-gnu",
1541 Exists) && Exists)
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001542 GccTriple = "x86_64-pc-linux-gnu";
NAKAMURA Takumic3703982011-06-16 12:43:57 +00001543 else if (!llvm::sys::fs::exists("/usr/lib/gcc/x86_64-redhat-linux6E",
1544 Exists) && Exists)
1545 GccTriple = "x86_64-redhat-linux6E";
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001546 else if (!llvm::sys::fs::exists("/usr/lib/gcc/x86_64-redhat-linux",
1547 Exists) && Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001548 GccTriple = "x86_64-redhat-linux";
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001549 else if (!llvm::sys::fs::exists("/usr/lib64/gcc/x86_64-suse-linux",
1550 Exists) && Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001551 GccTriple = "x86_64-suse-linux";
Nick Lewyckye10f9002011-02-01 23:03:29 +00001552 else if (!llvm::sys::fs::exists("/usr/lib/gcc/x86_64-manbo-linux-gnu",
1553 Exists) && Exists)
1554 GccTriple = "x86_64-manbo-linux-gnu";
Nico Weber80585d82011-04-25 03:17:35 +00001555 else if (!llvm::sys::fs::exists("/usr/lib/x86_64-linux-gnu/gcc",
1556 Exists) && Exists)
1557 GccTriple = "x86_64-linux-gnu";
Rafael Espindolac1da9812010-11-07 20:14:31 +00001558 } else if (Arch == llvm::Triple::x86) {
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001559 if (!llvm::sys::fs::exists("/usr/lib/gcc/i686-linux-gnu", Exists) && Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001560 GccTriple = "i686-linux-gnu";
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001561 else if (!llvm::sys::fs::exists("/usr/lib/gcc/i686-pc-linux-gnu", Exists) &&
1562 Exists)
Nuno Lopes2a69ddd2010-11-19 17:26:57 +00001563 GccTriple = "i686-pc-linux-gnu";
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001564 else if (!llvm::sys::fs::exists("/usr/lib/gcc/i486-linux-gnu", Exists) &&
1565 Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001566 GccTriple = "i486-linux-gnu";
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001567 else if (!llvm::sys::fs::exists("/usr/lib/gcc/i686-redhat-linux", Exists) &&
1568 Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001569 GccTriple = "i686-redhat-linux";
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001570 else if (!llvm::sys::fs::exists("/usr/lib/gcc/i586-suse-linux", Exists) &&
1571 Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001572 GccTriple = "i586-suse-linux";
Ted Kremenekd130c7d2011-04-18 17:50:19 +00001573 else if (!llvm::sys::fs::exists("/usr/lib/gcc/i486-slackware-linux", Exists)
1574 && Exists)
1575 GccTriple = "i486-slackware-linux";
Ted Kremenek43ac2972011-04-05 22:04:27 +00001576 } else if (Arch == llvm::Triple::ppc) {
1577 if (!llvm::sys::fs::exists("/usr/lib/powerpc-linux-gnu", Exists) && Exists)
1578 GccTriple = "powerpc-linux-gnu";
Eric Christopher9af535a2011-06-03 13:28:31 +00001579 else if (!llvm::sys::fs::exists("/usr/lib/gcc/powerpc-unknown-linux-gnu",
1580 Exists) && Exists)
Ted Kremenek43ac2972011-04-05 22:04:27 +00001581 GccTriple = "powerpc-unknown-linux-gnu";
1582 } else if (Arch == llvm::Triple::ppc64) {
Eric Christopher9af535a2011-06-03 13:28:31 +00001583 if (!llvm::sys::fs::exists("/usr/lib/gcc/powerpc64-unknown-linux-gnu",
1584 Exists) && Exists)
Ted Kremenek43ac2972011-04-05 22:04:27 +00001585 GccTriple = "powerpc64-unknown-linux-gnu";
Eric Christopher9af535a2011-06-03 13:28:31 +00001586 else if (!llvm::sys::fs::exists("/usr/lib64/gcc/"
1587 "powerpc64-unknown-linux-gnu", Exists) &&
1588 Exists)
Ted Kremenek43ac2972011-04-05 22:04:27 +00001589 GccTriple = "powerpc64-unknown-linux-gnu";
Rafael Espindolac1da9812010-11-07 20:14:31 +00001590 }
1591
Rafael Espindola14ea13c2011-06-02 22:18:46 +00001592 std::string Base = findGCCBaseLibDir(GccTriple);
Rafael Espindolac1da9812010-11-07 20:14:31 +00001593 path_list &Paths = getFilePaths();
Eric Christopher9af535a2011-06-03 13:28:31 +00001594 bool Is32Bits = (getArch() == llvm::Triple::x86 ||
1595 getArch() == llvm::Triple::ppc);
Rafael Espindolac1da9812010-11-07 20:14:31 +00001596
1597 std::string Suffix;
1598 std::string Lib;
1599
1600 if (Is32Bits) {
1601 Suffix = Suffix32;
1602 Lib = Lib32;
1603 } else {
1604 Suffix = Suffix64;
1605 Lib = Lib64;
1606 }
1607
1608 llvm::sys::Path LinkerPath(Base + "/../../../../" + GccTriple + "/bin/ld");
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001609 if (!llvm::sys::fs::exists(LinkerPath.str(), Exists) && Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001610 Linker = LinkerPath.str();
1611 else
1612 Linker = GetProgramPath("ld");
1613
1614 LinuxDistro Distro = DetectLinuxDistro(Arch);
1615
Chris Lattner64a89172011-05-22 16:45:07 +00001616 if (IsOpenSuse(Distro) || IsUbuntu(Distro)) {
Rafael Espindola94c80222010-11-08 14:48:47 +00001617 ExtraOpts.push_back("-z");
1618 ExtraOpts.push_back("relro");
1619 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00001620
Douglas Gregorf0594d82011-03-06 19:11:49 +00001621 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001622 ExtraOpts.push_back("-X");
1623
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001624 if (IsRedhat(Distro) || IsOpenSuse(Distro) || Distro == UbuntuMaverick ||
Benjamin Kramer25a857b2011-06-05 16:08:59 +00001625 Distro == UbuntuNatty || Distro == UbuntuOneiric)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001626 ExtraOpts.push_back("--hash-style=gnu");
1627
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001628 if (IsDebian(Distro) || IsOpenSuse(Distro) || Distro == UbuntuLucid ||
Chris Lattner64a89172011-05-22 16:45:07 +00001629 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001630 ExtraOpts.push_back("--hash-style=both");
1631
Chris Lattnerd753b562011-05-22 05:36:06 +00001632 if (IsRedhat(Distro))
Rafael Espindolac1da9812010-11-07 20:14:31 +00001633 ExtraOpts.push_back("--no-add-needed");
1634
Eli Friedman0b200f62011-06-02 21:36:53 +00001635 if (Distro == DebianSqueeze || Distro == DebianWheezy ||
Rafael Espindola5a640ef2011-06-03 15:23:24 +00001636 IsOpenSuse(Distro) ||
1637 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
1638 Distro == UbuntuLucid ||
Eli Friedman0b200f62011-06-02 21:36:53 +00001639 Distro == UbuntuMaverick || Distro == UbuntuKarmic ||
Benjamin Kramer25a857b2011-06-05 16:08:59 +00001640 Distro == UbuntuNatty || Distro == UbuntuOneiric)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001641 ExtraOpts.push_back("--build-id");
1642
Chris Lattner64a89172011-05-22 16:45:07 +00001643 if (IsOpenSuse(Distro))
Chandler Carruthf0b60ec2011-05-24 07:51:17 +00001644 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattner64a89172011-05-22 16:45:07 +00001645
Chandler Carruth3fd345a2011-02-25 06:39:53 +00001646 if (Distro == ArchLinux)
1647 Lib = "lib";
1648
Rafael Espindolac1da9812010-11-07 20:14:31 +00001649 Paths.push_back(Base + Suffix);
1650 if (HasMultilib(Arch, Distro)) {
1651 if (IsOpenSuse(Distro) && Is32Bits)
1652 Paths.push_back(Base + "/../../../../" + GccTriple + "/lib/../lib");
1653 Paths.push_back(Base + "/../../../../" + Lib);
Rafael Espindolac1da9812010-11-07 20:14:31 +00001654 }
Rafael Espindolac7409a02011-06-03 15:39:42 +00001655
1656 // FIXME: This is in here to find crt1.o. It is provided by libc, and
1657 // libc (like gcc), can be installed in any directory. Once we are
1658 // fetching this from a config file, we should have a libc prefix.
1659 Paths.push_back("/lib/../" + Lib);
1660 Paths.push_back("/usr/lib/../" + Lib);
1661
Rafael Espindolac1da9812010-11-07 20:14:31 +00001662 if (!Suffix.empty())
1663 Paths.push_back(Base);
1664 if (IsOpenSuse(Distro))
1665 Paths.push_back(Base + "/../../../../" + GccTriple + "/lib");
1666 Paths.push_back(Base + "/../../..");
1667 if (Arch == getArch() && IsUbuntu(Distro))
1668 Paths.push_back("/usr/lib/" + GccTriple);
1669}
1670
1671bool Linux::HasNativeLLVMSupport() const {
1672 return true;
Eli Friedman6b3454a2009-05-26 07:52:18 +00001673}
1674
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001675Tool &Linux::SelectTool(const Compilation &C, const JobAction &JA,
1676 const ActionList &Inputs) const {
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00001677 Action::ActionClass Key;
1678 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1679 Key = Action::AnalyzeJobClass;
1680 else
1681 Key = JA.getKind();
1682
Rafael Espindoladda5b922010-11-07 23:13:01 +00001683 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1684 options::OPT_no_integrated_as,
1685 IsIntegratedAssemblerDefault());
1686
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00001687 Tool *&T = Tools[Key];
1688 if (!T) {
1689 switch (Key) {
1690 case Action::AssembleJobClass:
Rafael Espindoladda5b922010-11-07 23:13:01 +00001691 if (UseIntegratedAs)
1692 T = new tools::ClangAs(*this);
1693 else
1694 T = new tools::linuxtools::Assemble(*this);
1695 break;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001696 case Action::LinkJobClass:
1697 T = new tools::linuxtools::Link(*this); break;
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00001698 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001699 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00001700 }
1701 }
1702
1703 return *T;
1704}
1705
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001706/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
1707
Daniel Dunbarcb8ab232009-05-22 02:53:45 +00001708DragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple)
Rafael Espindolae43cfa12010-10-29 20:14:02 +00001709 : Generic_ELF(Host, Triple) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001710
1711 // Path mangling to find libexec
Daniel Dunbaredf29b02010-08-01 22:29:51 +00001712 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer86643b82011-03-01 22:50:47 +00001713 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbaredf29b02010-08-01 22:29:51 +00001714 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001715
Daniel Dunbaree788e72009-12-21 18:54:17 +00001716 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001717 getFilePaths().push_back("/usr/lib");
1718 getFilePaths().push_back("/usr/lib/gcc41");
1719}
1720
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001721Tool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA,
1722 const ActionList &Inputs) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001723 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00001724 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001725 Key = Action::AnalyzeJobClass;
1726 else
1727 Key = JA.getKind();
1728
1729 Tool *&T = Tools[Key];
1730 if (!T) {
1731 switch (Key) {
1732 case Action::AssembleJobClass:
1733 T = new tools::dragonfly::Assemble(*this); break;
1734 case Action::LinkJobClass:
1735 T = new tools::dragonfly::Link(*this); break;
1736 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001737 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001738 }
1739 }
1740
1741 return *T;
1742}
Michael J. Spencerff58e362010-08-21 21:55:07 +00001743
1744Windows::Windows(const HostInfo &Host, const llvm::Triple& Triple)
1745 : ToolChain(Host, Triple) {
1746}
1747
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001748Tool &Windows::SelectTool(const Compilation &C, const JobAction &JA,
1749 const ActionList &Inputs) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00001750 Action::ActionClass Key;
1751 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1752 Key = Action::AnalyzeJobClass;
1753 else
1754 Key = JA.getKind();
1755
Chad Rosierc57114a2011-07-20 19:14:30 +00001756 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1757 options::OPT_no_integrated_as,
1758 IsIntegratedAssemblerDefault());
1759
Michael J. Spencerff58e362010-08-21 21:55:07 +00001760 Tool *&T = Tools[Key];
1761 if (!T) {
1762 switch (Key) {
1763 case Action::InputClass:
1764 case Action::BindArchClass:
Chandler Carruthe97673f2010-08-22 06:56:37 +00001765 case Action::LipoJobClass:
1766 case Action::DsymutilJobClass:
Michael J. Spencerff58e362010-08-21 21:55:07 +00001767 assert(0 && "Invalid tool kind.");
1768 case Action::PreprocessJobClass:
1769 case Action::PrecompileJobClass:
1770 case Action::AnalyzeJobClass:
1771 case Action::CompileJobClass:
1772 T = new tools::Clang(*this); break;
1773 case Action::AssembleJobClass:
Chad Rosierc57114a2011-07-20 19:14:30 +00001774 if (!UseIntegratedAs && getTriple().getEnvironment() == llvm::Triple::MachO)
1775 T = new tools::darwin::Assemble(*this);
1776 else
1777 T = new tools::ClangAs(*this);
1778 break;
Michael J. Spencerff58e362010-08-21 21:55:07 +00001779 case Action::LinkJobClass:
1780 T = new tools::visualstudio::Link(*this); break;
1781 }
1782 }
1783
1784 return *T;
1785}
1786
1787bool Windows::IsIntegratedAssemblerDefault() const {
1788 return true;
1789}
1790
1791bool Windows::IsUnwindTablesDefault() const {
1792 // FIXME: Gross; we should probably have some separate target
1793 // definition, possibly even reusing the one in clang.
1794 return getArchName() == "x86_64";
1795}
1796
1797const char *Windows::GetDefaultRelocationModel() const {
1798 return "static";
1799}
1800
1801const char *Windows::GetForcedPicModel() const {
1802 if (getArchName() == "x86_64")
1803 return "pic";
1804 return 0;
1805}