blob: 6bec70cc5f801e60cd9351ad8a575e3cd2a5c12a [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"
Chris Lattner10a5b382007-01-29 05:24:35 +000016#include "clang/AST/Builtins.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000017#include "clang/Basic/Diagnostic.h"
18#include "clang/Basic/TargetInfo.h"
19#include "llvm/Support/CommandLine.h"
20using namespace llvm;
21using namespace clang;
22
23/// Note: a hard coded list of targets is clearly silly, these should be
24/// dynamicly registered and loadable with "-load".
25enum SupportedTargets {
26 target_ppc, target_ppc64,
27 target_i386, target_x86_64,
28 target_linux_i386
29};
30
31static cl::list<SupportedTargets>
32Archs("arch", cl::desc("Architectures to compile for"),
33 cl::values(clEnumValN(target_ppc, "ppc", "32-bit Darwin PowerPC"),
34 clEnumValN(target_ppc64, "ppc64", "64-bit Darwin PowerPC"),
35 clEnumValN(target_i386, "i386", "32-bit Darwin X86"),
36 clEnumValN(target_x86_64, "x86_64","64-bit Darwin X86"),
37 clEnumValN(target_linux_i386,"linux", "Linux i386"),
38 clEnumValEnd));
39
40//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000041// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000042//===----------------------------------------------------------------------===//
43
44namespace {
45class DarwinTargetInfo : public TargetInfoImpl {
46public:
Chris Lattner1f5ad112006-10-14 18:32:12 +000047 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
Chris Lattner9c837532006-10-15 01:05:46 +000048 Defines.push_back("__APPLE__=1");
49 Defines.push_back("__MACH__=1");
50
51 if (1) {// -fobjc-gc controls this.
52 Defines.push_back("__weak=");
53 Defines.push_back("__strong=");
54 } else {
55 Defines.push_back("__weak=__attribute__((objc_gc(weak)))");
56 Defines.push_back("__strong=__attribute__((objc_gc(strong)))");
57 Defines.push_back("__OBJC_GC__");
58 }
59
60 // darwin_constant_cfstrings controls this.
61 Defines.push_back("__CONSTANT_CFSTRINGS__=1");
62
63 if (0) // darwin_pascal_strings
64 Defines.push_back("__PASCAL_STRINGS__");
Chris Lattner1f5ad112006-10-14 18:32:12 +000065 }
66
Chris Lattner5ba61f02006-10-14 07:39:34 +000067};
68} // end anonymous namespace.
69
70
Chris Lattner1f5ad112006-10-14 18:32:12 +000071/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
72/// not tied to a specific subtarget.
73static void getPowerPCDefines(std::vector<std::string> &Defines, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +000074 // Target identification.
Chris Lattner1f5ad112006-10-14 18:32:12 +000075 Defines.push_back("__ppc__");
Chris Lattner9c837532006-10-15 01:05:46 +000076 Defines.push_back("_ARCH_PPC=1");
77 Defines.push_back("__POWERPC__=1");
78 if (is64Bit) {
79 Defines.push_back("_ARCH_PPC64");
80 Defines.push_back("_LP64");
81 Defines.push_back("__LP64__");
82 Defines.push_back("__ppc64__");
83 } else {
84 Defines.push_back("__ppc__=1");
85 }
Chris Lattner1f5ad112006-10-14 18:32:12 +000086
Chris Lattner9c837532006-10-15 01:05:46 +000087 // Target properties.
88 Defines.push_back("_BIG_ENDIAN=1");
89 Defines.push_back("__BIG_ENDIAN__=1");
90
91 if (is64Bit) {
92 Defines.push_back("__INTMAX_MAX__=9223372036854775807L");
93 Defines.push_back("__INTMAX_TYPE__=long int");
94 Defines.push_back("__LONG_MAX__=9223372036854775807L");
95 Defines.push_back("__PTRDIFF_TYPE__=long int");
96 Defines.push_back("__UINTMAX_TYPE__=long unsigned int");
97 } else {
98 Defines.push_back("__INTMAX_MAX__=9223372036854775807LL");
99 Defines.push_back("__INTMAX_TYPE__=long long int");
100 Defines.push_back("__LONG_MAX__=2147483647L");
101 Defines.push_back("__PTRDIFF_TYPE__=int");
102 Defines.push_back("__UINTMAX_TYPE__=long long unsigned int");
103 }
104 Defines.push_back("__INT_MAX__=2147483647");
105 Defines.push_back("__LONG_LONG_MAX__=9223372036854775807LL");
106 Defines.push_back("__CHAR_BIT__=8");
107 Defines.push_back("__SCHAR_MAX__=127");
108 Defines.push_back("__SHRT_MAX__=32767");
109 Defines.push_back("__SIZE_TYPE__=long unsigned int");
110
111 // Subtarget options.
112 Defines.push_back("__USER_LABEL_PREFIX__=_");
113 Defines.push_back("__NATURAL_ALIGNMENT__=1");
114 Defines.push_back("__REGISTER_PREFIX__=");
115
116 Defines.push_back("__WCHAR_MAX__=2147483647");
117 Defines.push_back("__WCHAR_TYPE__=int");
118 Defines.push_back("__WINT_TYPE__=int");
119
120 // Float macros.
121 Defines.push_back("__FLT_DENORM_MIN__=1.40129846e-45F");
122 Defines.push_back("__FLT_DIG__=6");
123 Defines.push_back("__FLT_EPSILON__=1.19209290e-7F");
124 Defines.push_back("__FLT_EVAL_METHOD__=0");
125 Defines.push_back("__FLT_HAS_INFINITY__=1");
126 Defines.push_back("__FLT_HAS_QUIET_NAN__=1");
127 Defines.push_back("__FLT_MANT_DIG__=24");
128 Defines.push_back("__FLT_MAX_10_EXP__=38");
129 Defines.push_back("__FLT_MAX_EXP__=128");
130 Defines.push_back("__FLT_MAX__=3.40282347e+38F");
131 Defines.push_back("__FLT_MIN_10_EXP__=(-37)");
132 Defines.push_back("__FLT_MIN_EXP__=(-125)");
133 Defines.push_back("__FLT_MIN__=1.17549435e-38F");
134 Defines.push_back("__FLT_RADIX__=2");
135
136 // double macros.
137 Defines.push_back("__DBL_DENORM_MIN__=4.9406564584124654e-324");
138 Defines.push_back("__DBL_DIG__=15");
139 Defines.push_back("__DBL_EPSILON__=2.2204460492503131e-16");
140 Defines.push_back("__DBL_HAS_INFINITY__=1");
141 Defines.push_back("__DBL_HAS_QUIET_NAN__=1");
142 Defines.push_back("__DBL_MANT_DIG__=53");
143 Defines.push_back("__DBL_MAX_10_EXP__=308");
144 Defines.push_back("__DBL_MAX_EXP__=1024");
145 Defines.push_back("__DBL_MAX__=1.7976931348623157e+308");
146 Defines.push_back("__DBL_MIN_10_EXP__=(-307)");
147 Defines.push_back("__DBL_MIN_EXP__=(-1021)");
148 Defines.push_back("__DBL_MIN__=2.2250738585072014e-308");
149 Defines.push_back("__DECIMAL_DIG__=33");
150
151 // 128-bit long double macros.
152 Defines.push_back("__LDBL_DENORM_MIN__=4.940656458412465441765687"
153 "92868221e-324L");
154 Defines.push_back("__LDBL_DIG__=31");
155 Defines.push_back("__LDBL_EPSILON__=4.9406564584124654417656879286822"
156 "1e-324L");
157 Defines.push_back("__LDBL_HAS_INFINITY__=1");
158 Defines.push_back("__LDBL_HAS_QUIET_NAN__=1");
159 Defines.push_back("__LDBL_MANT_DIG__=106");
160 Defines.push_back("__LDBL_MAX_10_EXP__=308");
161 Defines.push_back("__LDBL_MAX_EXP__=1024");
162 Defines.push_back("__LDBL_MAX__=1.7976931348623158079372897140"
163 "5301e+308L");
164 Defines.push_back("__LDBL_MIN_10_EXP__=(-291)");
165 Defines.push_back("__LDBL_MIN_EXP__=(-968)");
166 Defines.push_back("__LDBL_MIN__=2.004168360008972777996108051350"
167 "16e-292L");
168 Defines.push_back("__LONG_DOUBLE_128__=1");
169
Chris Lattner1f5ad112006-10-14 18:32:12 +0000170}
171
172/// getX86Defines - Return a set of the X86-specific #defines that are
173/// not tied to a specific subtarget.
174static void getX86Defines(std::vector<std::string> &Defines, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000175 // Target identification.
176 if (is64Bit) {
177 Defines.push_back("_LP64");
178 Defines.push_back("__LP64__");
179 Defines.push_back("__amd64__");
180 Defines.push_back("__amd64");
181 Defines.push_back("__x86_64");
182 Defines.push_back("__x86_64__");
183 } else {
184 Defines.push_back("__i386__=1");
185 Defines.push_back("__i386=1");
186 Defines.push_back("i386=1");
187 }
188
189 // Target properties.
190 Defines.push_back("__LITTLE_ENDIAN__=1");
191
192 if (is64Bit) {
193 Defines.push_back("__INTMAX_MAX__=9223372036854775807L");
194 Defines.push_back("__INTMAX_TYPE__=long int");
195 Defines.push_back("__LONG_MAX__=9223372036854775807L");
196 Defines.push_back("__PTRDIFF_TYPE__=long int");
197 Defines.push_back("__UINTMAX_TYPE__=long unsigned int");
198 } else {
199 Defines.push_back("__INTMAX_MAX__=9223372036854775807LL");
200 Defines.push_back("__INTMAX_TYPE__=long long int");
201 Defines.push_back("__LONG_MAX__=2147483647L");
202 Defines.push_back("__PTRDIFF_TYPE__=int");
203 Defines.push_back("__UINTMAX_TYPE__=long long unsigned int");
204 }
205 Defines.push_back("__CHAR_BIT__=8");
206 Defines.push_back("__INT_MAX__=2147483647");
207 Defines.push_back("__LONG_LONG_MAX__=9223372036854775807LL");
208 Defines.push_back("__SCHAR_MAX__=127");
209 Defines.push_back("__SHRT_MAX__=32767");
210 Defines.push_back("__SIZE_TYPE__=long unsigned int");
211
212 // Subtarget options.
213 Defines.push_back("__nocona=1");
214 Defines.push_back("__nocona__=1");
215 Defines.push_back("__tune_nocona__=1");
216 Defines.push_back("__SSE2_MATH__=1");
217 Defines.push_back("__SSE2__=1");
218 Defines.push_back("__SSE_MATH__=1");
219 Defines.push_back("__SSE__=1");
220 Defines.push_back("__MMX__=1");
221 Defines.push_back("__REGISTER_PREFIX__=");
222
223 Defines.push_back("__WCHAR_MAX__=2147483647");
224 Defines.push_back("__WCHAR_TYPE__=int");
225 Defines.push_back("__WINT_TYPE__=int");
226
227 // Float macros.
228 Defines.push_back("__FLT_DENORM_MIN__=1.40129846e-45F");
229 Defines.push_back("__FLT_DIG__=6");
230 Defines.push_back("__FLT_EPSILON__=1.19209290e-7F");
231 Defines.push_back("__FLT_EVAL_METHOD__=0");
232 Defines.push_back("__FLT_HAS_INFINITY__=1");
233 Defines.push_back("__FLT_HAS_QUIET_NAN__=1");
234 Defines.push_back("__FLT_MANT_DIG__=24");
235 Defines.push_back("__FLT_MAX_10_EXP__=38");
236 Defines.push_back("__FLT_MAX_EXP__=128");
237 Defines.push_back("__FLT_MAX__=3.40282347e+38F");
238 Defines.push_back("__FLT_MIN_10_EXP__=(-37)");
239 Defines.push_back("__FLT_MIN_EXP__=(-125)");
240 Defines.push_back("__FLT_MIN__=1.17549435e-38F");
241 Defines.push_back("__FLT_RADIX__=2");
242
243 // Double macros.
244 Defines.push_back("__DBL_DENORM_MIN__=4.9406564584124654e-324");
245 Defines.push_back("__DBL_DIG__=15");
246 Defines.push_back("__DBL_EPSILON__=2.2204460492503131e-16");
247 Defines.push_back("__DBL_HAS_INFINITY__=1");
248 Defines.push_back("__DBL_HAS_QUIET_NAN__=1");
249 Defines.push_back("__DBL_MANT_DIG__=53");
250 Defines.push_back("__DBL_MAX_10_EXP__=308");
251 Defines.push_back("__DBL_MAX_EXP__=1024");
252 Defines.push_back("__DBL_MAX__=1.7976931348623157e+308");
253 Defines.push_back("__DBL_MIN_10_EXP__=(-307)");
254 Defines.push_back("__DBL_MIN_EXP__=(-1021)");
255 Defines.push_back("__DBL_MIN__=2.2250738585072014e-308");
256 Defines.push_back("__DECIMAL_DIG__=21");
257
258 // 80-bit Long double macros.
259 Defines.push_back("__LDBL_DENORM_MIN__=3.64519953188247460253e-4951L");
260 Defines.push_back("__LDBL_DIG__=18");
261 Defines.push_back("__LDBL_EPSILON__=1.08420217248550443401e-19L");
262 Defines.push_back("__LDBL_HAS_INFINITY__=1");
263 Defines.push_back("__LDBL_HAS_QUIET_NAN__=1");
264 Defines.push_back("__LDBL_MANT_DIG__=64");
265 Defines.push_back("__LDBL_MAX_10_EXP__=4932");
266 Defines.push_back("__LDBL_MAX_EXP__=16384");
267 Defines.push_back("__LDBL_MAX__=1.18973149535723176502e+4932L");
268 Defines.push_back("__LDBL_MIN_10_EXP__=(-4931)");
269 Defines.push_back("__LDBL_MIN_EXP__=(-16381)");
270 Defines.push_back("__LDBL_MIN__=3.36210314311209350626e-4932L");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000271
272}
273
Chris Lattner10a5b382007-01-29 05:24:35 +0000274/// PPC builtin info.
275namespace PPC {
276 enum {
277 LastTIBuiltin = Builtin::FirstTSBuiltin-1,
278#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
279#include "PPCBuiltins.def"
280 LastTSBuiltin
281 };
282
283 static const Builtin::Info BuiltinInfo[] = {
284#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
285#include "PPCBuiltins.def"
286 };
287
288 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
289 Records = BuiltinInfo;
290 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
291 }
292} // End namespace PPC
293
294
295/// X86 builtin info.
296namespace X86 {
297 enum {
298 LastTIBuiltin = Builtin::FirstTSBuiltin-1,
299#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
300#include "X86Builtins.def"
301 LastTSBuiltin
302 };
303
304 static const Builtin::Info BuiltinInfo[] = {
305#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
306#include "X86Builtins.def"
307 };
308
309 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
310 Records = BuiltinInfo;
311 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
312 }
313} // End namespace X86
314
Chris Lattner5ba61f02006-10-14 07:39:34 +0000315//===----------------------------------------------------------------------===//
316// Specific target implementations.
317//===----------------------------------------------------------------------===//
318
Chris Lattner02dffbd2006-10-14 07:50:21 +0000319
Chris Lattner5ba61f02006-10-14 07:39:34 +0000320namespace {
321class DarwinPPCTargetInfo : public DarwinTargetInfo {
322public:
Chris Lattner1f5ad112006-10-14 18:32:12 +0000323 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
324 DarwinTargetInfo::getTargetDefines(Defines);
325 getPowerPCDefines(Defines, false);
326 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000327 virtual void getTargetBuiltins(const Builtin::Info *&Records,
328 unsigned &NumRecords) const {
329 PPC::getBuiltins(Records, NumRecords);
330 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000331};
332} // end anonymous namespace.
333
334namespace {
335class DarwinPPC64TargetInfo : public DarwinTargetInfo {
336public:
Chris Lattner1f5ad112006-10-14 18:32:12 +0000337 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
338 DarwinTargetInfo::getTargetDefines(Defines);
339 getPowerPCDefines(Defines, true);
340 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000341 virtual void getTargetBuiltins(const Builtin::Info *&Records,
342 unsigned &NumRecords) const {
343 PPC::getBuiltins(Records, NumRecords);
344 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000345};
346} // end anonymous namespace.
347
348namespace {
349class DarwinI386TargetInfo : public DarwinTargetInfo {
350public:
Chris Lattner1f5ad112006-10-14 18:32:12 +0000351 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
352 DarwinTargetInfo::getTargetDefines(Defines);
353 getX86Defines(Defines, false);
354 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000355 virtual void getTargetBuiltins(const Builtin::Info *&Records,
356 unsigned &NumRecords) const {
357 X86::getBuiltins(Records, NumRecords);
358 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000359};
360} // end anonymous namespace.
361
362namespace {
363class DarwinX86_64TargetInfo : public DarwinTargetInfo {
364public:
Chris Lattner1f5ad112006-10-14 18:32:12 +0000365 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
366 DarwinTargetInfo::getTargetDefines(Defines);
367 getX86Defines(Defines, true);
368 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000369 virtual void getTargetBuiltins(const Builtin::Info *&Records,
370 unsigned &NumRecords) const {
371 X86::getBuiltins(Records, NumRecords);
372 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000373};
374} // end anonymous namespace.
375
376namespace {
377class LinuxTargetInfo : public DarwinTargetInfo {
378public:
379 LinuxTargetInfo() {
380 // Note: I have no idea if this is right, just for testing.
Chris Lattnerd5a828b2007-04-05 06:57:57 +0000381 WCharWidth = 16;
Chris Lattner5ba61f02006-10-14 07:39:34 +0000382 }
Chris Lattner1f5ad112006-10-14 18:32:12 +0000383
384 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
385 // TODO: linux-specific stuff.
386 getX86Defines(Defines, false);
387 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000388 virtual void getTargetBuiltins(const Builtin::Info *&Records,
389 unsigned &NumRecords) const {
390 X86::getBuiltins(Records, NumRecords);
391 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000392};
393} // end anonymous namespace.
394
395
396//===----------------------------------------------------------------------===//
397// Driver code
398//===----------------------------------------------------------------------===//
399
400/// CreateTarget - Create the TargetInfoImpl object for the specified target
401/// enum value.
402static TargetInfoImpl *CreateTarget(SupportedTargets T) {
403 switch (T) {
404 default: assert(0 && "Unknown target!");
405 case target_ppc: return new DarwinPPCTargetInfo();
406 case target_ppc64: return new DarwinPPC64TargetInfo();
407 case target_i386: return new DarwinI386TargetInfo();
408 case target_x86_64: return new DarwinX86_64TargetInfo();
409 case target_linux_i386: return new LinuxTargetInfo();
410 }
411}
412
413/// CreateTargetInfo - Return the set of target info objects as specified by
414/// the -arch command line option.
415TargetInfo *clang::CreateTargetInfo(Diagnostic &Diags) {
416 // If the user didn't specify at least one architecture, auto-sense the
417 // current host. TODO: This is a hack. :)
418 if (Archs.empty()) {
419#ifndef __APPLE__
420 // Assume non-apple = linux.
421 Archs.push_back(target_linux_i386);
422#elif (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \
423 defined(__ppc64__)
424 Archs.push_back(target_ppc64);
425#elif defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)
426 Archs.push_back(target_ppc);
427#elif defined(__x86_64__)
428 Archs.push_back(target_x86_64);
429#elif defined(__i386__) || defined(i386) || defined(_M_IX86)
430 Archs.push_back(target_i386);
431#else
432 // Don't know what this is!
433 return 0;
434#endif
435 }
436
437 // Create the primary target and target info.
438 TargetInfo *TI = new TargetInfo(CreateTarget(Archs[0]), &Diags);
439
440 // Add all secondary targets.
441 for (unsigned i = 1, e = Archs.size(); i != e; ++i)
442 TI->AddSecondaryTarget(CreateTarget(Archs[i]));
443 return TI;
444}