blob: 08c4ef490017c3ecfb37873070b6ac9f6e3dfe37 [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.
Ted Kremenek55bac532009-10-07 03:21:11 +000045 unsigned GCCVersion[3];
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;
87}
88
Daniel Dunbar7e4534d2009-03-18 01:09:40 +000089DarwinHostInfo::~DarwinHostInfo() {
Daniel Dunbar7ef7f132009-09-08 23:37:36 +000090 for (llvm::DenseMap<unsigned, ToolChain*>::iterator
Daniel Dunbar7e4534d2009-03-18 01:09:40 +000091 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
92 delete it->second;
93}
94
Daniel Dunbarfe8aa472009-09-08 23:37:08 +000095bool DarwinHostInfo::useDriverDriver() const {
Daniel Dunbare3995642009-03-10 23:50:49 +000096 return true;
97}
98
Daniel Dunbard7502d02009-09-08 23:37:19 +000099ToolChain *DarwinHostInfo::CreateToolChain(const ArgList &Args,
100 const char *ArchName) const {
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000101 llvm::Triple::ArchType Arch;
102
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000103 if (!ArchName) {
Daniel Dunbarf2edbf32009-06-16 21:39:33 +0000104 // If we aren't looking for a specific arch, infer the default architecture
105 // based on -arch and -m32/-m64 command line options.
106 if (Arg *A = Args.getLastArg(options::OPT_arch)) {
107 // The gcc driver behavior with multiple -arch flags wasn't consistent for
108 // things which rely on a default architecture. We just use the last -arch
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000109 // to find the default tool chain (assuming it is valid..
110 Arch = llvm::Triple::getArchTypeForDarwinArchName(A->getValue(Args));
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000111
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000112 // If it was invalid just use the host, we will reject this command line
113 // later.
114 if (Arch == llvm::Triple::UnknownArch)
115 Arch = getTriple().getArch();
Daniel Dunbarf2edbf32009-06-16 21:39:33 +0000116 } else {
117 // Otherwise default to the arch of the host.
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000118 Arch = getTriple().getArch();
Daniel Dunbarf2edbf32009-06-16 21:39:33 +0000119 }
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000120
Daniel Dunbarf2edbf32009-06-16 21:39:33 +0000121 // Honor -m32 and -m64 when finding the default tool chain.
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000122 //
123 // FIXME: Should this information be in llvm::Triple?
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000124 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000125 if (A->getOption().getId() == options::OPT_m32) {
126 if (Arch == llvm::Triple::x86_64)
127 Arch = llvm::Triple::x86;
128 if (Arch == llvm::Triple::ppc64)
129 Arch = llvm::Triple::ppc;
130 } else {
131 if (Arch == llvm::Triple::x86)
132 Arch = llvm::Triple::x86_64;
133 if (Arch == llvm::Triple::ppc)
134 Arch = llvm::Triple::ppc64;
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000135 }
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000136 }
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000137 } else
138 Arch = llvm::Triple::getArchTypeForDarwinArchName(ArchName);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000139
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000140 assert(Arch != llvm::Triple::UnknownArch && "Unexpected arch!");
141 ToolChain *&TC = ToolChains[Arch];
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000142 if (!TC) {
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000143 llvm::Triple TCTriple(getTriple());
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000144 TCTriple.setArch(Arch);
Daniel Dunbar30392de2009-09-04 18:35:21 +0000145
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000146 // If we recognized the arch, match it to the toolchains we support.
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000147 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
148 // We still use the legacy DarwinGCC toolchain on X86.
149 TC = new toolchains::DarwinGCC(*this, TCTriple, DarwinVersion, GCCVersion,
150 false);
151 } else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
152 TC = new toolchains::DarwinClang(*this, TCTriple, DarwinVersion, true);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000153 else
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000154 TC = new toolchains::Darwin_Generic_GCC(*this, TCTriple);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000155 }
156
157 return TC;
Daniel Dunbare3995642009-03-10 23:50:49 +0000158}
159
160// Unknown Host Info
161
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000162/// UnknownHostInfo - Generic host information to use for unknown
163/// hosts.
164class UnknownHostInfo : public HostInfo {
165 /// Cache of tool chains we have created.
166 mutable llvm::StringMap<ToolChain*> ToolChains;
167
168public:
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000169 UnknownHostInfo(const Driver &D, const llvm::Triple& Triple);
Daniel Dunbar7e4534d2009-03-18 01:09:40 +0000170 ~UnknownHostInfo();
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000171
172 virtual bool useDriverDriver() const;
173
Daniel Dunbare33bea42009-03-20 23:39:23 +0000174 virtual types::ID lookupTypeForExtension(const char *Ext) const {
175 return types::lookupTypeForExtension(Ext);
176 }
177
Daniel Dunbard7502d02009-09-08 23:37:19 +0000178 virtual ToolChain *CreateToolChain(const ArgList &Args,
179 const char *ArchName) const;
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000180};
181
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000182UnknownHostInfo::UnknownHostInfo(const Driver &D, const llvm::Triple& Triple)
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000183 : HostInfo(D, Triple) {
Daniel Dunbare3995642009-03-10 23:50:49 +0000184}
185
Daniel Dunbar7e4534d2009-03-18 01:09:40 +0000186UnknownHostInfo::~UnknownHostInfo() {
187 for (llvm::StringMap<ToolChain*>::iterator
188 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
189 delete it->second;
190}
191
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000192bool UnknownHostInfo::useDriverDriver() const {
Daniel Dunbare3995642009-03-10 23:50:49 +0000193 return false;
194}
195
Daniel Dunbard7502d02009-09-08 23:37:19 +0000196ToolChain *UnknownHostInfo::CreateToolChain(const ArgList &Args,
197 const char *ArchName) const {
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000198 assert(!ArchName &&
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000199 "Unexpected arch name on platform without driver driver support.");
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000200
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000201 // Automatically handle some instances of -m32/-m64 we know about.
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000202 std::string Arch = getArchName();
203 ArchName = Arch.c_str();
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000204 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
Eli Friedman4e2567d2009-06-03 18:59:56 +0000205 if (Triple.getArch() == llvm::Triple::x86 ||
206 Triple.getArch() == llvm::Triple::x86_64) {
207 ArchName =
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000208 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
Eli Friedman4e2567d2009-06-03 18:59:56 +0000209 } else if (Triple.getArch() == llvm::Triple::ppc ||
210 Triple.getArch() == llvm::Triple::ppc64) {
211 ArchName =
Daniel Dunbarbf54a062009-04-01 20:33:11 +0000212 (A->getOption().getId() == options::OPT_m32) ? "powerpc" : "powerpc64";
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000213 }
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000214 }
215
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000216 ToolChain *&TC = ToolChains[ArchName];
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000217 if (!TC) {
218 llvm::Triple TCTriple(getTriple());
219 TCTriple.setArchName(ArchName);
220
221 TC = new toolchains::Generic_GCC(*this, TCTriple);
222 }
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000223
Daniel Dunbarb25c7c12009-03-18 01:39:08 +0000224 return TC;
Daniel Dunbare3995642009-03-10 23:50:49 +0000225}
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000226
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000227// OpenBSD Host Info
228
229/// OpenBSDHostInfo - OpenBSD host information implementation.
230class OpenBSDHostInfo : public HostInfo {
231 /// Cache of tool chains we have created.
232 mutable llvm::StringMap<ToolChain*> ToolChains;
233
234public:
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000235 OpenBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000236 : HostInfo(D, Triple) {}
237 ~OpenBSDHostInfo();
238
239 virtual bool useDriverDriver() const;
240
241 virtual types::ID lookupTypeForExtension(const char *Ext) const {
242 return types::lookupTypeForExtension(Ext);
243 }
244
Daniel Dunbard7502d02009-09-08 23:37:19 +0000245 virtual ToolChain *CreateToolChain(const ArgList &Args,
246 const char *ArchName) const;
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000247};
248
249OpenBSDHostInfo::~OpenBSDHostInfo() {
250 for (llvm::StringMap<ToolChain*>::iterator
251 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
252 delete it->second;
253}
254
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000255bool OpenBSDHostInfo::useDriverDriver() const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000256 return false;
257}
258
Daniel Dunbard7502d02009-09-08 23:37:19 +0000259ToolChain *OpenBSDHostInfo::CreateToolChain(const ArgList &Args,
260 const char *ArchName) const {
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000261 assert(!ArchName &&
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000262 "Unexpected arch name on platform without driver driver support.");
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000263
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000264 std::string Arch = getArchName();
265 ArchName = Arch.c_str();
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000266
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000267 ToolChain *&TC = ToolChains[ArchName];
268 if (!TC) {
269 llvm::Triple TCTriple(getTriple());
270 TCTriple.setArchName(ArchName);
271
272 TC = new toolchains::OpenBSD(*this, TCTriple);
273 }
274
275 return TC;
276}
277
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000278// AuroraUX Host Info
279
280/// AuroraUXHostInfo - AuroraUX host information implementation.
281class AuroraUXHostInfo : public HostInfo {
282 /// Cache of tool chains we have created.
283 mutable llvm::StringMap<ToolChain*> ToolChains;
284
285public:
286 AuroraUXHostInfo(const Driver &D, const llvm::Triple& Triple)
287 : HostInfo(D, Triple) {}
288 ~AuroraUXHostInfo();
289
290 virtual bool useDriverDriver() const;
291
292 virtual types::ID lookupTypeForExtension(const char *Ext) const {
293 return types::lookupTypeForExtension(Ext);
294 }
295
Daniel Dunbard7502d02009-09-08 23:37:19 +0000296 virtual ToolChain *CreateToolChain(const ArgList &Args,
297 const char *ArchName) const;
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000298};
299
300AuroraUXHostInfo::~AuroraUXHostInfo() {
301 for (llvm::StringMap<ToolChain*>::iterator
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000302 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000303 delete it->second;
304}
305
306bool AuroraUXHostInfo::useDriverDriver() const {
307 return false;
308}
309
Daniel Dunbard7502d02009-09-08 23:37:19 +0000310ToolChain *AuroraUXHostInfo::CreateToolChain(const ArgList &Args,
311 const char *ArchName) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000312 assert(!ArchName &&
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000313 "Unexpected arch name on platform without driver driver support.");
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000314
315 ToolChain *&TC = ToolChains[getArchName()];
316
317 if (!TC) {
318 llvm::Triple TCTriple(getTriple());
319 TCTriple.setArchName(getArchName());
320
321 TC = new toolchains::AuroraUX(*this, TCTriple);
322 }
323
324 return TC;
325}
326
Daniel Dunbar75358d22009-03-30 21:06:03 +0000327// FreeBSD Host Info
328
Daniel Dunbarb85f59d2009-03-30 22:11:38 +0000329/// FreeBSDHostInfo - FreeBSD host information implementation.
Daniel Dunbar75358d22009-03-30 21:06:03 +0000330class FreeBSDHostInfo : public HostInfo {
331 /// Cache of tool chains we have created.
332 mutable llvm::StringMap<ToolChain*> ToolChains;
333
334public:
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000335 FreeBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000336 : HostInfo(D, Triple) {}
Daniel Dunbar75358d22009-03-30 21:06:03 +0000337 ~FreeBSDHostInfo();
338
339 virtual bool useDriverDriver() const;
340
341 virtual types::ID lookupTypeForExtension(const char *Ext) const {
342 return types::lookupTypeForExtension(Ext);
343 }
344
Daniel Dunbard7502d02009-09-08 23:37:19 +0000345 virtual ToolChain *CreateToolChain(const ArgList &Args,
346 const char *ArchName) const;
Daniel Dunbar75358d22009-03-30 21:06:03 +0000347};
348
Daniel Dunbar75358d22009-03-30 21:06:03 +0000349FreeBSDHostInfo::~FreeBSDHostInfo() {
350 for (llvm::StringMap<ToolChain*>::iterator
351 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
352 delete it->second;
353}
354
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000355bool FreeBSDHostInfo::useDriverDriver() const {
Daniel Dunbar75358d22009-03-30 21:06:03 +0000356 return false;
357}
358
Daniel Dunbard7502d02009-09-08 23:37:19 +0000359ToolChain *FreeBSDHostInfo::CreateToolChain(const ArgList &Args,
360 const char *ArchName) const {
Daniel Dunbar75358d22009-03-30 21:06:03 +0000361 bool Lib32 = false;
362
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000363 assert(!ArchName &&
Daniel Dunbar75358d22009-03-30 21:06:03 +0000364 "Unexpected arch name on platform without driver driver support.");
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000365
Daniel Dunbar75358d22009-03-30 21:06:03 +0000366 // On x86_64 we need to be able to compile 32-bits binaries as well.
367 // Compiling 64-bit binaries on i386 is not supported. We don't have a
368 // lib64.
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000369 std::string Arch = getArchName();
370 ArchName = Arch.c_str();
Daniel Dunbar75358d22009-03-30 21:06:03 +0000371 if (Args.hasArg(options::OPT_m32) && getArchName() == "x86_64") {
372 ArchName = "i386";
373 Lib32 = true;
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000374 }
375
Daniel Dunbar75358d22009-03-30 21:06:03 +0000376 ToolChain *&TC = ToolChains[ArchName];
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000377 if (!TC) {
378 llvm::Triple TCTriple(getTriple());
379 TCTriple.setArchName(ArchName);
380
381 TC = new toolchains::FreeBSD(*this, TCTriple, Lib32);
382 }
Daniel Dunbar75358d22009-03-30 21:06:03 +0000383
384 return TC;
385}
386
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000387// DragonFly Host Info
388
389/// DragonFlyHostInfo - DragonFly host information implementation.
390class DragonFlyHostInfo : public HostInfo {
391 /// Cache of tool chains we have created.
392 mutable llvm::StringMap<ToolChain*> ToolChains;
393
394public:
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000395 DragonFlyHostInfo(const Driver &D, const llvm::Triple& Triple)
396 : HostInfo(D, Triple) {}
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000397 ~DragonFlyHostInfo();
398
399 virtual bool useDriverDriver() const;
400
401 virtual types::ID lookupTypeForExtension(const char *Ext) const {
402 return types::lookupTypeForExtension(Ext);
403 }
404
Daniel Dunbard7502d02009-09-08 23:37:19 +0000405 virtual ToolChain *CreateToolChain(const ArgList &Args,
406 const char *ArchName) const;
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000407};
408
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000409DragonFlyHostInfo::~DragonFlyHostInfo() {
410 for (llvm::StringMap<ToolChain*>::iterator
411 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
412 delete it->second;
413}
414
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000415bool DragonFlyHostInfo::useDriverDriver() const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000416 return false;
417}
418
Daniel Dunbard7502d02009-09-08 23:37:19 +0000419ToolChain *DragonFlyHostInfo::CreateToolChain(const ArgList &Args,
420 const char *ArchName) const {
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000421 assert(!ArchName &&
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000422 "Unexpected arch name on platform without driver driver support.");
423
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000424 ToolChain *&TC = ToolChains[getArchName()];
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000425
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000426 if (!TC) {
427 llvm::Triple TCTriple(getTriple());
428 TCTriple.setArchName(getArchName());
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000429
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000430 TC = new toolchains::DragonFly(*this, TCTriple);
431 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000432
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000433 return TC;
434}
435
Eli Friedman6b3454a2009-05-26 07:52:18 +0000436// Linux Host Info
437
438/// LinuxHostInfo - Linux host information implementation.
439class LinuxHostInfo : public HostInfo {
440 /// Cache of tool chains we have created.
441 mutable llvm::StringMap<ToolChain*> ToolChains;
442
443public:
444 LinuxHostInfo(const Driver &D, const llvm::Triple& Triple)
445 : HostInfo(D, Triple) {}
446 ~LinuxHostInfo();
447
448 virtual bool useDriverDriver() const;
449
450 virtual types::ID lookupTypeForExtension(const char *Ext) const {
451 return types::lookupTypeForExtension(Ext);
452 }
453
Daniel Dunbard7502d02009-09-08 23:37:19 +0000454 virtual ToolChain *CreateToolChain(const ArgList &Args,
455 const char *ArchName) const;
Eli Friedman6b3454a2009-05-26 07:52:18 +0000456};
457
458LinuxHostInfo::~LinuxHostInfo() {
459 for (llvm::StringMap<ToolChain*>::iterator
460 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
461 delete it->second;
462}
463
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000464bool LinuxHostInfo::useDriverDriver() const {
Eli Friedman6b3454a2009-05-26 07:52:18 +0000465 return false;
466}
467
Daniel Dunbard7502d02009-09-08 23:37:19 +0000468ToolChain *LinuxHostInfo::CreateToolChain(const ArgList &Args,
469 const char *ArchName) const {
Eli Friedman6b3454a2009-05-26 07:52:18 +0000470
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000471 assert(!ArchName &&
Eli Friedman6b3454a2009-05-26 07:52:18 +0000472 "Unexpected arch name on platform without driver driver support.");
473
Eli Friedman4e2567d2009-06-03 18:59:56 +0000474 // Automatically handle some instances of -m32/-m64 we know about.
475 std::string Arch = getArchName();
476 ArchName = Arch.c_str();
477 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
478 if (Triple.getArch() == llvm::Triple::x86 ||
479 Triple.getArch() == llvm::Triple::x86_64) {
480 ArchName =
481 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
482 } else if (Triple.getArch() == llvm::Triple::ppc ||
483 Triple.getArch() == llvm::Triple::ppc64) {
484 ArchName =
485 (A->getOption().getId() == options::OPT_m32) ? "powerpc" : "powerpc64";
486 }
487 }
488
Eli Friedman6b3454a2009-05-26 07:52:18 +0000489 ToolChain *&TC = ToolChains[ArchName];
490
491 if (!TC) {
492 llvm::Triple TCTriple(getTriple());
Eli Friedman4e2567d2009-06-03 18:59:56 +0000493 TCTriple.setArchName(ArchName);
Eli Friedman6b3454a2009-05-26 07:52:18 +0000494
495 TC = new toolchains::Linux(*this, TCTriple);
496 }
497
498 return TC;
499}
500
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000501}
502
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000503const HostInfo *
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000504clang::driver::createAuroraUXHostInfo(const Driver &D,
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000505 const llvm::Triple& Triple){
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000506 return new AuroraUXHostInfo(D, Triple);
507}
508
509const HostInfo *
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000510clang::driver::createDarwinHostInfo(const Driver &D,
511 const llvm::Triple& Triple){
512 return new DarwinHostInfo(D, Triple);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000513}
514
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000515const HostInfo *
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000516clang::driver::createOpenBSDHostInfo(const Driver &D,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000517 const llvm::Triple& Triple) {
518 return new OpenBSDHostInfo(D, Triple);
519}
520
521const HostInfo *
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000522clang::driver::createFreeBSDHostInfo(const Driver &D,
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000523 const llvm::Triple& Triple) {
524 return new FreeBSDHostInfo(D, Triple);
Daniel Dunbar75358d22009-03-30 21:06:03 +0000525}
526
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000527const HostInfo *
528clang::driver::createDragonFlyHostInfo(const Driver &D,
529 const llvm::Triple& Triple) {
530 return new DragonFlyHostInfo(D, Triple);
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000531}
532
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000533const HostInfo *
Eli Friedman6b3454a2009-05-26 07:52:18 +0000534clang::driver::createLinuxHostInfo(const Driver &D,
535 const llvm::Triple& Triple) {
536 return new LinuxHostInfo(D, Triple);
537}
538
539const HostInfo *
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000540clang::driver::createUnknownHostInfo(const Driver &D,
541 const llvm::Triple& Triple) {
542 return new UnknownHostInfo(D, Triple);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000543}