blob: b98318dd26bf5d16490eb81b7d5b522bbcba4600 [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"
14#include "clang/Driver/Option.h"
15#include "clang/Driver/Options.h"
16
17#include "llvm/ADT/StringMap.h"
18#include "llvm/Support/Compiler.h"
19
Daniel Dunbar83b08eb2009-03-17 21:38:00 +000020#include "ToolChains.h"
21
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000022#include <cassert>
Daniel Dunbare3995642009-03-10 23:50:49 +000023
24using namespace clang::driver;
25
Daniel Dunbare5049522009-03-17 20:45:45 +000026HostInfo::HostInfo(const Driver &D, const char *_Arch, const char *_Platform,
Daniel Dunbare3995642009-03-10 23:50:49 +000027 const char *_OS)
Daniel Dunbare5049522009-03-17 20:45:45 +000028 : TheDriver(D), Arch(_Arch), Platform(_Platform), OS(_OS)
Daniel Dunbare3995642009-03-10 23:50:49 +000029{
30
31}
32
33HostInfo::~HostInfo() {
34}
35
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000036namespace VISIBILITY_HIDDEN {
37
Daniel Dunbare3995642009-03-10 23:50:49 +000038// Darwin Host Info
39
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000040/// DarwinHostInfo - Darwin host information implementation.
41class DarwinHostInfo : public HostInfo {
42 /// Darwin version of host.
43 unsigned DarwinVersion[3];
44
45 /// GCC version to use on this host.
46 unsigned GCCVersion[3];
47
48 /// Cache of tool chains we have created.
49 mutable llvm::StringMap<ToolChain*> ToolChains;
50
51public:
Daniel Dunbare5049522009-03-17 20:45:45 +000052 DarwinHostInfo(const Driver &D, const char *Arch,
53 const char *Platform, const char *OS);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000054
55 virtual bool useDriverDriver() const;
56
57 virtual ToolChain *getToolChain(const ArgList &Args,
58 const char *ArchName) const;
59};
60
Daniel Dunbare5049522009-03-17 20:45:45 +000061DarwinHostInfo::DarwinHostInfo(const Driver &D, const char *_Arch,
62 const char *_Platform, const char *_OS)
63 : HostInfo(D, _Arch, _Platform, _OS) {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000064
65 assert((getArchName() == "i386" || getArchName() == "x86_64" ||
66 getArchName() == "ppc" || getArchName() == "ppc64") &&
67 "Unknown Darwin arch.");
Daniel Dunbare3995642009-03-10 23:50:49 +000068
69 // FIXME: How to deal with errors?
70
71 // We can only call 4.2.1 for now.
72 GCCVersion[0] = 4;
73 GCCVersion[1] = 2;
74 GCCVersion[2] = 1;
75}
76
77bool DarwinHostInfo::useDriverDriver() const {
78 return true;
79}
80
81ToolChain *DarwinHostInfo::getToolChain(const ArgList &Args,
82 const char *ArchName) const {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000083 if (!ArchName) {
84 ArchName = getArchName().c_str();
85
86 // If no arch name is specified, infer it from the host and
87 // -m32/-m64.
88 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
89 if (getArchName() == "i386" || getArchName() == "x86_64") {
90 ArchName =
91 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
92 } else if (getArchName() == "ppc" || getArchName() == "ppc64") {
93 ArchName =
94 (A->getOption().getId() == options::OPT_m32) ? "ppc" : "ppc64";
95 }
96 }
97 }
98
99 ToolChain *&TC = ToolChains[ArchName];
100 if (!TC) {
Daniel Dunbar83b08eb2009-03-17 21:38:00 +0000101 if (strcmp(ArchName, "i386") == 0 || strcmp(ArchName, "x86_64") == 0)
102 TC = new toolchains::Generic_GCC(*this, ArchName,
103 getPlatformName().c_str(),
104 getOSName().c_str());
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000105 else
Daniel Dunbar83b08eb2009-03-17 21:38:00 +0000106 TC = new toolchains::Generic_GCC(*this, ArchName,
107 getPlatformName().c_str(),
108 getOSName().c_str());
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000109 }
110
111 return TC;
Daniel Dunbare3995642009-03-10 23:50:49 +0000112}
113
114// Unknown Host Info
115
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000116/// UnknownHostInfo - Generic host information to use for unknown
117/// hosts.
118class UnknownHostInfo : public HostInfo {
119 /// Cache of tool chains we have created.
120 mutable llvm::StringMap<ToolChain*> ToolChains;
121
122public:
Daniel Dunbare5049522009-03-17 20:45:45 +0000123 UnknownHostInfo(const Driver &D, const char *Arch,
124 const char *Platform, const char *OS);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000125
126 virtual bool useDriverDriver() const;
127
128 virtual ToolChain *getToolChain(const ArgList &Args,
129 const char *ArchName) const;
130};
131
Daniel Dunbare5049522009-03-17 20:45:45 +0000132UnknownHostInfo::UnknownHostInfo(const Driver &D, const char *Arch,
133 const char *Platform, const char *OS)
134 : HostInfo(D, Arch, Platform, OS) {
Daniel Dunbare3995642009-03-10 23:50:49 +0000135}
136
137bool UnknownHostInfo::useDriverDriver() const {
138 return false;
139}
140
141ToolChain *UnknownHostInfo::getToolChain(const ArgList &Args,
142 const char *ArchName) const {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000143 assert(!ArchName &&
144 "Unexpected arch name on platform without driver driver support.");
145
146 // Automatically handle some instances of -m32/-m64 we know about.
147 ArchName = getArchName().c_str();
148 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
149 if (getArchName() == "i386" || getArchName() == "x86_64") {
150 ArchName =
151 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
152 } else if (getArchName() == "ppc" || getArchName() == "ppc64") {
153 ArchName =
154 (A->getOption().getId() == options::OPT_m32) ? "ppc" : "ppc64";
155 }
156 }
157
158 ToolChain *&TC = ToolChains[ArchName];
159 if (!TC)
Daniel Dunbar83b08eb2009-03-17 21:38:00 +0000160 TC = new toolchains::Generic_GCC(*this, ArchName,
161 getPlatformName().c_str(),
162 getOSName().c_str());
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000163
Daniel Dunbare3995642009-03-10 23:50:49 +0000164 return 0;
165}
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000166
167}
168
Daniel Dunbare5049522009-03-17 20:45:45 +0000169const HostInfo *clang::driver::createDarwinHostInfo(const Driver &D,
170 const char *Arch,
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000171 const char *Platform,
172 const char *OS) {
Daniel Dunbare5049522009-03-17 20:45:45 +0000173 return new DarwinHostInfo(D, Arch, Platform, OS);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000174}
175
Daniel Dunbare5049522009-03-17 20:45:45 +0000176const HostInfo *clang::driver::createUnknownHostInfo(const Driver &D,
177 const char *Arch,
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000178 const char *Platform,
179 const char *OS) {
Daniel Dunbare5049522009-03-17 20:45:45 +0000180 return new UnknownHostInfo(D, Arch, Platform, OS);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000181}