blob: 18bb78659305e71181ff867bc1b44a1cf069fee7 [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 Dunbar26031372010-01-27 00:56:25 +0000109 // to find the default tool chain (assuming it is valid).
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000110 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 Dunbarb827a052009-11-19 03:26:40 +0000125 if (A->getOption().matches(options::OPT_m32)) {
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000126 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.
Daniel Dunbarcc8e1892010-01-27 00:56:44 +0000149 TC = new toolchains::DarwinGCC(*this, TCTriple, DarwinVersion,
150 GCCVersion);
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000151 } else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Daniel Dunbarcc8e1892010-01-27 00:56:44 +0000152 TC = new toolchains::DarwinClang(*this, TCTriple, DarwinVersion);
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 Dunbar26031372010-01-27 00:56:25 +0000162/// UnknownHostInfo - Generic host information to use for unknown hosts.
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000163class UnknownHostInfo : public HostInfo {
164 /// Cache of tool chains we have created.
165 mutable llvm::StringMap<ToolChain*> ToolChains;
166
167public:
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000168 UnknownHostInfo(const Driver &D, const llvm::Triple& Triple);
Daniel Dunbar7e4534d2009-03-18 01:09:40 +0000169 ~UnknownHostInfo();
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000170
171 virtual bool useDriverDriver() const;
172
Daniel Dunbare33bea42009-03-20 23:39:23 +0000173 virtual types::ID lookupTypeForExtension(const char *Ext) const {
174 return types::lookupTypeForExtension(Ext);
175 }
176
Daniel Dunbard7502d02009-09-08 23:37:19 +0000177 virtual ToolChain *CreateToolChain(const ArgList &Args,
178 const char *ArchName) const;
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000179};
180
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000181UnknownHostInfo::UnknownHostInfo(const Driver &D, const llvm::Triple& Triple)
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000182 : HostInfo(D, Triple) {
Daniel Dunbare3995642009-03-10 23:50:49 +0000183}
184
Daniel Dunbar7e4534d2009-03-18 01:09:40 +0000185UnknownHostInfo::~UnknownHostInfo() {
186 for (llvm::StringMap<ToolChain*>::iterator
187 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
188 delete it->second;
189}
190
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000191bool UnknownHostInfo::useDriverDriver() const {
Daniel Dunbare3995642009-03-10 23:50:49 +0000192 return false;
193}
194
Daniel Dunbard7502d02009-09-08 23:37:19 +0000195ToolChain *UnknownHostInfo::CreateToolChain(const ArgList &Args,
196 const char *ArchName) const {
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000197 assert(!ArchName &&
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000198 "Unexpected arch name on platform without driver driver support.");
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000199
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000200 // Automatically handle some instances of -m32/-m64 we know about.
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000201 std::string Arch = getArchName();
202 ArchName = Arch.c_str();
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000203 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
Eli Friedman4e2567d2009-06-03 18:59:56 +0000204 if (Triple.getArch() == llvm::Triple::x86 ||
205 Triple.getArch() == llvm::Triple::x86_64) {
206 ArchName =
Daniel Dunbarb827a052009-11-19 03:26:40 +0000207 (A->getOption().matches(options::OPT_m32)) ? "i386" : "x86_64";
Eli Friedman4e2567d2009-06-03 18:59:56 +0000208 } else if (Triple.getArch() == llvm::Triple::ppc ||
209 Triple.getArch() == llvm::Triple::ppc64) {
210 ArchName =
Daniel Dunbarb827a052009-11-19 03:26:40 +0000211 (A->getOption().matches(options::OPT_m32)) ? "powerpc" : "powerpc64";
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000212 }
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000213 }
214
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000215 ToolChain *&TC = ToolChains[ArchName];
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000216 if (!TC) {
217 llvm::Triple TCTriple(getTriple());
218 TCTriple.setArchName(ArchName);
219
220 TC = new toolchains::Generic_GCC(*this, TCTriple);
221 }
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000222
Daniel Dunbarb25c7c12009-03-18 01:39:08 +0000223 return TC;
Daniel Dunbare3995642009-03-10 23:50:49 +0000224}
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000225
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000226// OpenBSD Host Info
227
228/// OpenBSDHostInfo - OpenBSD host information implementation.
229class OpenBSDHostInfo : public HostInfo {
230 /// Cache of tool chains we have created.
231 mutable llvm::StringMap<ToolChain*> ToolChains;
232
233public:
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000234 OpenBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000235 : HostInfo(D, Triple) {}
236 ~OpenBSDHostInfo();
237
238 virtual bool useDriverDriver() const;
239
240 virtual types::ID lookupTypeForExtension(const char *Ext) const {
241 return types::lookupTypeForExtension(Ext);
242 }
243
Daniel Dunbard7502d02009-09-08 23:37:19 +0000244 virtual ToolChain *CreateToolChain(const ArgList &Args,
245 const char *ArchName) const;
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000246};
247
248OpenBSDHostInfo::~OpenBSDHostInfo() {
249 for (llvm::StringMap<ToolChain*>::iterator
250 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
251 delete it->second;
252}
253
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000254bool OpenBSDHostInfo::useDriverDriver() const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000255 return false;
256}
257
Daniel Dunbard7502d02009-09-08 23:37:19 +0000258ToolChain *OpenBSDHostInfo::CreateToolChain(const ArgList &Args,
259 const char *ArchName) const {
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000260 assert(!ArchName &&
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000261 "Unexpected arch name on platform without driver driver support.");
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000262
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000263 std::string Arch = getArchName();
264 ArchName = Arch.c_str();
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000265
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000266 ToolChain *&TC = ToolChains[ArchName];
267 if (!TC) {
268 llvm::Triple TCTriple(getTriple());
269 TCTriple.setArchName(ArchName);
270
271 TC = new toolchains::OpenBSD(*this, TCTriple);
272 }
273
274 return TC;
275}
276
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000277// AuroraUX Host Info
278
279/// AuroraUXHostInfo - AuroraUX host information implementation.
280class AuroraUXHostInfo : public HostInfo {
281 /// Cache of tool chains we have created.
282 mutable llvm::StringMap<ToolChain*> ToolChains;
283
284public:
285 AuroraUXHostInfo(const Driver &D, const llvm::Triple& Triple)
286 : HostInfo(D, Triple) {}
287 ~AuroraUXHostInfo();
288
289 virtual bool useDriverDriver() const;
290
291 virtual types::ID lookupTypeForExtension(const char *Ext) const {
292 return types::lookupTypeForExtension(Ext);
293 }
294
Daniel Dunbard7502d02009-09-08 23:37:19 +0000295 virtual ToolChain *CreateToolChain(const ArgList &Args,
296 const char *ArchName) const;
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000297};
298
299AuroraUXHostInfo::~AuroraUXHostInfo() {
300 for (llvm::StringMap<ToolChain*>::iterator
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000301 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000302 delete it->second;
303}
304
305bool AuroraUXHostInfo::useDriverDriver() const {
306 return false;
307}
308
Daniel Dunbard7502d02009-09-08 23:37:19 +0000309ToolChain *AuroraUXHostInfo::CreateToolChain(const ArgList &Args,
310 const char *ArchName) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000311 assert(!ArchName &&
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000312 "Unexpected arch name on platform without driver driver support.");
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000313
314 ToolChain *&TC = ToolChains[getArchName()];
315
316 if (!TC) {
317 llvm::Triple TCTriple(getTriple());
318 TCTriple.setArchName(getArchName());
319
320 TC = new toolchains::AuroraUX(*this, TCTriple);
321 }
322
323 return TC;
324}
325
Daniel Dunbar75358d22009-03-30 21:06:03 +0000326// FreeBSD Host Info
327
Daniel Dunbarb85f59d2009-03-30 22:11:38 +0000328/// FreeBSDHostInfo - FreeBSD host information implementation.
Daniel Dunbar75358d22009-03-30 21:06:03 +0000329class FreeBSDHostInfo : public HostInfo {
330 /// Cache of tool chains we have created.
331 mutable llvm::StringMap<ToolChain*> ToolChains;
332
333public:
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000334 FreeBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000335 : HostInfo(D, Triple) {}
Daniel Dunbar75358d22009-03-30 21:06:03 +0000336 ~FreeBSDHostInfo();
337
338 virtual bool useDriverDriver() const;
339
340 virtual types::ID lookupTypeForExtension(const char *Ext) const {
341 return types::lookupTypeForExtension(Ext);
342 }
343
Daniel Dunbard7502d02009-09-08 23:37:19 +0000344 virtual ToolChain *CreateToolChain(const ArgList &Args,
345 const char *ArchName) const;
Daniel Dunbar75358d22009-03-30 21:06:03 +0000346};
347
Daniel Dunbar75358d22009-03-30 21:06:03 +0000348FreeBSDHostInfo::~FreeBSDHostInfo() {
349 for (llvm::StringMap<ToolChain*>::iterator
350 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
351 delete it->second;
352}
353
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000354bool FreeBSDHostInfo::useDriverDriver() const {
Daniel Dunbar75358d22009-03-30 21:06:03 +0000355 return false;
356}
357
Daniel Dunbard7502d02009-09-08 23:37:19 +0000358ToolChain *FreeBSDHostInfo::CreateToolChain(const ArgList &Args,
359 const char *ArchName) const {
Daniel Dunbar75358d22009-03-30 21:06:03 +0000360 bool Lib32 = false;
361
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000362 assert(!ArchName &&
Daniel Dunbar75358d22009-03-30 21:06:03 +0000363 "Unexpected arch name on platform without driver driver support.");
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000364
Daniel Dunbar75358d22009-03-30 21:06:03 +0000365 // On x86_64 we need to be able to compile 32-bits binaries as well.
366 // Compiling 64-bit binaries on i386 is not supported. We don't have a
367 // lib64.
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000368 std::string Arch = getArchName();
369 ArchName = Arch.c_str();
Daniel Dunbar75358d22009-03-30 21:06:03 +0000370 if (Args.hasArg(options::OPT_m32) && getArchName() == "x86_64") {
371 ArchName = "i386";
372 Lib32 = true;
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000373 }
374
Daniel Dunbar75358d22009-03-30 21:06:03 +0000375 ToolChain *&TC = ToolChains[ArchName];
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000376 if (!TC) {
377 llvm::Triple TCTriple(getTriple());
378 TCTriple.setArchName(ArchName);
379
380 TC = new toolchains::FreeBSD(*this, TCTriple, Lib32);
381 }
Daniel Dunbar75358d22009-03-30 21:06:03 +0000382
383 return TC;
384}
385
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000386// DragonFly Host Info
387
388/// DragonFlyHostInfo - DragonFly host information implementation.
389class DragonFlyHostInfo : public HostInfo {
390 /// Cache of tool chains we have created.
391 mutable llvm::StringMap<ToolChain*> ToolChains;
392
393public:
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000394 DragonFlyHostInfo(const Driver &D, const llvm::Triple& Triple)
395 : HostInfo(D, Triple) {}
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000396 ~DragonFlyHostInfo();
397
398 virtual bool useDriverDriver() const;
399
400 virtual types::ID lookupTypeForExtension(const char *Ext) const {
401 return types::lookupTypeForExtension(Ext);
402 }
403
Daniel Dunbard7502d02009-09-08 23:37:19 +0000404 virtual ToolChain *CreateToolChain(const ArgList &Args,
405 const char *ArchName) const;
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000406};
407
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000408DragonFlyHostInfo::~DragonFlyHostInfo() {
409 for (llvm::StringMap<ToolChain*>::iterator
410 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
411 delete it->second;
412}
413
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000414bool DragonFlyHostInfo::useDriverDriver() const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000415 return false;
416}
417
Daniel Dunbard7502d02009-09-08 23:37:19 +0000418ToolChain *DragonFlyHostInfo::CreateToolChain(const ArgList &Args,
419 const char *ArchName) const {
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000420 assert(!ArchName &&
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000421 "Unexpected arch name on platform without driver driver support.");
422
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000423 ToolChain *&TC = ToolChains[getArchName()];
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000424
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000425 if (!TC) {
426 llvm::Triple TCTriple(getTriple());
427 TCTriple.setArchName(getArchName());
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000428
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000429 TC = new toolchains::DragonFly(*this, TCTriple);
430 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000431
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000432 return TC;
433}
434
Eli Friedman6b3454a2009-05-26 07:52:18 +0000435// Linux Host Info
436
437/// LinuxHostInfo - Linux host information implementation.
438class LinuxHostInfo : public HostInfo {
439 /// Cache of tool chains we have created.
440 mutable llvm::StringMap<ToolChain*> ToolChains;
441
442public:
443 LinuxHostInfo(const Driver &D, const llvm::Triple& Triple)
444 : HostInfo(D, Triple) {}
445 ~LinuxHostInfo();
446
447 virtual bool useDriverDriver() const;
448
449 virtual types::ID lookupTypeForExtension(const char *Ext) const {
450 return types::lookupTypeForExtension(Ext);
451 }
452
Daniel Dunbard7502d02009-09-08 23:37:19 +0000453 virtual ToolChain *CreateToolChain(const ArgList &Args,
454 const char *ArchName) const;
Eli Friedman6b3454a2009-05-26 07:52:18 +0000455};
456
457LinuxHostInfo::~LinuxHostInfo() {
458 for (llvm::StringMap<ToolChain*>::iterator
459 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
460 delete it->second;
461}
462
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000463bool LinuxHostInfo::useDriverDriver() const {
Eli Friedman6b3454a2009-05-26 07:52:18 +0000464 return false;
465}
466
Daniel Dunbard7502d02009-09-08 23:37:19 +0000467ToolChain *LinuxHostInfo::CreateToolChain(const ArgList &Args,
468 const char *ArchName) const {
Eli Friedman6b3454a2009-05-26 07:52:18 +0000469
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000470 assert(!ArchName &&
Eli Friedman6b3454a2009-05-26 07:52:18 +0000471 "Unexpected arch name on platform without driver driver support.");
472
Eli Friedman4e2567d2009-06-03 18:59:56 +0000473 // Automatically handle some instances of -m32/-m64 we know about.
474 std::string Arch = getArchName();
475 ArchName = Arch.c_str();
476 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
477 if (Triple.getArch() == llvm::Triple::x86 ||
478 Triple.getArch() == llvm::Triple::x86_64) {
479 ArchName =
Daniel Dunbarb827a052009-11-19 03:26:40 +0000480 (A->getOption().matches(options::OPT_m32)) ? "i386" : "x86_64";
Eli Friedman4e2567d2009-06-03 18:59:56 +0000481 } else if (Triple.getArch() == llvm::Triple::ppc ||
482 Triple.getArch() == llvm::Triple::ppc64) {
483 ArchName =
Daniel Dunbarb827a052009-11-19 03:26:40 +0000484 (A->getOption().matches(options::OPT_m32)) ? "powerpc" : "powerpc64";
Eli Friedman4e2567d2009-06-03 18:59:56 +0000485 }
486 }
487
Eli Friedman6b3454a2009-05-26 07:52:18 +0000488 ToolChain *&TC = ToolChains[ArchName];
489
490 if (!TC) {
491 llvm::Triple TCTriple(getTriple());
Eli Friedman4e2567d2009-06-03 18:59:56 +0000492 TCTriple.setArchName(ArchName);
Eli Friedman6b3454a2009-05-26 07:52:18 +0000493
494 TC = new toolchains::Linux(*this, TCTriple);
495 }
496
497 return TC;
498}
499
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000500}
501
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000502const HostInfo *
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000503clang::driver::createAuroraUXHostInfo(const Driver &D,
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000504 const llvm::Triple& Triple){
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000505 return new AuroraUXHostInfo(D, Triple);
506}
507
508const HostInfo *
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000509clang::driver::createDarwinHostInfo(const Driver &D,
510 const llvm::Triple& Triple){
511 return new DarwinHostInfo(D, Triple);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000512}
513
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000514const HostInfo *
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000515clang::driver::createOpenBSDHostInfo(const Driver &D,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000516 const llvm::Triple& Triple) {
517 return new OpenBSDHostInfo(D, Triple);
518}
519
520const HostInfo *
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000521clang::driver::createFreeBSDHostInfo(const Driver &D,
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000522 const llvm::Triple& Triple) {
523 return new FreeBSDHostInfo(D, Triple);
Daniel Dunbar75358d22009-03-30 21:06:03 +0000524}
525
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000526const HostInfo *
527clang::driver::createDragonFlyHostInfo(const Driver &D,
528 const llvm::Triple& Triple) {
529 return new DragonFlyHostInfo(D, Triple);
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000530}
531
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000532const HostInfo *
Eli Friedman6b3454a2009-05-26 07:52:18 +0000533clang::driver::createLinuxHostInfo(const Driver &D,
534 const llvm::Triple& Triple) {
535 return new LinuxHostInfo(D, Triple);
536}
537
538const HostInfo *
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000539clang::driver::createUnknownHostInfo(const Driver &D,
540 const llvm::Triple& Triple) {
541 return new UnknownHostInfo(D, Triple);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000542}