blob: 0f6828644db02e3da64169f11335198525d18564 [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"
Bob Wilsona59956b2011-10-07 00:37:57 +000030#include "llvm/ADT/StringSwitch.h"
John McCallf85e1932011-06-15 23:02:42 +000031#include "llvm/ADT/STLExtras.h"
Daniel Dunbar84ec96c2009-09-09 22:33:15 +000032#include "llvm/Support/ErrorHandling.h"
Michael J. Spencer32bef4e2011-01-10 02:34:13 +000033#include "llvm/Support/FileSystem.h"
Rafael Espindolac1da9812010-11-07 20:14:31 +000034#include "llvm/Support/MemoryBuffer.h"
Daniel Dunbarec069ed2009-03-25 06:58:31 +000035#include "llvm/Support/raw_ostream.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000036#include "llvm/Support/Path.h"
Michael J. Spencer3a321e22010-12-09 17:36:38 +000037#include "llvm/Support/system_error.h"
Daniel Dunbarc50b00d2009-03-23 16:15:50 +000038
Daniel Dunbarf36a06a2009-04-10 21:00:07 +000039#include <cstdlib> // ::getenv
40
Dylan Noblesmith89bb6142011-06-23 13:50:47 +000041#include "llvm/Config/config.h" // for CXX_INCLUDE_ROOT
42
Daniel Dunbar39176082009-03-20 00:20:03 +000043using namespace clang::driver;
44using namespace clang::driver::toolchains;
Chris Lattner5f9e2722011-07-23 10:55:15 +000045using namespace clang;
Daniel Dunbar39176082009-03-20 00:20:03 +000046
Daniel Dunbarf3955282009-09-04 18:34:51 +000047/// Darwin - Darwin tool chain for i386 and x86_64.
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +000048
Daniel Dunbar25b58eb2010-08-02 05:44:07 +000049Darwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple)
John McCallf85e1932011-06-15 23:02:42 +000050 : ToolChain(Host, Triple), TargetInitialized(false),
Bob Wilson163b1512011-10-07 17:54:41 +000051 ARCRuntimeForSimulator(ARCSimulator_None),
52 LibCXXForSimulator(LibCXXSimulator_None)
Daniel Dunbar1d4612b2009-09-18 08:15:13 +000053{
Daniel Dunbar25b58eb2010-08-02 05:44:07 +000054 // Compute the initial Darwin version based on the host.
55 bool HadExtra;
56 std::string OSName = Triple.getOSName();
Daniel Dunbar34f9e292011-02-25 21:20:15 +000057 if (!Driver::GetReleaseVersion(&OSName.c_str()[6],
Daniel Dunbar25b58eb2010-08-02 05:44:07 +000058 DarwinVersion[0], DarwinVersion[1],
59 DarwinVersion[2], HadExtra))
Chris Lattner5f9e2722011-07-23 10:55:15 +000060 getDriver().Diag(diag::err_drv_invalid_darwin_version) << OSName;
Daniel Dunbar25b58eb2010-08-02 05:44:07 +000061
Daniel Dunbar02633b52009-03-26 16:23:12 +000062 llvm::raw_string_ostream(MacosxVersionMin)
Daniel Dunbar25b58eb2010-08-02 05:44:07 +000063 << "10." << std::max(0, (int)DarwinVersion[0] - 4) << '.'
64 << DarwinVersion[1];
Daniel Dunbar1d4612b2009-09-18 08:15:13 +000065}
66
Daniel Dunbar41800112010-08-02 05:43:56 +000067types::ID Darwin::LookupTypeForExtension(const char *Ext) const {
68 types::ID Ty = types::lookupTypeForExtension(Ext);
69
70 // Darwin always preprocesses assembly files (unless -x is used explicitly).
71 if (Ty == types::TY_PP_Asm)
72 return types::TY_Asm;
73
74 return Ty;
75}
76
Daniel Dunbarb993f5d2010-09-17 00:24:52 +000077bool Darwin::HasNativeLLVMSupport() const {
78 return true;
79}
80
John McCall9f084a32011-07-06 00:26:06 +000081bool Darwin::hasARCRuntime() const {
John McCallf85e1932011-06-15 23:02:42 +000082 // FIXME: Remove this once there is a proper way to detect an ARC runtime
83 // for the simulator.
84 switch (ARCRuntimeForSimulator) {
85 case ARCSimulator_None:
86 break;
87 case ARCSimulator_HasARCRuntime:
88 return true;
89 case ARCSimulator_NoARCRuntime:
90 return false;
91 }
92
93 if (isTargetIPhoneOS())
94 return !isIPhoneOSVersionLT(5);
95 else
96 return !isMacosxVersionLT(10, 7);
97}
98
John McCall9f084a32011-07-06 00:26:06 +000099/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
100void Darwin::configureObjCRuntime(ObjCRuntime &runtime) const {
101 if (runtime.getKind() != ObjCRuntime::NeXT)
102 return ToolChain::configureObjCRuntime(runtime);
103
104 runtime.HasARC = runtime.HasWeak = hasARCRuntime();
John McCall256a76e2011-07-06 01:22:26 +0000105
106 // So far, objc_terminate is only available in iOS 5.
107 // FIXME: do the simulator logic properly.
108 if (!ARCRuntimeForSimulator && isTargetIPhoneOS())
109 runtime.HasTerminate = !isIPhoneOSVersionLT(5);
110 else
111 runtime.HasTerminate = false;
John McCall9f084a32011-07-06 00:26:06 +0000112}
113
John McCall13db5cf2011-09-09 20:41:01 +0000114/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
115bool Darwin::hasBlocksRuntime() const {
116 if (isTargetIPhoneOS())
117 return !isIPhoneOSVersionLT(3, 2);
118 else
119 return !isMacosxVersionLT(10, 6);
120}
121
Chris Lattner5f9e2722011-07-23 10:55:15 +0000122static const char *GetArmArchForMArch(StringRef Value) {
Bob Wilsona59956b2011-10-07 00:37:57 +0000123 return llvm::StringSwitch<const char*>(Value)
124 .Case("armv6k", "armv6")
125 .Case("armv5tej", "armv5")
126 .Case("xscale", "xscale")
127 .Case("armv4t", "armv4t")
128 .Case("armv7", "armv7")
129 .Cases("armv7a", "armv7-a", "armv7")
130 .Cases("armv7r", "armv7-r", "armv7")
131 .Cases("armv7m", "armv7-m", "armv7")
132 .Default(0);
Daniel Dunbareeff4062010-01-22 02:04:58 +0000133}
134
Chris Lattner5f9e2722011-07-23 10:55:15 +0000135static const char *GetArmArchForMCpu(StringRef Value) {
Bob Wilsona59956b2011-10-07 00:37:57 +0000136 return llvm::StringSwitch<const char *>(Value)
137 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "arm926ej-s","armv5")
138 .Cases("arm10e", "arm10tdmi", "armv5")
139 .Cases("arm1020t", "arm1020e", "arm1022e", "arm1026ej-s", "armv5")
140 .Case("xscale", "xscale")
141 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s",
142 "arm1176jzf-s", "cortex-m0", "armv6")
143 .Cases("cortex-a8", "cortex-r4", "cortex-m3", "cortex-a9", "armv7")
144 .Default(0);
Daniel Dunbareeff4062010-01-22 02:04:58 +0000145}
146
Chris Lattner5f9e2722011-07-23 10:55:15 +0000147StringRef Darwin::getDarwinArchName(const ArgList &Args) const {
Daniel Dunbareeff4062010-01-22 02:04:58 +0000148 switch (getTriple().getArch()) {
149 default:
150 return getArchName();
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000151
Douglas Gregorf0594d82011-03-06 19:11:49 +0000152 case llvm::Triple::thumb:
Daniel Dunbareeff4062010-01-22 02:04:58 +0000153 case llvm::Triple::arm: {
154 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
155 if (const char *Arch = GetArmArchForMArch(A->getValue(Args)))
156 return Arch;
157
158 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
159 if (const char *Arch = GetArmArchForMCpu(A->getValue(Args)))
160 return Arch;
161
162 return "arm";
163 }
164 }
165}
166
Daniel Dunbarf3955282009-09-04 18:34:51 +0000167Darwin::~Darwin() {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000168 // Free tool implementations.
169 for (llvm::DenseMap<unsigned, Tool*>::iterator
170 it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
171 delete it->second;
172}
173
Chad Rosier61ab80a2011-09-20 20:44:06 +0000174std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
175 types::ID InputType) const {
176 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000177
178 // If the target isn't initialized (e.g., an unknown Darwin platform, return
179 // the default triple).
180 if (!isTargetInitialized())
181 return Triple.getTriple();
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000182
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000183 unsigned Version[3];
184 getTargetVersion(Version);
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000185
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000186 llvm::SmallString<16> Str;
Daniel Dunbar729f38e2011-04-19 21:45:47 +0000187 llvm::raw_svector_ostream(Str)
Daniel Dunbar659d23a2011-04-19 23:34:17 +0000188 << (isTargetIPhoneOS() ? "ios" : "macosx")
Daniel Dunbar729f38e2011-04-19 21:45:47 +0000189 << Version[0] << "." << Version[1] << "." << Version[2];
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000190 Triple.setOSName(Str.str());
191
192 return Triple.getTriple();
193}
194
Daniel Dunbarac0659a2011-03-18 20:14:00 +0000195Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA,
196 const ActionList &Inputs) const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000197 Action::ActionClass Key;
Daniel Dunbar5ce872f2011-03-18 20:14:03 +0000198
199 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) {
200 // Fallback to llvm-gcc for i386 kext compiles, we don't support that ABI.
201 if (Inputs.size() == 1 &&
202 types::isCXX(Inputs[0]->getType()) &&
Bob Wilson905c45f2011-10-14 05:03:44 +0000203 getTriple().isOSDarwin() &&
Daniel Dunbar5ce872f2011-03-18 20:14:03 +0000204 getTriple().getArch() == llvm::Triple::x86 &&
Bob Wilsona544aee2011-08-13 23:48:55 +0000205 (C.getArgs().getLastArg(options::OPT_fapple_kext) ||
206 C.getArgs().getLastArg(options::OPT_mkernel)))
Daniel Dunbar5ce872f2011-03-18 20:14:03 +0000207 Key = JA.getKind();
208 else
209 Key = Action::AnalyzeJobClass;
210 } else
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000211 Key = JA.getKind();
212
Daniel Dunbar0f602de2010-05-20 21:48:38 +0000213 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
214 options::OPT_no_integrated_as,
Bob Wilson1a1764b2011-10-30 00:20:28 +0000215 IsIntegratedAssemblerDefault());
Daniel Dunbar0f602de2010-05-20 21:48:38 +0000216
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000217 Tool *&T = Tools[Key];
218 if (!T) {
219 switch (Key) {
220 case Action::InputClass:
221 case Action::BindArchClass:
David Blaikieb219cfc2011-09-23 05:06:16 +0000222 llvm_unreachable("Invalid tool kind.");
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000223 case Action::PreprocessJobClass:
Daniel Dunbar9120f172009-03-29 22:27:40 +0000224 T = new tools::darwin::Preprocess(*this); break;
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000225 case Action::AnalyzeJobClass:
226 T = new tools::Clang(*this); break;
Daniel Dunbar9120f172009-03-29 22:27:40 +0000227 case Action::PrecompileJobClass:
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000228 case Action::CompileJobClass:
Daniel Dunbar9120f172009-03-29 22:27:40 +0000229 T = new tools::darwin::Compile(*this); break;
Daniel Dunbar0f602de2010-05-20 21:48:38 +0000230 case Action::AssembleJobClass: {
231 if (UseIntegratedAs)
232 T = new tools::ClangAs(*this);
233 else
234 T = new tools::darwin::Assemble(*this);
235 break;
236 }
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000237 case Action::LinkJobClass:
Daniel Dunbar8f289622009-09-04 17:39:02 +0000238 T = new tools::darwin::Link(*this); break;
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000239 case Action::LipoJobClass:
240 T = new tools::darwin::Lipo(*this); break;
Daniel Dunbar6e0f2542010-06-04 18:28:36 +0000241 case Action::DsymutilJobClass:
242 T = new tools::darwin::Dsymutil(*this); break;
Eric Christopherf8571862011-08-23 17:56:55 +0000243 case Action::VerifyJobClass:
244 T = new tools::darwin::VerifyDebug(*this); break;
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000245 }
246 }
247
248 return *T;
249}
250
Daniel Dunbar6cd41542009-09-18 08:15:03 +0000251
Daniel Dunbar25b58eb2010-08-02 05:44:07 +0000252DarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple)
253 : Darwin(Host, Triple)
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000254{
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000255 getProgramPaths().push_back(getDriver().getInstalledDir());
256 if (getDriver().getInstalledDir() != getDriver().Dir)
257 getProgramPaths().push_back(getDriver().Dir);
258
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000259 // We expect 'as', 'ld', etc. to be adjacent to our install dir.
Daniel Dunbaredf29b02010-08-01 22:29:51 +0000260 getProgramPaths().push_back(getDriver().getInstalledDir());
261 if (getDriver().getInstalledDir() != getDriver().Dir)
262 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000263
264 // For fallback, we need to know how to find the GCC cc1 executables, so we
Daniel Dunbar47023092011-03-18 19:25:15 +0000265 // also add the GCC libexec paths. This is legacy code that can be removed
266 // once fallback is no longer useful.
Bob Wilson8aa76ea2011-09-20 22:00:38 +0000267 AddGCCLibexecPath(DarwinVersion[0]);
268 AddGCCLibexecPath(DarwinVersion[0] - 2);
269 AddGCCLibexecPath(DarwinVersion[0] - 1);
270 AddGCCLibexecPath(DarwinVersion[0] + 1);
271 AddGCCLibexecPath(DarwinVersion[0] + 2);
272}
273
274void DarwinClang::AddGCCLibexecPath(unsigned darwinVersion) {
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000275 std::string ToolChainDir = "i686-apple-darwin";
Bob Wilson8aa76ea2011-09-20 22:00:38 +0000276 ToolChainDir += llvm::utostr(darwinVersion);
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000277 ToolChainDir += "/4.2.1";
278
279 std::string Path = getDriver().Dir;
Bob Wilson8aa76ea2011-09-20 22:00:38 +0000280 Path += "/../llvm-gcc-4.2/libexec/gcc/";
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000281 Path += ToolChainDir;
282 getProgramPaths().push_back(Path);
283
Bob Wilson8aa76ea2011-09-20 22:00:38 +0000284 Path = "/usr/llvm-gcc-4.2/libexec/gcc/";
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000285 Path += ToolChainDir;
286 getProgramPaths().push_back(Path);
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000287}
288
289void DarwinClang::AddLinkSearchPathArgs(const ArgList &Args,
290 ArgStringList &CmdArgs) const {
291 // The Clang toolchain uses explicit paths for internal libraries.
Daniel Dunbar424b6612010-06-30 23:56:13 +0000292
293 // Unfortunately, we still might depend on a few of the libraries that are
294 // only available in the gcc library directory (in particular
295 // libstdc++.dylib). For now, hardcode the path to the known install location.
296 llvm::sys::Path P(getDriver().Dir);
297 P.eraseComponent(); // .../usr/bin -> ../usr
298 P.appendComponent("lib");
299 P.appendComponent("gcc");
300 switch (getTriple().getArch()) {
301 default:
David Blaikieb219cfc2011-09-23 05:06:16 +0000302 llvm_unreachable("Invalid Darwin arch!");
Daniel Dunbar424b6612010-06-30 23:56:13 +0000303 case llvm::Triple::x86:
304 case llvm::Triple::x86_64:
305 P.appendComponent("i686-apple-darwin10");
306 break;
307 case llvm::Triple::arm:
308 case llvm::Triple::thumb:
309 P.appendComponent("arm-apple-darwin10");
310 break;
311 case llvm::Triple::ppc:
312 case llvm::Triple::ppc64:
313 P.appendComponent("powerpc-apple-darwin10");
314 break;
315 }
316 P.appendComponent("4.2.1");
Daniel Dunbareab3bc42010-08-23 20:58:52 +0000317
318 // Determine the arch specific GCC subdirectory.
319 const char *ArchSpecificDir = 0;
320 switch (getTriple().getArch()) {
321 default:
322 break;
323 case llvm::Triple::arm:
Daniel Dunbar3a0e3922010-08-26 00:55:52 +0000324 case llvm::Triple::thumb: {
325 std::string Triple = ComputeLLVMTriple(Args);
Chris Lattner5f9e2722011-07-23 10:55:15 +0000326 StringRef TripleStr = Triple;
Daniel Dunbar3a0e3922010-08-26 00:55:52 +0000327 if (TripleStr.startswith("armv5") || TripleStr.startswith("thumbv5"))
328 ArchSpecificDir = "v5";
329 else if (TripleStr.startswith("armv6") || TripleStr.startswith("thumbv6"))
330 ArchSpecificDir = "v6";
331 else if (TripleStr.startswith("armv7") || TripleStr.startswith("thumbv7"))
332 ArchSpecificDir = "v7";
Daniel Dunbareab3bc42010-08-23 20:58:52 +0000333 break;
Daniel Dunbar3a0e3922010-08-26 00:55:52 +0000334 }
Daniel Dunbareab3bc42010-08-23 20:58:52 +0000335 case llvm::Triple::ppc64:
336 ArchSpecificDir = "ppc64";
337 break;
338 case llvm::Triple::x86_64:
339 ArchSpecificDir = "x86_64";
340 break;
341 }
342
343 if (ArchSpecificDir) {
344 P.appendComponent(ArchSpecificDir);
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000345 bool Exists;
346 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Daniel Dunbareab3bc42010-08-23 20:58:52 +0000347 CmdArgs.push_back(Args.MakeArgString("-L" + P.str()));
348 P.eraseComponent();
349 }
350
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000351 bool Exists;
352 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Daniel Dunbar424b6612010-06-30 23:56:13 +0000353 CmdArgs.push_back(Args.MakeArgString("-L" + P.str()));
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000354}
355
John McCallf85e1932011-06-15 23:02:42 +0000356void DarwinClang::AddLinkARCArgs(const ArgList &Args,
357 ArgStringList &CmdArgs) const {
Eric Christopherf8571862011-08-23 17:56:55 +0000358
359 CmdArgs.push_back("-force_load");
John McCallf85e1932011-06-15 23:02:42 +0000360 llvm::sys::Path P(getDriver().ClangExecutable);
361 P.eraseComponent(); // 'clang'
362 P.eraseComponent(); // 'bin'
363 P.appendComponent("lib");
364 P.appendComponent("arc");
365 P.appendComponent("libarclite_");
366 std::string s = P.str();
367 // Mash in the platform.
Argyrios Kyrtzidisc19981c2011-10-18 17:40:15 +0000368 if (isTargetIOSSimulator())
369 s += "iphonesimulator";
370 else if (isTargetIPhoneOS())
John McCallf85e1932011-06-15 23:02:42 +0000371 s += "iphoneos";
Argyrios Kyrtzidisc19981c2011-10-18 17:40:15 +0000372 // FIXME: Remove this once we depend fully on -mios-simulator-version-min.
John McCallf85e1932011-06-15 23:02:42 +0000373 else if (ARCRuntimeForSimulator != ARCSimulator_None)
374 s += "iphonesimulator";
375 else
376 s += "macosx";
377 s += ".a";
378
379 CmdArgs.push_back(Args.MakeArgString(s));
380}
381
Eric Christopher3404fe72011-06-22 17:41:40 +0000382void DarwinClang::AddLinkRuntimeLib(const ArgList &Args,
Eric Christopherf8571862011-08-23 17:56:55 +0000383 ArgStringList &CmdArgs,
Eric Christopher3404fe72011-06-22 17:41:40 +0000384 const char *DarwinStaticLib) const {
385 llvm::sys::Path P(getDriver().ResourceDir);
386 P.appendComponent("lib");
387 P.appendComponent("darwin");
388 P.appendComponent(DarwinStaticLib);
Eric Christopherf8571862011-08-23 17:56:55 +0000389
Eric Christopher3404fe72011-06-22 17:41:40 +0000390 // For now, allow missing resource libraries to support developers who may
391 // not have compiler-rt checked out or integrated into their build.
392 bool Exists;
393 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
394 CmdArgs.push_back(Args.MakeArgString(P.str()));
395}
396
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000397void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
398 ArgStringList &CmdArgs) const {
Daniel Dunbareec99102010-01-22 03:38:14 +0000399 // Darwin doesn't support real static executables, don't link any runtime
400 // libraries with -static.
401 if (Args.hasArg(options::OPT_static))
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000402 return;
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000403
404 // Reject -static-libgcc for now, we can deal with this when and if someone
405 // cares. This is useful in situations where someone wants to statically link
406 // something like libstdc++, and needs its runtime support routines.
407 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000408 getDriver().Diag(diag::err_drv_unsupported_opt)
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000409 << A->getAsString(Args);
410 return;
411 }
412
Daniel Dunbareec99102010-01-22 03:38:14 +0000413 // Otherwise link libSystem, then the dynamic runtime library, and finally any
414 // target specific static runtime library.
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000415 CmdArgs.push_back("-lSystem");
Daniel Dunbareec99102010-01-22 03:38:14 +0000416
417 // Select the dynamic runtime library and the target specific static library.
Daniel Dunbar251ca6c2010-01-27 00:56:37 +0000418 if (isTargetIPhoneOS()) {
Daniel Dunbar87e945f2011-04-30 04:25:16 +0000419 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
420 // it never went into the SDK.
Bob Wilson163b1512011-10-07 17:54:41 +0000421 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
422 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator())
423 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbareec99102010-01-22 03:38:14 +0000424
Daniel Dunbar3cceec52011-04-18 23:48:36 +0000425 // We currently always need a static runtime library for iOS.
Eric Christopher3404fe72011-06-22 17:41:40 +0000426 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbareec99102010-01-22 03:38:14 +0000427 } else {
Daniel Dunbareec99102010-01-22 03:38:14 +0000428 // The dynamic runtime library was merged with libSystem for 10.6 and
429 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbarce3fdf22010-01-27 00:57:03 +0000430 if (isMacosxVersionLT(10, 5))
Daniel Dunbareec99102010-01-22 03:38:14 +0000431 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +0000432 else if (isMacosxVersionLT(10, 6))
Daniel Dunbareec99102010-01-22 03:38:14 +0000433 CmdArgs.push_back("-lgcc_s.10.5");
434
Daniel Dunbar885b1db2010-09-22 00:03:52 +0000435 // For OS X, we thought we would only need a static runtime library when
Chris Lattnerfc8f0e12011-04-15 05:22:18 +0000436 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbar885b1db2010-09-22 00:03:52 +0000437 // omitted from 10.4.dylib.
438 //
439 // Unfortunately, that turned out to not be true, because Darwin system
440 // headers can still use eprintf on i386, and it is not exported from
441 // libSystem. Therefore, we still must provide a runtime library just for
442 // the tiny tiny handful of projects that *might* use that symbol.
443 if (isMacosxVersionLT(10, 5)) {
Eric Christopher3404fe72011-06-22 17:41:40 +0000444 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbar885b1db2010-09-22 00:03:52 +0000445 } else {
446 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopher3404fe72011-06-22 17:41:40 +0000447 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
448 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbar885b1db2010-09-22 00:03:52 +0000449 }
Daniel Dunbareec99102010-01-22 03:38:14 +0000450 }
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000451}
452
Argyrios Kyrtzidisdceb11f2011-10-18 00:22:49 +0000453static inline StringRef SimulatorVersionDefineName() {
454 return "__IPHONE_OS_VERSION_MIN_REQUIRED";
455}
456
457/// \brief Parse the simulator version define:
458/// __IPHONE_OS_VERSION_MIN_REQUIRED=([0-9])([0-9][0-9])([0-9][0-9])
459// and return the grouped values as integers, e.g:
460// __IPHONE_OS_VERSION_MIN_REQUIRED=40201
461// will return Major=4, Minor=2, Micro=1.
462static bool GetVersionFromSimulatorDefine(StringRef define,
463 unsigned &Major, unsigned &Minor,
464 unsigned &Micro) {
465 assert(define.startswith(SimulatorVersionDefineName()));
466 StringRef name, version;
467 llvm::tie(name, version) = define.split('=');
468 if (version.empty())
469 return false;
470 std::string verstr = version.str();
471 char *end;
472 unsigned num = (unsigned) strtol(verstr.c_str(), &end, 10);
473 if (*end != '\0')
474 return false;
475 Major = num / 10000;
476 num = num % 10000;
477 Minor = num / 100;
478 Micro = num % 100;
479 return true;
480}
481
Daniel Dunbar60baf0f2010-07-19 17:11:36 +0000482void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +0000483 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000484
Daniel Dunbar26031372010-01-27 00:56:25 +0000485 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000486 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
487 Arg *iOSSimVersion = Args.getLastArg(
488 options::OPT_mios_simulator_version_min_EQ);
John McCallf85e1932011-06-15 23:02:42 +0000489
Argyrios Kyrtzidisdceb11f2011-10-18 00:22:49 +0000490 // FIXME: HACK! When compiling for the simulator we don't get a
491 // '-miphoneos-version-min' to help us know whether there is an ARC runtime
492 // or not; try to parse a __IPHONE_OS_VERSION_MIN_REQUIRED
493 // define passed in command-line.
Argyrios Kyrtzidisc19981c2011-10-18 17:40:15 +0000494 if (!iOSVersion && !iOSSimVersion) {
Argyrios Kyrtzidisdceb11f2011-10-18 00:22:49 +0000495 for (arg_iterator it = Args.filtered_begin(options::OPT_D),
496 ie = Args.filtered_end(); it != ie; ++it) {
497 StringRef define = (*it)->getValue(Args);
498 if (define.startswith(SimulatorVersionDefineName())) {
499 unsigned Major = 0, Minor = 0, Micro = 0;
500 if (GetVersionFromSimulatorDefine(define, Major, Minor, Micro) &&
501 Major < 10 && Minor < 100 && Micro < 100) {
502 ARCRuntimeForSimulator = Major < 5 ? ARCSimulator_NoARCRuntime
503 : ARCSimulator_HasARCRuntime;
504 LibCXXForSimulator = Major < 5 ? LibCXXSimulator_NotAvailable
505 : LibCXXSimulator_Available;
506 }
507 break;
508 }
509 }
510 }
511
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000512 if (OSXVersion && (iOSVersion || iOSSimVersion)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000513 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarff8857a2009-04-10 20:11:50 +0000514 << OSXVersion->getAsString(Args)
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000515 << (iOSVersion ? iOSVersion : iOSSimVersion)->getAsString(Args);
516 iOSVersion = iOSSimVersion = 0;
517 } else if (iOSVersion && iOSSimVersion) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000518 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000519 << iOSVersion->getAsString(Args)
520 << iOSSimVersion->getAsString(Args);
521 iOSSimVersion = 0;
522 } else if (!OSXVersion && !iOSVersion && !iOSSimVersion) {
Chad Rosiera4884972011-08-31 20:56:25 +0000523 // If no deployment target was specified on the command line, check for
Daniel Dunbar816bc312010-01-26 01:45:19 +0000524 // environment defines.
Chad Rosiera4884972011-08-31 20:56:25 +0000525 StringRef OSXTarget;
526 StringRef iOSTarget;
527 StringRef iOSSimTarget;
528 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
529 OSXTarget = env;
530 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
531 iOSTarget = env;
532 if (char *env = ::getenv("IOS_SIMULATOR_DEPLOYMENT_TARGET"))
533 iOSSimTarget = env;
Daniel Dunbarf36a06a2009-04-10 21:00:07 +0000534
NAKAMURA Takumia789ca92011-10-08 11:31:46 +0000535 // If no '-miphoneos-version-min' specified on the command line and
Chad Rosiera4884972011-08-31 20:56:25 +0000536 // IPHONEOS_DEPLOYMENT_TARGET is not defined, see if we can set the default
537 // based on isysroot.
538 if (iOSTarget.empty()) {
539 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
540 StringRef first, second;
541 StringRef isysroot = A->getValue(Args);
542 llvm::tie(first, second) = isysroot.split(StringRef("SDKs/iPhoneOS"));
543 if (second != "")
544 iOSTarget = second.substr(0,3);
545 }
546 }
Daniel Dunbar816bc312010-01-26 01:45:19 +0000547
Chad Rosier4f8de272011-09-28 00:46:32 +0000548 // If no OSX or iOS target has been specified and we're compiling for armv7,
549 // go ahead as assume we're targeting iOS.
550 if (OSXTarget.empty() && iOSTarget.empty())
551 if (getDarwinArchName(Args) == "armv7")
552 iOSTarget = "0.0";
553
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000554 // Handle conflicting deployment targets
Daniel Dunbar39053672010-02-02 17:31:12 +0000555 //
556 // FIXME: Don't hardcode default here.
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000557
558 // Do not allow conflicts with the iOS simulator target.
Chad Rosiera4884972011-08-31 20:56:25 +0000559 if (!iOSSimTarget.empty() && (!OSXTarget.empty() || !iOSTarget.empty())) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000560 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000561 << "IOS_SIMULATOR_DEPLOYMENT_TARGET"
Chad Rosiera4884972011-08-31 20:56:25 +0000562 << (!OSXTarget.empty() ? "MACOSX_DEPLOYMENT_TARGET" :
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000563 "IPHONEOS_DEPLOYMENT_TARGET");
564 }
565
566 // Allow conflicts among OSX and iOS for historical reasons, but choose the
567 // default platform.
Chad Rosiera4884972011-08-31 20:56:25 +0000568 if (!OSXTarget.empty() && !iOSTarget.empty()) {
Daniel Dunbar39053672010-02-02 17:31:12 +0000569 if (getTriple().getArch() == llvm::Triple::arm ||
570 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosiera4884972011-08-31 20:56:25 +0000571 OSXTarget = "";
Daniel Dunbar39053672010-02-02 17:31:12 +0000572 else
Chad Rosiera4884972011-08-31 20:56:25 +0000573 iOSTarget = "";
Daniel Dunbar39053672010-02-02 17:31:12 +0000574 }
Daniel Dunbar1a3c1d92010-01-29 17:02:25 +0000575
Chad Rosiera4884972011-08-31 20:56:25 +0000576 if (!OSXTarget.empty()) {
Daniel Dunbar30392de2009-09-04 18:35:21 +0000577 const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar60baf0f2010-07-19 17:11:36 +0000578 OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget);
579 Args.append(OSXVersion);
Chad Rosiera4884972011-08-31 20:56:25 +0000580 } else if (!iOSTarget.empty()) {
Daniel Dunbar30392de2009-09-04 18:35:21 +0000581 const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000582 iOSVersion = Args.MakeJoinedArg(0, O, iOSTarget);
583 Args.append(iOSVersion);
Chad Rosiera4884972011-08-31 20:56:25 +0000584 } else if (!iOSSimTarget.empty()) {
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000585 const Option *O = Opts.getOption(
586 options::OPT_mios_simulator_version_min_EQ);
587 iOSSimVersion = Args.MakeJoinedArg(0, O, iOSSimTarget);
588 Args.append(iOSSimVersion);
Daniel Dunbar816bc312010-01-26 01:45:19 +0000589 } else {
Daniel Dunbar2bb38d02010-07-15 16:18:06 +0000590 // Otherwise, assume we are targeting OS X.
591 const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar60baf0f2010-07-19 17:11:36 +0000592 OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin);
593 Args.append(OSXVersion);
Daniel Dunbar30392de2009-09-04 18:35:21 +0000594 }
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000595 }
Mike Stump1eb44332009-09-09 15:08:12 +0000596
Daniel Dunbar3fd823b2011-04-30 04:20:40 +0000597 // Reject invalid architecture combinations.
598 if (iOSSimVersion && (getTriple().getArch() != llvm::Triple::x86 &&
599 getTriple().getArch() != llvm::Triple::x86_64)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000600 getDriver().Diag(diag::err_drv_invalid_arch_for_deployment_target)
Daniel Dunbar3fd823b2011-04-30 04:20:40 +0000601 << getTriple().getArchName() << iOSSimVersion->getAsString(Args);
602 }
603
Daniel Dunbar26031372010-01-27 00:56:25 +0000604 // Set the tool chain target information.
605 unsigned Major, Minor, Micro;
606 bool HadExtra;
607 if (OSXVersion) {
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000608 assert((!iOSVersion && !iOSSimVersion) && "Unknown target platform!");
Daniel Dunbar26031372010-01-27 00:56:25 +0000609 if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor,
610 Micro, HadExtra) || HadExtra ||
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000611 Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000612 getDriver().Diag(diag::err_drv_invalid_version_number)
Daniel Dunbar26031372010-01-27 00:56:25 +0000613 << OSXVersion->getAsString(Args);
614 } else {
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000615 const Arg *Version = iOSVersion ? iOSVersion : iOSSimVersion;
616 assert(Version && "Unknown target platform!");
617 if (!Driver::GetReleaseVersion(Version->getValue(Args), Major, Minor,
Daniel Dunbar26031372010-01-27 00:56:25 +0000618 Micro, HadExtra) || HadExtra ||
619 Major >= 10 || Minor >= 100 || Micro >= 100)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000620 getDriver().Diag(diag::err_drv_invalid_version_number)
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000621 << Version->getAsString(Args);
Daniel Dunbar26031372010-01-27 00:56:25 +0000622 }
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000623
Daniel Dunbar5f5c37b2011-04-30 04:18:16 +0000624 bool IsIOSSim = bool(iOSSimVersion);
625
626 // In GCC, the simulator historically was treated as being OS X in some
627 // contexts, like determining the link logic, despite generally being called
628 // with an iOS deployment target. For compatibility, we detect the
629 // simulator as iOS + x86, and treat it differently in a few contexts.
630 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
631 getTriple().getArch() == llvm::Triple::x86_64))
632 IsIOSSim = true;
633
634 setTarget(/*IsIPhoneOS=*/ !OSXVersion, Major, Minor, Micro, IsIOSSim);
Daniel Dunbarc0e665e2010-07-19 17:11:33 +0000635}
636
Daniel Dunbar132e35d2010-09-17 01:20:05 +0000637void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000638 ArgStringList &CmdArgs) const {
639 CXXStdlibType Type = GetCXXStdlibType(Args);
640
641 switch (Type) {
642 case ToolChain::CST_Libcxx:
643 CmdArgs.push_back("-lc++");
644 break;
645
646 case ToolChain::CST_Libstdcxx: {
647 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
648 // it was previously found in the gcc lib dir. However, for all the Darwin
649 // platforms we care about it was -lstdc++.6, so we search for that
650 // explicitly if we can't see an obvious -lstdc++ candidate.
651
652 // Check in the sysroot first.
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000653 bool Exists;
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000654 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
655 llvm::sys::Path P(A->getValue(Args));
656 P.appendComponent("usr");
657 P.appendComponent("lib");
658 P.appendComponent("libstdc++.dylib");
659
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000660 if (llvm::sys::fs::exists(P.str(), Exists) || !Exists) {
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000661 P.eraseComponent();
662 P.appendComponent("libstdc++.6.dylib");
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000663 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000664 CmdArgs.push_back(Args.MakeArgString(P.str()));
665 return;
666 }
667 }
668 }
669
670 // Otherwise, look in the root.
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000671 if ((llvm::sys::fs::exists("/usr/lib/libstdc++.dylib", Exists) || !Exists)&&
672 (!llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib", Exists) && Exists)){
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000673 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
674 return;
675 }
676
677 // Otherwise, let the linker search.
678 CmdArgs.push_back("-lstdc++");
679 break;
680 }
681 }
682}
683
Shantonu Sen7433fed2010-09-17 18:39:08 +0000684void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
685 ArgStringList &CmdArgs) const {
686
687 // For Darwin platforms, use the compiler-rt-based support library
688 // instead of the gcc-provided one (which is also incidentally
689 // only present in the gcc lib dir, which makes it hard to find).
690
691 llvm::sys::Path P(getDriver().ResourceDir);
692 P.appendComponent("lib");
693 P.appendComponent("darwin");
694 P.appendComponent("libclang_rt.cc_kext.a");
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000695
Shantonu Sen7433fed2010-09-17 18:39:08 +0000696 // For now, allow missing resource libraries to support developers who may
697 // not have compiler-rt checked out or integrated into their build.
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000698 bool Exists;
699 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Shantonu Sen7433fed2010-09-17 18:39:08 +0000700 CmdArgs.push_back(Args.MakeArgString(P.str()));
701}
702
Daniel Dunbarc0e665e2010-07-19 17:11:33 +0000703DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
704 const char *BoundArch) const {
705 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
706 const OptTable &Opts = getDriver().getOpts();
707
708 // FIXME: We really want to get out of the tool chain level argument
709 // translation business, as it makes the driver functionality much
710 // more opaque. For now, we follow gcc closely solely for the
711 // purpose of easily achieving feature parity & testability. Once we
712 // have something that works, we should reevaluate each translation
713 // and try to push it down into tool specific logic.
Daniel Dunbar26031372010-01-27 00:56:25 +0000714
Daniel Dunbar279c1db2010-06-11 22:00:26 +0000715 for (ArgList::const_iterator it = Args.begin(),
716 ie = Args.end(); it != ie; ++it) {
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000717 Arg *A = *it;
718
719 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar2a45fa72011-06-21 00:20:17 +0000720 // Skip this argument unless the architecture matches either the toolchain
721 // triple arch, or the arch being bound.
722 //
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000723 // FIXME: Canonicalize name.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000724 StringRef XarchArch = A->getValue(Args, 0);
Daniel Dunbar2a45fa72011-06-21 00:20:17 +0000725 if (!(XarchArch == getArchName() ||
726 (BoundArch && XarchArch == BoundArch)))
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000727 continue;
728
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000729 Arg *OriginalArg = A;
Daniel Dunbar0e100312010-06-14 21:23:08 +0000730 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(Args, 1));
731 unsigned Prev = Index;
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000732 Arg *XarchArg = Opts.ParseOneArg(Args, Index);
Mike Stump1eb44332009-09-09 15:08:12 +0000733
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000734 // If the argument parsing failed or more than one argument was
735 // consumed, the -Xarch_ argument's parameter tried to consume
736 // extra arguments. Emit an error and ignore.
737 //
738 // We also want to disallow any options which would alter the
739 // driver behavior; that isn't going to work in our model. We
740 // use isDriverOption() as an approximation, although things
741 // like -O4 are going to slip through.
Daniel Dunbar0e02f6e2011-04-21 17:41:34 +0000742 if (!XarchArg || Index > Prev + 1) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000743 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Daniel Dunbar7e9293b2011-04-21 17:32:21 +0000744 << A->getAsString(Args);
745 continue;
746 } else if (XarchArg->getOption().isDriverOption()) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000747 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000748 << A->getAsString(Args);
749 continue;
750 }
751
Daniel Dunbar478edc22009-03-29 22:29:05 +0000752 XarchArg->setBaseArg(A);
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000753 A = XarchArg;
Daniel Dunbar0e100312010-06-14 21:23:08 +0000754
755 DAL->AddSynthesizedArg(A);
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000756
757 // Linker input arguments require custom handling. The problem is that we
758 // have already constructed the phase actions, so we can not treat them as
759 // "input arguments".
760 if (A->getOption().isLinkerInput()) {
761 // Convert the argument into individual Zlinker_input_args.
762 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
763 DAL->AddSeparateArg(OriginalArg,
764 Opts.getOption(options::OPT_Zlinker_input),
765 A->getValue(Args, i));
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000766
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000767 }
768 continue;
769 }
Mike Stump1eb44332009-09-09 15:08:12 +0000770 }
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000771
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000772 // Sob. These is strictly gcc compatible for the time being. Apple
773 // gcc translates options twice, which means that self-expanding
774 // options add duplicates.
Daniel Dunbar9e1f9822009-11-19 04:14:53 +0000775 switch ((options::ID) A->getOption().getID()) {
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000776 default:
777 DAL->append(A);
778 break;
779
780 case options::OPT_mkernel:
781 case options::OPT_fapple_kext:
782 DAL->append(A);
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000783 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000784 break;
Mike Stump1eb44332009-09-09 15:08:12 +0000785
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000786 case options::OPT_dependency_file:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000787 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF),
788 A->getValue(Args));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000789 break;
790
791 case options::OPT_gfull:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000792 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
793 DAL->AddFlagArg(A,
794 Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000795 break;
796
797 case options::OPT_gused:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000798 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
799 DAL->AddFlagArg(A,
800 Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000801 break;
802
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000803 case options::OPT_shared:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000804 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000805 break;
806
807 case options::OPT_fconstant_cfstrings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000808 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000809 break;
810
811 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000812 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000813 break;
814
815 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000816 DAL->AddFlagArg(A,
817 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000818 break;
819
820 case options::OPT_Wno_nonportable_cfstrings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000821 DAL->AddFlagArg(A,
822 Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000823 break;
824
825 case options::OPT_fpascal_strings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000826 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000827 break;
828
829 case options::OPT_fno_pascal_strings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000830 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000831 break;
832 }
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000833 }
834
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000835 if (getTriple().getArch() == llvm::Triple::x86 ||
836 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbare4bdae72009-11-19 04:00:53 +0000837 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000838 DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000839
840 // Add the arch options based on the particular spelling of -arch, to match
841 // how the driver driver works.
842 if (BoundArch) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000843 StringRef Name = BoundArch;
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000844 const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ);
845 const Option *MArch = Opts.getOption(options::OPT_march_EQ);
846
847 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
848 // which defines the list of which architectures we accept.
849 if (Name == "ppc")
850 ;
851 else if (Name == "ppc601")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000852 DAL->AddJoinedArg(0, MCpu, "601");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000853 else if (Name == "ppc603")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000854 DAL->AddJoinedArg(0, MCpu, "603");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000855 else if (Name == "ppc604")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000856 DAL->AddJoinedArg(0, MCpu, "604");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000857 else if (Name == "ppc604e")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000858 DAL->AddJoinedArg(0, MCpu, "604e");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000859 else if (Name == "ppc750")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000860 DAL->AddJoinedArg(0, MCpu, "750");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000861 else if (Name == "ppc7400")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000862 DAL->AddJoinedArg(0, MCpu, "7400");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000863 else if (Name == "ppc7450")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000864 DAL->AddJoinedArg(0, MCpu, "7450");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000865 else if (Name == "ppc970")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000866 DAL->AddJoinedArg(0, MCpu, "970");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000867
868 else if (Name == "ppc64")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000869 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000870
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000871 else if (Name == "i386")
872 ;
873 else if (Name == "i486")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000874 DAL->AddJoinedArg(0, MArch, "i486");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000875 else if (Name == "i586")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000876 DAL->AddJoinedArg(0, MArch, "i586");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000877 else if (Name == "i686")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000878 DAL->AddJoinedArg(0, MArch, "i686");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000879 else if (Name == "pentium")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000880 DAL->AddJoinedArg(0, MArch, "pentium");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000881 else if (Name == "pentium2")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000882 DAL->AddJoinedArg(0, MArch, "pentium2");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000883 else if (Name == "pentpro")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000884 DAL->AddJoinedArg(0, MArch, "pentiumpro");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000885 else if (Name == "pentIIm3")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000886 DAL->AddJoinedArg(0, MArch, "pentium2");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000887
888 else if (Name == "x86_64")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000889 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000890
891 else if (Name == "arm")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000892 DAL->AddJoinedArg(0, MArch, "armv4t");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000893 else if (Name == "armv4t")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000894 DAL->AddJoinedArg(0, MArch, "armv4t");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000895 else if (Name == "armv5")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000896 DAL->AddJoinedArg(0, MArch, "armv5tej");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000897 else if (Name == "xscale")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000898 DAL->AddJoinedArg(0, MArch, "xscale");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000899 else if (Name == "armv6")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000900 DAL->AddJoinedArg(0, MArch, "armv6k");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000901 else if (Name == "armv7")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000902 DAL->AddJoinedArg(0, MArch, "armv7a");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000903
904 else
Jeffrey Yasskin9f61aa92009-12-12 05:05:38 +0000905 llvm_unreachable("invalid Darwin arch");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000906 }
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000907
Daniel Dunbar60baf0f2010-07-19 17:11:36 +0000908 // Add an explicit version min argument for the deployment target. We do this
909 // after argument translation because -Xarch_ arguments may add a version min
910 // argument.
911 AddDeploymentTarget(*DAL);
912
Bob Wilson163b1512011-10-07 17:54:41 +0000913 // Validate the C++ standard library choice.
914 CXXStdlibType Type = GetCXXStdlibType(*DAL);
915 if (Type == ToolChain::CST_Libcxx) {
916 switch (LibCXXForSimulator) {
917 case LibCXXSimulator_None:
918 // Handle non-simulator cases.
919 if (isTargetIPhoneOS()) {
920 if (isIPhoneOSVersionLT(5, 0)) {
921 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment)
922 << "iOS 5.0";
923 }
Bob Wilson163b1512011-10-07 17:54:41 +0000924 }
925 break;
926 case LibCXXSimulator_NotAvailable:
927 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment)
928 << "iOS 5.0";
929 break;
930 case LibCXXSimulator_Available:
931 break;
932 }
933 }
934
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000935 return DAL;
Mike Stump1eb44332009-09-09 15:08:12 +0000936}
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000937
Daniel Dunbarf3955282009-09-04 18:34:51 +0000938bool Darwin::IsUnwindTablesDefault() const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000939 // FIXME: Gross; we should probably have some separate target
940 // definition, possibly even reusing the one in clang.
941 return getArchName() == "x86_64";
942}
943
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +0000944bool Darwin::UseDwarfDebugFlags() const {
945 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
946 return S[0] != '\0';
947 return false;
948}
949
Daniel Dunbarb2987d12010-02-10 18:49:11 +0000950bool Darwin::UseSjLjExceptions() const {
951 // Darwin uses SjLj exceptions on ARM.
952 return (getTriple().getArch() == llvm::Triple::arm ||
953 getTriple().getArch() == llvm::Triple::thumb);
954}
955
Daniel Dunbarf3955282009-09-04 18:34:51 +0000956const char *Darwin::GetDefaultRelocationModel() const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000957 return "pic";
958}
959
Daniel Dunbarf3955282009-09-04 18:34:51 +0000960const char *Darwin::GetForcedPicModel() const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000961 if (getArchName() == "x86_64")
962 return "pic";
963 return 0;
964}
965
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +0000966bool Darwin::SupportsProfiling() const {
967 // Profiling instrumentation is only supported on x86.
968 return getArchName() == "i386" || getArchName() == "x86_64";
969}
970
Daniel Dunbar43a9b322010-04-10 16:20:23 +0000971bool Darwin::SupportsObjCGC() const {
972 // Garbage collection is supported everywhere except on iPhone OS.
973 return !isTargetIPhoneOS();
974}
975
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000976std::string
Chad Rosier61ab80a2011-09-20 20:44:06 +0000977Darwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args,
978 types::ID InputType) const {
979 return ComputeLLVMTriple(Args, InputType);
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000980}
981
Daniel Dunbar39176082009-03-20 00:20:03 +0000982/// Generic_GCC - A tool chain using the 'gcc' command to perform
983/// all subcommands; this relies on gcc translating the majority of
984/// command line options.
985
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000986Generic_GCC::Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple)
Mike Stump1eb44332009-09-09 15:08:12 +0000987 : ToolChain(Host, Triple) {
Daniel Dunbaredf29b02010-08-01 22:29:51 +0000988 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer86643b82011-03-01 22:50:47 +0000989 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbaredf29b02010-08-01 22:29:51 +0000990 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarc50b00d2009-03-23 16:15:50 +0000991}
992
Daniel Dunbar39176082009-03-20 00:20:03 +0000993Generic_GCC::~Generic_GCC() {
994 // Free tool implementations.
995 for (llvm::DenseMap<unsigned, Tool*>::iterator
996 it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
997 delete it->second;
998}
999
Mike Stump1eb44332009-09-09 15:08:12 +00001000Tool &Generic_GCC::SelectTool(const Compilation &C,
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001001 const JobAction &JA,
1002 const ActionList &Inputs) const {
Daniel Dunbar39176082009-03-20 00:20:03 +00001003 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00001004 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Daniel Dunbar39176082009-03-20 00:20:03 +00001005 Key = Action::AnalyzeJobClass;
1006 else
1007 Key = JA.getKind();
1008
1009 Tool *&T = Tools[Key];
1010 if (!T) {
1011 switch (Key) {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +00001012 case Action::InputClass:
1013 case Action::BindArchClass:
David Blaikieb219cfc2011-09-23 05:06:16 +00001014 llvm_unreachable("Invalid tool kind.");
Daniel Dunbar39176082009-03-20 00:20:03 +00001015 case Action::PreprocessJobClass:
1016 T = new tools::gcc::Preprocess(*this); break;
1017 case Action::PrecompileJobClass:
1018 T = new tools::gcc::Precompile(*this); break;
1019 case Action::AnalyzeJobClass:
1020 T = new tools::Clang(*this); break;
1021 case Action::CompileJobClass:
1022 T = new tools::gcc::Compile(*this); break;
1023 case Action::AssembleJobClass:
1024 T = new tools::gcc::Assemble(*this); break;
1025 case Action::LinkJobClass:
1026 T = new tools::gcc::Link(*this); break;
Mike Stump1eb44332009-09-09 15:08:12 +00001027
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +00001028 // This is a bit ungeneric, but the only platform using a driver
1029 // driver is Darwin.
1030 case Action::LipoJobClass:
1031 T = new tools::darwin::Lipo(*this); break;
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00001032 case Action::DsymutilJobClass:
1033 T = new tools::darwin::Dsymutil(*this); break;
Eric Christopherf8571862011-08-23 17:56:55 +00001034 case Action::VerifyJobClass:
1035 T = new tools::darwin::VerifyDebug(*this); break;
Daniel Dunbar39176082009-03-20 00:20:03 +00001036 }
1037 }
1038
1039 return *T;
1040}
1041
Daniel Dunbar39176082009-03-20 00:20:03 +00001042bool Generic_GCC::IsUnwindTablesDefault() const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +00001043 // FIXME: Gross; we should probably have some separate target
1044 // definition, possibly even reusing the one in clang.
Daniel Dunbar39176082009-03-20 00:20:03 +00001045 return getArchName() == "x86_64";
1046}
1047
1048const char *Generic_GCC::GetDefaultRelocationModel() const {
1049 return "static";
1050}
1051
1052const char *Generic_GCC::GetForcedPicModel() const {
1053 return 0;
1054}
Daniel Dunbarf3cad362009-03-25 04:13:45 +00001055
Chris Lattner3a47c4e2010-03-04 21:07:38 +00001056/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
1057/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
1058/// Currently does not support anything else but compilation.
1059
1060TCEToolChain::TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple)
1061 : ToolChain(Host, Triple) {
1062 // Path mangling to find libexec
1063 std::string Path(getDriver().Dir);
1064
1065 Path += "/../libexec";
1066 getProgramPaths().push_back(Path);
1067}
1068
1069TCEToolChain::~TCEToolChain() {
1070 for (llvm::DenseMap<unsigned, Tool*>::iterator
1071 it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
1072 delete it->second;
1073}
1074
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001075bool TCEToolChain::IsMathErrnoDefault() const {
1076 return true;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00001077}
1078
1079bool TCEToolChain::IsUnwindTablesDefault() const {
1080 return false;
1081}
1082
1083const char *TCEToolChain::GetDefaultRelocationModel() const {
1084 return "static";
1085}
1086
1087const char *TCEToolChain::GetForcedPicModel() const {
1088 return 0;
1089}
1090
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001091Tool &TCEToolChain::SelectTool(const Compilation &C,
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001092 const JobAction &JA,
1093 const ActionList &Inputs) const {
Chris Lattner3a47c4e2010-03-04 21:07:38 +00001094 Action::ActionClass Key;
1095 Key = Action::AnalyzeJobClass;
1096
1097 Tool *&T = Tools[Key];
1098 if (!T) {
1099 switch (Key) {
1100 case Action::PreprocessJobClass:
1101 T = new tools::gcc::Preprocess(*this); break;
1102 case Action::AnalyzeJobClass:
1103 T = new tools::Clang(*this); break;
1104 default:
David Blaikieb219cfc2011-09-23 05:06:16 +00001105 llvm_unreachable("Unsupported action for TCE target.");
Chris Lattner3a47c4e2010-03-04 21:07:38 +00001106 }
1107 }
1108 return *T;
1109}
1110
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001111/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
1112
1113OpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple)
Rafael Espindolae43cfa12010-10-29 20:14:02 +00001114 : Generic_ELF(Host, Triple) {
Daniel Dunbaree788e72009-12-21 18:54:17 +00001115 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001116 getFilePaths().push_back("/usr/lib");
1117}
1118
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001119Tool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA,
1120 const ActionList &Inputs) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001121 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00001122 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001123 Key = Action::AnalyzeJobClass;
1124 else
1125 Key = JA.getKind();
1126
Rafael Espindoladda5b922010-11-07 23:13:01 +00001127 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1128 options::OPT_no_integrated_as,
1129 IsIntegratedAssemblerDefault());
1130
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001131 Tool *&T = Tools[Key];
1132 if (!T) {
1133 switch (Key) {
Rafael Espindoladda5b922010-11-07 23:13:01 +00001134 case Action::AssembleJobClass: {
1135 if (UseIntegratedAs)
1136 T = new tools::ClangAs(*this);
1137 else
1138 T = new tools::openbsd::Assemble(*this);
1139 break;
1140 }
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001141 case Action::LinkJobClass:
1142 T = new tools::openbsd::Link(*this); break;
1143 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001144 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001145 }
1146 }
1147
1148 return *T;
1149}
1150
Daniel Dunbar75358d22009-03-30 21:06:03 +00001151/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
1152
Daniel Dunbar214afe92010-08-02 05:43:59 +00001153FreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple)
Rafael Espindolae43cfa12010-10-29 20:14:02 +00001154 : Generic_ELF(Host, Triple) {
Daniel Dunbar214afe92010-08-02 05:43:59 +00001155
1156 // Determine if we are compiling 32-bit code on an x86_64 platform.
1157 bool Lib32 = false;
1158 if (Triple.getArch() == llvm::Triple::x86 &&
1159 llvm::Triple(getDriver().DefaultHostTriple).getArch() ==
1160 llvm::Triple::x86_64)
1161 Lib32 = true;
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001162
Roman Divacky3393cef2011-06-04 07:37:31 +00001163 if (Triple.getArch() == llvm::Triple::ppc &&
1164 llvm::Triple(getDriver().DefaultHostTriple).getArch() ==
1165 llvm::Triple::ppc64)
1166 Lib32 = true;
1167
Daniel Dunbarbc534662009-04-02 18:30:04 +00001168 if (Lib32) {
Daniel Dunbarbc534662009-04-02 18:30:04 +00001169 getFilePaths().push_back("/usr/lib32");
1170 } else {
Daniel Dunbarbc534662009-04-02 18:30:04 +00001171 getFilePaths().push_back("/usr/lib");
1172 }
Daniel Dunbar75358d22009-03-30 21:06:03 +00001173}
1174
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001175Tool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA,
1176 const ActionList &Inputs) const {
Daniel Dunbar75358d22009-03-30 21:06:03 +00001177 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00001178 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Daniel Dunbar75358d22009-03-30 21:06:03 +00001179 Key = Action::AnalyzeJobClass;
1180 else
1181 Key = JA.getKind();
1182
Roman Divacky67dece72010-11-08 17:46:39 +00001183 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1184 options::OPT_no_integrated_as,
1185 IsIntegratedAssemblerDefault());
1186
Daniel Dunbar75358d22009-03-30 21:06:03 +00001187 Tool *&T = Tools[Key];
1188 if (!T) {
1189 switch (Key) {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00001190 case Action::AssembleJobClass:
Roman Divacky67dece72010-11-08 17:46:39 +00001191 if (UseIntegratedAs)
1192 T = new tools::ClangAs(*this);
1193 else
1194 T = new tools::freebsd::Assemble(*this);
Roman Divackyfe3a7ea2010-11-08 19:39:10 +00001195 break;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00001196 case Action::LinkJobClass:
1197 T = new tools::freebsd::Link(*this); break;
Daniel Dunbar75358d22009-03-30 21:06:03 +00001198 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001199 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Daniel Dunbar75358d22009-03-30 21:06:03 +00001200 }
1201 }
1202
1203 return *T;
1204}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001205
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001206/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
1207
Joerg Sonnenberger182564c2011-05-16 13:35:02 +00001208NetBSD::NetBSD(const HostInfo &Host, const llvm::Triple& Triple,
1209 const llvm::Triple& ToolTriple)
1210 : Generic_ELF(Host, Triple), ToolTriple(ToolTriple) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001211
1212 // Determine if we are compiling 32-bit code on an x86_64 platform.
1213 bool Lib32 = false;
Joerg Sonnenberger182564c2011-05-16 13:35:02 +00001214 if (ToolTriple.getArch() == llvm::Triple::x86_64 &&
1215 Triple.getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001216 Lib32 = true;
1217
Joerg Sonnenberger05e59302011-03-21 13:59:26 +00001218 if (getDriver().UseStdLib) {
1219 if (Lib32)
1220 getFilePaths().push_back("=/usr/lib/i386");
1221 else
1222 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001223 }
1224}
1225
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001226Tool &NetBSD::SelectTool(const Compilation &C, const JobAction &JA,
1227 const ActionList &Inputs) const {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001228 Action::ActionClass Key;
1229 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1230 Key = Action::AnalyzeJobClass;
1231 else
1232 Key = JA.getKind();
1233
1234 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1235 options::OPT_no_integrated_as,
1236 IsIntegratedAssemblerDefault());
1237
1238 Tool *&T = Tools[Key];
1239 if (!T) {
1240 switch (Key) {
1241 case Action::AssembleJobClass:
1242 if (UseIntegratedAs)
1243 T = new tools::ClangAs(*this);
1244 else
Joerg Sonnenberger182564c2011-05-16 13:35:02 +00001245 T = new tools::netbsd::Assemble(*this, ToolTriple);
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001246 break;
1247 case Action::LinkJobClass:
Joerg Sonnenberger182564c2011-05-16 13:35:02 +00001248 T = new tools::netbsd::Link(*this, ToolTriple);
1249 break;
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001250 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001251 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001252 }
1253 }
1254
1255 return *T;
1256}
1257
Chris Lattner38e317d2010-07-07 16:01:42 +00001258/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
1259
1260Minix::Minix(const HostInfo &Host, const llvm::Triple& Triple)
1261 : Generic_GCC(Host, Triple) {
1262 getFilePaths().push_back(getDriver().Dir + "/../lib");
1263 getFilePaths().push_back("/usr/lib");
1264 getFilePaths().push_back("/usr/gnu/lib");
1265 getFilePaths().push_back("/usr/gnu/lib/gcc/i686-pc-minix/4.4.3");
1266}
1267
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001268Tool &Minix::SelectTool(const Compilation &C, const JobAction &JA,
1269 const ActionList &Inputs) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00001270 Action::ActionClass Key;
1271 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1272 Key = Action::AnalyzeJobClass;
1273 else
1274 Key = JA.getKind();
1275
1276 Tool *&T = Tools[Key];
1277 if (!T) {
1278 switch (Key) {
1279 case Action::AssembleJobClass:
1280 T = new tools::minix::Assemble(*this); break;
1281 case Action::LinkJobClass:
1282 T = new tools::minix::Link(*this); break;
1283 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001284 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Chris Lattner38e317d2010-07-07 16:01:42 +00001285 }
1286 }
1287
1288 return *T;
1289}
1290
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001291/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
1292
1293AuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple)
1294 : Generic_GCC(Host, Triple) {
1295
Daniel Dunbaredf29b02010-08-01 22:29:51 +00001296 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer86643b82011-03-01 22:50:47 +00001297 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbaredf29b02010-08-01 22:29:51 +00001298 getProgramPaths().push_back(getDriver().Dir);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001299
Daniel Dunbaree788e72009-12-21 18:54:17 +00001300 getFilePaths().push_back(getDriver().Dir + "/../lib");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001301 getFilePaths().push_back("/usr/lib");
1302 getFilePaths().push_back("/usr/sfw/lib");
1303 getFilePaths().push_back("/opt/gcc4/lib");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00001304 getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001305
1306}
1307
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001308Tool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA,
1309 const ActionList &Inputs) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001310 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00001311 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001312 Key = Action::AnalyzeJobClass;
1313 else
1314 Key = JA.getKind();
1315
1316 Tool *&T = Tools[Key];
1317 if (!T) {
1318 switch (Key) {
1319 case Action::AssembleJobClass:
1320 T = new tools::auroraux::Assemble(*this); break;
1321 case Action::LinkJobClass:
1322 T = new tools::auroraux::Link(*this); break;
1323 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001324 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001325 }
1326 }
1327
1328 return *T;
1329}
1330
1331
Eli Friedman6b3454a2009-05-26 07:52:18 +00001332/// Linux toolchain (very bare-bones at the moment).
1333
Rafael Espindolac1da9812010-11-07 20:14:31 +00001334enum LinuxDistro {
Chandler Carruth3fd345a2011-02-25 06:39:53 +00001335 ArchLinux,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001336 DebianLenny,
1337 DebianSqueeze,
Eli Friedman0b200f62011-06-02 21:36:53 +00001338 DebianWheezy,
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001339 Exherbo,
Chris Lattnerd753b562011-05-22 05:36:06 +00001340 RHEL4,
1341 RHEL5,
1342 RHEL6,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001343 Fedora13,
1344 Fedora14,
Eric Christopher8f1cc072011-04-06 18:22:53 +00001345 Fedora15,
1346 FedoraRawhide,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001347 OpenSuse11_3,
David Chisnallde5c0482011-05-19 13:26:33 +00001348 OpenSuse11_4,
1349 OpenSuse12_1,
Douglas Gregor814638e2011-03-14 15:39:50 +00001350 UbuntuHardy,
1351 UbuntuIntrepid,
Rafael Espindola021aaa42010-11-10 05:00:22 +00001352 UbuntuJaunty,
Zhongxing Xu5ede8072010-11-15 09:01:52 +00001353 UbuntuKarmic,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001354 UbuntuLucid,
1355 UbuntuMaverick,
Ted Kremenek43ac2972011-04-05 22:04:27 +00001356 UbuntuNatty,
Benjamin Kramer25a857b2011-06-05 16:08:59 +00001357 UbuntuOneiric,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001358 UnknownDistro
1359};
1360
Chris Lattnerd753b562011-05-22 05:36:06 +00001361static bool IsRedhat(enum LinuxDistro Distro) {
Eric Christopher8f1cc072011-04-06 18:22:53 +00001362 return Distro == Fedora13 || Distro == Fedora14 ||
Rafael Espindola5a640ef2011-06-03 15:23:24 +00001363 Distro == Fedora15 || Distro == FedoraRawhide ||
1364 Distro == RHEL4 || Distro == RHEL5 || Distro == RHEL6;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001365}
1366
1367static bool IsOpenSuse(enum LinuxDistro Distro) {
David Chisnallde5c0482011-05-19 13:26:33 +00001368 return Distro == OpenSuse11_3 || Distro == OpenSuse11_4 ||
1369 Distro == OpenSuse12_1;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001370}
1371
1372static bool IsDebian(enum LinuxDistro Distro) {
Eli Friedman0b200f62011-06-02 21:36:53 +00001373 return Distro == DebianLenny || Distro == DebianSqueeze ||
1374 Distro == DebianWheezy;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001375}
1376
1377static bool IsUbuntu(enum LinuxDistro Distro) {
Douglas Gregor814638e2011-03-14 15:39:50 +00001378 return Distro == UbuntuHardy || Distro == UbuntuIntrepid ||
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001379 Distro == UbuntuLucid || Distro == UbuntuMaverick ||
Ted Kremenek43ac2972011-04-05 22:04:27 +00001380 Distro == UbuntuJaunty || Distro == UbuntuKarmic ||
Benjamin Kramer25a857b2011-06-05 16:08:59 +00001381 Distro == UbuntuNatty || Distro == UbuntuOneiric;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001382}
1383
Chandler Carruth38ec5462011-10-03 09:00:50 +00001384// FIXME: This should be deleted. We should assume a multilib environment, and
1385// fallback gracefully if any parts of it are absent.
Rafael Espindolac1da9812010-11-07 20:14:31 +00001386static bool HasMultilib(llvm::Triple::ArchType Arch, enum LinuxDistro Distro) {
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001387 if (Arch == llvm::Triple::x86_64) {
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001388 bool Exists;
1389 if (Distro == Exherbo &&
1390 (llvm::sys::fs::exists("/usr/lib32/libc.so", Exists) || !Exists))
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001391 return false;
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001392 }
Chandler Carruth38ec5462011-10-03 09:00:50 +00001393
1394 return true;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001395}
1396
1397static LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) {
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001398 llvm::OwningPtr<llvm::MemoryBuffer> File;
1399 if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001400 StringRef Data = File.get()->getBuffer();
1401 SmallVector<StringRef, 8> Lines;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001402 Data.split(Lines, "\n");
1403 for (unsigned int i = 0, s = Lines.size(); i < s; ++ i) {
Douglas Gregor814638e2011-03-14 15:39:50 +00001404 if (Lines[i] == "DISTRIB_CODENAME=hardy")
1405 return UbuntuHardy;
Ted Kremenek43ac2972011-04-05 22:04:27 +00001406 else if (Lines[i] == "DISTRIB_CODENAME=intrepid")
1407 return UbuntuIntrepid;
Rafael Espindola021aaa42010-11-10 05:00:22 +00001408 else if (Lines[i] == "DISTRIB_CODENAME=jaunty")
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001409 return UbuntuJaunty;
Zhongxing Xu5ede8072010-11-15 09:01:52 +00001410 else if (Lines[i] == "DISTRIB_CODENAME=karmic")
1411 return UbuntuKarmic;
Ted Kremenek43ac2972011-04-05 22:04:27 +00001412 else if (Lines[i] == "DISTRIB_CODENAME=lucid")
1413 return UbuntuLucid;
1414 else if (Lines[i] == "DISTRIB_CODENAME=maverick")
1415 return UbuntuMaverick;
1416 else if (Lines[i] == "DISTRIB_CODENAME=natty")
1417 return UbuntuNatty;
Benjamin Kramer25a857b2011-06-05 16:08:59 +00001418 else if (Lines[i] == "DISTRIB_CODENAME=oneiric")
1419 return UbuntuOneiric;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001420 }
1421 return UnknownDistro;
1422 }
1423
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001424 if (!llvm::MemoryBuffer::getFile("/etc/redhat-release", File)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001425 StringRef Data = File.get()->getBuffer();
Eric Christopher8f1cc072011-04-06 18:22:53 +00001426 if (Data.startswith("Fedora release 15"))
1427 return Fedora15;
1428 else if (Data.startswith("Fedora release 14"))
Rafael Espindolac1da9812010-11-07 20:14:31 +00001429 return Fedora14;
Eric Christopher8f1cc072011-04-06 18:22:53 +00001430 else if (Data.startswith("Fedora release 13"))
Rafael Espindolac1da9812010-11-07 20:14:31 +00001431 return Fedora13;
Eric Christopher8f1cc072011-04-06 18:22:53 +00001432 else if (Data.startswith("Fedora release") &&
Chris Lattner5f9e2722011-07-23 10:55:15 +00001433 Data.find("Rawhide") != StringRef::npos)
Eric Christopher8f1cc072011-04-06 18:22:53 +00001434 return FedoraRawhide;
Chris Lattnerd753b562011-05-22 05:36:06 +00001435 else if (Data.startswith("Red Hat Enterprise Linux") &&
Chris Lattner5f9e2722011-07-23 10:55:15 +00001436 Data.find("release 6") != StringRef::npos)
Chris Lattnerd753b562011-05-22 05:36:06 +00001437 return RHEL6;
Rafael Espindola5a640ef2011-06-03 15:23:24 +00001438 else if ((Data.startswith("Red Hat Enterprise Linux") ||
1439 Data.startswith("CentOS")) &&
Chris Lattner5f9e2722011-07-23 10:55:15 +00001440 Data.find("release 5") != StringRef::npos)
Chris Lattnerd753b562011-05-22 05:36:06 +00001441 return RHEL5;
Rafael Espindola5a640ef2011-06-03 15:23:24 +00001442 else if ((Data.startswith("Red Hat Enterprise Linux") ||
1443 Data.startswith("CentOS")) &&
Chris Lattner5f9e2722011-07-23 10:55:15 +00001444 Data.find("release 4") != StringRef::npos)
Chris Lattnerd753b562011-05-22 05:36:06 +00001445 return RHEL4;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001446 return UnknownDistro;
1447 }
1448
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001449 if (!llvm::MemoryBuffer::getFile("/etc/debian_version", File)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001450 StringRef Data = File.get()->getBuffer();
Rafael Espindolac1da9812010-11-07 20:14:31 +00001451 if (Data[0] == '5')
1452 return DebianLenny;
1453 else if (Data.startswith("squeeze/sid"))
1454 return DebianSqueeze;
Eli Friedman0b200f62011-06-02 21:36:53 +00001455 else if (Data.startswith("wheezy/sid"))
1456 return DebianWheezy;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001457 return UnknownDistro;
1458 }
1459
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001460 if (!llvm::MemoryBuffer::getFile("/etc/SuSE-release", File)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001461 StringRef Data = File.get()->getBuffer();
Rafael Espindolac1da9812010-11-07 20:14:31 +00001462 if (Data.startswith("openSUSE 11.3"))
1463 return OpenSuse11_3;
David Chisnallde5c0482011-05-19 13:26:33 +00001464 else if (Data.startswith("openSUSE 11.4"))
1465 return OpenSuse11_4;
1466 else if (Data.startswith("openSUSE 12.1"))
1467 return OpenSuse12_1;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001468 return UnknownDistro;
1469 }
1470
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001471 bool Exists;
1472 if (!llvm::sys::fs::exists("/etc/exherbo-release", Exists) && Exists)
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001473 return Exherbo;
1474
Chandler Carruth3fd345a2011-02-25 06:39:53 +00001475 if (!llvm::sys::fs::exists("/etc/arch-release", Exists) && Exists)
1476 return ArchLinux;
1477
Rafael Espindolac1da9812010-11-07 20:14:31 +00001478 return UnknownDistro;
1479}
1480
Chandler Carruth048e6492011-10-03 18:16:54 +00001481/// \brief Trivial helper function to simplify code checking path existence.
Chandler Carruthadc4afb2011-10-04 02:28:41 +00001482static bool PathExists(StringRef Path) {
Rafael Espindola14ea13c2011-06-02 22:18:46 +00001483 bool Exists;
Chandler Carruth048e6492011-10-03 18:16:54 +00001484 if (!llvm::sys::fs::exists(Path, Exists))
1485 return Exists;
1486 return false;
1487}
1488
1489namespace {
1490/// \brief This is a class to find a viable GCC installation for Clang to use.
1491///
1492/// This class tries to find a GCC installation on the system, and report
1493/// information about it. It starts from the host information provided to the
1494/// Driver, and has logic for fuzzing that where appropriate.
1495class GCCInstallationDetector {
Chandler Carruth6d9694c2011-10-04 21:22:33 +00001496 /// \brief Struct to store and manipulate GCC versions.
1497 ///
1498 /// We rely on assumptions about the form and structure of GCC version
1499 /// numbers: they consist of at most three '.'-separated components, and each
1500 /// component is a non-negative integer.
1501 struct GCCVersion {
1502 unsigned Major, Minor, Patch;
1503
1504 static GCCVersion Parse(StringRef VersionText) {
NAKAMURA Takumi96e21712011-10-08 11:31:53 +00001505 const GCCVersion BadVersion = {0, 0, 0};
Chandler Carruth6d9694c2011-10-04 21:22:33 +00001506 std::pair<StringRef, StringRef> First = VersionText.split('.');
1507 std::pair<StringRef, StringRef> Second = First.second.split('.');
1508
NAKAMURA Takumi96e21712011-10-08 11:31:53 +00001509 GCCVersion GoodVersion = {0, 0, 0};
Chandler Carruth6d9694c2011-10-04 21:22:33 +00001510 if (First.first.getAsInteger(10, GoodVersion.Major))
1511 return BadVersion;
1512 if (Second.first.getAsInteger(10, GoodVersion.Minor))
1513 return BadVersion;
Chandler Carruthdbc21442011-10-05 03:09:51 +00001514 // We accept a number, or a string for the patch version, in case there
1515 // is a strang suffix, or other mangling: '4.1.x', '4.1.2-rc3'. When it
1516 // isn't a number, we just use '0' as the number but accept it.
1517 if (Second.first.getAsInteger(10, GoodVersion.Patch))
1518 GoodVersion.Patch = 0;
Chandler Carruth6d9694c2011-10-04 21:22:33 +00001519 return GoodVersion;
1520 }
1521
1522 bool operator<(const GCCVersion &RHS) const {
1523 if (Major < RHS.Major) return true;
1524 if (Major > RHS.Major) return false;
1525 if (Minor < RHS.Minor) return true;
1526 if (Minor > RHS.Minor) return false;
1527 return Patch < RHS.Patch;
1528 }
1529 bool operator>(const GCCVersion &RHS) const { return RHS < *this; }
1530 bool operator<=(const GCCVersion &RHS) const { return !(*this > RHS); }
1531 bool operator>=(const GCCVersion &RHS) const { return !(*this < RHS); }
1532 };
1533
Chandler Carruth048e6492011-10-03 18:16:54 +00001534 bool IsValid;
1535 std::string GccTriple;
1536
1537 // FIXME: These might be better as path objects.
1538 std::string GccInstallPath;
1539 std::string GccParentLibPath;
1540
1541 llvm::SmallString<128> CxxIncludeRoot;
1542
1543public:
1544 /// \brief Construct a GCCInstallationDetector from the driver.
1545 ///
1546 /// This performs all of the autodetection and sets up the various paths.
1547 /// Once constructed, a GCCInstallation is esentially immutable.
1548 GCCInstallationDetector(const Driver &D)
1549 : IsValid(false),
1550 GccTriple(D.DefaultHostTriple),
1551 CxxIncludeRoot(CXX_INCLUDE_ROOT) {
1552 // FIXME: Using CXX_INCLUDE_ROOT is here is a bit of a hack, but
1553 // avoids adding yet another option to configure/cmake.
1554 // It would probably be cleaner to break it in two variables
1555 // CXX_GCC_ROOT with just /foo/bar
1556 // CXX_GCC_VER with 4.5.2
1557 // Then we would have
1558 // CXX_INCLUDE_ROOT = CXX_GCC_ROOT/include/c++/CXX_GCC_VER
1559 // and this function would return
1560 // CXX_GCC_ROOT/lib/gcc/CXX_INCLUDE_ARCH/CXX_GCC_VER
1561 if (CxxIncludeRoot != "") {
1562 // This is of the form /foo/bar/include/c++/4.5.2/
1563 if (CxxIncludeRoot.back() == '/')
1564 llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the /
1565 StringRef Version = llvm::sys::path::filename(CxxIncludeRoot);
1566 llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the version
1567 llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the c++
1568 llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the include
1569 GccInstallPath = CxxIncludeRoot.str();
1570 GccInstallPath.append("/lib/gcc/");
1571 GccInstallPath.append(CXX_INCLUDE_ARCH);
1572 GccInstallPath.append("/");
1573 GccInstallPath.append(Version);
Rafael Espindolaf886d6f2011-10-14 19:50:08 +00001574 GccParentLibPath = GccInstallPath + "/../../..";
Chandler Carruth048e6492011-10-03 18:16:54 +00001575 IsValid = true;
1576 return;
1577 }
1578
1579 llvm::Triple::ArchType HostArch = llvm::Triple(GccTriple).getArch();
Chandler Carruth810e0812011-10-04 08:32:14 +00001580 // The library directories which may contain GCC installations.
Chandler Carrutha24b9802011-10-04 09:47:17 +00001581 SmallVector<StringRef, 4> CandidateLibDirs;
Chandler Carruth810e0812011-10-04 08:32:14 +00001582 // The compatible GCC triples for this particular architecture.
Chandler Carruthadc4afb2011-10-04 02:28:41 +00001583 SmallVector<StringRef, 10> CandidateTriples;
Chandler Carruth4c9403c2011-10-04 22:58:04 +00001584 CollectLibDirsAndTriples(HostArch, CandidateLibDirs, CandidateTriples);
Chandler Carruthadc4afb2011-10-04 02:28:41 +00001585
Chandler Carruth810e0812011-10-04 08:32:14 +00001586 // Always include the default host triple as the final fallback if no
1587 // specific triple is detected.
1588 CandidateTriples.push_back(D.DefaultHostTriple);
Chandler Carruth048e6492011-10-03 18:16:54 +00001589
Chandler Carruth6d9694c2011-10-04 21:22:33 +00001590 // Compute the set of prefixes for our search.
Chandler Carruth810e0812011-10-04 08:32:14 +00001591 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1592 D.PrefixDirs.end());
Chandler Carruth6ab8e622011-10-04 21:22:42 +00001593 Prefixes.push_back(D.SysRoot);
Chandler Carruth810e0812011-10-04 08:32:14 +00001594 Prefixes.push_back(D.SysRoot + "/usr");
Chandler Carruth12036002011-10-05 06:38:03 +00001595 Prefixes.push_back(D.InstalledDir + "/..");
Chandler Carruth810e0812011-10-04 08:32:14 +00001596
Chandler Carruth6d9694c2011-10-04 21:22:33 +00001597 // Loop over the various components which exist and select the best GCC
1598 // installation available. GCC installs are ranked by version number.
NAKAMURA Takumi96e21712011-10-08 11:31:53 +00001599 GCCVersion BestVersion = {0, 0, 0};
Chandler Carruth6d9694c2011-10-04 21:22:33 +00001600 for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) {
1601 if (!PathExists(Prefixes[i]))
1602 continue;
1603 for (unsigned j = 0, je = CandidateLibDirs.size(); j < je; ++j) {
1604 const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str();
1605 if (!PathExists(LibDir))
1606 continue;
Chandler Carruthe0890882011-10-04 23:17:12 +00001607 for (unsigned k = 0, ke = CandidateTriples.size(); k < ke; ++k)
1608 ScanLibDirForGCCTriple(LibDir, CandidateTriples[k], BestVersion);
David Chisnall5adcec12011-09-27 22:03:18 +00001609 }
Eli Friedman733a83b2011-09-16 21:04:38 +00001610 }
Rafael Espindola14ea13c2011-06-02 22:18:46 +00001611 }
Chandler Carruth048e6492011-10-03 18:16:54 +00001612
1613 /// \brief Check whether we detected a valid GCC install.
1614 bool isValid() const { return IsValid; }
1615
1616 /// \brief Get the GCC triple for the detected install.
1617 const std::string &getTriple() const { return GccTriple; }
1618
1619 /// \brief Get the detected GCC installation path.
1620 const std::string &getInstallPath() const { return GccInstallPath; }
1621
1622 /// \brief Get the detected GCC parent lib path.
1623 const std::string &getParentLibPath() const { return GccParentLibPath; }
Chandler Carruth4c9403c2011-10-04 22:58:04 +00001624
1625private:
1626 static void CollectLibDirsAndTriples(llvm::Triple::ArchType HostArch,
1627 SmallVectorImpl<StringRef> &LibDirs,
1628 SmallVectorImpl<StringRef> &Triples) {
1629 if (HostArch == llvm::Triple::arm || HostArch == llvm::Triple::thumb) {
Chandler Carruth7a09d012011-10-16 10:54:30 +00001630 static const char *const ARMLibDirs[] = { "/lib" };
Chandler Carruth4c9403c2011-10-04 22:58:04 +00001631 static const char *const ARMTriples[] = { "arm-linux-gnueabi" };
1632 LibDirs.append(ARMLibDirs, ARMLibDirs + llvm::array_lengthof(ARMLibDirs));
1633 Triples.append(ARMTriples, ARMTriples + llvm::array_lengthof(ARMTriples));
1634 } else if (HostArch == llvm::Triple::x86_64) {
Chandler Carruth7a09d012011-10-16 10:54:30 +00001635 static const char *const X86_64LibDirs[] = { "/lib64", "/lib" };
Chandler Carruth4c9403c2011-10-04 22:58:04 +00001636 static const char *const X86_64Triples[] = {
1637 "x86_64-linux-gnu",
1638 "x86_64-unknown-linux-gnu",
1639 "x86_64-pc-linux-gnu",
1640 "x86_64-redhat-linux6E",
1641 "x86_64-redhat-linux",
1642 "x86_64-suse-linux",
1643 "x86_64-manbo-linux-gnu",
1644 "x86_64-linux-gnu",
1645 "x86_64-slackware-linux"
1646 };
1647 LibDirs.append(X86_64LibDirs,
1648 X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
1649 Triples.append(X86_64Triples,
1650 X86_64Triples + llvm::array_lengthof(X86_64Triples));
1651 } else if (HostArch == llvm::Triple::x86) {
Chandler Carruth7a09d012011-10-16 10:54:30 +00001652 static const char *const X86LibDirs[] = { "/lib32", "/lib" };
Chandler Carruth4c9403c2011-10-04 22:58:04 +00001653 static const char *const X86Triples[] = {
1654 "i686-linux-gnu",
1655 "i386-linux-gnu",
1656 "i686-pc-linux-gnu",
1657 "i486-linux-gnu",
1658 "i686-redhat-linux",
Benjamin Kramer84cbd4b2011-10-13 20:45:37 +00001659 "i386-redhat-linux",
Chandler Carruth4c9403c2011-10-04 22:58:04 +00001660 "i586-suse-linux",
1661 "i486-slackware-linux"
1662 };
1663 LibDirs.append(X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
1664 Triples.append(X86Triples, X86Triples + llvm::array_lengthof(X86Triples));
1665 } else if (HostArch == llvm::Triple::ppc) {
Chandler Carruth7a09d012011-10-16 10:54:30 +00001666 static const char *const PPCLibDirs[] = { "/lib32", "/lib" };
Chandler Carruth4c9403c2011-10-04 22:58:04 +00001667 static const char *const PPCTriples[] = {
1668 "powerpc-linux-gnu",
1669 "powerpc-unknown-linux-gnu"
1670 };
1671 LibDirs.append(PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
1672 Triples.append(PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples));
1673 } else if (HostArch == llvm::Triple::ppc64) {
Chandler Carruth7a09d012011-10-16 10:54:30 +00001674 static const char *const PPC64LibDirs[] = { "/lib64", "/lib" };
Chandler Carruth4c9403c2011-10-04 22:58:04 +00001675 static const char *const PPC64Triples[] = {
1676 "powerpc64-unknown-linux-gnu"
1677 };
1678 LibDirs.append(PPC64LibDirs,
1679 PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
1680 Triples.append(PPC64Triples,
1681 PPC64Triples + llvm::array_lengthof(PPC64Triples));
1682 }
1683 }
Chandler Carruthe0890882011-10-04 23:17:12 +00001684
1685 void ScanLibDirForGCCTriple(const std::string &LibDir,
1686 StringRef CandidateTriple,
1687 GCCVersion &BestVersion) {
Chandler Carruth7a09d012011-10-16 10:54:30 +00001688 // There are various different suffixes involving the triple we
Chandler Carruthe0890882011-10-04 23:17:12 +00001689 // check for. We also record what is necessary to walk from each back
1690 // up to the lib directory.
Chandler Carruth7a09d012011-10-16 10:54:30 +00001691 const std::string Suffixes[] = {
1692 "/gcc/" + CandidateTriple.str(),
Chandler Carruth16a63552011-10-16 11:05:04 +00001693 "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
Chandler Carruth7a09d012011-10-16 10:54:30 +00001694
1695 // Ubuntu has a strange mis-matched pair of triples that this happens to
1696 // match.
1697 // FIXME: It may be worthwhile to generalize this and look for a second
1698 // triple.
Chandler Carruth16a63552011-10-16 11:05:04 +00001699 "/" + CandidateTriple.str() + "/gcc/i686-linux-gnu"
Chandler Carruth7a09d012011-10-16 10:54:30 +00001700 };
1701 const std::string InstallSuffixes[] = {
1702 "/../../..",
1703 "/../../../..",
1704 "/../../../.."
1705 };
1706 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Chandler Carruthe0890882011-10-04 23:17:12 +00001707 const unsigned NumSuffixes = (llvm::array_lengthof(Suffixes) -
1708 (CandidateTriple != "i386-linux-gnu"));
1709 for (unsigned i = 0; i < NumSuffixes; ++i) {
1710 StringRef Suffix = Suffixes[i];
1711 llvm::error_code EC;
Chandler Carruth7a09d012011-10-16 10:54:30 +00001712 for (llvm::sys::fs::directory_iterator LI(LibDir + Suffix, EC), LE;
Chandler Carruthe0890882011-10-04 23:17:12 +00001713 !EC && LI != LE; LI = LI.increment(EC)) {
1714 StringRef VersionText = llvm::sys::path::filename(LI->path());
1715 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
1716 static const GCCVersion MinVersion = { 4, 1, 1 };
1717 if (CandidateVersion < MinVersion)
1718 continue;
1719 if (CandidateVersion <= BestVersion)
1720 continue;
1721 if (!PathExists(LI->path() + "/crtbegin.o"))
1722 continue;
1723
1724 BestVersion = CandidateVersion;
1725 GccTriple = CandidateTriple.str();
1726 // FIXME: We hack together the directory name here instead of
1727 // using LI to ensure stable path separators across Windows and
1728 // Linux.
Chandler Carruth7a09d012011-10-16 10:54:30 +00001729 GccInstallPath = LibDir + Suffixes[i] + "/" + VersionText.str();
Chandler Carruthe0890882011-10-04 23:17:12 +00001730 GccParentLibPath = GccInstallPath + InstallSuffixes[i];
1731 IsValid = true;
1732 }
1733 }
1734 }
Chandler Carruth048e6492011-10-03 18:16:54 +00001735};
Rafael Espindola14ea13c2011-06-02 22:18:46 +00001736}
1737
Chandler Carruthd2deee12011-10-03 05:28:29 +00001738static void addPathIfExists(const std::string &Path,
1739 ToolChain::path_list &Paths) {
Chandler Carruth048e6492011-10-03 18:16:54 +00001740 if (PathExists(Path)) Paths.push_back(Path);
Chandler Carruthd2deee12011-10-03 05:28:29 +00001741}
1742
Chandler Carruthdeb73f82011-10-31 08:42:24 +00001743/// \brief Get our best guess at the multiarch triple for a target.
1744///
1745/// Debian-based systems are starting to use a multiarch setup where they use
1746/// a target-triple directory in the library and header search paths.
1747/// Unfortunately, this triple does not align with the vanilla target triple,
1748/// so we provide a rough mapping here.
1749static std::string getMultiarchTriple(const llvm::Triple TargetTriple,
1750 StringRef SysRoot) {
1751 // For most architectures, just use whatever we have rather than trying to be
1752 // clever.
1753 switch (TargetTriple.getArch()) {
1754 default:
1755 return TargetTriple.str();
1756
1757 // We use the existence of '/lib/<triple>' as a directory to detect some
1758 // common linux triples that don't quite match the Clang triple for both
1759 // 32-bit and 64-bit targets. This works around annoying discrepancies on
1760 // Debian-based systems.
1761 case llvm::Triple::x86:
1762 if (llvm::sys::fs::exists(SysRoot + "/lib/i686-linux-gnu"))
1763 return "i686-linux-gnu";
1764 if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
1765 return "i386-linux-gnu";
1766 return TargetTriple.str();
1767 case llvm::Triple::x86_64:
1768 if (llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
1769 return "x86_64-linux-gnu";
1770 if (llvm::sys::fs::exists(SysRoot + "/lib/x86_64-pc-linux-gnu"))
1771 return "x86_64-pc-linux-gnu";
1772 if (llvm::sys::fs::exists(SysRoot + "/lib/x86_64-unknown-linux-gnu"))
1773 return "x86_64-unknown-linux-gnu";
1774 return TargetTriple.str();
1775 }
1776}
1777
Nick Lewycky3fdcc6f2010-12-31 17:31:54 +00001778Linux::Linux(const HostInfo &Host, const llvm::Triple &Triple)
Rafael Espindolae43cfa12010-10-29 20:14:02 +00001779 : Generic_ELF(Host, Triple) {
Rafael Espindolac1da9812010-11-07 20:14:31 +00001780 llvm::Triple::ArchType Arch =
1781 llvm::Triple(getDriver().DefaultHostTriple).getArch();
Chandler Carruthfde8d142011-10-03 06:41:08 +00001782 const std::string &SysRoot = getDriver().SysRoot;
Chandler Carruth048e6492011-10-03 18:16:54 +00001783 GCCInstallationDetector GCCInstallation(getDriver());
Rafael Espindolac1da9812010-11-07 20:14:31 +00001784
Rafael Espindolaab784082011-09-01 16:25:49 +00001785 // OpenSuse stores the linker with the compiler, add that to the search
1786 // path.
1787 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth048e6492011-10-03 18:16:54 +00001788 PPaths.push_back(GCCInstallation.getParentLibPath() + "/../" +
1789 GCCInstallation.getTriple() + "/bin");
Rafael Espindolaab784082011-09-01 16:25:49 +00001790
1791 Linker = GetProgramPath("ld");
Rafael Espindolac1da9812010-11-07 20:14:31 +00001792
1793 LinuxDistro Distro = DetectLinuxDistro(Arch);
1794
Chris Lattner64a89172011-05-22 16:45:07 +00001795 if (IsOpenSuse(Distro) || IsUbuntu(Distro)) {
Rafael Espindola94c80222010-11-08 14:48:47 +00001796 ExtraOpts.push_back("-z");
1797 ExtraOpts.push_back("relro");
1798 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00001799
Douglas Gregorf0594d82011-03-06 19:11:49 +00001800 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001801 ExtraOpts.push_back("-X");
1802
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001803 if (IsRedhat(Distro) || IsOpenSuse(Distro) || Distro == UbuntuMaverick ||
Benjamin Kramer25a857b2011-06-05 16:08:59 +00001804 Distro == UbuntuNatty || Distro == UbuntuOneiric)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001805 ExtraOpts.push_back("--hash-style=gnu");
1806
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001807 if (IsDebian(Distro) || IsOpenSuse(Distro) || Distro == UbuntuLucid ||
Chris Lattner64a89172011-05-22 16:45:07 +00001808 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001809 ExtraOpts.push_back("--hash-style=both");
1810
Chris Lattnerd753b562011-05-22 05:36:06 +00001811 if (IsRedhat(Distro))
Rafael Espindolac1da9812010-11-07 20:14:31 +00001812 ExtraOpts.push_back("--no-add-needed");
1813
Eli Friedman0b200f62011-06-02 21:36:53 +00001814 if (Distro == DebianSqueeze || Distro == DebianWheezy ||
Rafael Espindola5a640ef2011-06-03 15:23:24 +00001815 IsOpenSuse(Distro) ||
1816 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
1817 Distro == UbuntuLucid ||
Eli Friedman0b200f62011-06-02 21:36:53 +00001818 Distro == UbuntuMaverick || Distro == UbuntuKarmic ||
Benjamin Kramer25a857b2011-06-05 16:08:59 +00001819 Distro == UbuntuNatty || Distro == UbuntuOneiric)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001820 ExtraOpts.push_back("--build-id");
1821
Chris Lattner64a89172011-05-22 16:45:07 +00001822 if (IsOpenSuse(Distro))
Chandler Carruthf0b60ec2011-05-24 07:51:17 +00001823 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattner64a89172011-05-22 16:45:07 +00001824
Chandler Carruthd2deee12011-10-03 05:28:29 +00001825 // The selection of paths to try here is designed to match the patterns which
1826 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
1827 // This was determined by running GCC in a fake filesystem, creating all
1828 // possible permutations of these directories, and seeing which ones it added
1829 // to the link paths.
1830 path_list &Paths = getFilePaths();
1831 const bool Is32Bits = (getArch() == llvm::Triple::x86 ||
1832 getArch() == llvm::Triple::ppc);
Chandler Carruth3fd345a2011-02-25 06:39:53 +00001833
Chandler Carruthd2deee12011-10-03 05:28:29 +00001834 const std::string Suffix32 = Arch == llvm::Triple::x86_64 ? "/32" : "";
Chandler Carruth38ec5462011-10-03 09:00:50 +00001835 const std::string Suffix64 = Arch == llvm::Triple::x86_64 ? "" : "/64";
Chandler Carruthd2deee12011-10-03 05:28:29 +00001836 const std::string Suffix = Is32Bits ? Suffix32 : Suffix64;
1837 const std::string Multilib = Is32Bits ? "lib32" : "lib64";
Chandler Carruthdeb73f82011-10-31 08:42:24 +00001838 const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
Chandler Carruthd2deee12011-10-03 05:28:29 +00001839
1840 // FIXME: Because we add paths only when they exist on the system, I think we
1841 // should remove the concept of 'HasMultilib'. It's more likely to break the
1842 // behavior than to preserve any useful invariant on the system.
Rafael Espindolac1da9812010-11-07 20:14:31 +00001843 if (HasMultilib(Arch, Distro)) {
Chandler Carruthd2deee12011-10-03 05:28:29 +00001844 // Add the multilib suffixed paths.
Chandler Carruth048e6492011-10-03 18:16:54 +00001845 if (GCCInstallation.isValid()) {
1846 const std::string &LibPath = GCCInstallation.getParentLibPath();
1847 const std::string &GccTriple = GCCInstallation.getTriple();
1848 // FIXME: This OpenSuse-specific path shouldn't be needed any more, but
1849 // I don't want to remove it without finding someone to test.
1850 if (IsOpenSuse(Distro) && Is32Bits)
1851 Paths.push_back(LibPath + "/../" + GccTriple + "/lib/../lib");
1852
1853 addPathIfExists(GCCInstallation.getInstallPath() + Suffix, Paths);
1854 addPathIfExists(LibPath + "/../" + GccTriple + "/lib/../" + Multilib,
1855 Paths);
Chandler Carruthdeb73f82011-10-31 08:42:24 +00001856 addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
Chandler Carruth048e6492011-10-03 18:16:54 +00001857 addPathIfExists(LibPath + "/../" + Multilib, Paths);
Chandler Carruthd2deee12011-10-03 05:28:29 +00001858 }
Chandler Carruthdeb73f82011-10-31 08:42:24 +00001859 addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
Chandler Carruthfde8d142011-10-03 06:41:08 +00001860 addPathIfExists(SysRoot + "/lib/../" + Multilib, Paths);
Chandler Carruthdeb73f82011-10-31 08:42:24 +00001861 addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
Chandler Carruthfde8d142011-10-03 06:41:08 +00001862 addPathIfExists(SysRoot + "/usr/lib/../" + Multilib, Paths);
Chandler Carruth7a09d012011-10-16 10:54:30 +00001863
1864 // Try walking via the GCC triple path in case of multiarch GCC
1865 // installations with strange symlinks.
1866 if (GCCInstallation.isValid())
1867 addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple() +
1868 "/../../" + Multilib, Paths);
Rafael Espindolac1da9812010-11-07 20:14:31 +00001869 }
Rafael Espindolac7409a02011-06-03 15:39:42 +00001870
Chandler Carruth7a09d012011-10-16 10:54:30 +00001871 // Add the non-multilib suffixed paths (if potentially different).
Chandler Carruth048e6492011-10-03 18:16:54 +00001872 if (GCCInstallation.isValid()) {
1873 const std::string &LibPath = GCCInstallation.getParentLibPath();
1874 const std::string &GccTriple = GCCInstallation.getTriple();
Chandler Carruth663abc92011-10-03 08:02:58 +00001875 if (!Suffix.empty() || !HasMultilib(Arch, Distro))
Chandler Carruth048e6492011-10-03 18:16:54 +00001876 addPathIfExists(GCCInstallation.getInstallPath(), Paths);
1877 addPathIfExists(LibPath + "/../" + GccTriple + "/lib", Paths);
Chandler Carruthdeb73f82011-10-31 08:42:24 +00001878 addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
Chandler Carruth048e6492011-10-03 18:16:54 +00001879 addPathIfExists(LibPath, Paths);
Chandler Carruthd2deee12011-10-03 05:28:29 +00001880 }
Chandler Carruthdeb73f82011-10-31 08:42:24 +00001881 addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
Chandler Carruthfde8d142011-10-03 06:41:08 +00001882 addPathIfExists(SysRoot + "/lib", Paths);
Chandler Carruthdeb73f82011-10-31 08:42:24 +00001883 addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
Chandler Carruthfde8d142011-10-03 06:41:08 +00001884 addPathIfExists(SysRoot + "/usr/lib", Paths);
Rafael Espindolac1da9812010-11-07 20:14:31 +00001885}
1886
1887bool Linux::HasNativeLLVMSupport() const {
1888 return true;
Eli Friedman6b3454a2009-05-26 07:52:18 +00001889}
1890
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001891Tool &Linux::SelectTool(const Compilation &C, const JobAction &JA,
1892 const ActionList &Inputs) const {
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00001893 Action::ActionClass Key;
1894 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1895 Key = Action::AnalyzeJobClass;
1896 else
1897 Key = JA.getKind();
1898
Rafael Espindoladda5b922010-11-07 23:13:01 +00001899 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1900 options::OPT_no_integrated_as,
1901 IsIntegratedAssemblerDefault());
1902
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00001903 Tool *&T = Tools[Key];
1904 if (!T) {
1905 switch (Key) {
1906 case Action::AssembleJobClass:
Rafael Espindoladda5b922010-11-07 23:13:01 +00001907 if (UseIntegratedAs)
1908 T = new tools::ClangAs(*this);
1909 else
1910 T = new tools::linuxtools::Assemble(*this);
1911 break;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001912 case Action::LinkJobClass:
1913 T = new tools::linuxtools::Link(*this); break;
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00001914 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001915 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00001916 }
1917 }
1918
1919 return *T;
1920}
1921
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001922/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
1923
Daniel Dunbarcb8ab232009-05-22 02:53:45 +00001924DragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple)
Rafael Espindolae43cfa12010-10-29 20:14:02 +00001925 : Generic_ELF(Host, Triple) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001926
1927 // Path mangling to find libexec
Daniel Dunbaredf29b02010-08-01 22:29:51 +00001928 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer86643b82011-03-01 22:50:47 +00001929 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbaredf29b02010-08-01 22:29:51 +00001930 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001931
Daniel Dunbaree788e72009-12-21 18:54:17 +00001932 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001933 getFilePaths().push_back("/usr/lib");
1934 getFilePaths().push_back("/usr/lib/gcc41");
1935}
1936
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001937Tool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA,
1938 const ActionList &Inputs) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001939 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00001940 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001941 Key = Action::AnalyzeJobClass;
1942 else
1943 Key = JA.getKind();
1944
1945 Tool *&T = Tools[Key];
1946 if (!T) {
1947 switch (Key) {
1948 case Action::AssembleJobClass:
1949 T = new tools::dragonfly::Assemble(*this); break;
1950 case Action::LinkJobClass:
1951 T = new tools::dragonfly::Link(*this); break;
1952 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001953 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001954 }
1955 }
1956
1957 return *T;
1958}
Michael J. Spencerff58e362010-08-21 21:55:07 +00001959
1960Windows::Windows(const HostInfo &Host, const llvm::Triple& Triple)
1961 : ToolChain(Host, Triple) {
1962}
1963
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001964Tool &Windows::SelectTool(const Compilation &C, const JobAction &JA,
1965 const ActionList &Inputs) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00001966 Action::ActionClass Key;
1967 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1968 Key = Action::AnalyzeJobClass;
1969 else
1970 Key = JA.getKind();
1971
Chad Rosierc57114a2011-07-20 19:14:30 +00001972 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1973 options::OPT_no_integrated_as,
1974 IsIntegratedAssemblerDefault());
1975
Michael J. Spencerff58e362010-08-21 21:55:07 +00001976 Tool *&T = Tools[Key];
1977 if (!T) {
1978 switch (Key) {
1979 case Action::InputClass:
1980 case Action::BindArchClass:
Chandler Carruthe97673f2010-08-22 06:56:37 +00001981 case Action::LipoJobClass:
1982 case Action::DsymutilJobClass:
Eric Christopherf8571862011-08-23 17:56:55 +00001983 case Action::VerifyJobClass:
David Blaikieb219cfc2011-09-23 05:06:16 +00001984 llvm_unreachable("Invalid tool kind.");
Michael J. Spencerff58e362010-08-21 21:55:07 +00001985 case Action::PreprocessJobClass:
1986 case Action::PrecompileJobClass:
1987 case Action::AnalyzeJobClass:
1988 case Action::CompileJobClass:
1989 T = new tools::Clang(*this); break;
1990 case Action::AssembleJobClass:
Chad Rosierc57114a2011-07-20 19:14:30 +00001991 if (!UseIntegratedAs && getTriple().getEnvironment() == llvm::Triple::MachO)
1992 T = new tools::darwin::Assemble(*this);
1993 else
1994 T = new tools::ClangAs(*this);
1995 break;
Michael J. Spencerff58e362010-08-21 21:55:07 +00001996 case Action::LinkJobClass:
1997 T = new tools::visualstudio::Link(*this); break;
1998 }
1999 }
2000
2001 return *T;
2002}
2003
2004bool Windows::IsIntegratedAssemblerDefault() const {
2005 return true;
2006}
2007
2008bool Windows::IsUnwindTablesDefault() const {
2009 // FIXME: Gross; we should probably have some separate target
2010 // definition, possibly even reusing the one in clang.
2011 return getArchName() == "x86_64";
2012}
2013
2014const char *Windows::GetDefaultRelocationModel() const {
2015 return "static";
2016}
2017
2018const char *Windows::GetForcedPicModel() const {
2019 if (getArchName() == "x86_64")
2020 return "pic";
2021 return 0;
2022}