blob: 822579018d157cdecd03db5e010fb16869a29476 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Chris Lattner and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the -arch command line option and creates a TargetInfo
11// that represents them.
12//
13//===----------------------------------------------------------------------===//
14
15#include "clang.h"
16#include "clang/Basic/Diagnostic.h"
17#include "clang/Basic/TargetInfo.h"
18#include "llvm/Support/CommandLine.h"
19using namespace llvm;
20using namespace clang;
21
22/// Note: a hard coded list of targets is clearly silly, these should be
23/// dynamicly registered and loadable with "-load".
24enum SupportedTargets {
25 target_ppc, target_ppc64,
26 target_i386, target_x86_64,
27 target_linux_i386
28};
29
30static cl::list<SupportedTargets>
31Archs("arch", cl::desc("Architectures to compile for"),
32 cl::values(clEnumValN(target_ppc, "ppc", "32-bit Darwin PowerPC"),
33 clEnumValN(target_ppc64, "ppc64", "64-bit Darwin PowerPC"),
34 clEnumValN(target_i386, "i386", "32-bit Darwin X86"),
35 clEnumValN(target_x86_64, "x86_64","64-bit Darwin X86"),
36 clEnumValN(target_linux_i386,"linux", "Linux i386"),
37 clEnumValEnd));
38
39//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
43namespace {
44class DarwinTargetInfo : public TargetInfoImpl {
45public:
Chris Lattner1f5ad112006-10-14 18:32:12 +000046 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
Chris Lattner9c837532006-10-15 01:05:46 +000047 Defines.push_back("__APPLE__=1");
48 Defines.push_back("__MACH__=1");
49
50 if (1) {// -fobjc-gc controls this.
51 Defines.push_back("__weak=");
52 Defines.push_back("__strong=");
53 } else {
54 Defines.push_back("__weak=__attribute__((objc_gc(weak)))");
55 Defines.push_back("__strong=__attribute__((objc_gc(strong)))");
56 Defines.push_back("__OBJC_GC__");
57 }
58
59 // darwin_constant_cfstrings controls this.
60 Defines.push_back("__CONSTANT_CFSTRINGS__=1");
61
62 if (0) // darwin_pascal_strings
63 Defines.push_back("__PASCAL_STRINGS__");
Chris Lattner1f5ad112006-10-14 18:32:12 +000064 }
65
Chris Lattner5ba61f02006-10-14 07:39:34 +000066};
67} // end anonymous namespace.
68
69
Chris Lattner1f5ad112006-10-14 18:32:12 +000070/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
71/// not tied to a specific subtarget.
72static void getPowerPCDefines(std::vector<std::string> &Defines, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +000073 // Target identification.
Chris Lattner1f5ad112006-10-14 18:32:12 +000074 Defines.push_back("__ppc__");
Chris Lattner9c837532006-10-15 01:05:46 +000075 Defines.push_back("_ARCH_PPC=1");
76 Defines.push_back("__POWERPC__=1");
77 if (is64Bit) {
78 Defines.push_back("_ARCH_PPC64");
79 Defines.push_back("_LP64");
80 Defines.push_back("__LP64__");
81 Defines.push_back("__ppc64__");
82 } else {
83 Defines.push_back("__ppc__=1");
84 }
Chris Lattner1f5ad112006-10-14 18:32:12 +000085
Chris Lattner9c837532006-10-15 01:05:46 +000086 // Target properties.
87 Defines.push_back("_BIG_ENDIAN=1");
88 Defines.push_back("__BIG_ENDIAN__=1");
89
90 if (is64Bit) {
91 Defines.push_back("__INTMAX_MAX__=9223372036854775807L");
92 Defines.push_back("__INTMAX_TYPE__=long int");
93 Defines.push_back("__LONG_MAX__=9223372036854775807L");
94 Defines.push_back("__PTRDIFF_TYPE__=long int");
95 Defines.push_back("__UINTMAX_TYPE__=long unsigned int");
96 } else {
97 Defines.push_back("__INTMAX_MAX__=9223372036854775807LL");
98 Defines.push_back("__INTMAX_TYPE__=long long int");
99 Defines.push_back("__LONG_MAX__=2147483647L");
100 Defines.push_back("__PTRDIFF_TYPE__=int");
101 Defines.push_back("__UINTMAX_TYPE__=long long unsigned int");
102 }
103 Defines.push_back("__INT_MAX__=2147483647");
104 Defines.push_back("__LONG_LONG_MAX__=9223372036854775807LL");
105 Defines.push_back("__CHAR_BIT__=8");
106 Defines.push_back("__SCHAR_MAX__=127");
107 Defines.push_back("__SHRT_MAX__=32767");
108 Defines.push_back("__SIZE_TYPE__=long unsigned int");
109
110 // Subtarget options.
111 Defines.push_back("__USER_LABEL_PREFIX__=_");
112 Defines.push_back("__NATURAL_ALIGNMENT__=1");
113 Defines.push_back("__REGISTER_PREFIX__=");
114
115 Defines.push_back("__WCHAR_MAX__=2147483647");
116 Defines.push_back("__WCHAR_TYPE__=int");
117 Defines.push_back("__WINT_TYPE__=int");
118
119 // Float macros.
120 Defines.push_back("__FLT_DENORM_MIN__=1.40129846e-45F");
121 Defines.push_back("__FLT_DIG__=6");
122 Defines.push_back("__FLT_EPSILON__=1.19209290e-7F");
123 Defines.push_back("__FLT_EVAL_METHOD__=0");
124 Defines.push_back("__FLT_HAS_INFINITY__=1");
125 Defines.push_back("__FLT_HAS_QUIET_NAN__=1");
126 Defines.push_back("__FLT_MANT_DIG__=24");
127 Defines.push_back("__FLT_MAX_10_EXP__=38");
128 Defines.push_back("__FLT_MAX_EXP__=128");
129 Defines.push_back("__FLT_MAX__=3.40282347e+38F");
130 Defines.push_back("__FLT_MIN_10_EXP__=(-37)");
131 Defines.push_back("__FLT_MIN_EXP__=(-125)");
132 Defines.push_back("__FLT_MIN__=1.17549435e-38F");
133 Defines.push_back("__FLT_RADIX__=2");
134
135 // double macros.
136 Defines.push_back("__DBL_DENORM_MIN__=4.9406564584124654e-324");
137 Defines.push_back("__DBL_DIG__=15");
138 Defines.push_back("__DBL_EPSILON__=2.2204460492503131e-16");
139 Defines.push_back("__DBL_HAS_INFINITY__=1");
140 Defines.push_back("__DBL_HAS_QUIET_NAN__=1");
141 Defines.push_back("__DBL_MANT_DIG__=53");
142 Defines.push_back("__DBL_MAX_10_EXP__=308");
143 Defines.push_back("__DBL_MAX_EXP__=1024");
144 Defines.push_back("__DBL_MAX__=1.7976931348623157e+308");
145 Defines.push_back("__DBL_MIN_10_EXP__=(-307)");
146 Defines.push_back("__DBL_MIN_EXP__=(-1021)");
147 Defines.push_back("__DBL_MIN__=2.2250738585072014e-308");
148 Defines.push_back("__DECIMAL_DIG__=33");
149
150 // 128-bit long double macros.
151 Defines.push_back("__LDBL_DENORM_MIN__=4.940656458412465441765687"
152 "92868221e-324L");
153 Defines.push_back("__LDBL_DIG__=31");
154 Defines.push_back("__LDBL_EPSILON__=4.9406564584124654417656879286822"
155 "1e-324L");
156 Defines.push_back("__LDBL_HAS_INFINITY__=1");
157 Defines.push_back("__LDBL_HAS_QUIET_NAN__=1");
158 Defines.push_back("__LDBL_MANT_DIG__=106");
159 Defines.push_back("__LDBL_MAX_10_EXP__=308");
160 Defines.push_back("__LDBL_MAX_EXP__=1024");
161 Defines.push_back("__LDBL_MAX__=1.7976931348623158079372897140"
162 "5301e+308L");
163 Defines.push_back("__LDBL_MIN_10_EXP__=(-291)");
164 Defines.push_back("__LDBL_MIN_EXP__=(-968)");
165 Defines.push_back("__LDBL_MIN__=2.004168360008972777996108051350"
166 "16e-292L");
167 Defines.push_back("__LONG_DOUBLE_128__=1");
168
Chris Lattner1f5ad112006-10-14 18:32:12 +0000169}
170
171/// getX86Defines - Return a set of the X86-specific #defines that are
172/// not tied to a specific subtarget.
173static void getX86Defines(std::vector<std::string> &Defines, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000174 // Target identification.
175 if (is64Bit) {
176 Defines.push_back("_LP64");
177 Defines.push_back("__LP64__");
178 Defines.push_back("__amd64__");
179 Defines.push_back("__amd64");
180 Defines.push_back("__x86_64");
181 Defines.push_back("__x86_64__");
182 } else {
183 Defines.push_back("__i386__=1");
184 Defines.push_back("__i386=1");
185 Defines.push_back("i386=1");
186 }
187
188 // Target properties.
189 Defines.push_back("__LITTLE_ENDIAN__=1");
190
191 if (is64Bit) {
192 Defines.push_back("__INTMAX_MAX__=9223372036854775807L");
193 Defines.push_back("__INTMAX_TYPE__=long int");
194 Defines.push_back("__LONG_MAX__=9223372036854775807L");
195 Defines.push_back("__PTRDIFF_TYPE__=long int");
196 Defines.push_back("__UINTMAX_TYPE__=long unsigned int");
197 } else {
198 Defines.push_back("__INTMAX_MAX__=9223372036854775807LL");
199 Defines.push_back("__INTMAX_TYPE__=long long int");
200 Defines.push_back("__LONG_MAX__=2147483647L");
201 Defines.push_back("__PTRDIFF_TYPE__=int");
202 Defines.push_back("__UINTMAX_TYPE__=long long unsigned int");
203 }
204 Defines.push_back("__CHAR_BIT__=8");
205 Defines.push_back("__INT_MAX__=2147483647");
206 Defines.push_back("__LONG_LONG_MAX__=9223372036854775807LL");
207 Defines.push_back("__SCHAR_MAX__=127");
208 Defines.push_back("__SHRT_MAX__=32767");
209 Defines.push_back("__SIZE_TYPE__=long unsigned int");
210
211 // Subtarget options.
212 Defines.push_back("__nocona=1");
213 Defines.push_back("__nocona__=1");
214 Defines.push_back("__tune_nocona__=1");
215 Defines.push_back("__SSE2_MATH__=1");
216 Defines.push_back("__SSE2__=1");
217 Defines.push_back("__SSE_MATH__=1");
218 Defines.push_back("__SSE__=1");
219 Defines.push_back("__MMX__=1");
220 Defines.push_back("__REGISTER_PREFIX__=");
221
222 Defines.push_back("__WCHAR_MAX__=2147483647");
223 Defines.push_back("__WCHAR_TYPE__=int");
224 Defines.push_back("__WINT_TYPE__=int");
225
226 // Float macros.
227 Defines.push_back("__FLT_DENORM_MIN__=1.40129846e-45F");
228 Defines.push_back("__FLT_DIG__=6");
229 Defines.push_back("__FLT_EPSILON__=1.19209290e-7F");
230 Defines.push_back("__FLT_EVAL_METHOD__=0");
231 Defines.push_back("__FLT_HAS_INFINITY__=1");
232 Defines.push_back("__FLT_HAS_QUIET_NAN__=1");
233 Defines.push_back("__FLT_MANT_DIG__=24");
234 Defines.push_back("__FLT_MAX_10_EXP__=38");
235 Defines.push_back("__FLT_MAX_EXP__=128");
236 Defines.push_back("__FLT_MAX__=3.40282347e+38F");
237 Defines.push_back("__FLT_MIN_10_EXP__=(-37)");
238 Defines.push_back("__FLT_MIN_EXP__=(-125)");
239 Defines.push_back("__FLT_MIN__=1.17549435e-38F");
240 Defines.push_back("__FLT_RADIX__=2");
241
242 // Double macros.
243 Defines.push_back("__DBL_DENORM_MIN__=4.9406564584124654e-324");
244 Defines.push_back("__DBL_DIG__=15");
245 Defines.push_back("__DBL_EPSILON__=2.2204460492503131e-16");
246 Defines.push_back("__DBL_HAS_INFINITY__=1");
247 Defines.push_back("__DBL_HAS_QUIET_NAN__=1");
248 Defines.push_back("__DBL_MANT_DIG__=53");
249 Defines.push_back("__DBL_MAX_10_EXP__=308");
250 Defines.push_back("__DBL_MAX_EXP__=1024");
251 Defines.push_back("__DBL_MAX__=1.7976931348623157e+308");
252 Defines.push_back("__DBL_MIN_10_EXP__=(-307)");
253 Defines.push_back("__DBL_MIN_EXP__=(-1021)");
254 Defines.push_back("__DBL_MIN__=2.2250738585072014e-308");
255 Defines.push_back("__DECIMAL_DIG__=21");
256
257 // 80-bit Long double macros.
258 Defines.push_back("__LDBL_DENORM_MIN__=3.64519953188247460253e-4951L");
259 Defines.push_back("__LDBL_DIG__=18");
260 Defines.push_back("__LDBL_EPSILON__=1.08420217248550443401e-19L");
261 Defines.push_back("__LDBL_HAS_INFINITY__=1");
262 Defines.push_back("__LDBL_HAS_QUIET_NAN__=1");
263 Defines.push_back("__LDBL_MANT_DIG__=64");
264 Defines.push_back("__LDBL_MAX_10_EXP__=4932");
265 Defines.push_back("__LDBL_MAX_EXP__=16384");
266 Defines.push_back("__LDBL_MAX__=1.18973149535723176502e+4932L");
267 Defines.push_back("__LDBL_MIN_10_EXP__=(-4931)");
268 Defines.push_back("__LDBL_MIN_EXP__=(-16381)");
269 Defines.push_back("__LDBL_MIN__=3.36210314311209350626e-4932L");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000270
271}
272
Chris Lattner5ba61f02006-10-14 07:39:34 +0000273//===----------------------------------------------------------------------===//
274// Specific target implementations.
275//===----------------------------------------------------------------------===//
276
Chris Lattner02dffbd2006-10-14 07:50:21 +0000277
Chris Lattner5ba61f02006-10-14 07:39:34 +0000278namespace {
279class DarwinPPCTargetInfo : public DarwinTargetInfo {
280public:
Chris Lattner1f5ad112006-10-14 18:32:12 +0000281 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
282 DarwinTargetInfo::getTargetDefines(Defines);
283 getPowerPCDefines(Defines, false);
284 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000285};
286} // end anonymous namespace.
287
288namespace {
289class DarwinPPC64TargetInfo : public DarwinTargetInfo {
290public:
Chris Lattner1f5ad112006-10-14 18:32:12 +0000291 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
292 DarwinTargetInfo::getTargetDefines(Defines);
293 getPowerPCDefines(Defines, true);
294 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000295};
296} // end anonymous namespace.
297
298namespace {
299class DarwinI386TargetInfo : public DarwinTargetInfo {
300public:
Chris Lattner1f5ad112006-10-14 18:32:12 +0000301 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
302 DarwinTargetInfo::getTargetDefines(Defines);
303 getX86Defines(Defines, false);
304 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000305};
306} // end anonymous namespace.
307
308namespace {
309class DarwinX86_64TargetInfo : public DarwinTargetInfo {
310public:
Chris Lattner1f5ad112006-10-14 18:32:12 +0000311 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
312 DarwinTargetInfo::getTargetDefines(Defines);
313 getX86Defines(Defines, true);
314 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000315};
316} // end anonymous namespace.
317
318namespace {
319class LinuxTargetInfo : public DarwinTargetInfo {
320public:
321 LinuxTargetInfo() {
322 // Note: I have no idea if this is right, just for testing.
323 WCharWidth = 2;
324 }
Chris Lattner1f5ad112006-10-14 18:32:12 +0000325
326 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
327 // TODO: linux-specific stuff.
328 getX86Defines(Defines, false);
329 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000330};
331} // end anonymous namespace.
332
333
334//===----------------------------------------------------------------------===//
335// Driver code
336//===----------------------------------------------------------------------===//
337
338/// CreateTarget - Create the TargetInfoImpl object for the specified target
339/// enum value.
340static TargetInfoImpl *CreateTarget(SupportedTargets T) {
341 switch (T) {
342 default: assert(0 && "Unknown target!");
343 case target_ppc: return new DarwinPPCTargetInfo();
344 case target_ppc64: return new DarwinPPC64TargetInfo();
345 case target_i386: return new DarwinI386TargetInfo();
346 case target_x86_64: return new DarwinX86_64TargetInfo();
347 case target_linux_i386: return new LinuxTargetInfo();
348 }
349}
350
351/// CreateTargetInfo - Return the set of target info objects as specified by
352/// the -arch command line option.
353TargetInfo *clang::CreateTargetInfo(Diagnostic &Diags) {
354 // If the user didn't specify at least one architecture, auto-sense the
355 // current host. TODO: This is a hack. :)
356 if (Archs.empty()) {
357#ifndef __APPLE__
358 // Assume non-apple = linux.
359 Archs.push_back(target_linux_i386);
360#elif (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \
361 defined(__ppc64__)
362 Archs.push_back(target_ppc64);
363#elif defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)
364 Archs.push_back(target_ppc);
365#elif defined(__x86_64__)
366 Archs.push_back(target_x86_64);
367#elif defined(__i386__) || defined(i386) || defined(_M_IX86)
368 Archs.push_back(target_i386);
369#else
370 // Don't know what this is!
371 return 0;
372#endif
373 }
374
375 // Create the primary target and target info.
376 TargetInfo *TI = new TargetInfo(CreateTarget(Archs[0]), &Diags);
377
378 // Add all secondary targets.
379 for (unsigned i = 1, e = Archs.size(); i != e; ++i)
380 TI->AddSecondaryTarget(CreateTarget(Archs[i]));
381 return TI;
382}