blob: 22fe11d661a27e1ec0fe9ec31483d7b370499724 [file] [log] [blame]
Daniel Dunbare3995642009-03-10 23:50:49 +00001//===--- HostInfo.cpp - Host specific information -----------------------*-===//
2//
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 "clang/Driver/HostInfo.h"
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000011
12#include "clang/Driver/Arg.h"
13#include "clang/Driver/ArgList.h"
Daniel Dunbarfc6a8992009-03-20 18:21:51 +000014#include "clang/Driver/Driver.h"
15#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000016#include "clang/Driver/Option.h"
17#include "clang/Driver/Options.h"
18
19#include "llvm/ADT/StringMap.h"
20#include "llvm/Support/Compiler.h"
21
Daniel Dunbar83b08eb2009-03-17 21:38:00 +000022#include "ToolChains.h"
23
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000024#include <cassert>
Daniel Dunbarfe8aa472009-09-08 23:37:08 +000025
Daniel Dunbare3995642009-03-10 23:50:49 +000026using namespace clang::driver;
27
Daniel Dunbarcb8ab232009-05-22 02:53:45 +000028HostInfo::HostInfo(const Driver &D, const llvm::Triple &_Triple)
Mike Stump1eb44332009-09-09 15:08:12 +000029 : TheDriver(D), Triple(_Triple) {
Daniel Dunbare3995642009-03-10 23:50:49 +000030}
31
32HostInfo::~HostInfo() {
33}
34
Chris Lattneraae82f12009-03-17 22:24:01 +000035namespace {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000036
Daniel Dunbare3995642009-03-10 23:50:49 +000037// Darwin Host Info
38
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000039/// DarwinHostInfo - Darwin host information implementation.
40class DarwinHostInfo : public HostInfo {
41 /// Darwin version of host.
42 unsigned DarwinVersion[3];
43
44 /// GCC version to use on this host.
Mike Stump44da8212009-10-07 01:11:54 +000045 unsigned GCCVersion[4];
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000046
47 /// Cache of tool chains we have created.
Daniel Dunbar7ef7f132009-09-08 23:37:36 +000048 mutable llvm::DenseMap<unsigned, ToolChain*> ToolChains;
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000049
50public:
Daniel Dunbarcb8ab232009-05-22 02:53:45 +000051 DarwinHostInfo(const Driver &D, const llvm::Triple &Triple);
Daniel Dunbar7e4534d2009-03-18 01:09:40 +000052 ~DarwinHostInfo();
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000053
54 virtual bool useDriverDriver() const;
55
Daniel Dunbare33bea42009-03-20 23:39:23 +000056 virtual types::ID lookupTypeForExtension(const char *Ext) const {
57 types::ID Ty = types::lookupTypeForExtension(Ext);
58
59 // Darwin always preprocesses assembly files (unless -x is used
60 // explicitly).
61 if (Ty == types::TY_PP_Asm)
62 return types::TY_Asm;
63
64 return Ty;
65 }
66
Daniel Dunbard7502d02009-09-08 23:37:19 +000067 virtual ToolChain *CreateToolChain(const ArgList &Args,
68 const char *ArchName) const;
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000069};
70
Daniel Dunbarcb8ab232009-05-22 02:53:45 +000071DarwinHostInfo::DarwinHostInfo(const Driver &D, const llvm::Triple& Triple)
72 : HostInfo(D, Triple) {
Daniel Dunbarfe8aa472009-09-08 23:37:08 +000073
Daniel Dunbar7ef7f132009-09-08 23:37:36 +000074 assert(Triple.getArch() != llvm::Triple::UnknownArch && "Invalid arch!");
Daniel Dunbarfc6a8992009-03-20 18:21:51 +000075 assert(memcmp(&getOSName()[0], "darwin", 6) == 0 &&
76 "Unknown Darwin platform.");
Daniel Dunbard73fe9b2009-03-26 15:58:36 +000077 bool HadExtra;
Daniel Dunbarfe8aa472009-09-08 23:37:08 +000078 if (!Driver::GetReleaseVersion(&getOSName()[6],
79 DarwinVersion[0], DarwinVersion[1],
Daniel Dunbar7ef7f132009-09-08 23:37:36 +000080 DarwinVersion[2], HadExtra))
81 D.Diag(clang::diag::err_drv_invalid_darwin_version) << getOSName();
Daniel Dunbarfe8aa472009-09-08 23:37:08 +000082
Daniel Dunbare3995642009-03-10 23:50:49 +000083 // We can only call 4.2.1 for now.
84 GCCVersion[0] = 4;
85 GCCVersion[1] = 2;
86 GCCVersion[2] = 1;
Mike Stump44da8212009-10-07 01:11:54 +000087 // And we need to select the OS gcc was configured for, darwin10
88#ifdef OS_MAJOR
89 GCCVersion[3] = OS_MAJOR;
90#else
91 GCCVersion[3] = 10;
92#endif
Daniel Dunbare3995642009-03-10 23:50:49 +000093}
94
Daniel Dunbar7e4534d2009-03-18 01:09:40 +000095DarwinHostInfo::~DarwinHostInfo() {
Daniel Dunbar7ef7f132009-09-08 23:37:36 +000096 for (llvm::DenseMap<unsigned, ToolChain*>::iterator
Daniel Dunbar7e4534d2009-03-18 01:09:40 +000097 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
98 delete it->second;
99}
100
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000101bool DarwinHostInfo::useDriverDriver() const {
Daniel Dunbare3995642009-03-10 23:50:49 +0000102 return true;
103}
104
Daniel Dunbard7502d02009-09-08 23:37:19 +0000105ToolChain *DarwinHostInfo::CreateToolChain(const ArgList &Args,
106 const char *ArchName) const {
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000107 llvm::Triple::ArchType Arch;
108
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000109 if (!ArchName) {
Daniel Dunbarf2edbf32009-06-16 21:39:33 +0000110 // If we aren't looking for a specific arch, infer the default architecture
111 // based on -arch and -m32/-m64 command line options.
112 if (Arg *A = Args.getLastArg(options::OPT_arch)) {
113 // The gcc driver behavior with multiple -arch flags wasn't consistent for
114 // things which rely on a default architecture. We just use the last -arch
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000115 // to find the default tool chain (assuming it is valid..
116 Arch = llvm::Triple::getArchTypeForDarwinArchName(A->getValue(Args));
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000117
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000118 // If it was invalid just use the host, we will reject this command line
119 // later.
120 if (Arch == llvm::Triple::UnknownArch)
121 Arch = getTriple().getArch();
Daniel Dunbarf2edbf32009-06-16 21:39:33 +0000122 } else {
123 // Otherwise default to the arch of the host.
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000124 Arch = getTriple().getArch();
Daniel Dunbarf2edbf32009-06-16 21:39:33 +0000125 }
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000126
Daniel Dunbarf2edbf32009-06-16 21:39:33 +0000127 // Honor -m32 and -m64 when finding the default tool chain.
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000128 //
129 // FIXME: Should this information be in llvm::Triple?
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000130 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000131 if (A->getOption().getId() == options::OPT_m32) {
132 if (Arch == llvm::Triple::x86_64)
133 Arch = llvm::Triple::x86;
134 if (Arch == llvm::Triple::ppc64)
135 Arch = llvm::Triple::ppc;
136 } else {
137 if (Arch == llvm::Triple::x86)
138 Arch = llvm::Triple::x86_64;
139 if (Arch == llvm::Triple::ppc)
140 Arch = llvm::Triple::ppc64;
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000141 }
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000142 }
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000143 } else
144 Arch = llvm::Triple::getArchTypeForDarwinArchName(ArchName);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000145
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000146 assert(Arch != llvm::Triple::UnknownArch && "Unexpected arch!");
147 ToolChain *&TC = ToolChains[Arch];
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000148 if (!TC) {
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000149 llvm::Triple TCTriple(getTriple());
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000150 TCTriple.setArch(Arch);
Daniel Dunbar30392de2009-09-04 18:35:21 +0000151
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000152 // If we recognized the arch, match it to the toolchains we support.
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000153 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
154 // We still use the legacy DarwinGCC toolchain on X86.
155 TC = new toolchains::DarwinGCC(*this, TCTriple, DarwinVersion, GCCVersion,
156 false);
157 } else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
158 TC = new toolchains::DarwinClang(*this, TCTriple, DarwinVersion, true);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000159 else
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000160 TC = new toolchains::Darwin_Generic_GCC(*this, TCTriple);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000161 }
162
163 return TC;
Daniel Dunbare3995642009-03-10 23:50:49 +0000164}
165
166// Unknown Host Info
167
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000168/// UnknownHostInfo - Generic host information to use for unknown
169/// hosts.
170class UnknownHostInfo : public HostInfo {
171 /// Cache of tool chains we have created.
172 mutable llvm::StringMap<ToolChain*> ToolChains;
173
174public:
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000175 UnknownHostInfo(const Driver &D, const llvm::Triple& Triple);
Daniel Dunbar7e4534d2009-03-18 01:09:40 +0000176 ~UnknownHostInfo();
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000177
178 virtual bool useDriverDriver() const;
179
Daniel Dunbare33bea42009-03-20 23:39:23 +0000180 virtual types::ID lookupTypeForExtension(const char *Ext) const {
181 return types::lookupTypeForExtension(Ext);
182 }
183
Daniel Dunbard7502d02009-09-08 23:37:19 +0000184 virtual ToolChain *CreateToolChain(const ArgList &Args,
185 const char *ArchName) const;
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000186};
187
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000188UnknownHostInfo::UnknownHostInfo(const Driver &D, const llvm::Triple& Triple)
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000189 : HostInfo(D, Triple) {
Daniel Dunbare3995642009-03-10 23:50:49 +0000190}
191
Daniel Dunbar7e4534d2009-03-18 01:09:40 +0000192UnknownHostInfo::~UnknownHostInfo() {
193 for (llvm::StringMap<ToolChain*>::iterator
194 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
195 delete it->second;
196}
197
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000198bool UnknownHostInfo::useDriverDriver() const {
Daniel Dunbare3995642009-03-10 23:50:49 +0000199 return false;
200}
201
Daniel Dunbard7502d02009-09-08 23:37:19 +0000202ToolChain *UnknownHostInfo::CreateToolChain(const ArgList &Args,
203 const char *ArchName) const {
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000204 assert(!ArchName &&
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000205 "Unexpected arch name on platform without driver driver support.");
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000206
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000207 // Automatically handle some instances of -m32/-m64 we know about.
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000208 std::string Arch = getArchName();
209 ArchName = Arch.c_str();
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000210 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
Eli Friedman4e2567d2009-06-03 18:59:56 +0000211 if (Triple.getArch() == llvm::Triple::x86 ||
212 Triple.getArch() == llvm::Triple::x86_64) {
213 ArchName =
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000214 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
Eli Friedman4e2567d2009-06-03 18:59:56 +0000215 } else if (Triple.getArch() == llvm::Triple::ppc ||
216 Triple.getArch() == llvm::Triple::ppc64) {
217 ArchName =
Daniel Dunbarbf54a062009-04-01 20:33:11 +0000218 (A->getOption().getId() == options::OPT_m32) ? "powerpc" : "powerpc64";
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000219 }
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000220 }
221
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000222 ToolChain *&TC = ToolChains[ArchName];
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000223 if (!TC) {
224 llvm::Triple TCTriple(getTriple());
225 TCTriple.setArchName(ArchName);
226
227 TC = new toolchains::Generic_GCC(*this, TCTriple);
228 }
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000229
Daniel Dunbarb25c7c12009-03-18 01:39:08 +0000230 return TC;
Daniel Dunbare3995642009-03-10 23:50:49 +0000231}
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000232
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000233// OpenBSD Host Info
234
235/// OpenBSDHostInfo - OpenBSD host information implementation.
236class OpenBSDHostInfo : public HostInfo {
237 /// Cache of tool chains we have created.
238 mutable llvm::StringMap<ToolChain*> ToolChains;
239
240public:
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000241 OpenBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000242 : HostInfo(D, Triple) {}
243 ~OpenBSDHostInfo();
244
245 virtual bool useDriverDriver() const;
246
247 virtual types::ID lookupTypeForExtension(const char *Ext) const {
248 return types::lookupTypeForExtension(Ext);
249 }
250
Daniel Dunbard7502d02009-09-08 23:37:19 +0000251 virtual ToolChain *CreateToolChain(const ArgList &Args,
252 const char *ArchName) const;
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000253};
254
255OpenBSDHostInfo::~OpenBSDHostInfo() {
256 for (llvm::StringMap<ToolChain*>::iterator
257 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
258 delete it->second;
259}
260
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000261bool OpenBSDHostInfo::useDriverDriver() const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000262 return false;
263}
264
Daniel Dunbard7502d02009-09-08 23:37:19 +0000265ToolChain *OpenBSDHostInfo::CreateToolChain(const ArgList &Args,
266 const char *ArchName) const {
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000267 assert(!ArchName &&
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000268 "Unexpected arch name on platform without driver driver support.");
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000269
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000270 std::string Arch = getArchName();
271 ArchName = Arch.c_str();
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000272
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000273 ToolChain *&TC = ToolChains[ArchName];
274 if (!TC) {
275 llvm::Triple TCTriple(getTriple());
276 TCTriple.setArchName(ArchName);
277
278 TC = new toolchains::OpenBSD(*this, TCTriple);
279 }
280
281 return TC;
282}
283
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000284// AuroraUX Host Info
285
286/// AuroraUXHostInfo - AuroraUX host information implementation.
287class AuroraUXHostInfo : public HostInfo {
288 /// Cache of tool chains we have created.
289 mutable llvm::StringMap<ToolChain*> ToolChains;
290
291public:
292 AuroraUXHostInfo(const Driver &D, const llvm::Triple& Triple)
293 : HostInfo(D, Triple) {}
294 ~AuroraUXHostInfo();
295
296 virtual bool useDriverDriver() const;
297
298 virtual types::ID lookupTypeForExtension(const char *Ext) const {
299 return types::lookupTypeForExtension(Ext);
300 }
301
Daniel Dunbard7502d02009-09-08 23:37:19 +0000302 virtual ToolChain *CreateToolChain(const ArgList &Args,
303 const char *ArchName) const;
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000304};
305
306AuroraUXHostInfo::~AuroraUXHostInfo() {
307 for (llvm::StringMap<ToolChain*>::iterator
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000308 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000309 delete it->second;
310}
311
312bool AuroraUXHostInfo::useDriverDriver() const {
313 return false;
314}
315
Daniel Dunbard7502d02009-09-08 23:37:19 +0000316ToolChain *AuroraUXHostInfo::CreateToolChain(const ArgList &Args,
317 const char *ArchName) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000318 assert(!ArchName &&
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000319 "Unexpected arch name on platform without driver driver support.");
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000320
321 ToolChain *&TC = ToolChains[getArchName()];
322
323 if (!TC) {
324 llvm::Triple TCTriple(getTriple());
325 TCTriple.setArchName(getArchName());
326
327 TC = new toolchains::AuroraUX(*this, TCTriple);
328 }
329
330 return TC;
331}
332
Daniel Dunbar75358d22009-03-30 21:06:03 +0000333// FreeBSD Host Info
334
Daniel Dunbarb85f59d2009-03-30 22:11:38 +0000335/// FreeBSDHostInfo - FreeBSD host information implementation.
Daniel Dunbar75358d22009-03-30 21:06:03 +0000336class FreeBSDHostInfo : public HostInfo {
337 /// Cache of tool chains we have created.
338 mutable llvm::StringMap<ToolChain*> ToolChains;
339
340public:
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000341 FreeBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000342 : HostInfo(D, Triple) {}
Daniel Dunbar75358d22009-03-30 21:06:03 +0000343 ~FreeBSDHostInfo();
344
345 virtual bool useDriverDriver() const;
346
347 virtual types::ID lookupTypeForExtension(const char *Ext) const {
348 return types::lookupTypeForExtension(Ext);
349 }
350
Daniel Dunbard7502d02009-09-08 23:37:19 +0000351 virtual ToolChain *CreateToolChain(const ArgList &Args,
352 const char *ArchName) const;
Daniel Dunbar75358d22009-03-30 21:06:03 +0000353};
354
Daniel Dunbar75358d22009-03-30 21:06:03 +0000355FreeBSDHostInfo::~FreeBSDHostInfo() {
356 for (llvm::StringMap<ToolChain*>::iterator
357 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
358 delete it->second;
359}
360
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000361bool FreeBSDHostInfo::useDriverDriver() const {
Daniel Dunbar75358d22009-03-30 21:06:03 +0000362 return false;
363}
364
Daniel Dunbard7502d02009-09-08 23:37:19 +0000365ToolChain *FreeBSDHostInfo::CreateToolChain(const ArgList &Args,
366 const char *ArchName) const {
Daniel Dunbar75358d22009-03-30 21:06:03 +0000367 bool Lib32 = false;
368
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000369 assert(!ArchName &&
Daniel Dunbar75358d22009-03-30 21:06:03 +0000370 "Unexpected arch name on platform without driver driver support.");
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000371
Daniel Dunbar75358d22009-03-30 21:06:03 +0000372 // On x86_64 we need to be able to compile 32-bits binaries as well.
373 // Compiling 64-bit binaries on i386 is not supported. We don't have a
374 // lib64.
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000375 std::string Arch = getArchName();
376 ArchName = Arch.c_str();
Daniel Dunbar75358d22009-03-30 21:06:03 +0000377 if (Args.hasArg(options::OPT_m32) && getArchName() == "x86_64") {
378 ArchName = "i386";
379 Lib32 = true;
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000380 }
381
Daniel Dunbar75358d22009-03-30 21:06:03 +0000382 ToolChain *&TC = ToolChains[ArchName];
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000383 if (!TC) {
384 llvm::Triple TCTriple(getTriple());
385 TCTriple.setArchName(ArchName);
386
387 TC = new toolchains::FreeBSD(*this, TCTriple, Lib32);
388 }
Daniel Dunbar75358d22009-03-30 21:06:03 +0000389
390 return TC;
391}
392
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000393// DragonFly Host Info
394
395/// DragonFlyHostInfo - DragonFly host information implementation.
396class DragonFlyHostInfo : public HostInfo {
397 /// Cache of tool chains we have created.
398 mutable llvm::StringMap<ToolChain*> ToolChains;
399
400public:
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000401 DragonFlyHostInfo(const Driver &D, const llvm::Triple& Triple)
402 : HostInfo(D, Triple) {}
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000403 ~DragonFlyHostInfo();
404
405 virtual bool useDriverDriver() const;
406
407 virtual types::ID lookupTypeForExtension(const char *Ext) const {
408 return types::lookupTypeForExtension(Ext);
409 }
410
Daniel Dunbard7502d02009-09-08 23:37:19 +0000411 virtual ToolChain *CreateToolChain(const ArgList &Args,
412 const char *ArchName) const;
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000413};
414
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000415DragonFlyHostInfo::~DragonFlyHostInfo() {
416 for (llvm::StringMap<ToolChain*>::iterator
417 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
418 delete it->second;
419}
420
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000421bool DragonFlyHostInfo::useDriverDriver() const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000422 return false;
423}
424
Daniel Dunbard7502d02009-09-08 23:37:19 +0000425ToolChain *DragonFlyHostInfo::CreateToolChain(const ArgList &Args,
426 const char *ArchName) const {
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000427 assert(!ArchName &&
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000428 "Unexpected arch name on platform without driver driver support.");
429
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000430 ToolChain *&TC = ToolChains[getArchName()];
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000431
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000432 if (!TC) {
433 llvm::Triple TCTriple(getTriple());
434 TCTriple.setArchName(getArchName());
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000435
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000436 TC = new toolchains::DragonFly(*this, TCTriple);
437 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000438
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000439 return TC;
440}
441
Eli Friedman6b3454a2009-05-26 07:52:18 +0000442// Linux Host Info
443
444/// LinuxHostInfo - Linux host information implementation.
445class LinuxHostInfo : public HostInfo {
446 /// Cache of tool chains we have created.
447 mutable llvm::StringMap<ToolChain*> ToolChains;
448
449public:
450 LinuxHostInfo(const Driver &D, const llvm::Triple& Triple)
451 : HostInfo(D, Triple) {}
452 ~LinuxHostInfo();
453
454 virtual bool useDriverDriver() const;
455
456 virtual types::ID lookupTypeForExtension(const char *Ext) const {
457 return types::lookupTypeForExtension(Ext);
458 }
459
Daniel Dunbard7502d02009-09-08 23:37:19 +0000460 virtual ToolChain *CreateToolChain(const ArgList &Args,
461 const char *ArchName) const;
Eli Friedman6b3454a2009-05-26 07:52:18 +0000462};
463
464LinuxHostInfo::~LinuxHostInfo() {
465 for (llvm::StringMap<ToolChain*>::iterator
466 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
467 delete it->second;
468}
469
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000470bool LinuxHostInfo::useDriverDriver() const {
Eli Friedman6b3454a2009-05-26 07:52:18 +0000471 return false;
472}
473
Daniel Dunbard7502d02009-09-08 23:37:19 +0000474ToolChain *LinuxHostInfo::CreateToolChain(const ArgList &Args,
475 const char *ArchName) const {
Eli Friedman6b3454a2009-05-26 07:52:18 +0000476
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000477 assert(!ArchName &&
Eli Friedman6b3454a2009-05-26 07:52:18 +0000478 "Unexpected arch name on platform without driver driver support.");
479
Eli Friedman4e2567d2009-06-03 18:59:56 +0000480 // Automatically handle some instances of -m32/-m64 we know about.
481 std::string Arch = getArchName();
482 ArchName = Arch.c_str();
483 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
484 if (Triple.getArch() == llvm::Triple::x86 ||
485 Triple.getArch() == llvm::Triple::x86_64) {
486 ArchName =
487 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
488 } else if (Triple.getArch() == llvm::Triple::ppc ||
489 Triple.getArch() == llvm::Triple::ppc64) {
490 ArchName =
491 (A->getOption().getId() == options::OPT_m32) ? "powerpc" : "powerpc64";
492 }
493 }
494
Eli Friedman6b3454a2009-05-26 07:52:18 +0000495 ToolChain *&TC = ToolChains[ArchName];
496
497 if (!TC) {
498 llvm::Triple TCTriple(getTriple());
Eli Friedman4e2567d2009-06-03 18:59:56 +0000499 TCTriple.setArchName(ArchName);
Eli Friedman6b3454a2009-05-26 07:52:18 +0000500
501 TC = new toolchains::Linux(*this, TCTriple);
502 }
503
504 return TC;
505}
506
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000507}
508
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000509const HostInfo *
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000510clang::driver::createAuroraUXHostInfo(const Driver &D,
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000511 const llvm::Triple& Triple){
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000512 return new AuroraUXHostInfo(D, Triple);
513}
514
515const HostInfo *
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000516clang::driver::createDarwinHostInfo(const Driver &D,
517 const llvm::Triple& Triple){
518 return new DarwinHostInfo(D, Triple);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000519}
520
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000521const HostInfo *
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000522clang::driver::createOpenBSDHostInfo(const Driver &D,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000523 const llvm::Triple& Triple) {
524 return new OpenBSDHostInfo(D, Triple);
525}
526
527const HostInfo *
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000528clang::driver::createFreeBSDHostInfo(const Driver &D,
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000529 const llvm::Triple& Triple) {
530 return new FreeBSDHostInfo(D, Triple);
Daniel Dunbar75358d22009-03-30 21:06:03 +0000531}
532
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000533const HostInfo *
534clang::driver::createDragonFlyHostInfo(const Driver &D,
535 const llvm::Triple& Triple) {
536 return new DragonFlyHostInfo(D, Triple);
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000537}
538
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000539const HostInfo *
Eli Friedman6b3454a2009-05-26 07:52:18 +0000540clang::driver::createLinuxHostInfo(const Driver &D,
541 const llvm::Triple& Triple) {
542 return new LinuxHostInfo(D, Triple);
543}
544
545const HostInfo *
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000546clang::driver::createUnknownHostInfo(const Driver &D,
547 const llvm::Triple& Triple) {
548 return new UnknownHostInfo(D, Triple);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000549}