blob: ceb4ed10231461907983ec70e30d60f4d7597e0f [file] [log] [blame]
Daniel Dunbarc1376b62009-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 Dunbar7424b8a2009-03-17 19:00:50 +000011
12#include "clang/Driver/Arg.h"
13#include "clang/Driver/ArgList.h"
Daniel Dunbard9be9092009-03-20 18:21:51 +000014#include "clang/Driver/Driver.h"
15#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar7424b8a2009-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 Dunbara12df5c2009-03-17 21:38:00 +000022#include "ToolChains.h"
23
Daniel Dunbar7424b8a2009-03-17 19:00:50 +000024#include <cassert>
Daniel Dunbar522d6de2009-09-08 23:37:08 +000025
Daniel Dunbarc1376b62009-03-10 23:50:49 +000026using namespace clang::driver;
27
Daniel Dunbar08303652009-05-22 02:53:45 +000028HostInfo::HostInfo(const Driver &D, const llvm::Triple &_Triple)
29 : TheDriver(D), Triple(_Triple)
Daniel Dunbarc1376b62009-03-10 23:50:49 +000030{
Daniel Dunbar522d6de2009-09-08 23:37:08 +000031
Daniel Dunbarc1376b62009-03-10 23:50:49 +000032}
33
34HostInfo::~HostInfo() {
35}
36
Chris Lattner8db5bfd2009-03-17 22:24:01 +000037namespace {
Daniel Dunbar7424b8a2009-03-17 19:00:50 +000038
Daniel Dunbarc1376b62009-03-10 23:50:49 +000039// Darwin Host Info
40
Daniel Dunbar7424b8a2009-03-17 19:00:50 +000041/// DarwinHostInfo - Darwin host information implementation.
42class DarwinHostInfo : public HostInfo {
43 /// Darwin version of host.
44 unsigned DarwinVersion[3];
45
46 /// GCC version to use on this host.
47 unsigned GCCVersion[3];
48
49 /// Cache of tool chains we have created.
Daniel Dunbar96460f72009-09-08 23:37:36 +000050 mutable llvm::DenseMap<unsigned, ToolChain*> ToolChains;
Daniel Dunbar7424b8a2009-03-17 19:00:50 +000051
52public:
Daniel Dunbar08303652009-05-22 02:53:45 +000053 DarwinHostInfo(const Driver &D, const llvm::Triple &Triple);
Daniel Dunbar2f8b37e2009-03-18 01:09:40 +000054 ~DarwinHostInfo();
Daniel Dunbar7424b8a2009-03-17 19:00:50 +000055
56 virtual bool useDriverDriver() const;
57
Daniel Dunbar7b6dfbd2009-03-20 23:39:23 +000058 virtual types::ID lookupTypeForExtension(const char *Ext) const {
59 types::ID Ty = types::lookupTypeForExtension(Ext);
60
61 // Darwin always preprocesses assembly files (unless -x is used
62 // explicitly).
63 if (Ty == types::TY_PP_Asm)
64 return types::TY_Asm;
65
66 return Ty;
67 }
68
Daniel Dunbar31a70e92009-09-08 23:37:19 +000069 virtual ToolChain *CreateToolChain(const ArgList &Args,
70 const char *ArchName) const;
Daniel Dunbar7424b8a2009-03-17 19:00:50 +000071};
72
Daniel Dunbar08303652009-05-22 02:53:45 +000073DarwinHostInfo::DarwinHostInfo(const Driver &D, const llvm::Triple& Triple)
74 : HostInfo(D, Triple) {
Daniel Dunbar522d6de2009-09-08 23:37:08 +000075
Daniel Dunbar96460f72009-09-08 23:37:36 +000076 assert(Triple.getArch() != llvm::Triple::UnknownArch && "Invalid arch!");
Daniel Dunbard9be9092009-03-20 18:21:51 +000077 assert(memcmp(&getOSName()[0], "darwin", 6) == 0 &&
78 "Unknown Darwin platform.");
Daniel Dunbar9cdd4d42009-03-26 15:58:36 +000079 bool HadExtra;
Daniel Dunbar522d6de2009-09-08 23:37:08 +000080 if (!Driver::GetReleaseVersion(&getOSName()[6],
81 DarwinVersion[0], DarwinVersion[1],
Daniel Dunbar96460f72009-09-08 23:37:36 +000082 DarwinVersion[2], HadExtra))
83 D.Diag(clang::diag::err_drv_invalid_darwin_version) << getOSName();
Daniel Dunbar522d6de2009-09-08 23:37:08 +000084
Daniel Dunbarc1376b62009-03-10 23:50:49 +000085 // We can only call 4.2.1 for now.
86 GCCVersion[0] = 4;
87 GCCVersion[1] = 2;
88 GCCVersion[2] = 1;
89}
90
Daniel Dunbar2f8b37e2009-03-18 01:09:40 +000091DarwinHostInfo::~DarwinHostInfo() {
Daniel Dunbar96460f72009-09-08 23:37:36 +000092 for (llvm::DenseMap<unsigned, ToolChain*>::iterator
Daniel Dunbar2f8b37e2009-03-18 01:09:40 +000093 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
94 delete it->second;
95}
96
Daniel Dunbar522d6de2009-09-08 23:37:08 +000097bool DarwinHostInfo::useDriverDriver() const {
Daniel Dunbarc1376b62009-03-10 23:50:49 +000098 return true;
99}
100
Daniel Dunbar31a70e92009-09-08 23:37:19 +0000101ToolChain *DarwinHostInfo::CreateToolChain(const ArgList &Args,
102 const char *ArchName) const {
Daniel Dunbar96460f72009-09-08 23:37:36 +0000103 llvm::Triple::ArchType Arch;
104
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000105 if (!ArchName) {
Daniel Dunbar5b518b42009-06-16 21:39:33 +0000106 // If we aren't looking for a specific arch, infer the default architecture
107 // based on -arch and -m32/-m64 command line options.
108 if (Arg *A = Args.getLastArg(options::OPT_arch)) {
109 // The gcc driver behavior with multiple -arch flags wasn't consistent for
110 // things which rely on a default architecture. We just use the last -arch
Daniel Dunbar96460f72009-09-08 23:37:36 +0000111 // to find the default tool chain (assuming it is valid..
112 Arch = llvm::Triple::getArchTypeForDarwinArchName(A->getValue(Args));
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000113
Daniel Dunbar96460f72009-09-08 23:37:36 +0000114 // If it was invalid just use the host, we will reject this command line
115 // later.
116 if (Arch == llvm::Triple::UnknownArch)
117 Arch = getTriple().getArch();
Daniel Dunbar5b518b42009-06-16 21:39:33 +0000118 } else {
119 // Otherwise default to the arch of the host.
Daniel Dunbar96460f72009-09-08 23:37:36 +0000120 Arch = getTriple().getArch();
Daniel Dunbar5b518b42009-06-16 21:39:33 +0000121 }
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000122
Daniel Dunbar5b518b42009-06-16 21:39:33 +0000123 // Honor -m32 and -m64 when finding the default tool chain.
Daniel Dunbar96460f72009-09-08 23:37:36 +0000124 //
125 // FIXME: Should this information be in llvm::Triple?
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000126 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
Daniel Dunbar96460f72009-09-08 23:37:36 +0000127 if (A->getOption().getId() == options::OPT_m32) {
128 if (Arch == llvm::Triple::x86_64)
129 Arch = llvm::Triple::x86;
130 if (Arch == llvm::Triple::ppc64)
131 Arch = llvm::Triple::ppc;
132 } else {
133 if (Arch == llvm::Triple::x86)
134 Arch = llvm::Triple::x86_64;
135 if (Arch == llvm::Triple::ppc)
136 Arch = llvm::Triple::ppc64;
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000137 }
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000138 }
Daniel Dunbar96460f72009-09-08 23:37:36 +0000139 } else
140 Arch = llvm::Triple::getArchTypeForDarwinArchName(ArchName);
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000141
Daniel Dunbar96460f72009-09-08 23:37:36 +0000142 assert(Arch != llvm::Triple::UnknownArch && "Unexpected arch!");
143 ToolChain *&TC = ToolChains[Arch];
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000144 if (!TC) {
Daniel Dunbar08303652009-05-22 02:53:45 +0000145 llvm::Triple TCTriple(getTriple());
Daniel Dunbar96460f72009-09-08 23:37:36 +0000146 TCTriple.setArch(Arch);
Daniel Dunbar2c4c4612009-09-04 18:35:21 +0000147
Daniel Dunbar96460f72009-09-08 23:37:36 +0000148 // If we recognized the arch, match it to the toolchains we support.
149 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64)
150 TC = new toolchains::Darwin(*this, TCTriple, DarwinVersion, GCCVersion,
Daniel Dunbar2c4c4612009-09-04 18:35:21 +0000151 false);
Daniel Dunbar96460f72009-09-08 23:37:36 +0000152 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
153 TC = new toolchains::Darwin(*this, TCTriple, DarwinVersion, GCCVersion,
Daniel Dunbar2c4c4612009-09-04 18:35:21 +0000154 true);
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000155 else
Daniel Dunbar08303652009-05-22 02:53:45 +0000156 TC = new toolchains::Darwin_GCC(*this, TCTriple);
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000157 }
158
159 return TC;
Daniel Dunbarc1376b62009-03-10 23:50:49 +0000160}
161
162// Unknown Host Info
163
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000164/// UnknownHostInfo - Generic host information to use for unknown
165/// hosts.
166class UnknownHostInfo : public HostInfo {
167 /// Cache of tool chains we have created.
168 mutable llvm::StringMap<ToolChain*> ToolChains;
169
170public:
Daniel Dunbar08303652009-05-22 02:53:45 +0000171 UnknownHostInfo(const Driver &D, const llvm::Triple& Triple);
Daniel Dunbar2f8b37e2009-03-18 01:09:40 +0000172 ~UnknownHostInfo();
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000173
174 virtual bool useDriverDriver() const;
175
Daniel Dunbar7b6dfbd2009-03-20 23:39:23 +0000176 virtual types::ID lookupTypeForExtension(const char *Ext) const {
177 return types::lookupTypeForExtension(Ext);
178 }
179
Daniel Dunbar31a70e92009-09-08 23:37:19 +0000180 virtual ToolChain *CreateToolChain(const ArgList &Args,
181 const char *ArchName) const;
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000182};
183
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000184UnknownHostInfo::UnknownHostInfo(const Driver &D, const llvm::Triple& Triple)
Daniel Dunbar08303652009-05-22 02:53:45 +0000185 : HostInfo(D, Triple) {
Daniel Dunbarc1376b62009-03-10 23:50:49 +0000186}
187
Daniel Dunbar2f8b37e2009-03-18 01:09:40 +0000188UnknownHostInfo::~UnknownHostInfo() {
189 for (llvm::StringMap<ToolChain*>::iterator
190 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
191 delete it->second;
192}
193
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000194bool UnknownHostInfo::useDriverDriver() const {
Daniel Dunbarc1376b62009-03-10 23:50:49 +0000195 return false;
196}
197
Daniel Dunbar31a70e92009-09-08 23:37:19 +0000198ToolChain *UnknownHostInfo::CreateToolChain(const ArgList &Args,
199 const char *ArchName) const {
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000200 assert(!ArchName &&
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000201 "Unexpected arch name on platform without driver driver support.");
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000202
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000203 // Automatically handle some instances of -m32/-m64 we know about.
Daniel Dunbar08303652009-05-22 02:53:45 +0000204 std::string Arch = getArchName();
205 ArchName = Arch.c_str();
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000206 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
Eli Friedman32690c12009-06-03 18:59:56 +0000207 if (Triple.getArch() == llvm::Triple::x86 ||
208 Triple.getArch() == llvm::Triple::x86_64) {
209 ArchName =
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000210 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
Eli Friedman32690c12009-06-03 18:59:56 +0000211 } else if (Triple.getArch() == llvm::Triple::ppc ||
212 Triple.getArch() == llvm::Triple::ppc64) {
213 ArchName =
Daniel Dunbarb7daa2d2009-04-01 20:33:11 +0000214 (A->getOption().getId() == options::OPT_m32) ? "powerpc" : "powerpc64";
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000215 }
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000216 }
217
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000218 ToolChain *&TC = ToolChains[ArchName];
Daniel Dunbar08303652009-05-22 02:53:45 +0000219 if (!TC) {
220 llvm::Triple TCTriple(getTriple());
221 TCTriple.setArchName(ArchName);
222
223 TC = new toolchains::Generic_GCC(*this, TCTriple);
224 }
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000225
Daniel Dunbarb1dd58a2009-03-18 01:39:08 +0000226 return TC;
Daniel Dunbarc1376b62009-03-10 23:50:49 +0000227}
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000228
Daniel Dunbar64c77a12009-06-29 20:52:51 +0000229// OpenBSD Host Info
230
231/// OpenBSDHostInfo - OpenBSD host information implementation.
232class OpenBSDHostInfo : public HostInfo {
233 /// Cache of tool chains we have created.
234 mutable llvm::StringMap<ToolChain*> ToolChains;
235
236public:
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000237 OpenBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
Daniel Dunbar64c77a12009-06-29 20:52:51 +0000238 : HostInfo(D, Triple) {}
239 ~OpenBSDHostInfo();
240
241 virtual bool useDriverDriver() const;
242
243 virtual types::ID lookupTypeForExtension(const char *Ext) const {
244 return types::lookupTypeForExtension(Ext);
245 }
246
Daniel Dunbar31a70e92009-09-08 23:37:19 +0000247 virtual ToolChain *CreateToolChain(const ArgList &Args,
248 const char *ArchName) const;
Daniel Dunbar64c77a12009-06-29 20:52:51 +0000249};
250
251OpenBSDHostInfo::~OpenBSDHostInfo() {
252 for (llvm::StringMap<ToolChain*>::iterator
253 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
254 delete it->second;
255}
256
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000257bool OpenBSDHostInfo::useDriverDriver() const {
Daniel Dunbar64c77a12009-06-29 20:52:51 +0000258 return false;
259}
260
Daniel Dunbar31a70e92009-09-08 23:37:19 +0000261ToolChain *OpenBSDHostInfo::CreateToolChain(const ArgList &Args,
262 const char *ArchName) const {
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000263 assert(!ArchName &&
Daniel Dunbar64c77a12009-06-29 20:52:51 +0000264 "Unexpected arch name on platform without driver driver support.");
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000265
Daniel Dunbar64c77a12009-06-29 20:52:51 +0000266 std::string Arch = getArchName();
267 ArchName = Arch.c_str();
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000268
Daniel Dunbar64c77a12009-06-29 20:52:51 +0000269 ToolChain *&TC = ToolChains[ArchName];
270 if (!TC) {
271 llvm::Triple TCTriple(getTriple());
272 TCTriple.setArchName(ArchName);
273
274 TC = new toolchains::OpenBSD(*this, TCTriple);
275 }
276
277 return TC;
278}
279
Edward O'Callaghanb68ac562009-08-22 01:06:46 +0000280// AuroraUX Host Info
281
282/// AuroraUXHostInfo - AuroraUX host information implementation.
283class AuroraUXHostInfo : public HostInfo {
284 /// Cache of tool chains we have created.
285 mutable llvm::StringMap<ToolChain*> ToolChains;
286
287public:
288 AuroraUXHostInfo(const Driver &D, const llvm::Triple& Triple)
289 : HostInfo(D, Triple) {}
290 ~AuroraUXHostInfo();
291
292 virtual bool useDriverDriver() const;
293
294 virtual types::ID lookupTypeForExtension(const char *Ext) const {
295 return types::lookupTypeForExtension(Ext);
296 }
297
Daniel Dunbar31a70e92009-09-08 23:37:19 +0000298 virtual ToolChain *CreateToolChain(const ArgList &Args,
299 const char *ArchName) const;
Edward O'Callaghanb68ac562009-08-22 01:06:46 +0000300};
301
302AuroraUXHostInfo::~AuroraUXHostInfo() {
303 for (llvm::StringMap<ToolChain*>::iterator
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000304 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
Edward O'Callaghanb68ac562009-08-22 01:06:46 +0000305 delete it->second;
306}
307
308bool AuroraUXHostInfo::useDriverDriver() const {
309 return false;
310}
311
Daniel Dunbar31a70e92009-09-08 23:37:19 +0000312ToolChain *AuroraUXHostInfo::CreateToolChain(const ArgList &Args,
313 const char *ArchName) const {
Edward O'Callaghanb68ac562009-08-22 01:06:46 +0000314 assert(!ArchName &&
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000315 "Unexpected arch name on platform without driver driver support.");
Edward O'Callaghanb68ac562009-08-22 01:06:46 +0000316
317 ToolChain *&TC = ToolChains[getArchName()];
318
319 if (!TC) {
320 llvm::Triple TCTriple(getTriple());
321 TCTriple.setArchName(getArchName());
322
323 TC = new toolchains::AuroraUX(*this, TCTriple);
324 }
325
326 return TC;
327}
328
Daniel Dunbar606f6142009-03-30 21:06:03 +0000329// FreeBSD Host Info
330
Daniel Dunbare9b52a22009-03-30 22:11:38 +0000331/// FreeBSDHostInfo - FreeBSD host information implementation.
Daniel Dunbar606f6142009-03-30 21:06:03 +0000332class FreeBSDHostInfo : public HostInfo {
333 /// Cache of tool chains we have created.
334 mutable llvm::StringMap<ToolChain*> ToolChains;
335
336public:
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000337 FreeBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
Daniel Dunbar08303652009-05-22 02:53:45 +0000338 : HostInfo(D, Triple) {}
Daniel Dunbar606f6142009-03-30 21:06:03 +0000339 ~FreeBSDHostInfo();
340
341 virtual bool useDriverDriver() const;
342
343 virtual types::ID lookupTypeForExtension(const char *Ext) const {
344 return types::lookupTypeForExtension(Ext);
345 }
346
Daniel Dunbar31a70e92009-09-08 23:37:19 +0000347 virtual ToolChain *CreateToolChain(const ArgList &Args,
348 const char *ArchName) const;
Daniel Dunbar606f6142009-03-30 21:06:03 +0000349};
350
Daniel Dunbar606f6142009-03-30 21:06:03 +0000351FreeBSDHostInfo::~FreeBSDHostInfo() {
352 for (llvm::StringMap<ToolChain*>::iterator
353 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
354 delete it->second;
355}
356
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000357bool FreeBSDHostInfo::useDriverDriver() const {
Daniel Dunbar606f6142009-03-30 21:06:03 +0000358 return false;
359}
360
Daniel Dunbar31a70e92009-09-08 23:37:19 +0000361ToolChain *FreeBSDHostInfo::CreateToolChain(const ArgList &Args,
362 const char *ArchName) const {
Daniel Dunbar606f6142009-03-30 21:06:03 +0000363 bool Lib32 = false;
364
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000365 assert(!ArchName &&
Daniel Dunbar606f6142009-03-30 21:06:03 +0000366 "Unexpected arch name on platform without driver driver support.");
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000367
Daniel Dunbar606f6142009-03-30 21:06:03 +0000368 // On x86_64 we need to be able to compile 32-bits binaries as well.
369 // Compiling 64-bit binaries on i386 is not supported. We don't have a
370 // lib64.
Daniel Dunbar08303652009-05-22 02:53:45 +0000371 std::string Arch = getArchName();
372 ArchName = Arch.c_str();
Daniel Dunbar606f6142009-03-30 21:06:03 +0000373 if (Args.hasArg(options::OPT_m32) && getArchName() == "x86_64") {
374 ArchName = "i386";
375 Lib32 = true;
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000376 }
377
Daniel Dunbar606f6142009-03-30 21:06:03 +0000378 ToolChain *&TC = ToolChains[ArchName];
Daniel Dunbar08303652009-05-22 02:53:45 +0000379 if (!TC) {
380 llvm::Triple TCTriple(getTriple());
381 TCTriple.setArchName(ArchName);
382
383 TC = new toolchains::FreeBSD(*this, TCTriple, Lib32);
384 }
Daniel Dunbar606f6142009-03-30 21:06:03 +0000385
386 return TC;
387}
388
Daniel Dunbar46363f52009-05-02 18:28:39 +0000389// DragonFly Host Info
390
391/// DragonFlyHostInfo - DragonFly host information implementation.
392class DragonFlyHostInfo : public HostInfo {
393 /// Cache of tool chains we have created.
394 mutable llvm::StringMap<ToolChain*> ToolChains;
395
396public:
Daniel Dunbar08303652009-05-22 02:53:45 +0000397 DragonFlyHostInfo(const Driver &D, const llvm::Triple& Triple)
398 : HostInfo(D, Triple) {}
Daniel Dunbar46363f52009-05-02 18:28:39 +0000399 ~DragonFlyHostInfo();
400
401 virtual bool useDriverDriver() const;
402
403 virtual types::ID lookupTypeForExtension(const char *Ext) const {
404 return types::lookupTypeForExtension(Ext);
405 }
406
Daniel Dunbar31a70e92009-09-08 23:37:19 +0000407 virtual ToolChain *CreateToolChain(const ArgList &Args,
408 const char *ArchName) const;
Daniel Dunbar46363f52009-05-02 18:28:39 +0000409};
410
Daniel Dunbar46363f52009-05-02 18:28:39 +0000411DragonFlyHostInfo::~DragonFlyHostInfo() {
412 for (llvm::StringMap<ToolChain*>::iterator
413 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
414 delete it->second;
415}
416
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000417bool DragonFlyHostInfo::useDriverDriver() const {
Daniel Dunbar46363f52009-05-02 18:28:39 +0000418 return false;
419}
420
Daniel Dunbar31a70e92009-09-08 23:37:19 +0000421ToolChain *DragonFlyHostInfo::CreateToolChain(const ArgList &Args,
422 const char *ArchName) const {
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000423 assert(!ArchName &&
Daniel Dunbar46363f52009-05-02 18:28:39 +0000424 "Unexpected arch name on platform without driver driver support.");
425
Daniel Dunbar08303652009-05-22 02:53:45 +0000426 ToolChain *&TC = ToolChains[getArchName()];
Daniel Dunbar46363f52009-05-02 18:28:39 +0000427
Daniel Dunbar08303652009-05-22 02:53:45 +0000428 if (!TC) {
429 llvm::Triple TCTriple(getTriple());
430 TCTriple.setArchName(getArchName());
Daniel Dunbar46363f52009-05-02 18:28:39 +0000431
Daniel Dunbar08303652009-05-22 02:53:45 +0000432 TC = new toolchains::DragonFly(*this, TCTriple);
433 }
Daniel Dunbar46363f52009-05-02 18:28:39 +0000434
Daniel Dunbar46363f52009-05-02 18:28:39 +0000435 return TC;
436}
437
Eli Friedman8cac4352009-05-26 07:52:18 +0000438// Linux Host Info
439
440/// LinuxHostInfo - Linux host information implementation.
441class LinuxHostInfo : public HostInfo {
442 /// Cache of tool chains we have created.
443 mutable llvm::StringMap<ToolChain*> ToolChains;
444
445public:
446 LinuxHostInfo(const Driver &D, const llvm::Triple& Triple)
447 : HostInfo(D, Triple) {}
448 ~LinuxHostInfo();
449
450 virtual bool useDriverDriver() const;
451
452 virtual types::ID lookupTypeForExtension(const char *Ext) const {
453 return types::lookupTypeForExtension(Ext);
454 }
455
Daniel Dunbar31a70e92009-09-08 23:37:19 +0000456 virtual ToolChain *CreateToolChain(const ArgList &Args,
457 const char *ArchName) const;
Eli Friedman8cac4352009-05-26 07:52:18 +0000458};
459
460LinuxHostInfo::~LinuxHostInfo() {
461 for (llvm::StringMap<ToolChain*>::iterator
462 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
463 delete it->second;
464}
465
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000466bool LinuxHostInfo::useDriverDriver() const {
Eli Friedman8cac4352009-05-26 07:52:18 +0000467 return false;
468}
469
Daniel Dunbar31a70e92009-09-08 23:37:19 +0000470ToolChain *LinuxHostInfo::CreateToolChain(const ArgList &Args,
471 const char *ArchName) const {
Eli Friedman8cac4352009-05-26 07:52:18 +0000472
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000473 assert(!ArchName &&
Eli Friedman8cac4352009-05-26 07:52:18 +0000474 "Unexpected arch name on platform without driver driver support.");
475
Eli Friedman32690c12009-06-03 18:59:56 +0000476 // Automatically handle some instances of -m32/-m64 we know about.
477 std::string Arch = getArchName();
478 ArchName = Arch.c_str();
479 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
480 if (Triple.getArch() == llvm::Triple::x86 ||
481 Triple.getArch() == llvm::Triple::x86_64) {
482 ArchName =
483 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
484 } else if (Triple.getArch() == llvm::Triple::ppc ||
485 Triple.getArch() == llvm::Triple::ppc64) {
486 ArchName =
487 (A->getOption().getId() == options::OPT_m32) ? "powerpc" : "powerpc64";
488 }
489 }
490
Eli Friedman8cac4352009-05-26 07:52:18 +0000491 ToolChain *&TC = ToolChains[ArchName];
492
493 if (!TC) {
494 llvm::Triple TCTriple(getTriple());
Eli Friedman32690c12009-06-03 18:59:56 +0000495 TCTriple.setArchName(ArchName);
Eli Friedman8cac4352009-05-26 07:52:18 +0000496
497 TC = new toolchains::Linux(*this, TCTriple);
498 }
499
500 return TC;
501}
502
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000503}
504
Daniel Dunbar08303652009-05-22 02:53:45 +0000505const HostInfo *
Edward O'Callaghanb68ac562009-08-22 01:06:46 +0000506clang::driver::createAuroraUXHostInfo(const Driver &D,
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000507 const llvm::Triple& Triple){
Edward O'Callaghanb68ac562009-08-22 01:06:46 +0000508 return new AuroraUXHostInfo(D, Triple);
509}
510
511const HostInfo *
Daniel Dunbar08303652009-05-22 02:53:45 +0000512clang::driver::createDarwinHostInfo(const Driver &D,
513 const llvm::Triple& Triple){
514 return new DarwinHostInfo(D, Triple);
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000515}
516
Daniel Dunbar08303652009-05-22 02:53:45 +0000517const HostInfo *
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000518clang::driver::createOpenBSDHostInfo(const Driver &D,
Daniel Dunbar64c77a12009-06-29 20:52:51 +0000519 const llvm::Triple& Triple) {
520 return new OpenBSDHostInfo(D, Triple);
521}
522
523const HostInfo *
Daniel Dunbar522d6de2009-09-08 23:37:08 +0000524clang::driver::createFreeBSDHostInfo(const Driver &D,
Daniel Dunbar08303652009-05-22 02:53:45 +0000525 const llvm::Triple& Triple) {
526 return new FreeBSDHostInfo(D, Triple);
Daniel Dunbar606f6142009-03-30 21:06:03 +0000527}
528
Daniel Dunbar08303652009-05-22 02:53:45 +0000529const HostInfo *
530clang::driver::createDragonFlyHostInfo(const Driver &D,
531 const llvm::Triple& Triple) {
532 return new DragonFlyHostInfo(D, Triple);
Daniel Dunbar46363f52009-05-02 18:28:39 +0000533}
534
Daniel Dunbar08303652009-05-22 02:53:45 +0000535const HostInfo *
Eli Friedman8cac4352009-05-26 07:52:18 +0000536clang::driver::createLinuxHostInfo(const Driver &D,
537 const llvm::Triple& Triple) {
538 return new LinuxHostInfo(D, Triple);
539}
540
541const HostInfo *
Daniel Dunbar08303652009-05-22 02:53:45 +0000542clang::driver::createUnknownHostInfo(const Driver &D,
543 const llvm::Triple& Triple) {
544 return new UnknownHostInfo(D, Triple);
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000545}