Targets.cpp revision db57a4cdb0a6abf3239f3a794a900ce312c5887b
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/TargetInfo.h"
16#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
18#include "clang/Basic/LangOptions.h"
19#include "clang/Basic/MacroBuilder.h"
20#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
22#include "llvm/ADT/APFloat.h"
23#include "llvm/ADT/OwningPtr.h"
24#include "llvm/ADT/STLExtras.h"
25#include "llvm/ADT/StringRef.h"
26#include "llvm/ADT/StringSwitch.h"
27#include "llvm/ADT/Triple.h"
28#include "llvm/MC/MCSectionMachO.h"
29#include "llvm/Type.h"
30#include <algorithm>
31using namespace clang;
32
33//===----------------------------------------------------------------------===//
34//  Common code shared among targets.
35//===----------------------------------------------------------------------===//
36
37/// DefineStd - Define a macro name and standard variants.  For example if
38/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
39/// when in GNU mode.
40static void DefineStd(MacroBuilder &Builder, llvm::StringRef MacroName,
41                      const LangOptions &Opts) {
42  assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
43
44  // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
45  // in the user's namespace.
46  if (Opts.GNUMode)
47    Builder.defineMacro(MacroName);
48
49  // Define __unix.
50  Builder.defineMacro("__" + MacroName);
51
52  // Define __unix__.
53  Builder.defineMacro("__" + MacroName + "__");
54}
55
56//===----------------------------------------------------------------------===//
57// Defines specific to certain operating systems.
58//===----------------------------------------------------------------------===//
59
60namespace {
61template<typename TgtInfo>
62class OSTargetInfo : public TgtInfo {
63protected:
64  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
65                            MacroBuilder &Builder) const=0;
66public:
67  OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
68  virtual void getTargetDefines(const LangOptions &Opts,
69                                MacroBuilder &Builder) const {
70    TgtInfo::getTargetDefines(Opts, Builder);
71    getOSDefines(Opts, TgtInfo::getTriple(), Builder);
72  }
73
74};
75} // end anonymous namespace
76
77
78static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
79                             const llvm::Triple &Triple,
80                             llvm::StringRef &PlatformName,
81                             VersionTuple &PlatformMinVersion) {
82  Builder.defineMacro("__APPLE_CC__", "5621");
83  Builder.defineMacro("__APPLE__");
84  Builder.defineMacro("__MACH__");
85  Builder.defineMacro("OBJC_NEW_PROPERTIES");
86
87  // __weak is always defined, for use in blocks and with objc pointers.
88  Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
89
90  // Darwin defines __strong even in C mode (just to nothing).
91  if (!Opts.ObjC1 || Opts.getGCMode() == LangOptions::NonGC)
92    Builder.defineMacro("__strong", "");
93  else
94    Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
95
96  if (Opts.Static)
97    Builder.defineMacro("__STATIC__");
98  else
99    Builder.defineMacro("__DYNAMIC__");
100
101  if (Opts.POSIXThreads)
102    Builder.defineMacro("_REENTRANT");
103
104  // Get the platform type and version number from the triple.
105  unsigned Maj, Min, Rev;
106
107  // If no version was given, default to to 10.4.0, for simplifying tests.
108  if (Triple.getOSName() == "darwin" || Triple.getOSName() == "osx") {
109    PlatformName = "macosx";
110    Min = Rev = 0;
111    Maj = 8;
112  } else {
113    // Otherwise, honor all three triple forms ("-darwinNNN[-iphoneos]",
114    // "-osxNNN", and "-iosNNN").
115
116    if (Triple.getOS() == llvm::Triple::Darwin) {
117      // For historical reasons that make little sense, the version passed here
118      // is the "darwin" version, which drops the 10 and offsets by 4.
119      Triple.getOSVersion(Maj, Min, Rev);
120
121      if (Triple.getEnvironmentName() == "iphoneos") {
122        PlatformName = "ios";
123      } else {
124        assert(Rev == 0 && "invalid triple, unexpected micro version!");
125        PlatformName = "macosx";
126        Rev = Min;
127        Min = Maj - 4;
128        Maj = 10;
129      }
130    } else if (Triple.getOS() == llvm::Triple::OSX) {
131      Triple.getOSVersion(Maj, Min, Rev);
132      PlatformName = "macosx";
133    } else {
134      assert(Triple.getOS() == llvm::Triple::IOS && "unexpected triple!");
135      Triple.getOSVersion(Maj, Min, Rev);
136      PlatformName = "ios";
137    }
138  }
139
140  // Set the appropriate OS version define.
141  if (PlatformName == "ios") {
142    assert(Maj < 10 && Min < 99 && Rev < 99 && "Invalid version!");
143    char Str[6];
144    Str[0] = '0' + Maj;
145    Str[1] = '0' + (Min / 10);
146    Str[2] = '0' + (Min % 10);
147    Str[3] = '0' + (Rev / 10);
148    Str[4] = '0' + (Rev % 10);
149    Str[5] = '\0';
150    Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
151  } else {
152    assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
153    assert(Maj < 99 && Min < 10 && Rev < 10 && "Invalid version!");
154    char Str[5];
155    Str[0] = '0' + (Maj / 10);
156    Str[1] = '0' + (Maj % 10);
157    Str[2] = '0' + Min;
158    Str[3] = '0' + Rev;
159    Str[4] = '\0';
160    Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
161  }
162
163  PlatformMinVersion = VersionTuple(Maj, Min, Rev);
164}
165
166namespace {
167template<typename Target>
168class DarwinTargetInfo : public OSTargetInfo<Target> {
169protected:
170  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
171                            MacroBuilder &Builder) const {
172    getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
173                     this->PlatformMinVersion);
174  }
175
176public:
177  DarwinTargetInfo(const std::string& triple) :
178    OSTargetInfo<Target>(triple) {
179      this->TLSSupported = llvm::Triple(triple).getDarwinMajorNumber() > 10;
180      this->MCountName = "\01mcount";
181    }
182
183  virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
184    // Let MCSectionMachO validate this.
185    llvm::StringRef Segment, Section;
186    unsigned TAA, StubSize;
187    bool HasTAA;
188    return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
189                                                       TAA, HasTAA, StubSize);
190  }
191
192  virtual const char *getStaticInitSectionSpecifier() const {
193    // FIXME: We should return 0 when building kexts.
194    return "__TEXT,__StaticInit,regular,pure_instructions";
195  }
196
197};
198
199
200// DragonFlyBSD Target
201template<typename Target>
202class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
203protected:
204  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
205                            MacroBuilder &Builder) const {
206    // DragonFly defines; list based off of gcc output
207    Builder.defineMacro("__DragonFly__");
208    Builder.defineMacro("__DragonFly_cc_version", "100001");
209    Builder.defineMacro("__ELF__");
210    Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
211    Builder.defineMacro("__tune_i386__");
212    DefineStd(Builder, "unix", Opts);
213  }
214public:
215  DragonFlyBSDTargetInfo(const std::string &triple)
216    : OSTargetInfo<Target>(triple) {}
217};
218
219// FreeBSD Target
220template<typename Target>
221class FreeBSDTargetInfo : public OSTargetInfo<Target> {
222protected:
223  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
224                            MacroBuilder &Builder) const {
225    // FreeBSD defines; list based off of gcc output
226
227    // FIXME: Move version number handling to llvm::Triple.
228    llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
229
230    Builder.defineMacro("__FreeBSD__", Release);
231    Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
232    Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
233    DefineStd(Builder, "unix", Opts);
234    Builder.defineMacro("__ELF__");
235  }
236public:
237  FreeBSDTargetInfo(const std::string &triple)
238    : OSTargetInfo<Target>(triple) {
239      this->UserLabelPrefix = "";
240
241      llvm::Triple Triple(triple);
242      switch (Triple.getArch()) {
243        default:
244        case llvm::Triple::x86:
245        case llvm::Triple::x86_64:
246          this->MCountName = ".mcount";
247          break;
248        case llvm::Triple::mips:
249        case llvm::Triple::mipsel:
250        case llvm::Triple::ppc:
251        case llvm::Triple::ppc64:
252          this->MCountName = "_mcount";
253          break;
254        case llvm::Triple::arm:
255          this->MCountName = "__mcount";
256          break;
257      }
258
259    }
260};
261
262// Minix Target
263template<typename Target>
264class MinixTargetInfo : public OSTargetInfo<Target> {
265protected:
266  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
267                            MacroBuilder &Builder) const {
268    // Minix defines
269
270    Builder.defineMacro("__minix", "3");
271    Builder.defineMacro("_EM_WSIZE", "4");
272    Builder.defineMacro("_EM_PSIZE", "4");
273    Builder.defineMacro("_EM_SSIZE", "2");
274    Builder.defineMacro("_EM_LSIZE", "4");
275    Builder.defineMacro("_EM_FSIZE", "4");
276    Builder.defineMacro("_EM_DSIZE", "8");
277    DefineStd(Builder, "unix", Opts);
278  }
279public:
280  MinixTargetInfo(const std::string &triple)
281    : OSTargetInfo<Target>(triple) {
282      this->UserLabelPrefix = "";
283    }
284};
285
286// Linux target
287template<typename Target>
288class LinuxTargetInfo : public OSTargetInfo<Target> {
289protected:
290  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
291                            MacroBuilder &Builder) const {
292    // Linux defines; list based off of gcc output
293    DefineStd(Builder, "unix", Opts);
294    DefineStd(Builder, "linux", Opts);
295    Builder.defineMacro("__gnu_linux__");
296    Builder.defineMacro("__ELF__");
297    if (Opts.POSIXThreads)
298      Builder.defineMacro("_REENTRANT");
299    if (Opts.CPlusPlus)
300      Builder.defineMacro("_GNU_SOURCE");
301  }
302public:
303  LinuxTargetInfo(const std::string& triple)
304    : OSTargetInfo<Target>(triple) {
305    this->UserLabelPrefix = "";
306    this->WIntType = TargetInfo::UnsignedInt;
307  }
308};
309
310// NetBSD Target
311template<typename Target>
312class NetBSDTargetInfo : public OSTargetInfo<Target> {
313protected:
314  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
315                            MacroBuilder &Builder) const {
316    // NetBSD defines; list based off of gcc output
317    Builder.defineMacro("__NetBSD__");
318    Builder.defineMacro("__unix__");
319    Builder.defineMacro("__ELF__");
320    if (Opts.POSIXThreads)
321      Builder.defineMacro("_POSIX_THREADS");
322  }
323public:
324  NetBSDTargetInfo(const std::string &triple)
325    : OSTargetInfo<Target>(triple) {
326      this->UserLabelPrefix = "";
327    }
328};
329
330// OpenBSD Target
331template<typename Target>
332class OpenBSDTargetInfo : public OSTargetInfo<Target> {
333protected:
334  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
335                            MacroBuilder &Builder) const {
336    // OpenBSD defines; list based off of gcc output
337
338    Builder.defineMacro("__OpenBSD__");
339    DefineStd(Builder, "unix", Opts);
340    Builder.defineMacro("__ELF__");
341    if (Opts.POSIXThreads)
342      Builder.defineMacro("_POSIX_THREADS");
343  }
344public:
345  OpenBSDTargetInfo(const std::string &triple)
346    : OSTargetInfo<Target>(triple) {}
347};
348
349// PSP Target
350template<typename Target>
351class PSPTargetInfo : public OSTargetInfo<Target> {
352protected:
353  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
354                            MacroBuilder &Builder) const {
355    // PSP defines; list based on the output of the pspdev gcc toolchain.
356    Builder.defineMacro("PSP");
357    Builder.defineMacro("_PSP");
358    Builder.defineMacro("__psp__");
359    Builder.defineMacro("__ELF__");
360  }
361public:
362  PSPTargetInfo(const std::string& triple)
363    : OSTargetInfo<Target>(triple) {
364    this->UserLabelPrefix = "";
365  }
366};
367
368// PS3 PPU Target
369template<typename Target>
370class PS3PPUTargetInfo : public OSTargetInfo<Target> {
371protected:
372  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
373                            MacroBuilder &Builder) const {
374    // PS3 PPU defines.
375    Builder.defineMacro("__PPC__");
376    Builder.defineMacro("__PPU__");
377    Builder.defineMacro("__CELLOS_LV2__");
378    Builder.defineMacro("__ELF__");
379    Builder.defineMacro("__LP32__");
380    Builder.defineMacro("_ARCH_PPC64");
381    Builder.defineMacro("__powerpc64__");
382  }
383public:
384  PS3PPUTargetInfo(const std::string& triple)
385    : OSTargetInfo<Target>(triple) {
386    this->UserLabelPrefix = "";
387    this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
388    this->IntMaxType = TargetInfo::SignedLongLong;
389    this->UIntMaxType = TargetInfo::UnsignedLongLong;
390    this->Int64Type = TargetInfo::SignedLongLong;
391    this->SizeType = TargetInfo::UnsignedInt;
392    this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
393                        "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
394  }
395};
396
397// FIXME: Need a real SPU target.
398// PS3 SPU Target
399template<typename Target>
400class PS3SPUTargetInfo : public OSTargetInfo<Target> {
401protected:
402  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
403                            MacroBuilder &Builder) const {
404    // PS3 PPU defines.
405    Builder.defineMacro("__SPU__");
406    Builder.defineMacro("__ELF__");
407  }
408public:
409  PS3SPUTargetInfo(const std::string& triple)
410    : OSTargetInfo<Target>(triple) {
411    this->UserLabelPrefix = "";
412  }
413};
414
415// AuroraUX target
416template<typename Target>
417class AuroraUXTargetInfo : public OSTargetInfo<Target> {
418protected:
419  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
420                            MacroBuilder &Builder) const {
421    DefineStd(Builder, "sun", Opts);
422    DefineStd(Builder, "unix", Opts);
423    Builder.defineMacro("__ELF__");
424    Builder.defineMacro("__svr4__");
425    Builder.defineMacro("__SVR4");
426  }
427public:
428  AuroraUXTargetInfo(const std::string& triple)
429    : OSTargetInfo<Target>(triple) {
430    this->UserLabelPrefix = "";
431    this->WCharType = this->SignedLong;
432    // FIXME: WIntType should be SignedLong
433  }
434};
435
436// Solaris target
437template<typename Target>
438class SolarisTargetInfo : public OSTargetInfo<Target> {
439protected:
440  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
441                            MacroBuilder &Builder) const {
442    DefineStd(Builder, "sun", Opts);
443    DefineStd(Builder, "unix", Opts);
444    Builder.defineMacro("__ELF__");
445    Builder.defineMacro("__svr4__");
446    Builder.defineMacro("__SVR4");
447  }
448public:
449  SolarisTargetInfo(const std::string& triple)
450    : OSTargetInfo<Target>(triple) {
451    this->UserLabelPrefix = "";
452    this->WCharType = this->SignedLong;
453    // FIXME: WIntType should be SignedLong
454  }
455};
456
457// Windows target
458template<typename Target>
459class WindowsTargetInfo : public OSTargetInfo<Target> {
460protected:
461  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
462                            MacroBuilder &Builder) const {
463    Builder.defineMacro("_WIN32");
464  }
465  void getVisualStudioDefines(const LangOptions &Opts,
466                              MacroBuilder &Builder) const {
467    if (Opts.CPlusPlus) {
468      if (Opts.RTTI)
469        Builder.defineMacro("_CPPRTTI");
470
471      if (Opts.Exceptions)
472        Builder.defineMacro("_CPPUNWIND");
473    }
474
475    if (!Opts.CharIsSigned)
476      Builder.defineMacro("_CHAR_UNSIGNED");
477
478    // FIXME: POSIXThreads isn't exactly the option this should be defined for,
479    //        but it works for now.
480    if (Opts.POSIXThreads)
481      Builder.defineMacro("_MT");
482
483    if (Opts.MSCVersion != 0)
484      Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
485
486    if (Opts.Microsoft) {
487      Builder.defineMacro("_MSC_EXTENSIONS");
488
489      if (Opts.CPlusPlus0x) {
490        Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
491        Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
492        Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
493      }
494    }
495
496    Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
497  }
498
499public:
500  WindowsTargetInfo(const std::string &triple)
501    : OSTargetInfo<Target>(triple) {}
502};
503
504} // end anonymous namespace.
505
506//===----------------------------------------------------------------------===//
507// Specific target implementations.
508//===----------------------------------------------------------------------===//
509
510namespace {
511// PPC abstract base class
512class PPCTargetInfo : public TargetInfo {
513  static const Builtin::Info BuiltinInfo[];
514  static const char * const GCCRegNames[];
515  static const TargetInfo::GCCRegAlias GCCRegAliases[];
516
517public:
518  PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
519
520  virtual void getTargetBuiltins(const Builtin::Info *&Records,
521                                 unsigned &NumRecords) const {
522    Records = BuiltinInfo;
523    NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
524  }
525
526  virtual void getTargetDefines(const LangOptions &Opts,
527                                MacroBuilder &Builder) const;
528
529  virtual void getGCCRegNames(const char * const *&Names,
530                              unsigned &NumNames) const;
531  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
532                                unsigned &NumAliases) const;
533  virtual bool validateAsmConstraint(const char *&Name,
534                                     TargetInfo::ConstraintInfo &Info) const {
535    switch (*Name) {
536    default: return false;
537    case 'O': // Zero
538      break;
539    case 'b': // Base register
540    case 'f': // Floating point register
541      Info.setAllowsRegister();
542      break;
543    // FIXME: The following are added to allow parsing.
544    // I just took a guess at what the actions should be.
545    // Also, is more specific checking needed?  I.e. specific registers?
546    case 'd': // Floating point register (containing 64-bit value)
547    case 'v': // Altivec vector register
548      Info.setAllowsRegister();
549      break;
550    case 'w':
551      switch (Name[1]) {
552        case 'd':// VSX vector register to hold vector double data
553        case 'f':// VSX vector register to hold vector float data
554        case 's':// VSX vector register to hold scalar float data
555        case 'a':// Any VSX register
556          break;
557        default:
558          return false;
559      }
560      Info.setAllowsRegister();
561      Name++; // Skip over 'w'.
562      break;
563    case 'h': // `MQ', `CTR', or `LINK' register
564    case 'q': // `MQ' register
565    case 'c': // `CTR' register
566    case 'l': // `LINK' register
567    case 'x': // `CR' register (condition register) number 0
568    case 'y': // `CR' register (condition register)
569    case 'z': // `XER[CA]' carry bit (part of the XER register)
570      Info.setAllowsRegister();
571      break;
572    case 'I': // Signed 16-bit constant
573    case 'J': // Unsigned 16-bit constant shifted left 16 bits
574              //  (use `L' instead for SImode constants)
575    case 'K': // Unsigned 16-bit constant
576    case 'L': // Signed 16-bit constant shifted left 16 bits
577    case 'M': // Constant larger than 31
578    case 'N': // Exact power of 2
579    case 'P': // Constant whose negation is a signed 16-bit constant
580    case 'G': // Floating point constant that can be loaded into a
581              // register with one instruction per word
582    case 'H': // Integer/Floating point constant that can be loaded
583              // into a register using three instructions
584      break;
585    case 'm': // Memory operand. Note that on PowerPC targets, m can
586              // include addresses that update the base register. It
587              // is therefore only safe to use `m' in an asm statement
588              // if that asm statement accesses the operand exactly once.
589              // The asm statement must also use `%U<opno>' as a
590              // placeholder for the "update" flag in the corresponding
591              // load or store instruction. For example:
592              // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
593              // is correct but:
594              // asm ("st %1,%0" : "=m" (mem) : "r" (val));
595              // is not. Use es rather than m if you don't want the base
596              // register to be updated.
597    case 'e':
598      if (Name[1] != 's')
599          return false;
600              // es: A "stable" memory operand; that is, one which does not
601              // include any automodification of the base register. Unlike
602              // `m', this constraint can be used in asm statements that
603              // might access the operand several times, or that might not
604              // access it at all.
605      Info.setAllowsMemory();
606      Name++; // Skip over 'e'.
607      break;
608    case 'Q': // Memory operand that is an offset from a register (it is
609              // usually better to use `m' or `es' in asm statements)
610    case 'Z': // Memory operand that is an indexed or indirect from a
611              // register (it is usually better to use `m' or `es' in
612              // asm statements)
613      Info.setAllowsMemory();
614      Info.setAllowsRegister();
615      break;
616    case 'R': // AIX TOC entry
617    case 'a': // Address operand that is an indexed or indirect from a
618              // register (`p' is preferable for asm statements)
619    case 'S': // Constant suitable as a 64-bit mask operand
620    case 'T': // Constant suitable as a 32-bit mask operand
621    case 'U': // System V Release 4 small data area reference
622    case 't': // AND masks that can be performed by two rldic{l, r}
623              // instructions
624    case 'W': // Vector constant that does not require memory
625    case 'j': // Vector constant that is all zeros.
626      break;
627    // End FIXME.
628    }
629    return true;
630  }
631  virtual const char *getClobbers() const {
632    return "";
633  }
634};
635
636const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
637#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
638#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
639                                              ALL_LANGUAGES, false },
640#include "clang/Basic/BuiltinsPPC.def"
641};
642
643
644/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
645/// #defines that are not tied to a specific subtarget.
646void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
647                                     MacroBuilder &Builder) const {
648  // Target identification.
649  Builder.defineMacro("__ppc__");
650  Builder.defineMacro("_ARCH_PPC");
651  Builder.defineMacro("__powerpc__");
652  Builder.defineMacro("__POWERPC__");
653  if (PointerWidth == 64) {
654    Builder.defineMacro("_ARCH_PPC64");
655    Builder.defineMacro("_LP64");
656    Builder.defineMacro("__LP64__");
657    Builder.defineMacro("__powerpc64__");
658    Builder.defineMacro("__ppc64__");
659  } else {
660    Builder.defineMacro("__ppc__");
661  }
662
663  // Target properties.
664  Builder.defineMacro("_BIG_ENDIAN");
665  Builder.defineMacro("__BIG_ENDIAN__");
666
667  // Subtarget options.
668  Builder.defineMacro("__NATURAL_ALIGNMENT__");
669  Builder.defineMacro("__REGISTER_PREFIX__", "");
670
671  // FIXME: Should be controlled by command line option.
672  Builder.defineMacro("__LONG_DOUBLE_128__");
673
674  if (Opts.AltiVec) {
675    Builder.defineMacro("__VEC__", "10206");
676    Builder.defineMacro("__ALTIVEC__");
677  }
678}
679
680
681const char * const PPCTargetInfo::GCCRegNames[] = {
682  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
683  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
684  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
685  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
686  "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
687  "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
688  "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
689  "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
690  "mq", "lr", "ctr", "ap",
691  "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
692  "xer",
693  "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
694  "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
695  "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
696  "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
697  "vrsave", "vscr",
698  "spe_acc", "spefscr",
699  "sfp"
700};
701
702void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
703                                   unsigned &NumNames) const {
704  Names = GCCRegNames;
705  NumNames = llvm::array_lengthof(GCCRegNames);
706}
707
708const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
709  // While some of these aliases do map to different registers
710  // they still share the same register name.
711  { { "0" }, "r0" },
712  { { "1"}, "r1" },
713  { { "2" }, "r2" },
714  { { "3" }, "r3" },
715  { { "4" }, "r4" },
716  { { "5" }, "r5" },
717  { { "6" }, "r6" },
718  { { "7" }, "r7" },
719  { { "8" }, "r8" },
720  { { "9" }, "r9" },
721  { { "10" }, "r10" },
722  { { "11" }, "r11" },
723  { { "12" }, "r12" },
724  { { "13" }, "r13" },
725  { { "14" }, "r14" },
726  { { "15" }, "r15" },
727  { { "16" }, "r16" },
728  { { "17" }, "r17" },
729  { { "18" }, "r18" },
730  { { "19" }, "r19" },
731  { { "20" }, "r20" },
732  { { "21" }, "r21" },
733  { { "22" }, "r22" },
734  { { "23" }, "r23" },
735  { { "24" }, "r24" },
736  { { "25" }, "r25" },
737  { { "26" }, "r26" },
738  { { "27" }, "r27" },
739  { { "28" }, "r28" },
740  { { "29" }, "r29" },
741  { { "30" }, "r30" },
742  { { "31" }, "r31" },
743  { { "fr0" }, "f0" },
744  { { "fr1" }, "f1" },
745  { { "fr2" }, "f2" },
746  { { "fr3" }, "f3" },
747  { { "fr4" }, "f4" },
748  { { "fr5" }, "f5" },
749  { { "fr6" }, "f6" },
750  { { "fr7" }, "f7" },
751  { { "fr8" }, "f8" },
752  { { "fr9" }, "f9" },
753  { { "fr10" }, "f10" },
754  { { "fr11" }, "f11" },
755  { { "fr12" }, "f12" },
756  { { "fr13" }, "f13" },
757  { { "fr14" }, "f14" },
758  { { "fr15" }, "f15" },
759  { { "fr16" }, "f16" },
760  { { "fr17" }, "f17" },
761  { { "fr18" }, "f18" },
762  { { "fr19" }, "f19" },
763  { { "fr20" }, "f20" },
764  { { "fr21" }, "f21" },
765  { { "fr22" }, "f22" },
766  { { "fr23" }, "f23" },
767  { { "fr24" }, "f24" },
768  { { "fr25" }, "f25" },
769  { { "fr26" }, "f26" },
770  { { "fr27" }, "f27" },
771  { { "fr28" }, "f28" },
772  { { "fr29" }, "f29" },
773  { { "fr30" }, "f30" },
774  { { "fr31" }, "f31" },
775  { { "cc" }, "cr0" },
776};
777
778void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
779                                     unsigned &NumAliases) const {
780  Aliases = GCCRegAliases;
781  NumAliases = llvm::array_lengthof(GCCRegAliases);
782}
783} // end anonymous namespace.
784
785namespace {
786class PPC32TargetInfo : public PPCTargetInfo {
787public:
788  PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
789    DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
790                        "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
791
792    if (getTriple().getOS() == llvm::Triple::FreeBSD)
793        SizeType = UnsignedInt;
794  }
795
796  virtual const char *getVAListDeclaration() const {
797    // This is the ELF definition, and is overridden by the Darwin sub-target
798    return "typedef struct __va_list_tag {"
799           "  unsigned char gpr;"
800           "  unsigned char fpr;"
801           "  unsigned short reserved;"
802           "  void* overflow_arg_area;"
803           "  void* reg_save_area;"
804           "} __builtin_va_list[1];";
805  }
806};
807} // end anonymous namespace.
808
809namespace {
810class PPC64TargetInfo : public PPCTargetInfo {
811public:
812  PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
813    LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
814    IntMaxType = SignedLong;
815    UIntMaxType = UnsignedLong;
816    Int64Type = SignedLong;
817    DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
818                        "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
819  }
820  virtual const char *getVAListDeclaration() const {
821    return "typedef char* __builtin_va_list;";
822  }
823};
824} // end anonymous namespace.
825
826
827namespace {
828class DarwinPPC32TargetInfo :
829  public DarwinTargetInfo<PPC32TargetInfo> {
830public:
831  DarwinPPC32TargetInfo(const std::string& triple)
832    : DarwinTargetInfo<PPC32TargetInfo>(triple) {
833    HasAlignMac68kSupport = true;
834    BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
835  }
836  virtual const char *getVAListDeclaration() const {
837    return "typedef char* __builtin_va_list;";
838  }
839};
840
841class DarwinPPC64TargetInfo :
842  public DarwinTargetInfo<PPC64TargetInfo> {
843public:
844  DarwinPPC64TargetInfo(const std::string& triple)
845    : DarwinTargetInfo<PPC64TargetInfo>(triple) {
846    HasAlignMac68kSupport = true;
847  }
848};
849} // end anonymous namespace.
850
851namespace {
852// MBlaze abstract base class
853class MBlazeTargetInfo : public TargetInfo {
854  static const char * const GCCRegNames[];
855  static const TargetInfo::GCCRegAlias GCCRegAliases[];
856
857public:
858  MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
859    DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
860  }
861
862  virtual void getTargetBuiltins(const Builtin::Info *&Records,
863                                 unsigned &NumRecords) const {
864    // FIXME: Implement.
865    Records = 0;
866    NumRecords = 0;
867  }
868
869  virtual void getTargetDefines(const LangOptions &Opts,
870                                MacroBuilder &Builder) const;
871
872  virtual const char *getVAListDeclaration() const {
873    return "typedef char* __builtin_va_list;";
874  }
875  virtual const char *getTargetPrefix() const {
876    return "mblaze";
877  }
878  virtual void getGCCRegNames(const char * const *&Names,
879                              unsigned &NumNames) const;
880  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
881                                unsigned &NumAliases) const;
882  virtual bool validateAsmConstraint(const char *&Name,
883                                     TargetInfo::ConstraintInfo &Info) const {
884    switch (*Name) {
885    default: return false;
886    case 'O': // Zero
887      return true;
888    case 'b': // Base register
889    case 'f': // Floating point register
890      Info.setAllowsRegister();
891      return true;
892    }
893  }
894  virtual const char *getClobbers() const {
895    return "";
896  }
897};
898
899/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
900/// #defines that are not tied to a specific subtarget.
901void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
902                                     MacroBuilder &Builder) const {
903  // Target identification.
904  Builder.defineMacro("__microblaze__");
905  Builder.defineMacro("_ARCH_MICROBLAZE");
906  Builder.defineMacro("__MICROBLAZE__");
907
908  // Target properties.
909  Builder.defineMacro("_BIG_ENDIAN");
910  Builder.defineMacro("__BIG_ENDIAN__");
911
912  // Subtarget options.
913  Builder.defineMacro("__REGISTER_PREFIX__", "");
914}
915
916
917const char * const MBlazeTargetInfo::GCCRegNames[] = {
918  "r0",   "r1",   "r2",   "r3",   "r4",   "r5",   "r6",   "r7",
919  "r8",   "r9",   "r10",  "r11",  "r12",  "r13",  "r14",  "r15",
920  "r16",  "r17",  "r18",  "r19",  "r20",  "r21",  "r22",  "r23",
921  "r24",  "r25",  "r26",  "r27",  "r28",  "r29",  "r30",  "r31",
922  "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
923  "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
924  "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
925  "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
926  "hi",   "lo",   "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
927  "$fcc5","$fcc6","$fcc7","$ap",  "$rap", "$frp"
928};
929
930void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
931                                   unsigned &NumNames) const {
932  Names = GCCRegNames;
933  NumNames = llvm::array_lengthof(GCCRegNames);
934}
935
936const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
937  { {"f0"},  "r0" },
938  { {"f1"},  "r1" },
939  { {"f2"},  "r2" },
940  { {"f3"},  "r3" },
941  { {"f4"},  "r4" },
942  { {"f5"},  "r5" },
943  { {"f6"},  "r6" },
944  { {"f7"},  "r7" },
945  { {"f8"},  "r8" },
946  { {"f9"},  "r9" },
947  { {"f10"}, "r10" },
948  { {"f11"}, "r11" },
949  { {"f12"}, "r12" },
950  { {"f13"}, "r13" },
951  { {"f14"}, "r14" },
952  { {"f15"}, "r15" },
953  { {"f16"}, "r16" },
954  { {"f17"}, "r17" },
955  { {"f18"}, "r18" },
956  { {"f19"}, "r19" },
957  { {"f20"}, "r20" },
958  { {"f21"}, "r21" },
959  { {"f22"}, "r22" },
960  { {"f23"}, "r23" },
961  { {"f24"}, "r24" },
962  { {"f25"}, "r25" },
963  { {"f26"}, "r26" },
964  { {"f27"}, "r27" },
965  { {"f28"}, "r28" },
966  { {"f29"}, "r29" },
967  { {"f30"}, "r30" },
968  { {"f31"}, "r31" },
969};
970
971void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
972                                     unsigned &NumAliases) const {
973  Aliases = GCCRegAliases;
974  NumAliases = llvm::array_lengthof(GCCRegAliases);
975}
976} // end anonymous namespace.
977
978namespace {
979// Namespace for x86 abstract base class
980const Builtin::Info BuiltinInfo[] = {
981#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
982#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
983                                              ALL_LANGUAGES, false },
984#include "clang/Basic/BuiltinsX86.def"
985};
986
987static const char* const GCCRegNames[] = {
988  "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
989  "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
990  "argp", "flags", "fspr", "dirflag", "frame",
991  "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
992  "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
993  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
994  "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
995};
996
997const TargetInfo::GCCRegAlias GCCRegAliases[] = {
998  { { "al", "ah", "eax", "rax" }, "ax" },
999  { { "bl", "bh", "ebx", "rbx" }, "bx" },
1000  { { "cl", "ch", "ecx", "rcx" }, "cx" },
1001  { { "dl", "dh", "edx", "rdx" }, "dx" },
1002  { { "esi", "rsi" }, "si" },
1003  { { "edi", "rdi" }, "di" },
1004  { { "esp", "rsp" }, "sp" },
1005  { { "ebp", "rbp" }, "bp" },
1006};
1007
1008// X86 target abstract base class; x86-32 and x86-64 are very close, so
1009// most of the implementation can be shared.
1010class X86TargetInfo : public TargetInfo {
1011  enum X86SSEEnum {
1012    NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
1013  } SSELevel;
1014  enum AMD3DNowEnum {
1015    NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
1016  } AMD3DNowLevel;
1017
1018  bool HasAES;
1019  bool HasAVX;
1020
1021public:
1022  X86TargetInfo(const std::string& triple)
1023    : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
1024      HasAES(false), HasAVX(false) {
1025    LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
1026  }
1027  virtual void getTargetBuiltins(const Builtin::Info *&Records,
1028                                 unsigned &NumRecords) const {
1029    Records = BuiltinInfo;
1030    NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
1031  }
1032  virtual void getGCCRegNames(const char * const *&Names,
1033                              unsigned &NumNames) const {
1034    Names = GCCRegNames;
1035    NumNames = llvm::array_lengthof(GCCRegNames);
1036  }
1037  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1038                                unsigned &NumAliases) const {
1039    Aliases = GCCRegAliases;
1040    NumAliases = llvm::array_lengthof(GCCRegAliases);
1041  }
1042  virtual bool validateAsmConstraint(const char *&Name,
1043                                     TargetInfo::ConstraintInfo &info) const;
1044  virtual std::string convertConstraint(const char Constraint) const;
1045  virtual const char *getClobbers() const {
1046    return "~{dirflag},~{fpsr},~{flags}";
1047  }
1048  virtual void getTargetDefines(const LangOptions &Opts,
1049                                MacroBuilder &Builder) const;
1050  virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1051                                 const std::string &Name,
1052                                 bool Enabled) const;
1053  virtual void getDefaultFeatures(const std::string &CPU,
1054                                  llvm::StringMap<bool> &Features) const;
1055  virtual void HandleTargetFeatures(std::vector<std::string> &Features);
1056};
1057
1058void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
1059                                       llvm::StringMap<bool> &Features) const {
1060  // FIXME: This should not be here.
1061  Features["3dnow"] = false;
1062  Features["3dnowa"] = false;
1063  Features["mmx"] = false;
1064  Features["sse"] = false;
1065  Features["sse2"] = false;
1066  Features["sse3"] = false;
1067  Features["ssse3"] = false;
1068  Features["sse41"] = false;
1069  Features["sse42"] = false;
1070  Features["aes"] = false;
1071  Features["avx"] = false;
1072
1073  // LLVM does not currently recognize this.
1074  // Features["sse4a"] = false;
1075
1076  // FIXME: This *really* should not be here.
1077
1078  // X86_64 always has SSE2.
1079  if (PointerWidth == 64)
1080    Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1081
1082  if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1083      CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1084    ;
1085  else if (CPU == "pentium-mmx" || CPU == "pentium2")
1086    setFeatureEnabled(Features, "mmx", true);
1087  else if (CPU == "pentium3")
1088    setFeatureEnabled(Features, "sse", true);
1089  else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
1090    setFeatureEnabled(Features, "sse2", true);
1091  else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
1092    setFeatureEnabled(Features, "sse3", true);
1093  else if (CPU == "core2")
1094    setFeatureEnabled(Features, "ssse3", true);
1095  else if (CPU == "penryn") {
1096    setFeatureEnabled(Features, "sse4", true);
1097    Features["sse42"] = false;
1098  } else if (CPU == "atom")
1099    setFeatureEnabled(Features, "sse3", true);
1100  else if (CPU == "corei7") {
1101    setFeatureEnabled(Features, "sse4", true);
1102    setFeatureEnabled(Features, "aes", true);
1103  } else if (CPU == "sandybridge") {
1104    setFeatureEnabled(Features, "sse4", true);
1105    setFeatureEnabled(Features, "aes", true);
1106//    setFeatureEnabled(Features, "avx", true);
1107  } else if (CPU == "k6" || CPU == "winchip-c6")
1108    setFeatureEnabled(Features, "mmx", true);
1109  else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
1110           CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
1111    setFeatureEnabled(Features, "mmx", true);
1112    setFeatureEnabled(Features, "3dnow", true);
1113  } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1114    setFeatureEnabled(Features, "sse", true);
1115    setFeatureEnabled(Features, "3dnowa", true);
1116  } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1117           CPU == "athlon-fx") {
1118    setFeatureEnabled(Features, "sse2", true);
1119    setFeatureEnabled(Features, "3dnowa", true);
1120  } else if (CPU == "k8-sse3") {
1121    setFeatureEnabled(Features, "sse3", true);
1122    setFeatureEnabled(Features, "3dnowa", true);
1123  } else if (CPU == "c3-2")
1124    setFeatureEnabled(Features, "sse", true);
1125}
1126
1127bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1128                                      const std::string &Name,
1129                                      bool Enabled) const {
1130  // FIXME: This *really* should not be here.  We need some way of translating
1131  // options into llvm subtarget features.
1132  if (!Features.count(Name) &&
1133      (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
1134    return false;
1135
1136  if (Enabled) {
1137    if (Name == "mmx")
1138      Features["mmx"] = true;
1139    else if (Name == "sse")
1140      Features["mmx"] = Features["sse"] = true;
1141    else if (Name == "sse2")
1142      Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1143    else if (Name == "sse3")
1144      Features["mmx"] = Features["sse"] = Features["sse2"] =
1145        Features["sse3"] = true;
1146    else if (Name == "ssse3")
1147      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1148        Features["ssse3"] = true;
1149    else if (Name == "sse4" || Name == "sse4.2")
1150      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1151        Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
1152    else if (Name == "sse4.1")
1153      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1154        Features["ssse3"] = Features["sse41"] = true;
1155    else if (Name == "3dnow")
1156      Features["3dnowa"] = true;
1157    else if (Name == "3dnowa")
1158      Features["3dnow"] = Features["3dnowa"] = true;
1159    else if (Name == "aes")
1160      Features["aes"] = true;
1161    else if (Name == "avx")
1162      Features["avx"] = true;
1163  } else {
1164    if (Name == "mmx")
1165      Features["mmx"] = Features["3dnow"] = Features["3dnowa"] =
1166        Features["sse"] = Features["sse2"] = Features["sse3"] =
1167        Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1168    else if (Name == "sse")
1169      Features["sse"] = Features["sse2"] = Features["sse3"] =
1170        Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1171    else if (Name == "sse2")
1172      Features["sse2"] = Features["sse3"] = Features["ssse3"] =
1173        Features["sse41"] = Features["sse42"] = false;
1174    else if (Name == "sse3")
1175      Features["sse3"] = Features["ssse3"] = Features["sse41"] =
1176        Features["sse42"] = false;
1177    else if (Name == "ssse3")
1178      Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1179    else if (Name == "sse4" || Name == "sse4.1")
1180      Features["sse41"] = Features["sse42"] = false;
1181    else if (Name == "sse4.2")
1182      Features["sse42"] = false;
1183    else if (Name == "3dnow")
1184      Features["3dnow"] = Features["3dnowa"] = false;
1185    else if (Name == "3dnowa")
1186      Features["3dnowa"] = false;
1187    else if (Name == "aes")
1188      Features["aes"] = false;
1189    else if (Name == "avx")
1190      Features["avx"] = false;
1191  }
1192
1193  return true;
1194}
1195
1196/// HandleTargetOptions - Perform initialization based on the user
1197/// configured set of features.
1198void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
1199  // Remember the maximum enabled sselevel.
1200  for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1201    // Ignore disabled features.
1202    if (Features[i][0] == '-')
1203      continue;
1204
1205    if (Features[i].substr(1) == "aes") {
1206      HasAES = true;
1207      continue;
1208    }
1209
1210    // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1211    // For now let it be enabled together with other SSE levels.
1212    if (Features[i].substr(1) == "avx") {
1213      HasAVX = true;
1214      continue;
1215    }
1216
1217    assert(Features[i][0] == '+' && "Invalid target feature!");
1218    X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1219      .Case("sse42", SSE42)
1220      .Case("sse41", SSE41)
1221      .Case("ssse3", SSSE3)
1222      .Case("sse3", SSE3)
1223      .Case("sse2", SSE2)
1224      .Case("sse", SSE1)
1225      .Case("mmx", MMX)
1226      .Default(NoMMXSSE);
1227    SSELevel = std::max(SSELevel, Level);
1228
1229    AMD3DNowEnum ThreeDNowLevel =
1230      llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1231        .Case("3dnowa", AMD3DNowAthlon)
1232        .Case("3dnow", AMD3DNow)
1233        .Default(NoAMD3DNow);
1234
1235    AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
1236  }
1237}
1238
1239/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1240/// that are not tied to a specific subtarget.
1241void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
1242                                     MacroBuilder &Builder) const {
1243  // Target identification.
1244  if (PointerWidth == 64) {
1245    Builder.defineMacro("_LP64");
1246    Builder.defineMacro("__LP64__");
1247    Builder.defineMacro("__amd64__");
1248    Builder.defineMacro("__amd64");
1249    Builder.defineMacro("__x86_64");
1250    Builder.defineMacro("__x86_64__");
1251  } else {
1252    DefineStd(Builder, "i386", Opts);
1253  }
1254
1255  if (HasAES)
1256    Builder.defineMacro("__AES__");
1257
1258  if (HasAVX)
1259    Builder.defineMacro("__AVX__");
1260
1261  // Target properties.
1262  Builder.defineMacro("__LITTLE_ENDIAN__");
1263
1264  // Subtarget options.
1265  Builder.defineMacro("__nocona");
1266  Builder.defineMacro("__nocona__");
1267  Builder.defineMacro("__tune_nocona__");
1268  Builder.defineMacro("__REGISTER_PREFIX__", "");
1269
1270  // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1271  // functions in glibc header files that use FP Stack inline asm which the
1272  // backend can't deal with (PR879).
1273  Builder.defineMacro("__NO_MATH_INLINES");
1274
1275  // Each case falls through to the previous one here.
1276  switch (SSELevel) {
1277  case SSE42:
1278    Builder.defineMacro("__SSE4_2__");
1279  case SSE41:
1280    Builder.defineMacro("__SSE4_1__");
1281  case SSSE3:
1282    Builder.defineMacro("__SSSE3__");
1283  case SSE3:
1284    Builder.defineMacro("__SSE3__");
1285  case SSE2:
1286    Builder.defineMacro("__SSE2__");
1287    Builder.defineMacro("__SSE2_MATH__");  // -mfp-math=sse always implied.
1288  case SSE1:
1289    Builder.defineMacro("__SSE__");
1290    Builder.defineMacro("__SSE_MATH__");   // -mfp-math=sse always implied.
1291  case MMX:
1292    Builder.defineMacro("__MMX__");
1293  case NoMMXSSE:
1294    break;
1295  }
1296
1297  if (Opts.Microsoft && PointerWidth == 32) {
1298    switch (SSELevel) {
1299    case SSE42:
1300    case SSE41:
1301    case SSSE3:
1302    case SSE3:
1303    case SSE2:
1304      Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1305      break;
1306    case SSE1:
1307      Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1308      break;
1309    default:
1310      Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1311    }
1312  }
1313
1314  // Each case falls through to the previous one here.
1315  switch (AMD3DNowLevel) {
1316  case AMD3DNowAthlon:
1317    Builder.defineMacro("__3dNOW_A__");
1318  case AMD3DNow:
1319    Builder.defineMacro("__3dNOW__");
1320  case NoAMD3DNow:
1321    break;
1322  }
1323}
1324
1325
1326bool
1327X86TargetInfo::validateAsmConstraint(const char *&Name,
1328                                     TargetInfo::ConstraintInfo &Info) const {
1329  switch (*Name) {
1330  default: return false;
1331  case 'Y': // first letter of a pair:
1332    switch (*(Name+1)) {
1333    default: return false;
1334    case '0':  // First SSE register.
1335    case 't':  // Any SSE register, when SSE2 is enabled.
1336    case 'i':  // Any SSE register, when SSE2 and inter-unit moves enabled.
1337    case 'm':  // any MMX register, when inter-unit moves enabled.
1338      break;   // falls through to setAllowsRegister.
1339  }
1340  case 'a': // eax.
1341  case 'b': // ebx.
1342  case 'c': // ecx.
1343  case 'd': // edx.
1344  case 'S': // esi.
1345  case 'D': // edi.
1346  case 'A': // edx:eax.
1347  case 'f': // any x87 floating point stack register.
1348  case 't': // top of floating point stack.
1349  case 'u': // second from top of floating point stack.
1350  case 'q': // Any register accessible as [r]l: a, b, c, and d.
1351  case 'y': // Any MMX register.
1352  case 'x': // Any SSE register.
1353  case 'Q': // Any register accessible as [r]h: a, b, c, and d.
1354  case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1355  case 'l': // "Index" registers: any general register that can be used as an
1356            // index in a base+index memory access.
1357    Info.setAllowsRegister();
1358    return true;
1359  case 'C': // SSE floating point constant.
1360  case 'G': // x87 floating point constant.
1361  case 'e': // 32-bit signed integer constant for use with zero-extending
1362            // x86_64 instructions.
1363  case 'Z': // 32-bit unsigned integer constant for use with zero-extending
1364            // x86_64 instructions.
1365    return true;
1366  }
1367  return false;
1368}
1369
1370
1371std::string
1372X86TargetInfo::convertConstraint(const char Constraint) const {
1373  switch (Constraint) {
1374  case 'a': return std::string("{ax}");
1375  case 'b': return std::string("{bx}");
1376  case 'c': return std::string("{cx}");
1377  case 'd': return std::string("{dx}");
1378  case 'S': return std::string("{si}");
1379  case 'D': return std::string("{di}");
1380  case 'p': // address
1381    return std::string("im");
1382  case 't': // top of floating point stack.
1383    return std::string("{st}");
1384  case 'u': // second from top of floating point stack.
1385    return std::string("{st(1)}"); // second from top of floating point stack.
1386  default:
1387    return std::string(1, Constraint);
1388  }
1389}
1390} // end anonymous namespace
1391
1392namespace {
1393// X86-32 generic target
1394class X86_32TargetInfo : public X86TargetInfo {
1395public:
1396  X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1397    DoubleAlign = LongLongAlign = 32;
1398    LongDoubleWidth = 96;
1399    LongDoubleAlign = 32;
1400    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1401                        "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
1402                        "a0:0:64-f80:32:32-n8:16:32";
1403    SizeType = UnsignedInt;
1404    PtrDiffType = SignedInt;
1405    IntPtrType = SignedInt;
1406    RegParmMax = 3;
1407
1408    // Use fpret for all types.
1409    RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1410                             (1 << TargetInfo::Double) |
1411                             (1 << TargetInfo::LongDouble));
1412  }
1413  virtual const char *getVAListDeclaration() const {
1414    return "typedef char* __builtin_va_list;";
1415  }
1416
1417  int getEHDataRegisterNumber(unsigned RegNo) const {
1418    if (RegNo == 0) return 0;
1419    if (RegNo == 1) return 2;
1420    return -1;
1421  }
1422};
1423} // end anonymous namespace
1424
1425namespace {
1426class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1427public:
1428  OpenBSDI386TargetInfo(const std::string& triple) :
1429    OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1430    SizeType = UnsignedLong;
1431    IntPtrType = SignedLong;
1432    PtrDiffType = SignedLong;
1433  }
1434};
1435} // end anonymous namespace
1436
1437namespace {
1438class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
1439public:
1440  DarwinI386TargetInfo(const std::string& triple) :
1441    DarwinTargetInfo<X86_32TargetInfo>(triple) {
1442    LongDoubleWidth = 128;
1443    LongDoubleAlign = 128;
1444    SizeType = UnsignedLong;
1445    IntPtrType = SignedLong;
1446    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1447                        "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
1448                        "a0:0:64-f80:128:128-n8:16:32";
1449    HasAlignMac68kSupport = true;
1450  }
1451
1452};
1453} // end anonymous namespace
1454
1455namespace {
1456// x86-32 Windows target
1457class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
1458public:
1459  WindowsX86_32TargetInfo(const std::string& triple)
1460    : WindowsTargetInfo<X86_32TargetInfo>(triple) {
1461    TLSSupported = false;
1462    WCharType = UnsignedShort;
1463    DoubleAlign = LongLongAlign = 64;
1464    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1465                        "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1466                        "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
1467  }
1468  virtual void getTargetDefines(const LangOptions &Opts,
1469                                MacroBuilder &Builder) const {
1470    WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1471  }
1472};
1473} // end anonymous namespace
1474
1475namespace {
1476
1477// x86-32 Windows Visual Studio target
1478class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1479public:
1480  VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1481    : WindowsX86_32TargetInfo(triple) {
1482    LongDoubleWidth = LongDoubleAlign = 64;
1483    LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1484  }
1485  virtual void getTargetDefines(const LangOptions &Opts,
1486                                MacroBuilder &Builder) const {
1487    WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1488    WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1489    // The value of the following reflects processor type.
1490    // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1491    // We lost the original triple, so we use the default.
1492    Builder.defineMacro("_M_IX86", "600");
1493  }
1494};
1495} // end anonymous namespace
1496
1497namespace {
1498// x86-32 MinGW target
1499class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1500public:
1501  MinGWX86_32TargetInfo(const std::string& triple)
1502    : WindowsX86_32TargetInfo(triple) {
1503  }
1504  virtual void getTargetDefines(const LangOptions &Opts,
1505                                MacroBuilder &Builder) const {
1506    WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1507    DefineStd(Builder, "WIN32", Opts);
1508    DefineStd(Builder, "WINNT", Opts);
1509    Builder.defineMacro("_X86_");
1510    Builder.defineMacro("__MSVCRT__");
1511    Builder.defineMacro("__MINGW32__");
1512
1513    // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1514    // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1515    if (Opts.Microsoft)
1516      // Provide "as-is" __declspec.
1517      Builder.defineMacro("__declspec", "__declspec");
1518    else
1519      // Provide alias of __attribute__ like mingw32-gcc.
1520      Builder.defineMacro("__declspec(a)", "__attribute__((a))");
1521  }
1522};
1523} // end anonymous namespace
1524
1525namespace {
1526// x86-32 Cygwin target
1527class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1528public:
1529  CygwinX86_32TargetInfo(const std::string& triple)
1530    : X86_32TargetInfo(triple) {
1531    TLSSupported = false;
1532    WCharType = UnsignedShort;
1533    DoubleAlign = LongLongAlign = 64;
1534    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1535                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
1536                        "a0:0:64-f80:32:32-n8:16:32";
1537  }
1538  virtual void getTargetDefines(const LangOptions &Opts,
1539                                MacroBuilder &Builder) const {
1540    X86_32TargetInfo::getTargetDefines(Opts, Builder);
1541    Builder.defineMacro("__CYGWIN__");
1542    Builder.defineMacro("__CYGWIN32__");
1543    DefineStd(Builder, "unix", Opts);
1544    if (Opts.CPlusPlus)
1545      Builder.defineMacro("_GNU_SOURCE");
1546  }
1547};
1548} // end anonymous namespace
1549
1550namespace {
1551// x86-32 Haiku target
1552class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1553public:
1554  HaikuX86_32TargetInfo(const std::string& triple)
1555    : X86_32TargetInfo(triple) {
1556    SizeType = UnsignedLong;
1557    IntPtrType = SignedLong;
1558    PtrDiffType = SignedLong;
1559    this->UserLabelPrefix = "";
1560  }
1561  virtual void getTargetDefines(const LangOptions &Opts,
1562                                MacroBuilder &Builder) const {
1563    X86_32TargetInfo::getTargetDefines(Opts, Builder);
1564    Builder.defineMacro("__INTEL__");
1565    Builder.defineMacro("__HAIKU__");
1566  }
1567};
1568} // end anonymous namespace
1569
1570namespace {
1571// x86-64 generic target
1572class X86_64TargetInfo : public X86TargetInfo {
1573public:
1574  X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
1575    LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
1576    LongDoubleWidth = 128;
1577    LongDoubleAlign = 128;
1578    LargeArrayMinWidth = 128;
1579    LargeArrayAlign = 128;
1580    IntMaxType = SignedLong;
1581    UIntMaxType = UnsignedLong;
1582    Int64Type = SignedLong;
1583    RegParmMax = 6;
1584
1585    DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1586                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
1587                        "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
1588
1589    // Use fpret only for long double.
1590    RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
1591  }
1592  virtual const char *getVAListDeclaration() const {
1593    return "typedef struct __va_list_tag {"
1594           "  unsigned gp_offset;"
1595           "  unsigned fp_offset;"
1596           "  void* overflow_arg_area;"
1597           "  void* reg_save_area;"
1598           "} __va_list_tag;"
1599           "typedef __va_list_tag __builtin_va_list[1];";
1600  }
1601
1602  int getEHDataRegisterNumber(unsigned RegNo) const {
1603    if (RegNo == 0) return 0;
1604    if (RegNo == 1) return 1;
1605    return -1;
1606  }
1607};
1608} // end anonymous namespace
1609
1610namespace {
1611// x86-64 Windows target
1612class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
1613public:
1614  WindowsX86_64TargetInfo(const std::string& triple)
1615    : WindowsTargetInfo<X86_64TargetInfo>(triple) {
1616    TLSSupported = false;
1617    WCharType = UnsignedShort;
1618    LongWidth = LongAlign = 32;
1619    DoubleAlign = LongLongAlign = 64;
1620    IntMaxType = SignedLongLong;
1621    UIntMaxType = UnsignedLongLong;
1622    Int64Type = SignedLongLong;
1623    SizeType = UnsignedLongLong;
1624    PtrDiffType = SignedLongLong;
1625    IntPtrType = SignedLongLong;
1626    this->UserLabelPrefix = "";
1627  }
1628  virtual void getTargetDefines(const LangOptions &Opts,
1629                                MacroBuilder &Builder) const {
1630    WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
1631    Builder.defineMacro("_WIN64");
1632  }
1633  virtual const char *getVAListDeclaration() const {
1634    return "typedef char* __builtin_va_list;";
1635  }
1636};
1637} // end anonymous namespace
1638
1639namespace {
1640// x86-64 Windows Visual Studio target
1641class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1642public:
1643  VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1644    : WindowsX86_64TargetInfo(triple) {
1645    LongDoubleWidth = LongDoubleAlign = 64;
1646    LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1647  }
1648  virtual void getTargetDefines(const LangOptions &Opts,
1649                                MacroBuilder &Builder) const {
1650    WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1651    WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
1652    Builder.defineMacro("_M_X64");
1653    Builder.defineMacro("_M_AMD64");
1654  }
1655};
1656} // end anonymous namespace
1657
1658namespace {
1659// x86-64 MinGW target
1660class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1661public:
1662  MinGWX86_64TargetInfo(const std::string& triple)
1663    : WindowsX86_64TargetInfo(triple) {
1664  }
1665  virtual void getTargetDefines(const LangOptions &Opts,
1666                                MacroBuilder &Builder) const {
1667    WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1668    DefineStd(Builder, "WIN64", Opts);
1669    Builder.defineMacro("__MSVCRT__");
1670    Builder.defineMacro("__MINGW32__");
1671    Builder.defineMacro("__MINGW64__");
1672
1673    // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1674    // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1675    if (Opts.Microsoft)
1676      // Provide "as-is" __declspec.
1677      Builder.defineMacro("__declspec", "__declspec");
1678    else
1679      // Provide alias of __attribute__ like mingw32-gcc.
1680      Builder.defineMacro("__declspec(a)", "__attribute__((a))");
1681  }
1682};
1683} // end anonymous namespace
1684
1685namespace {
1686class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1687public:
1688  DarwinX86_64TargetInfo(const std::string& triple)
1689      : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1690    Int64Type = SignedLongLong;
1691  }
1692};
1693} // end anonymous namespace
1694
1695namespace {
1696class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1697public:
1698  OpenBSDX86_64TargetInfo(const std::string& triple)
1699      : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1700    IntMaxType = SignedLongLong;
1701    UIntMaxType = UnsignedLongLong;
1702    Int64Type = SignedLongLong;
1703  }
1704};
1705} // end anonymous namespace
1706
1707namespace {
1708class ARMTargetInfo : public TargetInfo {
1709  // Possible FPU choices.
1710  enum FPUMode {
1711    NoFPU,
1712    VFP2FPU,
1713    VFP3FPU,
1714    NeonFPU
1715  };
1716
1717  static bool FPUModeIsVFP(FPUMode Mode) {
1718    return Mode >= VFP2FPU && Mode <= NeonFPU;
1719  }
1720
1721  static const TargetInfo::GCCRegAlias GCCRegAliases[];
1722  static const char * const GCCRegNames[];
1723
1724  std::string ABI, CPU;
1725
1726  unsigned FPU : 3;
1727
1728  unsigned IsThumb : 1;
1729
1730  // Initialized via features.
1731  unsigned SoftFloat : 1;
1732  unsigned SoftFloatABI : 1;
1733
1734  static const Builtin::Info BuiltinInfo[];
1735
1736public:
1737  ARMTargetInfo(const std::string &TripleStr)
1738    : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
1739  {
1740    SizeType = UnsignedInt;
1741    PtrDiffType = SignedInt;
1742
1743    // {} in inline assembly are neon specifiers, not assembly variant
1744    // specifiers.
1745    NoAsmVariants = true;
1746
1747    // FIXME: Should we just treat this as a feature?
1748    IsThumb = getTriple().getArchName().startswith("thumb");
1749    if (IsThumb) {
1750      // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1751      // so set preferred for small types to 32.
1752      DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1753                           "i64:64:64-f32:32:32-f64:64:64-"
1754                           "v64:64:64-v128:64:128-a0:0:32-n32");
1755    } else {
1756      DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1757                           "i64:64:64-f32:32:32-f64:64:64-"
1758                           "v64:64:64-v128:64:128-a0:0:64-n32");
1759    }
1760
1761    // ARM targets default to using the ARM C++ ABI.
1762    CXXABI = CXXABI_ARM;
1763  }
1764  virtual const char *getABI() const { return ABI.c_str(); }
1765  virtual bool setABI(const std::string &Name) {
1766    ABI = Name;
1767
1768    // The defaults (above) are for AAPCS, check if we need to change them.
1769    //
1770    // FIXME: We need support for -meabi... we could just mangle it into the
1771    // name.
1772    if (Name == "apcs-gnu") {
1773      DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
1774      SizeType = UnsignedLong;
1775
1776      // Do not respect the alignment of bit-field types when laying out
1777      // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1778      UseBitFieldTypeAlignment = false;
1779
1780      if (IsThumb) {
1781        // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1782        // so set preferred for small types to 32.
1783        DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1784                             "i64:32:32-f32:32:32-f64:32:32-"
1785                             "v64:32:64-v128:32:128-a0:0:32-n32");
1786      } else {
1787        DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1788                             "i64:32:64-f32:32:32-f64:32:64-"
1789                             "v64:32:64-v128:32:128-a0:0:32-n32");
1790      }
1791
1792      // FIXME: Override "preferred align" for double and long long.
1793    } else if (Name == "aapcs") {
1794      // FIXME: Enumerated types are variable width in straight AAPCS.
1795    } else if (Name == "aapcs-linux") {
1796      ;
1797    } else
1798      return false;
1799
1800    return true;
1801  }
1802
1803  void getDefaultFeatures(const std::string &CPU,
1804                          llvm::StringMap<bool> &Features) const {
1805    // FIXME: This should not be here.
1806    Features["vfp2"] = false;
1807    Features["vfp3"] = false;
1808    Features["neon"] = false;
1809
1810    if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1811      Features["vfp2"] = true;
1812    else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1813      Features["neon"] = true;
1814  }
1815
1816  virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1817                                 const std::string &Name,
1818                                 bool Enabled) const {
1819    if (Name == "soft-float" || Name == "soft-float-abi") {
1820      Features[Name] = Enabled;
1821    } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1822      // These effectively are a single option, reset them when any is enabled.
1823      if (Enabled)
1824        Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1825      Features[Name] = Enabled;
1826    } else
1827      return false;
1828
1829    return true;
1830  }
1831
1832  virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
1833    FPU = NoFPU;
1834    SoftFloat = SoftFloatABI = false;
1835    for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1836      if (Features[i] == "+soft-float")
1837        SoftFloat = true;
1838      else if (Features[i] == "+soft-float-abi")
1839        SoftFloatABI = true;
1840      else if (Features[i] == "+vfp2")
1841        FPU = VFP2FPU;
1842      else if (Features[i] == "+vfp3")
1843        FPU = VFP3FPU;
1844      else if (Features[i] == "+neon")
1845        FPU = NeonFPU;
1846    }
1847
1848    // Remove front-end specific options which the backend handles differently.
1849    std::vector<std::string>::iterator it;
1850    it = std::find(Features.begin(), Features.end(), "+soft-float");
1851    if (it != Features.end())
1852      Features.erase(it);
1853    it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
1854    if (it != Features.end())
1855      Features.erase(it);
1856  }
1857
1858  static const char *getCPUDefineSuffix(llvm::StringRef Name) {
1859    return llvm::StringSwitch<const char*>(Name)
1860      .Cases("arm8", "arm810", "4")
1861      .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
1862      .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
1863      .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
1864      .Case("ep9312", "4T")
1865      .Cases("arm10tdmi", "arm1020t", "5T")
1866      .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
1867      .Case("arm926ej-s", "5TEJ")
1868      .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
1869      .Cases("xscale", "iwmmxt", "5TE")
1870      .Case("arm1136j-s", "6J")
1871      .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
1872      .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
1873      .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1874      .Cases("cortex-a8", "cortex-a9", "7A")
1875      .Case("cortex-m3", "7M")
1876      .Case("cortex-m0", "6M")
1877      .Default(0);
1878  }
1879  virtual bool setCPU(const std::string &Name) {
1880    if (!getCPUDefineSuffix(Name))
1881      return false;
1882
1883    CPU = Name;
1884    return true;
1885  }
1886  virtual void getTargetDefines(const LangOptions &Opts,
1887                                MacroBuilder &Builder) const {
1888    // Target identification.
1889    Builder.defineMacro("__arm");
1890    Builder.defineMacro("__arm__");
1891
1892    // Target properties.
1893    Builder.defineMacro("__ARMEL__");
1894    Builder.defineMacro("__LITTLE_ENDIAN__");
1895    Builder.defineMacro("__REGISTER_PREFIX__", "");
1896
1897    llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
1898    Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
1899
1900    // Subtarget options.
1901
1902    // FIXME: It's more complicated than this and we don't really support
1903    // interworking.
1904    if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
1905      Builder.defineMacro("__THUMB_INTERWORK__");
1906
1907    if (ABI == "aapcs" || ABI == "aapcs-linux")
1908      Builder.defineMacro("__ARM_EABI__");
1909
1910    if (SoftFloat)
1911      Builder.defineMacro("__SOFTFP__");
1912
1913    if (CPU == "xscale")
1914      Builder.defineMacro("__XSCALE__");
1915
1916    bool IsThumb2 = IsThumb && (CPUArch == "6T2" || CPUArch.startswith("7"));
1917    if (IsThumb) {
1918      Builder.defineMacro("__THUMBEL__");
1919      Builder.defineMacro("__thumb__");
1920      if (IsThumb2)
1921        Builder.defineMacro("__thumb2__");
1922    }
1923
1924    // Note, this is always on in gcc, even though it doesn't make sense.
1925    Builder.defineMacro("__APCS_32__");
1926
1927    if (FPUModeIsVFP((FPUMode) FPU))
1928      Builder.defineMacro("__VFP_FP__");
1929
1930    // This only gets set when Neon instructions are actually available, unlike
1931    // the VFP define, hence the soft float and arch check. This is subtly
1932    // different from gcc, we follow the intent which was that it should be set
1933    // when Neon instructions are actually available.
1934    if (FPU == NeonFPU && !SoftFloat && IsThumb2)
1935      Builder.defineMacro("__ARM_NEON__");
1936  }
1937  virtual void getTargetBuiltins(const Builtin::Info *&Records,
1938                                 unsigned &NumRecords) const {
1939    Records = BuiltinInfo;
1940    NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
1941  }
1942  virtual const char *getVAListDeclaration() const {
1943    return "typedef char* __builtin_va_list;";
1944  }
1945  virtual void getGCCRegNames(const char * const *&Names,
1946                              unsigned &NumNames) const;
1947  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1948                                unsigned &NumAliases) const;
1949  virtual bool validateAsmConstraint(const char *&Name,
1950                                     TargetInfo::ConstraintInfo &Info) const {
1951    // FIXME: Check if this is complete
1952    switch (*Name) {
1953    default:
1954    case 'l': // r0-r7
1955    case 'h': // r8-r15
1956    case 'w': // VFP Floating point register single precision
1957    case 'P': // VFP Floating point register double precision
1958      Info.setAllowsRegister();
1959      return true;
1960    }
1961    return false;
1962  }
1963  virtual const char *getClobbers() const {
1964    // FIXME: Is this really right?
1965    return "";
1966  }
1967};
1968
1969const char * const ARMTargetInfo::GCCRegNames[] = {
1970  // Integer registers
1971  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1972  "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
1973
1974  // Float registers
1975  "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1976  "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1977  "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1978  "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1979
1980  // Double registers
1981  "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
1982  "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
1983  "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
1984  "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
1985
1986  // Quad registers
1987  "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1988  "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
1989};
1990
1991void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
1992                                   unsigned &NumNames) const {
1993  Names = GCCRegNames;
1994  NumNames = llvm::array_lengthof(GCCRegNames);
1995}
1996
1997const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
1998  { { "a1" }, "r0" },
1999  { { "a2" }, "r1" },
2000  { { "a3" }, "r2" },
2001  { { "a4" }, "r3" },
2002  { { "v1" }, "r4" },
2003  { { "v2" }, "r5" },
2004  { { "v3" }, "r6" },
2005  { { "v4" }, "r7" },
2006  { { "v5" }, "r8" },
2007  { { "v6", "rfp" }, "r9" },
2008  { { "sl" }, "r10" },
2009  { { "fp" }, "r11" },
2010  { { "ip" }, "r12" },
2011  { { "r13" }, "sp" },
2012  { { "r14" }, "lr" },
2013  { { "r15" }, "pc" },
2014  // The S, D and Q registers overlap, but aren't really aliases; we
2015  // don't want to substitute one of these for a different-sized one.
2016};
2017
2018void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2019                                       unsigned &NumAliases) const {
2020  Aliases = GCCRegAliases;
2021  NumAliases = llvm::array_lengthof(GCCRegAliases);
2022}
2023
2024const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
2025#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
2026#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
2027                                              ALL_LANGUAGES, false },
2028#include "clang/Basic/BuiltinsARM.def"
2029};
2030} // end anonymous namespace.
2031
2032
2033namespace {
2034class DarwinARMTargetInfo :
2035  public DarwinTargetInfo<ARMTargetInfo> {
2036protected:
2037  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2038                            MacroBuilder &Builder) const {
2039    getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
2040  }
2041
2042public:
2043  DarwinARMTargetInfo(const std::string& triple)
2044    : DarwinTargetInfo<ARMTargetInfo>(triple) {
2045    HasAlignMac68kSupport = true;
2046  }
2047};
2048} // end anonymous namespace.
2049
2050namespace {
2051class SparcV8TargetInfo : public TargetInfo {
2052  static const TargetInfo::GCCRegAlias GCCRegAliases[];
2053  static const char * const GCCRegNames[];
2054  bool SoftFloat;
2055public:
2056  SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2057    // FIXME: Support Sparc quad-precision long double?
2058    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2059                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
2060  }
2061  virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2062                                 const std::string &Name,
2063                                 bool Enabled) const {
2064    if (Name == "soft-float")
2065      Features[Name] = Enabled;
2066    else
2067      return false;
2068
2069    return true;
2070  }
2071  virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2072    SoftFloat = false;
2073    for (unsigned i = 0, e = Features.size(); i != e; ++i)
2074      if (Features[i] == "+soft-float")
2075        SoftFloat = true;
2076  }
2077  virtual void getTargetDefines(const LangOptions &Opts,
2078                                MacroBuilder &Builder) const {
2079    DefineStd(Builder, "sparc", Opts);
2080    Builder.defineMacro("__sparcv8");
2081    Builder.defineMacro("__REGISTER_PREFIX__", "");
2082
2083    if (SoftFloat)
2084      Builder.defineMacro("SOFT_FLOAT", "1");
2085  }
2086  virtual void getTargetBuiltins(const Builtin::Info *&Records,
2087                                 unsigned &NumRecords) const {
2088    // FIXME: Implement!
2089  }
2090  virtual const char *getVAListDeclaration() const {
2091    return "typedef void* __builtin_va_list;";
2092  }
2093  virtual void getGCCRegNames(const char * const *&Names,
2094                              unsigned &NumNames) const;
2095  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2096                                unsigned &NumAliases) const;
2097  virtual bool validateAsmConstraint(const char *&Name,
2098                                     TargetInfo::ConstraintInfo &info) const {
2099    // FIXME: Implement!
2100    return false;
2101  }
2102  virtual const char *getClobbers() const {
2103    // FIXME: Implement!
2104    return "";
2105  }
2106};
2107
2108const char * const SparcV8TargetInfo::GCCRegNames[] = {
2109  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2110  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2111  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2112  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2113};
2114
2115void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
2116                                       unsigned &NumNames) const {
2117  Names = GCCRegNames;
2118  NumNames = llvm::array_lengthof(GCCRegNames);
2119}
2120
2121const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
2122  { { "g0" }, "r0" },
2123  { { "g1" }, "r1" },
2124  { { "g2" }, "r2" },
2125  { { "g3" }, "r3" },
2126  { { "g4" }, "r4" },
2127  { { "g5" }, "r5" },
2128  { { "g6" }, "r6" },
2129  { { "g7" }, "r7" },
2130  { { "o0" }, "r8" },
2131  { { "o1" }, "r9" },
2132  { { "o2" }, "r10" },
2133  { { "o3" }, "r11" },
2134  { { "o4" }, "r12" },
2135  { { "o5" }, "r13" },
2136  { { "o6", "sp" }, "r14" },
2137  { { "o7" }, "r15" },
2138  { { "l0" }, "r16" },
2139  { { "l1" }, "r17" },
2140  { { "l2" }, "r18" },
2141  { { "l3" }, "r19" },
2142  { { "l4" }, "r20" },
2143  { { "l5" }, "r21" },
2144  { { "l6" }, "r22" },
2145  { { "l7" }, "r23" },
2146  { { "i0" }, "r24" },
2147  { { "i1" }, "r25" },
2148  { { "i2" }, "r26" },
2149  { { "i3" }, "r27" },
2150  { { "i4" }, "r28" },
2151  { { "i5" }, "r29" },
2152  { { "i6", "fp" }, "r30" },
2153  { { "i7" }, "r31" },
2154};
2155
2156void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2157                                         unsigned &NumAliases) const {
2158  Aliases = GCCRegAliases;
2159  NumAliases = llvm::array_lengthof(GCCRegAliases);
2160}
2161} // end anonymous namespace.
2162
2163namespace {
2164class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2165public:
2166  AuroraUXSparcV8TargetInfo(const std::string& triple) :
2167      AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2168    SizeType = UnsignedInt;
2169    PtrDiffType = SignedInt;
2170  }
2171};
2172class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
2173public:
2174  SolarisSparcV8TargetInfo(const std::string& triple) :
2175      SolarisTargetInfo<SparcV8TargetInfo>(triple) {
2176    SizeType = UnsignedInt;
2177    PtrDiffType = SignedInt;
2178  }
2179};
2180} // end anonymous namespace.
2181
2182namespace {
2183  class MSP430TargetInfo : public TargetInfo {
2184    static const char * const GCCRegNames[];
2185  public:
2186    MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2187      TLSSupported = false;
2188      IntWidth = 16; IntAlign = 16;
2189      LongWidth = 32; LongLongWidth = 64;
2190      LongAlign = LongLongAlign = 16;
2191      PointerWidth = 16; PointerAlign = 16;
2192      SizeType = UnsignedInt;
2193      IntMaxType = SignedLong;
2194      UIntMaxType = UnsignedLong;
2195      IntPtrType = SignedShort;
2196      PtrDiffType = SignedInt;
2197      SigAtomicType = SignedLong;
2198      DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
2199   }
2200    virtual void getTargetDefines(const LangOptions &Opts,
2201                                  MacroBuilder &Builder) const {
2202      Builder.defineMacro("MSP430");
2203      Builder.defineMacro("__MSP430__");
2204      // FIXME: defines for different 'flavours' of MCU
2205    }
2206    virtual void getTargetBuiltins(const Builtin::Info *&Records,
2207                                   unsigned &NumRecords) const {
2208     // FIXME: Implement.
2209      Records = 0;
2210      NumRecords = 0;
2211    }
2212    virtual void getGCCRegNames(const char * const *&Names,
2213                                unsigned &NumNames) const;
2214    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2215                                  unsigned &NumAliases) const {
2216      // No aliases.
2217      Aliases = 0;
2218      NumAliases = 0;
2219    }
2220    virtual bool validateAsmConstraint(const char *&Name,
2221                                       TargetInfo::ConstraintInfo &info) const {
2222      // No target constraints for now.
2223      return false;
2224    }
2225    virtual const char *getClobbers() const {
2226      // FIXME: Is this really right?
2227      return "";
2228    }
2229    virtual const char *getVAListDeclaration() const {
2230      // FIXME: implement
2231      return "typedef char* __builtin_va_list;";
2232   }
2233  };
2234
2235  const char * const MSP430TargetInfo::GCCRegNames[] = {
2236    "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2237    "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2238  };
2239
2240  void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2241                                        unsigned &NumNames) const {
2242    Names = GCCRegNames;
2243    NumNames = llvm::array_lengthof(GCCRegNames);
2244  }
2245}
2246
2247
2248namespace {
2249  class SystemZTargetInfo : public TargetInfo {
2250    static const char * const GCCRegNames[];
2251  public:
2252    SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2253      TLSSupported = false;
2254      IntWidth = IntAlign = 32;
2255      LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2256      PointerWidth = PointerAlign = 64;
2257      DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2258      "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
2259   }
2260    virtual void getTargetDefines(const LangOptions &Opts,
2261                                  MacroBuilder &Builder) const {
2262      Builder.defineMacro("__s390__");
2263      Builder.defineMacro("__s390x__");
2264    }
2265    virtual void getTargetBuiltins(const Builtin::Info *&Records,
2266                                   unsigned &NumRecords) const {
2267      // FIXME: Implement.
2268      Records = 0;
2269      NumRecords = 0;
2270    }
2271
2272    virtual void getGCCRegNames(const char * const *&Names,
2273                                unsigned &NumNames) const;
2274    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2275                                  unsigned &NumAliases) const {
2276      // No aliases.
2277      Aliases = 0;
2278      NumAliases = 0;
2279    }
2280    virtual bool validateAsmConstraint(const char *&Name,
2281                                       TargetInfo::ConstraintInfo &info) const {
2282      // FIXME: implement
2283      return true;
2284    }
2285    virtual const char *getClobbers() const {
2286      // FIXME: Is this really right?
2287      return "";
2288    }
2289    virtual const char *getVAListDeclaration() const {
2290      // FIXME: implement
2291      return "typedef char* __builtin_va_list;";
2292   }
2293  };
2294
2295  const char * const SystemZTargetInfo::GCCRegNames[] = {
2296    "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2297    "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2298  };
2299
2300  void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2301                                         unsigned &NumNames) const {
2302    Names = GCCRegNames;
2303    NumNames = llvm::array_lengthof(GCCRegNames);
2304  }
2305}
2306
2307namespace {
2308  class BlackfinTargetInfo : public TargetInfo {
2309    static const char * const GCCRegNames[];
2310  public:
2311    BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2312      TLSSupported = false;
2313      DoubleAlign = 32;
2314      LongLongAlign = 32;
2315      LongDoubleAlign = 32;
2316      DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
2317    }
2318
2319    virtual void getTargetDefines(const LangOptions &Opts,
2320                                  MacroBuilder &Builder) const {
2321      DefineStd(Builder, "bfin", Opts);
2322      DefineStd(Builder, "BFIN", Opts);
2323      Builder.defineMacro("__ADSPBLACKFIN__");
2324      // FIXME: This one is really dependent on -mcpu
2325      Builder.defineMacro("__ADSPLPBLACKFIN__");
2326      // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2327    }
2328
2329    virtual void getTargetBuiltins(const Builtin::Info *&Records,
2330                                   unsigned &NumRecords) const {
2331      // FIXME: Implement.
2332      Records = 0;
2333      NumRecords = 0;
2334    }
2335
2336    virtual void getGCCRegNames(const char * const *&Names,
2337                                unsigned &NumNames) const;
2338
2339    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2340                                  unsigned &NumAliases) const {
2341      // No aliases.
2342      Aliases = 0;
2343      NumAliases = 0;
2344    }
2345
2346    virtual bool validateAsmConstraint(const char *&Name,
2347                                       TargetInfo::ConstraintInfo &Info) const {
2348      if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2349        Info.setAllowsRegister();
2350        return true;
2351      }
2352      return false;
2353    }
2354
2355    virtual const char *getClobbers() const {
2356      return "";
2357    }
2358
2359    virtual const char *getVAListDeclaration() const {
2360      return "typedef char* __builtin_va_list;";
2361    }
2362  };
2363
2364  const char * const BlackfinTargetInfo::GCCRegNames[] = {
2365    "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2366    "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2367    "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2368    "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2369    "a0", "a1", "cc",
2370    "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2371    "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2372  };
2373
2374  void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2375                                          unsigned &NumNames) const {
2376    Names = GCCRegNames;
2377    NumNames = llvm::array_lengthof(GCCRegNames);
2378  }
2379}
2380
2381namespace {
2382
2383  // LLVM and Clang cannot be used directly to output native binaries for
2384  // target, but is used to compile C code to llvm bitcode with correct
2385  // type and alignment information.
2386  //
2387  // TCE uses the llvm bitcode as input and uses it for generating customized
2388  // target processor and program binary. TCE co-design environment is
2389  // publicly available in http://tce.cs.tut.fi
2390
2391  class TCETargetInfo : public TargetInfo{
2392  public:
2393    TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2394      TLSSupported = false;
2395      IntWidth = 32;
2396      LongWidth = LongLongWidth = 32;
2397      PointerWidth = 32;
2398      IntAlign = 32;
2399      LongAlign = LongLongAlign = 32;
2400      PointerAlign = 32;
2401      SizeType = UnsignedInt;
2402      IntMaxType = SignedLong;
2403      UIntMaxType = UnsignedLong;
2404      IntPtrType = SignedInt;
2405      PtrDiffType = SignedInt;
2406      FloatWidth = 32;
2407      FloatAlign = 32;
2408      DoubleWidth = 32;
2409      DoubleAlign = 32;
2410      LongDoubleWidth = 32;
2411      LongDoubleAlign = 32;
2412      FloatFormat = &llvm::APFloat::IEEEsingle;
2413      DoubleFormat = &llvm::APFloat::IEEEsingle;
2414      LongDoubleFormat = &llvm::APFloat::IEEEsingle;
2415      DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2416                          "i16:16:32-i32:32:32-i64:32:32-"
2417                          "f32:32:32-f64:32:32-v64:32:32-"
2418                          "v128:32:32-a0:0:32-n32";
2419    }
2420
2421    virtual void getTargetDefines(const LangOptions &Opts,
2422                                  MacroBuilder &Builder) const {
2423      DefineStd(Builder, "tce", Opts);
2424      Builder.defineMacro("__TCE__");
2425      Builder.defineMacro("__TCE_V1__");
2426    }
2427    virtual void getTargetBuiltins(const Builtin::Info *&Records,
2428                                   unsigned &NumRecords) const {}
2429    virtual const char *getClobbers() const {
2430      return "";
2431    }
2432    virtual const char *getVAListDeclaration() const {
2433      return "typedef void* __builtin_va_list;";
2434    }
2435    virtual void getGCCRegNames(const char * const *&Names,
2436                                unsigned &NumNames) const {}
2437    virtual bool validateAsmConstraint(const char *&Name,
2438                                       TargetInfo::ConstraintInfo &info) const {
2439      return true;
2440    }
2441    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2442                                  unsigned &NumAliases) const {}
2443  };
2444}
2445
2446namespace {
2447class MipsTargetInfo : public TargetInfo {
2448  std::string ABI, CPU;
2449  static const TargetInfo::GCCRegAlias GCCRegAliases[];
2450  static const char * const GCCRegNames[];
2451public:
2452  MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
2453    DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2454                        "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2455  }
2456  virtual const char *getABI() const { return ABI.c_str(); }
2457  virtual bool setABI(const std::string &Name) {
2458
2459    if ((Name == "o32") || (Name == "eabi")) {
2460      ABI = Name;
2461      return true;
2462    } else
2463      return false;
2464  }
2465  virtual bool setCPU(const std::string &Name) {
2466    CPU = Name;
2467    return true;
2468  }
2469  void getDefaultFeatures(const std::string &CPU,
2470                          llvm::StringMap<bool> &Features) const {
2471    Features[ABI] = true;
2472    Features[CPU] = true;
2473  }
2474  virtual void getArchDefines(const LangOptions &Opts,
2475                                MacroBuilder &Builder) const {
2476    if (ABI == "o32")
2477      Builder.defineMacro("__mips_o32");
2478    else if (ABI == "eabi")
2479      Builder.defineMacro("__mips_eabi");
2480  }
2481  virtual void getTargetDefines(const LangOptions &Opts,
2482                                MacroBuilder &Builder) const {
2483    DefineStd(Builder, "mips", Opts);
2484    Builder.defineMacro("_mips");
2485    DefineStd(Builder, "MIPSEB", Opts);
2486    Builder.defineMacro("_MIPSEB");
2487    Builder.defineMacro("__REGISTER_PREFIX__", "");
2488    getArchDefines(Opts, Builder);
2489  }
2490  virtual void getTargetBuiltins(const Builtin::Info *&Records,
2491                                 unsigned &NumRecords) const {
2492    // FIXME: Implement!
2493  }
2494  virtual const char *getVAListDeclaration() const {
2495    return "typedef void* __builtin_va_list;";
2496  }
2497  virtual void getGCCRegNames(const char * const *&Names,
2498                              unsigned &NumNames) const;
2499  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2500                                unsigned &NumAliases) const;
2501  virtual bool validateAsmConstraint(const char *&Name,
2502                                     TargetInfo::ConstraintInfo &Info) const {
2503    switch (*Name) {
2504    default:
2505    case 'r': // CPU registers.
2506    case 'd': // Equivalent to "r" unless generating MIPS16 code.
2507    case 'y': // Equivalent to "r", backwards compatibility only.
2508    case 'f': // floating-point registers.
2509      Info.setAllowsRegister();
2510      return true;
2511    }
2512    return false;
2513  }
2514
2515  virtual const char *getClobbers() const {
2516    // FIXME: Implement!
2517    return "";
2518  }
2519};
2520
2521const char * const MipsTargetInfo::GCCRegNames[] = {
2522  "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
2523  "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
2524  "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
2525  "$24",  "$25",  "$26",  "$27",  "$28",  "$sp",  "$fp",  "$31",
2526  "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
2527  "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2528  "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2529  "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2530  "hi",   "lo",   "",     "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2531  "$fcc5","$fcc6","$fcc7"
2532};
2533
2534void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2535                                       unsigned &NumNames) const {
2536  Names = GCCRegNames;
2537  NumNames = llvm::array_lengthof(GCCRegNames);
2538}
2539
2540const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2541  { { "at" },  "$1" },
2542  { { "v0" },  "$2" },
2543  { { "v1" },  "$3" },
2544  { { "a0" },  "$4" },
2545  { { "a1" },  "$5" },
2546  { { "a2" },  "$6" },
2547  { { "a3" },  "$7" },
2548  { { "t0" },  "$8" },
2549  { { "t1" },  "$9" },
2550  { { "t2" }, "$10" },
2551  { { "t3" }, "$11" },
2552  { { "t4" }, "$12" },
2553  { { "t5" }, "$13" },
2554  { { "t6" }, "$14" },
2555  { { "t7" }, "$15" },
2556  { { "s0" }, "$16" },
2557  { { "s1" }, "$17" },
2558  { { "s2" }, "$18" },
2559  { { "s3" }, "$19" },
2560  { { "s4" }, "$20" },
2561  { { "s5" }, "$21" },
2562  { { "s6" }, "$22" },
2563  { { "s7" }, "$23" },
2564  { { "t8" }, "$24" },
2565  { { "t9" }, "$25" },
2566  { { "k0" }, "$26" },
2567  { { "k1" }, "$27" },
2568  { { "gp" }, "$28" },
2569  { { "sp" }, "$29" },
2570  { { "fp" }, "$30" },
2571  { { "ra" }, "$31" }
2572};
2573
2574void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2575                                         unsigned &NumAliases) const {
2576  Aliases = GCCRegAliases;
2577  NumAliases = llvm::array_lengthof(GCCRegAliases);
2578}
2579} // end anonymous namespace.
2580
2581namespace {
2582class MipselTargetInfo : public MipsTargetInfo {
2583public:
2584  MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2585    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2586                        "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2587  }
2588
2589  virtual void getTargetDefines(const LangOptions &Opts,
2590                                MacroBuilder &Builder) const;
2591};
2592
2593void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
2594                                        MacroBuilder &Builder) const {
2595  DefineStd(Builder, "mips", Opts);
2596  Builder.defineMacro("_mips");
2597  DefineStd(Builder, "MIPSEL", Opts);
2598  Builder.defineMacro("_MIPSEL");
2599  Builder.defineMacro("__REGISTER_PREFIX__", "");
2600  getArchDefines(Opts, Builder);
2601}
2602} // end anonymous namespace.
2603
2604//===----------------------------------------------------------------------===//
2605// Driver code
2606//===----------------------------------------------------------------------===//
2607
2608static TargetInfo *AllocateTarget(const std::string &T) {
2609  llvm::Triple Triple(T);
2610  llvm::Triple::OSType os = Triple.getOS();
2611
2612  switch (Triple.getArch()) {
2613  default:
2614    return NULL;
2615
2616  case llvm::Triple::arm:
2617  case llvm::Triple::thumb:
2618    if (Triple.isOSDarwin())
2619      return new DarwinARMTargetInfo(T);
2620
2621    switch (os) {
2622    case llvm::Triple::Linux:
2623      return new LinuxTargetInfo<ARMTargetInfo>(T);
2624    case llvm::Triple::FreeBSD:
2625      return new FreeBSDTargetInfo<ARMTargetInfo>(T);
2626    default:
2627      return new ARMTargetInfo(T);
2628    }
2629
2630  case llvm::Triple::bfin:
2631    return new BlackfinTargetInfo(T);
2632
2633  case llvm::Triple::msp430:
2634    return new MSP430TargetInfo(T);
2635
2636  case llvm::Triple::mips:
2637    if (os == llvm::Triple::Psp)
2638      return new PSPTargetInfo<MipsTargetInfo>(T);
2639    if (os == llvm::Triple::Linux)
2640      return new LinuxTargetInfo<MipsTargetInfo>(T);
2641    return new MipsTargetInfo(T);
2642
2643  case llvm::Triple::mipsel:
2644    if (os == llvm::Triple::Psp)
2645      return new PSPTargetInfo<MipselTargetInfo>(T);
2646    if (os == llvm::Triple::Linux)
2647      return new LinuxTargetInfo<MipselTargetInfo>(T);
2648    return new MipselTargetInfo(T);
2649
2650  case llvm::Triple::ppc:
2651    if (Triple.isOSDarwin())
2652      return new DarwinPPC32TargetInfo(T);
2653    else if (os == llvm::Triple::FreeBSD)
2654      return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
2655    return new PPC32TargetInfo(T);
2656
2657  case llvm::Triple::ppc64:
2658    if (Triple.isOSDarwin())
2659      return new DarwinPPC64TargetInfo(T);
2660    else if (os == llvm::Triple::Lv2)
2661      return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
2662    else if (os == llvm::Triple::FreeBSD)
2663      return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
2664    return new PPC64TargetInfo(T);
2665
2666  case llvm::Triple::mblaze:
2667    return new MBlazeTargetInfo(T);
2668
2669  case llvm::Triple::sparc:
2670    if (os == llvm::Triple::AuroraUX)
2671      return new AuroraUXSparcV8TargetInfo(T);
2672    if (os == llvm::Triple::Solaris)
2673      return new SolarisSparcV8TargetInfo(T);
2674    return new SparcV8TargetInfo(T);
2675
2676  // FIXME: Need a real SPU target.
2677  case llvm::Triple::cellspu:
2678    return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2679
2680  case llvm::Triple::systemz:
2681    return new SystemZTargetInfo(T);
2682
2683  case llvm::Triple::tce:
2684    return new TCETargetInfo(T);
2685
2686  case llvm::Triple::x86:
2687    if (Triple.isOSDarwin())
2688      return new DarwinI386TargetInfo(T);
2689
2690    switch (os) {
2691    case llvm::Triple::AuroraUX:
2692      return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
2693    case llvm::Triple::Linux:
2694      return new LinuxTargetInfo<X86_32TargetInfo>(T);
2695    case llvm::Triple::DragonFly:
2696      return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2697    case llvm::Triple::NetBSD:
2698      return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2699    case llvm::Triple::OpenBSD:
2700      return new OpenBSDI386TargetInfo(T);
2701    case llvm::Triple::FreeBSD:
2702      return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
2703    case llvm::Triple::Minix:
2704      return new MinixTargetInfo<X86_32TargetInfo>(T);
2705    case llvm::Triple::Solaris:
2706      return new SolarisTargetInfo<X86_32TargetInfo>(T);
2707    case llvm::Triple::Cygwin:
2708      return new CygwinX86_32TargetInfo(T);
2709    case llvm::Triple::MinGW32:
2710      return new MinGWX86_32TargetInfo(T);
2711    case llvm::Triple::Win32:
2712      return new VisualStudioWindowsX86_32TargetInfo(T);
2713    case llvm::Triple::Haiku:
2714      return new HaikuX86_32TargetInfo(T);
2715    default:
2716      return new X86_32TargetInfo(T);
2717    }
2718
2719  case llvm::Triple::x86_64:
2720    if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
2721      return new DarwinX86_64TargetInfo(T);
2722
2723    switch (os) {
2724    case llvm::Triple::AuroraUX:
2725      return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
2726    case llvm::Triple::Linux:
2727      return new LinuxTargetInfo<X86_64TargetInfo>(T);
2728    case llvm::Triple::DragonFly:
2729      return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
2730    case llvm::Triple::NetBSD:
2731      return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2732    case llvm::Triple::OpenBSD:
2733      return new OpenBSDX86_64TargetInfo(T);
2734    case llvm::Triple::FreeBSD:
2735      return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2736    case llvm::Triple::Solaris:
2737      return new SolarisTargetInfo<X86_64TargetInfo>(T);
2738    case llvm::Triple::MinGW32:
2739      return new MinGWX86_64TargetInfo(T);
2740    case llvm::Triple::Win32:   // This is what Triple.h supports now.
2741      return new VisualStudioWindowsX86_64TargetInfo(T);
2742    default:
2743      return new X86_64TargetInfo(T);
2744    }
2745  }
2746}
2747
2748/// CreateTargetInfo - Return the target info object for the specified target
2749/// triple.
2750TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
2751                                         TargetOptions &Opts) {
2752  llvm::Triple Triple(Opts.Triple);
2753
2754  // Construct the target
2755  llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2756  if (!Target) {
2757    Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2758    return 0;
2759  }
2760
2761  // Set the target CPU if specified.
2762  if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2763    Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2764    return 0;
2765  }
2766
2767  // Set the target ABI if specified.
2768  if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2769    Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2770    return 0;
2771  }
2772
2773  // Set the target C++ ABI.
2774  if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
2775    Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2776    return 0;
2777  }
2778
2779  // Compute the default target features, we need the target to handle this
2780  // because features may have dependencies on one another.
2781  llvm::StringMap<bool> Features;
2782  Target->getDefaultFeatures(Opts.CPU, Features);
2783
2784  // Apply the user specified deltas.
2785  for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2786         ie = Opts.Features.end(); it != ie; ++it) {
2787    const char *Name = it->c_str();
2788
2789    // Apply the feature via the target.
2790    if ((Name[0] != '-' && Name[0] != '+') ||
2791        !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2792      Diags.Report(diag::err_target_invalid_feature) << Name;
2793      return 0;
2794    }
2795  }
2796
2797  // Add the features to the compile options.
2798  //
2799  // FIXME: If we are completely confident that we have the right set, we only
2800  // need to pass the minuses.
2801  Opts.Features.clear();
2802  for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2803         ie = Features.end(); it != ie; ++it)
2804    Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2805  Target->HandleTargetFeatures(Opts.Features);
2806
2807  return Target.take();
2808}
2809