Targets.cpp revision b63decfa6e1b165693f1fbfe52d5faec832968f7
1//===--- Targets.cpp - Implement -arch option and targets -----------------===//
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// This file implements construction of a TargetInfo object from a
11// target triple.
12//
13//===----------------------------------------------------------------------===//
14
15#include "clang/Basic/Builtins.h"
16#include "clang/Basic/TargetBuiltins.h"
17#include "clang/Basic/TargetInfo.h"
18#include "clang/Basic/LangOptions.h"
19#include "llvm/ADT/APFloat.h"
20#include "llvm/ADT/SmallString.h"
21#include "llvm/ADT/StringRef.h"
22#include "llvm/ADT/STLExtras.h"
23#include "llvm/ADT/Triple.h"
24#include "llvm/MC/MCSectionMachO.h"
25using namespace clang;
26
27//===----------------------------------------------------------------------===//
28//  Common code shared among targets.
29//===----------------------------------------------------------------------===//
30
31static void Define(std::vector<char> &Buf, const llvm::StringRef &Macro,
32                   const llvm::StringRef &Val = "1") {
33  const char *Def = "#define ";
34  Buf.insert(Buf.end(), Def, Def+strlen(Def));
35  Buf.insert(Buf.end(), Macro.begin(), Macro.end());
36  Buf.push_back(' ');
37  Buf.insert(Buf.end(), Val.begin(), Val.end());
38  Buf.push_back('\n');
39}
40
41/// DefineStd - Define a macro name and standard variants.  For example if
42/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
43/// when in GNU mode.
44static void DefineStd(std::vector<char> &Buf, const char *MacroName,
45                      const LangOptions &Opts) {
46  assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
47
48  // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
49  // in the user's namespace.
50  if (Opts.GNUMode)
51    Define(Buf, MacroName);
52
53  // Define __unix.
54  llvm::SmallString<20> TmpStr;
55  TmpStr = "__";
56  TmpStr += MacroName;
57  Define(Buf, TmpStr.str());
58
59  // Define __unix__.
60  TmpStr += "__";
61  Define(Buf, TmpStr.str());
62}
63
64//===----------------------------------------------------------------------===//
65// Defines specific to certain operating systems.
66//===----------------------------------------------------------------------===//
67
68namespace {
69template<typename TgtInfo>
70class OSTargetInfo : public TgtInfo {
71protected:
72  virtual void getOSDefines(const LangOptions &Opts, const char *Triple,
73                            std::vector<char> &Defines) const=0;
74public:
75  OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
76  virtual void getTargetDefines(const LangOptions &Opts,
77                                std::vector<char> &Defines) const {
78    TgtInfo::getTargetDefines(Opts, Defines);
79    getOSDefines(Opts, TgtInfo::getTargetTriple(), Defines);
80  }
81
82};
83} // end anonymous namespace
84
85
86static void getDarwinDefines(std::vector<char> &Defs, const LangOptions &Opts) {
87  Define(Defs, "__APPLE_CC__", "5621");
88  Define(Defs, "__APPLE__");
89  Define(Defs, "__MACH__");
90  Define(Defs, "OBJC_NEW_PROPERTIES");
91
92  // __weak is always defined, for use in blocks and with objc pointers.
93  Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
94
95  // Darwin defines __strong even in C mode (just to nothing).
96  if (!Opts.ObjC1 || Opts.getGCMode() == LangOptions::NonGC)
97    Define(Defs, "__strong", "");
98  else
99    Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
100
101  if (Opts.Static)
102    Define(Defs, "__STATIC__");
103  else
104    Define(Defs, "__DYNAMIC__");
105}
106
107static void getDarwinOSXDefines(std::vector<char> &Defs, const char *TripleStr){
108  llvm::Triple TheTriple(TripleStr);
109  if (TheTriple.getOS() != llvm::Triple::Darwin)
110    return;
111
112  // Figure out which "darwin number" the target triple is.  "darwin9" -> 10.5.
113  unsigned Maj, Min, Rev;
114  TheTriple.getDarwinNumber(Maj, Min, Rev);
115
116  char MacOSXStr[] = "1000";
117  if (Maj >= 4 && Maj <= 13) { // 10.0-10.9
118    // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
119    MacOSXStr[2] = '0' + Maj-4;
120  }
121
122  // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
123  // Cap 10.4.11 -> darwin8.11 -> "1049"
124  MacOSXStr[3] = std::min(Min, 9U)+'0';
125  Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", MacOSXStr);
126}
127
128static void getDarwinIPhoneOSDefines(std::vector<char> &Defs,
129                                     const char *TripleStr) {
130  llvm::Triple TheTriple(TripleStr);
131  if (TheTriple.getOS() != llvm::Triple::Darwin)
132    return;
133
134  // Figure out which "darwin number" the target triple is.  "darwin9" -> 10.5.
135  unsigned Maj, Min, Rev;
136  TheTriple.getDarwinNumber(Maj, Min, Rev);
137
138  // When targetting iPhone OS, interpret the minor version and
139  // revision as the iPhone OS version
140  char iPhoneOSStr[] = "10000";
141  if (Min >= 2 && Min <= 9) { // iPhone OS 2.0-9.0
142    // darwin9.2.0 -> 20000, darwin9.3.0 -> 30000, etc.
143    iPhoneOSStr[0] = '0' + Min;
144  }
145
146  // Handle minor version: 2.2 -> darwin9.2.2 -> 20200
147  iPhoneOSStr[2] = std::min(Rev, 9U)+'0';
148  Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
149         iPhoneOSStr);
150}
151
152/// GetDarwinLanguageOptions - Set the default language options for darwin.
153static void GetDarwinLanguageOptions(LangOptions &Opts,
154                                     const char *TripleStr) {
155  Opts.NeXTRuntime = true;
156
157  llvm::Triple TheTriple(TripleStr);
158  if (TheTriple.getOS() != llvm::Triple::Darwin)
159    return;
160
161  unsigned MajorVersion = TheTriple.getDarwinMajorNumber();
162
163  // Blocks and stack protectors default to on for 10.6 (darwin10) and beyond.
164  if (MajorVersion > 9) {
165    Opts.Blocks = 1;
166    Opts.setStackProtectorMode(LangOptions::SSPOn);
167  }
168
169  // Non-fragile ABI (in 64-bit mode) default to on for 10.5 (darwin9) and
170  // beyond.
171  if (MajorVersion >= 9 && Opts.ObjC1 &&
172      TheTriple.getArch() == llvm::Triple::x86_64)
173    Opts.ObjCNonFragileABI = 1;
174}
175
176namespace {
177template<typename Target>
178class DarwinTargetInfo : public OSTargetInfo<Target> {
179protected:
180  virtual void getOSDefines(const LangOptions &Opts, const char *Triple,
181                    std::vector<char> &Defines) const {
182    getDarwinDefines(Defines, Opts);
183    getDarwinOSXDefines(Defines, Triple);
184  }
185
186  /// getDefaultLangOptions - Allow the target to specify default settings for
187  /// various language options.  These may be overridden by command line
188  /// options.
189  virtual void getDefaultLangOptions(LangOptions &Opts) {
190    TargetInfo::getDefaultLangOptions(Opts);
191    GetDarwinLanguageOptions(Opts, TargetInfo::getTargetTriple());
192  }
193public:
194  DarwinTargetInfo(const std::string& triple) :
195    OSTargetInfo<Target>(triple) {
196      this->TLSSupported = false;
197    }
198
199  virtual const char *getUnicodeStringSymbolPrefix() const {
200    return "__utf16_string_";
201  }
202
203  virtual const char *getUnicodeStringSection() const {
204    return "__TEXT,__ustring";
205  }
206
207  virtual std::string isValidSectionSpecifier(const llvm::StringRef &SR) const {
208    // Let MCSectionMachO validate this.
209    llvm::StringRef Segment, Section;
210    unsigned TAA, StubSize;
211    return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
212                                                       TAA, StubSize);
213  }
214};
215
216
217// DragonFlyBSD Target
218template<typename Target>
219class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
220protected:
221  virtual void getOSDefines(const LangOptions &Opts, const char *Triple,
222                    std::vector<char> &Defs) const {
223    // DragonFly defines; list based off of gcc output
224    Define(Defs, "__DragonFly__");
225    Define(Defs, "__DragonFly_cc_version", "100001");
226    Define(Defs, "__ELF__");
227    Define(Defs, "__KPRINTF_ATTRIBUTE__");
228    Define(Defs, "__tune_i386__");
229    DefineStd(Defs, "unix", Opts);
230  }
231public:
232  DragonFlyBSDTargetInfo(const std::string &triple)
233    : OSTargetInfo<Target>(triple) {}
234};
235
236// FreeBSD Target
237template<typename Target>
238class FreeBSDTargetInfo : public OSTargetInfo<Target> {
239protected:
240  virtual void getOSDefines(const LangOptions &Opts, const char *Triple,
241                    std::vector<char> &Defs) const {
242    // FreeBSD defines; list based off of gcc output
243
244    const char *FreeBSD = strstr(Triple, "-freebsd");
245    FreeBSD += strlen("-freebsd");
246    char release[] = "X";
247    release[0] = FreeBSD[0];
248    char version[] = "X00001";
249    version[0] = FreeBSD[0];
250
251    Define(Defs, "__FreeBSD__", release);
252    Define(Defs, "__FreeBSD_cc_version", version);
253    Define(Defs, "__KPRINTF_ATTRIBUTE__");
254    DefineStd(Defs, "unix", Opts);
255    Define(Defs, "__ELF__", "1");
256  }
257public:
258  FreeBSDTargetInfo(const std::string &triple)
259    : OSTargetInfo<Target>(triple) {
260      this->UserLabelPrefix = "";
261    }
262};
263
264// Linux target
265template<typename Target>
266class LinuxTargetInfo : public OSTargetInfo<Target> {
267protected:
268  virtual void getOSDefines(const LangOptions &Opts, const char *Triple,
269                           std::vector<char> &Defs) const {
270    // Linux defines; list based off of gcc output
271    DefineStd(Defs, "unix", Opts);
272    DefineStd(Defs, "linux", Opts);
273    Define(Defs, "__gnu_linux__");
274    Define(Defs, "__ELF__", "1");
275  }
276public:
277  LinuxTargetInfo(const std::string& triple)
278    : OSTargetInfo<Target>(triple) {
279    this->UserLabelPrefix = "";
280  }
281};
282
283// NetBSD Target
284template<typename Target>
285class NetBSDTargetInfo : public OSTargetInfo<Target> {
286protected:
287  virtual void getOSDefines(const LangOptions &Opts, const char *Triple,
288                    std::vector<char> &Defs) const {
289    // NetBSD defines; list based off of gcc output
290    Define(Defs, "__NetBSD__", "1");
291    Define(Defs, "__unix__", "1");
292    Define(Defs, "__ELF__", "1");
293  }
294public:
295  NetBSDTargetInfo(const std::string &triple)
296    : OSTargetInfo<Target>(triple) {
297      this->UserLabelPrefix = "";
298    }
299};
300
301// OpenBSD Target
302template<typename Target>
303class OpenBSDTargetInfo : public OSTargetInfo<Target> {
304protected:
305  virtual void getOSDefines(const LangOptions &Opts, const char *Triple,
306                    std::vector<char> &Defs) const {
307    // OpenBSD defines; list based off of gcc output
308
309    Define(Defs, "__OpenBSD__", "1");
310    DefineStd(Defs, "unix", Opts);
311    Define(Defs, "__ELF__", "1");
312  }
313public:
314  OpenBSDTargetInfo(const std::string &triple)
315    : OSTargetInfo<Target>(triple) {}
316};
317
318// Solaris target
319template<typename Target>
320class SolarisTargetInfo : public OSTargetInfo<Target> {
321protected:
322  virtual void getOSDefines(const LangOptions &Opts, const char *Triple,
323                                std::vector<char> &Defs) const {
324    DefineStd(Defs, "sun", Opts);
325    DefineStd(Defs, "unix", Opts);
326    Define(Defs, "__ELF__");
327    Define(Defs, "__svr4__");
328    Define(Defs, "__SVR4");
329  }
330public:
331  SolarisTargetInfo(const std::string& triple)
332    : OSTargetInfo<Target>(triple) {
333    this->UserLabelPrefix = "";
334    this->WCharType = this->SignedLong;
335    // FIXME: WIntType should be SignedLong
336  }
337};
338} // end anonymous namespace.
339
340/// GetWindowsLanguageOptions - Set the default language options for Windows.
341static void GetWindowsLanguageOptions(LangOptions &Opts,
342                                     const char *Triple) {
343  Opts.Microsoft = true;
344}
345
346//===----------------------------------------------------------------------===//
347// Specific target implementations.
348//===----------------------------------------------------------------------===//
349
350namespace {
351// PPC abstract base class
352class PPCTargetInfo : public TargetInfo {
353  static const Builtin::Info BuiltinInfo[];
354  static const char * const GCCRegNames[];
355  static const TargetInfo::GCCRegAlias GCCRegAliases[];
356
357public:
358  PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
359
360  virtual void getTargetBuiltins(const Builtin::Info *&Records,
361                                 unsigned &NumRecords) const {
362    Records = BuiltinInfo;
363    NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
364  }
365
366  virtual void getTargetDefines(const LangOptions &Opts,
367                                std::vector<char> &Defines) const;
368
369  virtual const char *getVAListDeclaration() const {
370    return "typedef char* __builtin_va_list;";
371    // This is the right definition for ABI/V4: System V.4/eabi.
372    /*return "typedef struct __va_list_tag {"
373           "  unsigned char gpr;"
374           "  unsigned char fpr;"
375           "  unsigned short reserved;"
376           "  void* overflow_arg_area;"
377           "  void* reg_save_area;"
378           "} __builtin_va_list[1];";*/
379  }
380  virtual const char *getTargetPrefix() const {
381    return "ppc";
382  }
383  virtual void getGCCRegNames(const char * const *&Names,
384                              unsigned &NumNames) const;
385  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
386                                unsigned &NumAliases) const;
387  virtual bool validateAsmConstraint(const char *&Name,
388                                     TargetInfo::ConstraintInfo &Info) const {
389    switch (*Name) {
390    default: return false;
391    case 'O': // Zero
392      return true;
393    case 'b': // Base register
394    case 'f': // Floating point register
395      Info.setAllowsRegister();
396      return true;
397    }
398  }
399  virtual void getDefaultLangOptions(LangOptions &Opts) {
400    TargetInfo::getDefaultLangOptions(Opts);
401    Opts.CharIsSigned = false;
402  }
403  virtual const char *getClobbers() const {
404    return "";
405  }
406};
407
408const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
409#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
410#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
411#include "clang/Basic/BuiltinsPPC.def"
412};
413
414
415/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
416/// #defines that are not tied to a specific subtarget.
417void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
418                                     std::vector<char> &Defs) const {
419  // Target identification.
420  Define(Defs, "__ppc__");
421  Define(Defs, "_ARCH_PPC");
422  Define(Defs, "__POWERPC__");
423  if (PointerWidth == 64) {
424    Define(Defs, "_ARCH_PPC64");
425    Define(Defs, "_LP64");
426    Define(Defs, "__LP64__");
427    Define(Defs, "__ppc64__");
428  } else {
429    Define(Defs, "__ppc__");
430  }
431
432  // Target properties.
433  Define(Defs, "_BIG_ENDIAN");
434  Define(Defs, "__BIG_ENDIAN__");
435
436  // Subtarget options.
437  Define(Defs, "__NATURAL_ALIGNMENT__");
438  Define(Defs, "__REGISTER_PREFIX__", "");
439
440  // FIXME: Should be controlled by command line option.
441  Define(Defs, "__LONG_DOUBLE_128__");
442}
443
444
445const char * const PPCTargetInfo::GCCRegNames[] = {
446  "0", "1", "2", "3", "4", "5", "6", "7",
447  "8", "9", "10", "11", "12", "13", "14", "15",
448  "16", "17", "18", "19", "20", "21", "22", "23",
449  "24", "25", "26", "27", "28", "29", "30", "31",
450  "0", "1", "2", "3", "4", "5", "6", "7",
451  "8", "9", "10", "11", "12", "13", "14", "15",
452  "16", "17", "18", "19", "20", "21", "22", "23",
453  "24", "25", "26", "27", "28", "29", "30", "31",
454  "mq", "lr", "ctr", "ap",
455  "0", "1", "2", "3", "4", "5", "6", "7",
456  "xer",
457  "0", "1", "2", "3", "4", "5", "6", "7",
458  "8", "9", "10", "11", "12", "13", "14", "15",
459  "16", "17", "18", "19", "20", "21", "22", "23",
460  "24", "25", "26", "27", "28", "29", "30", "31",
461  "vrsave", "vscr",
462  "spe_acc", "spefscr",
463  "sfp"
464};
465
466void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
467                                   unsigned &NumNames) const {
468  Names = GCCRegNames;
469  NumNames = llvm::array_lengthof(GCCRegNames);
470}
471
472const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
473  // While some of these aliases do map to different registers
474  // they still share the same register name.
475  { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
476  { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
477  { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
478  { { "cr3", "fr3", "r3", "v3"}, "3" },
479  { { "cr4", "fr4", "r4", "v4"}, "4" },
480  { { "cr5", "fr5", "r5", "v5"}, "5" },
481  { { "cr6", "fr6", "r6", "v6"}, "6" },
482  { { "cr7", "fr7", "r7", "v7"}, "7" },
483  { { "fr8", "r8", "v8"}, "8" },
484  { { "fr9", "r9", "v9"}, "9" },
485  { { "fr10", "r10", "v10"}, "10" },
486  { { "fr11", "r11", "v11"}, "11" },
487  { { "fr12", "r12", "v12"}, "12" },
488  { { "fr13", "r13", "v13"}, "13" },
489  { { "fr14", "r14", "v14"}, "14" },
490  { { "fr15", "r15", "v15"}, "15" },
491  { { "fr16", "r16", "v16"}, "16" },
492  { { "fr17", "r17", "v17"}, "17" },
493  { { "fr18", "r18", "v18"}, "18" },
494  { { "fr19", "r19", "v19"}, "19" },
495  { { "fr20", "r20", "v20"}, "20" },
496  { { "fr21", "r21", "v21"}, "21" },
497  { { "fr22", "r22", "v22"}, "22" },
498  { { "fr23", "r23", "v23"}, "23" },
499  { { "fr24", "r24", "v24"}, "24" },
500  { { "fr25", "r25", "v25"}, "25" },
501  { { "fr26", "r26", "v26"}, "26" },
502  { { "fr27", "r27", "v27"}, "27" },
503  { { "fr28", "r28", "v28"}, "28" },
504  { { "fr29", "r29", "v29"}, "29" },
505  { { "fr30", "r30", "v30"}, "30" },
506  { { "fr31", "r31", "v31"}, "31" },
507};
508
509void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
510                                     unsigned &NumAliases) const {
511  Aliases = GCCRegAliases;
512  NumAliases = llvm::array_lengthof(GCCRegAliases);
513}
514} // end anonymous namespace.
515
516namespace {
517class PPC32TargetInfo : public PPCTargetInfo {
518public:
519  PPC32TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
520    DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
521                        "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
522  }
523};
524} // end anonymous namespace.
525
526namespace {
527class PPC64TargetInfo : public PPCTargetInfo {
528public:
529  PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
530    LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
531    IntMaxType = SignedLong;
532    UIntMaxType = UnsignedLong;
533    Int64Type = SignedLong;
534    DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
535                        "i64:64:64-f32:32:32-f64:64:64-v128:128:128";
536  }
537};
538} // end anonymous namespace.
539
540namespace {
541// Namespace for x86 abstract base class
542const Builtin::Info BuiltinInfo[] = {
543#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, false },
544#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER, false },
545#include "clang/Basic/BuiltinsX86.def"
546};
547
548const char *GCCRegNames[] = {
549  "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
550  "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
551  "argp", "flags", "fspr", "dirflag", "frame",
552  "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
553  "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
554  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
555  "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
556};
557
558const TargetInfo::GCCRegAlias GCCRegAliases[] = {
559  { { "al", "ah", "eax", "rax" }, "ax" },
560  { { "bl", "bh", "ebx", "rbx" }, "bx" },
561  { { "cl", "ch", "ecx", "rcx" }, "cx" },
562  { { "dl", "dh", "edx", "rdx" }, "dx" },
563  { { "esi", "rsi" }, "si" },
564  { { "edi", "rdi" }, "di" },
565  { { "esp", "rsp" }, "sp" },
566  { { "ebp", "rbp" }, "bp" },
567};
568
569// X86 target abstract base class; x86-32 and x86-64 are very close, so
570// most of the implementation can be shared.
571class X86TargetInfo : public TargetInfo {
572  enum X86SSEEnum {
573    NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
574  } SSELevel;
575public:
576  X86TargetInfo(const std::string& triple)
577    : TargetInfo(triple), SSELevel(NoMMXSSE) {
578    LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
579  }
580  virtual void getTargetBuiltins(const Builtin::Info *&Records,
581                                 unsigned &NumRecords) const {
582    Records = BuiltinInfo;
583    NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
584  }
585  virtual const char *getTargetPrefix() const {
586    return "x86";
587  }
588  virtual void getGCCRegNames(const char * const *&Names,
589                              unsigned &NumNames) const {
590    Names = GCCRegNames;
591    NumNames = llvm::array_lengthof(GCCRegNames);
592  }
593  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
594                                unsigned &NumAliases) const {
595    Aliases = GCCRegAliases;
596    NumAliases = llvm::array_lengthof(GCCRegAliases);
597  }
598  virtual bool validateAsmConstraint(const char *&Name,
599                                     TargetInfo::ConstraintInfo &info) const;
600  virtual std::string convertConstraint(const char Constraint) const;
601  virtual const char *getClobbers() const {
602    return "~{dirflag},~{fpsr},~{flags}";
603  }
604  virtual void getTargetDefines(const LangOptions &Opts,
605                                std::vector<char> &Defines) const;
606  virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
607                                 const std::string &Name,
608                                 bool Enabled) const;
609  virtual void getDefaultFeatures(const std::string &CPU,
610                                  llvm::StringMap<bool> &Features) const;
611  virtual void HandleTargetFeatures(const llvm::StringMap<bool> &Features);
612};
613
614void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
615                                       llvm::StringMap<bool> &Features) const {
616  // FIXME: This should not be here.
617  Features["3dnow"] = false;
618  Features["3dnowa"] = false;
619  Features["mmx"] = false;
620  Features["sse"] = false;
621  Features["sse2"] = false;
622  Features["sse3"] = false;
623  Features["ssse3"] = false;
624  Features["sse41"] = false;
625  Features["sse42"] = false;
626
627  // LLVM does not currently recognize this.
628  // Features["sse4a"] = false;
629
630  // FIXME: This *really* should not be here.
631
632  // X86_64 always has SSE2.
633  if (PointerWidth == 64)
634    Features["sse2"] = Features["sse"] = Features["mmx"] = true;
635
636  if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
637      CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
638    ;
639  else if (CPU == "pentium-mmx" || CPU == "pentium2")
640    setFeatureEnabled(Features, "mmx", true);
641  else if (CPU == "pentium3")
642    setFeatureEnabled(Features, "sse", true);
643  else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
644    setFeatureEnabled(Features, "sse2", true);
645  else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
646    setFeatureEnabled(Features, "sse3", true);
647  else if (CPU == "core2")
648    setFeatureEnabled(Features, "ssse3", true);
649  else if (CPU == "penryn") {
650    setFeatureEnabled(Features, "sse4", true);
651    Features["sse42"] = false;
652  } else if (CPU == "atom")
653    setFeatureEnabled(Features, "sse3", true);
654  else if (CPU == "corei7")
655    setFeatureEnabled(Features, "sse4", true);
656  else if (CPU == "k6" || CPU == "winchip-c6")
657    setFeatureEnabled(Features, "mmx", true);
658  else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
659           CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
660    setFeatureEnabled(Features, "mmx", true);
661    setFeatureEnabled(Features, "3dnow", true);
662  } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
663    setFeatureEnabled(Features, "sse", true);
664    setFeatureEnabled(Features, "3dnowa", true);
665  } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
666           CPU == "athlon-fx") {
667    setFeatureEnabled(Features, "sse2", true);
668    setFeatureEnabled(Features, "3dnowa", true);
669  } else if (CPU == "c3-2")
670    setFeatureEnabled(Features, "sse", true);
671}
672
673bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
674                                      const std::string &Name,
675                                      bool Enabled) const {
676  // FIXME: This *really* should not be here.
677  if (!Features.count(Name) && Name != "sse4")
678    return false;
679
680  if (Enabled) {
681    if (Name == "mmx")
682      Features["mmx"] = true;
683    else if (Name == "sse")
684      Features["mmx"] = Features["sse"] = true;
685    else if (Name == "sse2")
686      Features["mmx"] = Features["sse"] = Features["sse2"] = true;
687    else if (Name == "sse3")
688      Features["mmx"] = Features["sse"] = Features["sse2"] =
689        Features["sse3"] = true;
690    else if (Name == "ssse3")
691      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
692        Features["ssse3"] = true;
693    else if (Name == "sse4")
694      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
695        Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
696    else if (Name == "3dnow")
697      Features["3dnowa"] = true;
698    else if (Name == "3dnowa")
699      Features["3dnow"] = Features["3dnowa"] = true;
700  } else {
701    if (Name == "mmx")
702      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
703        Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
704    else if (Name == "sse")
705      Features["sse"] = Features["sse2"] = Features["sse3"] =
706        Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
707    else if (Name == "sse2")
708      Features["sse2"] = Features["sse3"] = Features["ssse3"] =
709        Features["sse41"] = Features["sse42"] = false;
710    else if (Name == "sse3")
711      Features["sse3"] = Features["ssse3"] = Features["sse41"] =
712        Features["sse42"] = false;
713    else if (Name == "ssse3")
714      Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
715    else if (Name == "sse4")
716      Features["sse41"] = Features["sse42"] = false;
717    else if (Name == "3dnow")
718      Features["3dnow"] = Features["3dnowa"] = false;
719    else if (Name == "3dnowa")
720      Features["3dnowa"] = false;
721  }
722
723  return true;
724}
725
726/// HandleTargetOptions - Perform initialization based on the user
727/// configured set of features.
728void X86TargetInfo::HandleTargetFeatures(const llvm::StringMap<bool>&Features) {
729  if (Features.lookup("sse42"))
730    SSELevel = SSE42;
731  else if (Features.lookup("sse41"))
732    SSELevel = SSE41;
733  else if (Features.lookup("ssse3"))
734    SSELevel = SSSE3;
735  else if (Features.lookup("sse3"))
736    SSELevel = SSE3;
737  else if (Features.lookup("sse2"))
738    SSELevel = SSE2;
739  else if (Features.lookup("sse"))
740    SSELevel = SSE1;
741  else if (Features.lookup("mmx"))
742    SSELevel = MMX;
743}
744
745/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
746/// that are not tied to a specific subtarget.
747void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
748                                     std::vector<char> &Defs) const {
749  // Target identification.
750  if (PointerWidth == 64) {
751    Define(Defs, "_LP64");
752    Define(Defs, "__LP64__");
753    Define(Defs, "__amd64__");
754    Define(Defs, "__amd64");
755    Define(Defs, "__x86_64");
756    Define(Defs, "__x86_64__");
757  } else {
758    DefineStd(Defs, "i386", Opts);
759  }
760
761  // Target properties.
762  Define(Defs, "__LITTLE_ENDIAN__");
763
764  // Subtarget options.
765  Define(Defs, "__nocona");
766  Define(Defs, "__nocona__");
767  Define(Defs, "__tune_nocona__");
768  Define(Defs, "__REGISTER_PREFIX__", "");
769
770  // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
771  // functions in glibc header files that use FP Stack inline asm which the
772  // backend can't deal with (PR879).
773  Define(Defs, "__NO_MATH_INLINES");
774
775  // Each case falls through to the previous one here.
776  switch (SSELevel) {
777  case SSE42:
778    Define(Defs, "__SSE4_2__");
779  case SSE41:
780    Define(Defs, "__SSE4_1__");
781  case SSSE3:
782    Define(Defs, "__SSSE3__");
783  case SSE3:
784    Define(Defs, "__SSE3__");
785  case SSE2:
786    Define(Defs, "__SSE2__");
787    Define(Defs, "__SSE2_MATH__");  // -mfp-math=sse always implied.
788  case SSE1:
789    Define(Defs, "__SSE__");
790    Define(Defs, "__SSE_MATH__");   // -mfp-math=sse always implied.
791  case MMX:
792    Define(Defs, "__MMX__");
793  case NoMMXSSE:
794    break;
795  }
796}
797
798
799bool
800X86TargetInfo::validateAsmConstraint(const char *&Name,
801                                     TargetInfo::ConstraintInfo &Info) const {
802  switch (*Name) {
803  default: return false;
804  case 'a': // eax.
805  case 'b': // ebx.
806  case 'c': // ecx.
807  case 'd': // edx.
808  case 'S': // esi.
809  case 'D': // edi.
810  case 'A': // edx:eax.
811  case 't': // top of floating point stack.
812  case 'u': // second from top of floating point stack.
813  case 'q': // Any register accessible as [r]l: a, b, c, and d.
814  case 'y': // Any MMX register.
815  case 'x': // Any SSE register.
816  case 'Q': // Any register accessible as [r]h: a, b, c, and d.
817  case 'e': // 32-bit signed integer constant for use with zero-extending
818            // x86_64 instructions.
819  case 'Z': // 32-bit unsigned integer constant for use with zero-extending
820            // x86_64 instructions.
821  case 'N': // unsigned 8-bit integer constant for use with in and out
822            // instructions.
823  case 'R': // "legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
824    Info.setAllowsRegister();
825    return true;
826  }
827}
828
829std::string
830X86TargetInfo::convertConstraint(const char Constraint) const {
831  switch (Constraint) {
832  case 'a': return std::string("{ax}");
833  case 'b': return std::string("{bx}");
834  case 'c': return std::string("{cx}");
835  case 'd': return std::string("{dx}");
836  case 'S': return std::string("{si}");
837  case 'D': return std::string("{di}");
838  case 't': // top of floating point stack.
839    return std::string("{st}");
840  case 'u': // second from top of floating point stack.
841    return std::string("{st(1)}"); // second from top of floating point stack.
842  default:
843    return std::string(1, Constraint);
844  }
845}
846} // end anonymous namespace
847
848namespace {
849// X86-32 generic target
850class X86_32TargetInfo : public X86TargetInfo {
851public:
852  X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
853    DoubleAlign = LongLongAlign = 32;
854    LongDoubleWidth = 96;
855    LongDoubleAlign = 32;
856    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
857                        "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
858                        "a0:0:64-f80:32:32";
859    SizeType = UnsignedInt;
860    PtrDiffType = SignedInt;
861    IntPtrType = SignedInt;
862    RegParmMax = 3;
863  }
864  virtual const char *getVAListDeclaration() const {
865    return "typedef char* __builtin_va_list;";
866  }
867};
868} // end anonymous namespace
869
870namespace {
871class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
872public:
873  OpenBSDI386TargetInfo(const std::string& triple) :
874    OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
875    SizeType = UnsignedLong;
876    IntPtrType = SignedLong;
877    PtrDiffType = SignedLong;
878  }
879};
880} // end anonymous namespace
881
882namespace {
883class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
884public:
885  DarwinI386TargetInfo(const std::string& triple) :
886    DarwinTargetInfo<X86_32TargetInfo>(triple) {
887    LongDoubleWidth = 128;
888    LongDoubleAlign = 128;
889    SizeType = UnsignedLong;
890    IntPtrType = SignedLong;
891    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
892                        "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
893                        "a0:0:64-f80:128:128";
894  }
895
896};
897} // end anonymous namespace
898
899namespace {
900// x86-32 Windows target
901class WindowsX86_32TargetInfo : public X86_32TargetInfo {
902public:
903  WindowsX86_32TargetInfo(const std::string& triple)
904    : X86_32TargetInfo(triple) {
905    TLSSupported = false;
906    WCharType = UnsignedShort;
907    WCharWidth = WCharAlign = 16;
908    DoubleAlign = LongLongAlign = 64;
909    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
910                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
911                        "a0:0:64-f80:32:32";
912  }
913  virtual void getTargetDefines(const LangOptions &Opts,
914                                std::vector<char> &Defines) const {
915    X86_32TargetInfo::getTargetDefines(Opts, Defines);
916    // This list is based off of the the list of things MingW defines
917    Define(Defines, "_WIN32");
918    DefineStd(Defines, "WIN32", Opts);
919    DefineStd(Defines, "WINNT", Opts);
920    Define(Defines, "_X86_");
921    Define(Defines, "__MSVCRT__");
922  }
923
924  virtual void getDefaultLangOptions(LangOptions &Opts) {
925    X86_32TargetInfo::getDefaultLangOptions(Opts);
926    GetWindowsLanguageOptions(Opts, getTargetTriple());
927  }
928};
929} // end anonymous namespace
930
931namespace {
932// x86-64 generic target
933class X86_64TargetInfo : public X86TargetInfo {
934public:
935  X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
936    LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
937    LongDoubleWidth = 128;
938    LongDoubleAlign = 128;
939    IntMaxType = SignedLong;
940    UIntMaxType = UnsignedLong;
941    Int64Type = SignedLong;
942    RegParmMax = 6;
943
944    DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
945                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
946                        "a0:0:64-s0:64:64-f80:128:128";
947  }
948  virtual const char *getVAListDeclaration() const {
949    return "typedef struct __va_list_tag {"
950           "  unsigned gp_offset;"
951           "  unsigned fp_offset;"
952           "  void* overflow_arg_area;"
953           "  void* reg_save_area;"
954           "} __va_list_tag;"
955           "typedef __va_list_tag __builtin_va_list[1];";
956  }
957};
958} // end anonymous namespace
959
960namespace {
961class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
962public:
963  DarwinX86_64TargetInfo(const std::string& triple)
964      : DarwinTargetInfo<X86_64TargetInfo>(triple) {
965    Int64Type = SignedLongLong;
966  }
967};
968} // end anonymous namespace
969
970namespace {
971class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
972public:
973  OpenBSDX86_64TargetInfo(const std::string& triple)
974      : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
975    IntMaxType = SignedLongLong;
976    UIntMaxType = UnsignedLongLong;
977    Int64Type = SignedLongLong;
978  }
979};
980} // end anonymous namespace
981
982namespace {
983class ARMTargetInfo : public TargetInfo {
984  enum {
985    Armv4t,
986    Armv5,
987    Armv6,
988    Armv7a,
989    XScale
990  } ArmArch;
991public:
992  ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
993    // FIXME: Are the defaults correct for ARM?
994    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
995                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
996    if (triple.find("armv7-") == 0)
997      ArmArch = Armv7a;
998    else if (triple.find("arm-") == 0 || triple.find("armv6-") == 0)
999      ArmArch = Armv6;
1000    else if (triple.find("armv5-") == 0)
1001      ArmArch = Armv5;
1002    else if (triple.find("armv4t-") == 0)
1003      ArmArch = Armv4t;
1004    else if (triple.find("xscale-") == 0)
1005      ArmArch = XScale;
1006    else if (triple.find("armv") == 0) {
1007      // FIXME: fuzzy match for other random weird arm triples.  This is useful
1008      // for the static analyzer and other clients, but probably should be
1009      // re-evaluated when codegen is brought up.
1010      ArmArch = Armv6;
1011    }
1012  }
1013  virtual void getTargetDefines(const LangOptions &Opts,
1014                                std::vector<char> &Defs) const {
1015    // Target identification.
1016    Define(Defs, "__arm");
1017    Define(Defs, "__arm__");
1018
1019    // Target properties.
1020    Define(Defs, "__LITTLE_ENDIAN__");
1021
1022    // Subtarget options.
1023    if (ArmArch == Armv7a) {
1024      Define(Defs, "__ARM_ARCH_7A__");
1025      Define(Defs, "__THUMB_INTERWORK__");
1026    } else if (ArmArch == Armv6) {
1027      Define(Defs, "__ARM_ARCH_6K__");
1028      Define(Defs, "__THUMB_INTERWORK__");
1029    } else if (ArmArch == Armv5) {
1030      Define(Defs, "__ARM_ARCH_5TEJ__");
1031      Define(Defs, "__THUMB_INTERWORK__");
1032      Define(Defs, "__SOFTFP__");
1033    } else if (ArmArch == Armv4t) {
1034      Define(Defs, "__ARM_ARCH_4T__");
1035      Define(Defs, "__SOFTFP__");
1036    } else if (ArmArch == XScale) {
1037      Define(Defs, "__ARM_ARCH_5TE__");
1038      Define(Defs, "__XSCALE__");
1039      Define(Defs, "__SOFTFP__");
1040    }
1041    Define(Defs, "__ARMEL__");
1042    Define(Defs, "__APCS_32__");
1043    Define(Defs, "__VFP_FP__");
1044  }
1045  virtual void getTargetBuiltins(const Builtin::Info *&Records,
1046                                 unsigned &NumRecords) const {
1047    // FIXME: Implement.
1048    Records = 0;
1049    NumRecords = 0;
1050  }
1051  virtual const char *getVAListDeclaration() const {
1052    return "typedef char* __builtin_va_list;";
1053  }
1054  virtual const char *getTargetPrefix() const {
1055    return "arm";
1056  }
1057  virtual void getGCCRegNames(const char * const *&Names,
1058                              unsigned &NumNames) const {
1059    // FIXME: Implement.
1060    Names = 0;
1061    NumNames = 0;
1062  }
1063  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1064                                unsigned &NumAliases) const {
1065    // FIXME: Implement.
1066    Aliases = 0;
1067    NumAliases = 0;
1068  }
1069  virtual bool validateAsmConstraint(const char *&Name,
1070                                     TargetInfo::ConstraintInfo &Info) const {
1071    // FIXME: Check if this is complete
1072    switch (*Name) {
1073    default:
1074    case 'l': // r0-r7
1075    case 'h': // r8-r15
1076    case 'w': // VFP Floating point register single precision
1077    case 'P': // VFP Floating point register double precision
1078      Info.setAllowsRegister();
1079      return true;
1080    }
1081    return false;
1082  }
1083  virtual const char *getClobbers() const {
1084    // FIXME: Is this really right?
1085    return "";
1086  }
1087};
1088} // end anonymous namespace.
1089
1090
1091namespace {
1092class DarwinARMTargetInfo :
1093  public DarwinTargetInfo<ARMTargetInfo> {
1094protected:
1095  virtual void getOSDefines(const LangOptions &Opts, const char *Triple,
1096                    std::vector<char> &Defines) const {
1097    getDarwinDefines(Defines, Opts);
1098    getDarwinIPhoneOSDefines(Defines, Triple);
1099  }
1100
1101public:
1102  DarwinARMTargetInfo(const std::string& triple)
1103    : DarwinTargetInfo<ARMTargetInfo>(triple) {}
1104};
1105} // end anonymous namespace.
1106
1107namespace {
1108class SparcV8TargetInfo : public TargetInfo {
1109  static const TargetInfo::GCCRegAlias GCCRegAliases[];
1110  static const char * const GCCRegNames[];
1111public:
1112  SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
1113    // FIXME: Support Sparc quad-precision long double?
1114    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1115                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64";
1116  }
1117  virtual void getTargetDefines(const LangOptions &Opts,
1118                                std::vector<char> &Defines) const {
1119    DefineStd(Defines, "sparc", Opts);
1120    Define(Defines, "__sparcv8");
1121    Define(Defines, "__REGISTER_PREFIX__", "");
1122  }
1123  virtual void getTargetBuiltins(const Builtin::Info *&Records,
1124                                 unsigned &NumRecords) const {
1125    // FIXME: Implement!
1126  }
1127  virtual const char *getVAListDeclaration() const {
1128    return "typedef void* __builtin_va_list;";
1129  }
1130  virtual const char *getTargetPrefix() const {
1131    return "sparc";
1132  }
1133  virtual void getGCCRegNames(const char * const *&Names,
1134                              unsigned &NumNames) const;
1135  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1136                                unsigned &NumAliases) const;
1137  virtual bool validateAsmConstraint(const char *&Name,
1138                                     TargetInfo::ConstraintInfo &info) const {
1139    // FIXME: Implement!
1140    return false;
1141  }
1142  virtual const char *getClobbers() const {
1143    // FIXME: Implement!
1144    return "";
1145  }
1146};
1147
1148const char * const SparcV8TargetInfo::GCCRegNames[] = {
1149  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1150  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1151  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1152  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
1153};
1154
1155void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
1156                                       unsigned &NumNames) const {
1157  Names = GCCRegNames;
1158  NumNames = llvm::array_lengthof(GCCRegNames);
1159}
1160
1161const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
1162  { { "g0" }, "r0" },
1163  { { "g1" }, "r1" },
1164  { { "g2" }, "r2" },
1165  { { "g3" }, "r3" },
1166  { { "g4" }, "r4" },
1167  { { "g5" }, "r5" },
1168  { { "g6" }, "r6" },
1169  { { "g7" }, "r7" },
1170  { { "o0" }, "r8" },
1171  { { "o1" }, "r9" },
1172  { { "o2" }, "r10" },
1173  { { "o3" }, "r11" },
1174  { { "o4" }, "r12" },
1175  { { "o5" }, "r13" },
1176  { { "o6", "sp" }, "r14" },
1177  { { "o7" }, "r15" },
1178  { { "l0" }, "r16" },
1179  { { "l1" }, "r17" },
1180  { { "l2" }, "r18" },
1181  { { "l3" }, "r19" },
1182  { { "l4" }, "r20" },
1183  { { "l5" }, "r21" },
1184  { { "l6" }, "r22" },
1185  { { "l7" }, "r23" },
1186  { { "i0" }, "r24" },
1187  { { "i1" }, "r25" },
1188  { { "i2" }, "r26" },
1189  { { "i3" }, "r27" },
1190  { { "i4" }, "r28" },
1191  { { "i5" }, "r29" },
1192  { { "i6", "fp" }, "r30" },
1193  { { "i7" }, "r31" },
1194};
1195
1196void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1197                                         unsigned &NumAliases) const {
1198  Aliases = GCCRegAliases;
1199  NumAliases = llvm::array_lengthof(GCCRegAliases);
1200}
1201} // end anonymous namespace.
1202
1203namespace {
1204class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
1205public:
1206  SolarisSparcV8TargetInfo(const std::string& triple) :
1207      SolarisTargetInfo<SparcV8TargetInfo>(triple) {
1208    SizeType = UnsignedInt;
1209    PtrDiffType = SignedInt;
1210  }
1211};
1212} // end anonymous namespace.
1213
1214namespace {
1215  class PIC16TargetInfo : public TargetInfo{
1216  public:
1217    PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
1218      TLSSupported = false;
1219      IntWidth = 16;
1220      LongWidth = LongLongWidth = 32;
1221      IntMaxTWidth = 32;
1222      PointerWidth = 16;
1223      IntAlign = 8;
1224      LongAlign = LongLongAlign = 8;
1225      PointerAlign = 8;
1226      SizeType = UnsignedInt;
1227      IntMaxType = SignedLong;
1228      UIntMaxType = UnsignedLong;
1229      IntPtrType = SignedShort;
1230      PtrDiffType = SignedInt;
1231      FloatWidth = 32;
1232      FloatAlign = 32;
1233      DoubleWidth = 32;
1234      DoubleAlign = 32;
1235      LongDoubleWidth = 32;
1236      LongDoubleAlign = 32;
1237      FloatFormat = &llvm::APFloat::IEEEsingle;
1238      DoubleFormat = &llvm::APFloat::IEEEsingle;
1239      LongDoubleFormat = &llvm::APFloat::IEEEsingle;
1240      DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8-f32:32:32";
1241
1242    }
1243    virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
1244    virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
1245    virtual void getTargetDefines(const LangOptions &Opts,
1246                                  std::vector<char> &Defines) const {
1247      Define(Defines, "__pic16");
1248      Define(Defines, "rom", "__attribute__((address_space(1)))");
1249      Define(Defines, "ram", "__attribute__((address_space(0)))");
1250      Define(Defines, "_section(SectName)", "__attribute__((section(SectName)))");
1251      Define(Defines, "_address(Addr)","__attribute__((section(\"Address=\"#Addr)))");
1252      Define(Defines, "_CONFIG(conf)", "asm(\"CONFIG \"#conf)");
1253    }
1254    virtual void getTargetBuiltins(const Builtin::Info *&Records,
1255                                   unsigned &NumRecords) const {}
1256    virtual const char *getVAListDeclaration() const { return "";}
1257    virtual const char *getClobbers() const {return "";}
1258    virtual const char *getTargetPrefix() const {return "pic16";}
1259    virtual void getGCCRegNames(const char * const *&Names,
1260                                unsigned &NumNames) const {}
1261    virtual bool validateAsmConstraint(const char *&Name,
1262                                       TargetInfo::ConstraintInfo &info) const {
1263      return true;
1264    }
1265    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1266                                  unsigned &NumAliases) const {}
1267    virtual bool useGlobalsForAutomaticVariables() const {return true;}
1268  };
1269}
1270
1271namespace {
1272  class MSP430TargetInfo : public TargetInfo {
1273    static const char * const GCCRegNames[];
1274  public:
1275    MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
1276      TLSSupported = false;
1277      IntWidth = 16;
1278      LongWidth = LongLongWidth = 32;
1279      IntMaxTWidth = 32;
1280      PointerWidth = 16;
1281      IntAlign = 8;
1282      LongAlign = LongLongAlign = 8;
1283      PointerAlign = 8;
1284      SizeType = UnsignedInt;
1285      IntMaxType = SignedLong;
1286      UIntMaxType = UnsignedLong;
1287      IntPtrType = SignedShort;
1288      PtrDiffType = SignedInt;
1289      DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
1290   }
1291    virtual void getTargetDefines(const LangOptions &Opts,
1292                                 std::vector<char> &Defines) const {
1293      Define(Defines, "MSP430");
1294      Define(Defines, "__MSP430__");
1295      // FIXME: defines for different 'flavours' of MCU
1296    }
1297    virtual void getTargetBuiltins(const Builtin::Info *&Records,
1298                                   unsigned &NumRecords) const {
1299     // FIXME: Implement.
1300      Records = 0;
1301      NumRecords = 0;
1302    }
1303    virtual const char *getTargetPrefix() const {
1304      return "msp430";
1305    }
1306    virtual void getGCCRegNames(const char * const *&Names,
1307                                unsigned &NumNames) const;
1308    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1309                                  unsigned &NumAliases) const {
1310      // No aliases.
1311      Aliases = 0;
1312      NumAliases = 0;
1313    }
1314    virtual bool validateAsmConstraint(const char *&Name,
1315                                       TargetInfo::ConstraintInfo &info) const {
1316      // FIXME: implement
1317      return true;
1318    }
1319    virtual const char *getClobbers() const {
1320      // FIXME: Is this really right?
1321      return "";
1322    }
1323    virtual const char *getVAListDeclaration() const {
1324      // FIXME: implement
1325      return "typedef char* __builtin_va_list;";
1326   }
1327  };
1328
1329  const char * const MSP430TargetInfo::GCCRegNames[] = {
1330    "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1331    "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1332  };
1333
1334  void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
1335                                        unsigned &NumNames) const {
1336    Names = GCCRegNames;
1337    NumNames = llvm::array_lengthof(GCCRegNames);
1338  }
1339}
1340
1341
1342namespace {
1343  class SystemZTargetInfo : public TargetInfo {
1344    static const char * const GCCRegNames[];
1345  public:
1346    SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
1347      TLSSupported = false;
1348      IntWidth = IntAlign = 32;
1349      LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
1350      PointerWidth = PointerAlign = 64;
1351      DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16";
1352   }
1353    virtual void getTargetDefines(const LangOptions &Opts,
1354                                 std::vector<char> &Defines) const {
1355      Define(Defines, "__s390__");
1356      Define(Defines, "__s390x__");
1357    }
1358    virtual void getTargetBuiltins(const Builtin::Info *&Records,
1359                                   unsigned &NumRecords) const {
1360      // FIXME: Implement.
1361      Records = 0;
1362      NumRecords = 0;
1363    }
1364    virtual const char *getTargetPrefix() const {
1365      return "s390x";
1366    }
1367
1368    virtual void getDefaultLangOptions(LangOptions &Opts) {
1369      TargetInfo::getDefaultLangOptions(Opts);
1370      Opts.CharIsSigned = false;
1371    }
1372
1373    virtual void getGCCRegNames(const char * const *&Names,
1374                                unsigned &NumNames) const;
1375    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1376                                  unsigned &NumAliases) const {
1377      // No aliases.
1378      Aliases = 0;
1379      NumAliases = 0;
1380    }
1381    virtual bool validateAsmConstraint(const char *&Name,
1382                                       TargetInfo::ConstraintInfo &info) const {
1383      // FIXME: implement
1384      return true;
1385    }
1386    virtual const char *getClobbers() const {
1387      // FIXME: Is this really right?
1388      return "";
1389    }
1390    virtual const char *getVAListDeclaration() const {
1391      // FIXME: implement
1392      return "typedef char* __builtin_va_list;";
1393   }
1394  };
1395
1396  const char * const SystemZTargetInfo::GCCRegNames[] = {
1397    "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1398    "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1399  };
1400
1401  void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
1402                                         unsigned &NumNames) const {
1403    Names = GCCRegNames;
1404    NumNames = llvm::array_lengthof(GCCRegNames);
1405  }
1406}
1407
1408namespace {
1409  class BlackfinTargetInfo : public TargetInfo {
1410    static const char * const GCCRegNames[];
1411  public:
1412    BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
1413      TLSSupported = false;
1414      DoubleAlign = 32;
1415      LongLongAlign = 32;
1416      LongDoubleAlign = 32;
1417      DescriptionString = "e-p:32:32-i64:32-f64:32";
1418    }
1419
1420    virtual void getTargetDefines(const LangOptions &Opts,
1421                                  std::vector<char> &Defines) const {
1422      DefineStd(Defines, "bfin", Opts);
1423      DefineStd(Defines, "BFIN", Opts);
1424      Define(Defines, "__ADSPBLACKFIN__");
1425      // FIXME: This one is really dependent on -mcpu
1426      Define(Defines, "__ADSPLPBLACKFIN__");
1427      // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
1428    }
1429
1430    virtual void getTargetBuiltins(const Builtin::Info *&Records,
1431                                   unsigned &NumRecords) const {
1432      // FIXME: Implement.
1433      Records = 0;
1434      NumRecords = 0;
1435    }
1436
1437    virtual const char *getTargetPrefix() const {
1438      return "bfin";
1439    }
1440
1441    virtual void getGCCRegNames(const char * const *&Names,
1442                                unsigned &NumNames) const;
1443
1444    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1445                                  unsigned &NumAliases) const {
1446      // No aliases.
1447      Aliases = 0;
1448      NumAliases = 0;
1449    }
1450
1451    virtual bool validateAsmConstraint(const char *&Name,
1452                                       TargetInfo::ConstraintInfo &Info) const {
1453      if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
1454        Info.setAllowsRegister();
1455        return true;
1456      }
1457      return false;
1458    }
1459
1460    virtual const char *getClobbers() const {
1461      return "";
1462    }
1463
1464    virtual const char *getVAListDeclaration() const {
1465      return "typedef char* __builtin_va_list;";
1466    }
1467  };
1468
1469  const char * const BlackfinTargetInfo::GCCRegNames[] = {
1470    "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1471    "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
1472    "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
1473    "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
1474    "a0", "a1", "cc",
1475    "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
1476    "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
1477  };
1478
1479  void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
1480                                          unsigned &NumNames) const {
1481    Names = GCCRegNames;
1482    NumNames = llvm::array_lengthof(GCCRegNames);
1483  }
1484}
1485
1486namespace {
1487
1488  // LLVM and Clang cannot be used directly to output native binaries for
1489  // target, but is used to compile C code to llvm bitcode with correct
1490  // type and alignment information.
1491  //
1492  // TCE uses the llvm bitcode as input and uses it for generating customized
1493  // target processor and program binary. TCE co-design environment is
1494  // publicly available in http://tce.cs.tut.fi
1495
1496  class TCETargetInfo : public TargetInfo{
1497  public:
1498    TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
1499      TLSSupported = false;
1500      IntWidth = 32;
1501      LongWidth = LongLongWidth = 32;
1502      IntMaxTWidth = 32;
1503      PointerWidth = 32;
1504      IntAlign = 32;
1505      LongAlign = LongLongAlign = 32;
1506      PointerAlign = 32;
1507      SizeType = UnsignedInt;
1508      IntMaxType = SignedLong;
1509      UIntMaxType = UnsignedLong;
1510      IntPtrType = SignedInt;
1511      PtrDiffType = SignedInt;
1512      FloatWidth = 32;
1513      FloatAlign = 32;
1514      DoubleWidth = 32;
1515      DoubleAlign = 32;
1516      LongDoubleWidth = 32;
1517      LongDoubleAlign = 32;
1518      FloatFormat = &llvm::APFloat::IEEEsingle;
1519      DoubleFormat = &llvm::APFloat::IEEEsingle;
1520      LongDoubleFormat = &llvm::APFloat::IEEEsingle;
1521      DescriptionString = "E-p:32:32:32-a0:32:32"
1522                          "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64"
1523                          "-f32:32:32-f64:32:64";
1524    }
1525
1526    virtual void getTargetDefines(const LangOptions &Opts,
1527                                  std::vector<char> &Defines) const {
1528      DefineStd(Defines, "tce", Opts);
1529      Define(Defines, "__TCE__");
1530      Define(Defines, "__TCE_V1__");
1531    }
1532    virtual void getTargetBuiltins(const Builtin::Info *&Records,
1533                                   unsigned &NumRecords) const {}
1534    virtual const char *getClobbers() const {return "";}
1535    virtual const char *getVAListDeclaration() const {
1536      return "typedef void* __builtin_va_list;";
1537    }
1538    virtual const char *getTargetPrefix() const {return "tce";}
1539    virtual void getGCCRegNames(const char * const *&Names,
1540                                unsigned &NumNames) const {}
1541    virtual bool validateAsmConstraint(const char *&Name,
1542                                       TargetInfo::ConstraintInfo &info) const {
1543      return true;
1544    }
1545    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1546                                  unsigned &NumAliases) const {}
1547  };
1548}
1549
1550//===----------------------------------------------------------------------===//
1551// Driver code
1552//===----------------------------------------------------------------------===//
1553
1554/// CreateTargetInfo - Return the target info object for the specified target
1555/// triple.
1556TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
1557  llvm::Triple Triple(T);
1558  llvm::Triple::OSType os = Triple.getOS();
1559
1560  switch (Triple.getArch()) {
1561  default:
1562    return NULL;
1563
1564  case llvm::Triple::arm:
1565    switch (os) {
1566    case llvm::Triple::Darwin:
1567      return new DarwinARMTargetInfo(T);
1568    case llvm::Triple::FreeBSD:
1569      return new FreeBSDTargetInfo<ARMTargetInfo>(T);
1570    default:
1571      return new ARMTargetInfo(T);
1572    }
1573
1574  case llvm::Triple::bfin:
1575    return new BlackfinTargetInfo(T);
1576
1577  case llvm::Triple::msp430:
1578    return new MSP430TargetInfo(T);
1579
1580  case llvm::Triple::pic16:
1581    return new PIC16TargetInfo(T);
1582
1583  case llvm::Triple::ppc:
1584    if (os == llvm::Triple::Darwin)
1585      return new DarwinTargetInfo<PPCTargetInfo>(T);
1586    return new PPC32TargetInfo(T);
1587
1588  case llvm::Triple::ppc64:
1589    if (os == llvm::Triple::Darwin)
1590      return new DarwinTargetInfo<PPC64TargetInfo>(T);
1591    return new PPC64TargetInfo(T);
1592
1593  case llvm::Triple::sparc:
1594    if (os == llvm::Triple::Solaris)
1595      return new SolarisSparcV8TargetInfo(T);
1596    return new SparcV8TargetInfo(T);
1597
1598  case llvm::Triple::systemz:
1599    return new SystemZTargetInfo(T);
1600
1601  case llvm::Triple::tce:
1602    return new TCETargetInfo(T);
1603
1604  case llvm::Triple::x86:
1605    switch (os) {
1606    case llvm::Triple::Darwin:
1607      return new DarwinI386TargetInfo(T);
1608    case llvm::Triple::Linux:
1609      return new LinuxTargetInfo<X86_32TargetInfo>(T);
1610    case llvm::Triple::DragonFly:
1611      return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
1612    case llvm::Triple::NetBSD:
1613      return new NetBSDTargetInfo<X86_32TargetInfo>(T);
1614    case llvm::Triple::OpenBSD:
1615      return new OpenBSDI386TargetInfo(T);
1616    case llvm::Triple::FreeBSD:
1617      return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
1618    case llvm::Triple::Solaris:
1619      return new SolarisTargetInfo<X86_32TargetInfo>(T);
1620    case llvm::Triple::Cygwin:
1621    case llvm::Triple::MinGW32:
1622    case llvm::Triple::MinGW64:
1623    case llvm::Triple::Win32:
1624      return new WindowsX86_32TargetInfo(T);
1625    default:
1626      return new X86_32TargetInfo(T);
1627    }
1628
1629  case llvm::Triple::x86_64:
1630    switch (os) {
1631    case llvm::Triple::Darwin:
1632      return new DarwinX86_64TargetInfo(T);
1633    case llvm::Triple::Linux:
1634      return new LinuxTargetInfo<X86_64TargetInfo>(T);
1635    case llvm::Triple::NetBSD:
1636      return new NetBSDTargetInfo<X86_64TargetInfo>(T);
1637    case llvm::Triple::OpenBSD:
1638      return new OpenBSDX86_64TargetInfo(T);
1639    case llvm::Triple::FreeBSD:
1640      return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
1641    case llvm::Triple::Solaris:
1642      return new SolarisTargetInfo<X86_64TargetInfo>(T);
1643    default:
1644      return new X86_64TargetInfo(T);
1645    }
1646  }
1647}
1648