blob: 7755de51ba78a6964b88990fe4058c26971627f2 [file] [log] [blame]
Chris Lattner4b009652007-07-25 00:24:17 +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/AST/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
18#include "clang/Basic/TargetInfo.h"
19#include "llvm/Support/CommandLine.h"
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 llvm::cl::list<SupportedTargets>
31Archs("arch", llvm::cl::desc("Architectures to compile for"),
32llvm::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//===----------------------------------------------------------------------===//
40// Common code shared among targets.
41//===----------------------------------------------------------------------===//
42
43namespace {
44class DarwinTargetInfo : public TargetInfoImpl {
45public:
46 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
47 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__");
64 }
65
66};
67} // end anonymous namespace.
68
69
70/// 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) {
73 // Target identification.
74 Defines.push_back("__ppc__");
75 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 }
85
86 // 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
169}
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) {
174 // 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");
270
271}
272
273/// PPC builtin info.
274namespace PPC {
275 enum {
276 LastTIBuiltin = Builtin::FirstTSBuiltin-1,
277#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
278#include "PPCBuiltins.def"
279 LastTSBuiltin
280 };
281
282 static const Builtin::Info BuiltinInfo[] = {
283#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
284#include "PPCBuiltins.def"
285 };
286
287 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
288 Records = BuiltinInfo;
289 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
290 }
291} // End namespace PPC
292
293
294/// X86 builtin info.
295namespace X86 {
296 enum {
297 LastTIBuiltin = Builtin::FirstTSBuiltin-1,
298#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
299#include "X86Builtins.def"
300 LastTSBuiltin
301 };
302
303 static const Builtin::Info BuiltinInfo[] = {
304#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
305#include "X86Builtins.def"
306 };
307
308 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
309 Records = BuiltinInfo;
310 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
311 }
312} // End namespace X86
313
314//===----------------------------------------------------------------------===//
315// Specific target implementations.
316//===----------------------------------------------------------------------===//
317
318
319namespace {
320class DarwinPPCTargetInfo : public DarwinTargetInfo {
321public:
322 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
323 DarwinTargetInfo::getTargetDefines(Defines);
324 getPowerPCDefines(Defines, false);
325 }
326 virtual void getTargetBuiltins(const Builtin::Info *&Records,
327 unsigned &NumRecords) const {
328 PPC::getBuiltins(Records, NumRecords);
329 }
330};
331} // end anonymous namespace.
332
333namespace {
334class DarwinPPC64TargetInfo : public DarwinTargetInfo {
335public:
336 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
337 DarwinTargetInfo::getTargetDefines(Defines);
338 getPowerPCDefines(Defines, true);
339 }
340 virtual void getTargetBuiltins(const Builtin::Info *&Records,
341 unsigned &NumRecords) const {
342 PPC::getBuiltins(Records, NumRecords);
343 }
344};
345} // end anonymous namespace.
346
347namespace {
348class DarwinI386TargetInfo : public DarwinTargetInfo {
349public:
350 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
351 DarwinTargetInfo::getTargetDefines(Defines);
352 getX86Defines(Defines, false);
353 }
354 virtual void getTargetBuiltins(const Builtin::Info *&Records,
355 unsigned &NumRecords) const {
356 X86::getBuiltins(Records, NumRecords);
357 }
358};
359} // end anonymous namespace.
360
361namespace {
362class DarwinX86_64TargetInfo : public DarwinTargetInfo {
363public:
364 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
365 DarwinTargetInfo::getTargetDefines(Defines);
366 getX86Defines(Defines, true);
367 }
368 virtual void getTargetBuiltins(const Builtin::Info *&Records,
369 unsigned &NumRecords) const {
370 X86::getBuiltins(Records, NumRecords);
371 }
372};
373} // end anonymous namespace.
374
375namespace {
376class LinuxTargetInfo : public DarwinTargetInfo {
377public:
378 LinuxTargetInfo() {
379 // Note: I have no idea if this is right, just for testing.
380 WCharWidth = 16;
381 WCharAlign = 16;
382 }
383
384 virtual void getTargetDefines(std::vector<std::string> &Defines) const {
385 // TODO: linux-specific stuff.
386 getX86Defines(Defines, false);
387 }
388 virtual void getTargetBuiltins(const Builtin::Info *&Records,
389 unsigned &NumRecords) const {
390 X86::getBuiltins(Records, NumRecords);
391 }
392};
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 = i386 for now.
421 Archs.push_back(target_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}