blob: 5069bda3ed21aa2347c19f10d54ee759510de977 [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
20#include <cassert>
Daniel Dunbare3995642009-03-10 23:50:49 +000021
22using namespace clang::driver;
23
24HostInfo::HostInfo(const char *_Arch, const char *_Platform,
25 const char *_OS)
26 : Arch(_Arch), Platform(_Platform), OS(_OS)
27{
28
29}
30
31HostInfo::~HostInfo() {
32}
33
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000034namespace VISIBILITY_HIDDEN {
35
Daniel Dunbare3995642009-03-10 23:50:49 +000036// Darwin Host Info
37
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000038/// DarwinHostInfo - Darwin host information implementation.
39class DarwinHostInfo : public HostInfo {
40 /// Darwin version of host.
41 unsigned DarwinVersion[3];
42
43 /// GCC version to use on this host.
44 unsigned GCCVersion[3];
45
46 /// Cache of tool chains we have created.
47 mutable llvm::StringMap<ToolChain*> ToolChains;
48
49public:
50 DarwinHostInfo(const char *Arch, const char *Platform, const char *OS);
51
52 virtual bool useDriverDriver() const;
53
54 virtual ToolChain *getToolChain(const ArgList &Args,
55 const char *ArchName) const;
56};
57
58DarwinHostInfo::DarwinHostInfo(const char *_Arch, const char *_Platform,
59 const char *_OS)
60 : HostInfo(_Arch, _Platform, _OS) {
61
62 assert((getArchName() == "i386" || getArchName() == "x86_64" ||
63 getArchName() == "ppc" || getArchName() == "ppc64") &&
64 "Unknown Darwin arch.");
Daniel Dunbare3995642009-03-10 23:50:49 +000065
66 // FIXME: How to deal with errors?
67
68 // We can only call 4.2.1 for now.
69 GCCVersion[0] = 4;
70 GCCVersion[1] = 2;
71 GCCVersion[2] = 1;
72}
73
74bool DarwinHostInfo::useDriverDriver() const {
75 return true;
76}
77
78ToolChain *DarwinHostInfo::getToolChain(const ArgList &Args,
79 const char *ArchName) const {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000080 if (!ArchName) {
81 ArchName = getArchName().c_str();
82
83 // If no arch name is specified, infer it from the host and
84 // -m32/-m64.
85 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
86 if (getArchName() == "i386" || getArchName() == "x86_64") {
87 ArchName =
88 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
89 } else if (getArchName() == "ppc" || getArchName() == "ppc64") {
90 ArchName =
91 (A->getOption().getId() == options::OPT_m32) ? "ppc" : "ppc64";
92 }
93 }
94 }
95
96 ToolChain *&TC = ToolChains[ArchName];
97 if (!TC) {
98 TC = 0;
99#if 0
100 if (ArchName == "i386")
101 TC = new Darwin_X86_ToolChain(ArchName);
102 else if (ArchName == "x86_64")
103 TC = new Darwin_X86_ToolChain(ArchName);
104 else
105 TC = new Darwin_GCC_ToolChain(ArchName);
106#endif
107 }
108
109 return TC;
Daniel Dunbare3995642009-03-10 23:50:49 +0000110}
111
112// Unknown Host Info
113
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000114/// UnknownHostInfo - Generic host information to use for unknown
115/// hosts.
116class UnknownHostInfo : public HostInfo {
117 /// Cache of tool chains we have created.
118 mutable llvm::StringMap<ToolChain*> ToolChains;
119
120public:
121 UnknownHostInfo(const char *Arch, const char *Platform, const char *OS);
122
123 virtual bool useDriverDriver() const;
124
125 virtual ToolChain *getToolChain(const ArgList &Args,
126 const char *ArchName) const;
127};
128
Daniel Dunbare3995642009-03-10 23:50:49 +0000129UnknownHostInfo::UnknownHostInfo(const char *Arch, const char *Platform,
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000130 const char *OS)
Daniel Dunbare3995642009-03-10 23:50:49 +0000131 : HostInfo(Arch, Platform, OS) {
132}
133
134bool UnknownHostInfo::useDriverDriver() const {
135 return false;
136}
137
138ToolChain *UnknownHostInfo::getToolChain(const ArgList &Args,
139 const char *ArchName) const {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000140 assert(!ArchName &&
141 "Unexpected arch name on platform without driver driver support.");
142
143 // Automatically handle some instances of -m32/-m64 we know about.
144 ArchName = getArchName().c_str();
145 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
146 if (getArchName() == "i386" || getArchName() == "x86_64") {
147 ArchName =
148 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
149 } else if (getArchName() == "ppc" || getArchName() == "ppc64") {
150 ArchName =
151 (A->getOption().getId() == options::OPT_m32) ? "ppc" : "ppc64";
152 }
153 }
154
155 ToolChain *&TC = ToolChains[ArchName];
156 if (!TC)
157 TC = 0; //new Generic_GCC_ToolChain(ArchName);
158
Daniel Dunbare3995642009-03-10 23:50:49 +0000159 return 0;
160}
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000161
162}
163
164const HostInfo *clang::driver::createDarwinHostInfo(const char *Arch,
165 const char *Platform,
166 const char *OS) {
167 return new DarwinHostInfo(Arch, Platform, OS);
168}
169
170const HostInfo *clang::driver::createUnknownHostInfo(const char *Arch,
171 const char *Platform,
172 const char *OS) {
173 return new UnknownHostInfo(Arch, Platform, OS);
174}