Targets.cpp revision 00a92abaf907802bfa4d6f38bdd242c6bfc34c09
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/Support/ErrorHandling.h"
30#include "llvm/Type.h"
31#include <algorithm>
32using namespace clang;
33
34//===----------------------------------------------------------------------===//
35//  Common code shared among targets.
36//===----------------------------------------------------------------------===//
37
38/// DefineStd - Define a macro name and standard variants.  For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
41static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
42                      const LangOptions &Opts) {
43  assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
44
45  // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46  // in the user's namespace.
47  if (Opts.GNUMode)
48    Builder.defineMacro(MacroName);
49
50  // Define __unix.
51  Builder.defineMacro("__" + MacroName);
52
53  // Define __unix__.
54  Builder.defineMacro("__" + MacroName + "__");
55}
56
57//===----------------------------------------------------------------------===//
58// Defines specific to certain operating systems.
59//===----------------------------------------------------------------------===//
60
61namespace {
62template<typename TgtInfo>
63class OSTargetInfo : public TgtInfo {
64protected:
65  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
66                            MacroBuilder &Builder) const=0;
67public:
68  OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
69  virtual void getTargetDefines(const LangOptions &Opts,
70                                MacroBuilder &Builder) const {
71    TgtInfo::getTargetDefines(Opts, Builder);
72    getOSDefines(Opts, TgtInfo::getTriple(), Builder);
73  }
74
75};
76} // end anonymous namespace
77
78
79static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
80                             const llvm::Triple &Triple,
81                             StringRef &PlatformName,
82                             VersionTuple &PlatformMinVersion) {
83  Builder.defineMacro("__APPLE_CC__", "5621");
84  Builder.defineMacro("__APPLE__");
85  Builder.defineMacro("__MACH__");
86  Builder.defineMacro("OBJC_NEW_PROPERTIES");
87
88  if (!Opts.ObjCAutoRefCount) {
89    // __weak is always defined, for use in blocks and with objc pointers.
90    Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
91
92    // Darwin defines __strong even in C mode (just to nothing).
93    if (Opts.getGC() != LangOptions::NonGC)
94      Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
95    else
96      Builder.defineMacro("__strong", "");
97
98    // __unsafe_unretained is defined to nothing in non-ARC mode. We even
99    // allow this in C, since one might have block pointers in structs that
100    // are used in pure C code and in Objective-C ARC.
101    Builder.defineMacro("__unsafe_unretained", "");
102
103    // The Objective-C bridged cast keywords are defined to nothing in non-ARC
104    // mode; then they become normal, C-style casts.
105    Builder.defineMacro("__bridge", "");
106    Builder.defineMacro("__bridge_transfer", "");
107    Builder.defineMacro("__bridge_retained", "");
108    Builder.defineMacro("__bridge_retain", "");
109  }
110
111  if (Opts.Static)
112    Builder.defineMacro("__STATIC__");
113  else
114    Builder.defineMacro("__DYNAMIC__");
115
116  if (Opts.POSIXThreads)
117    Builder.defineMacro("_REENTRANT");
118
119  // Get the platform type and version number from the triple.
120  unsigned Maj, Min, Rev;
121
122  // If no version was given, default to to 10.4.0, for simplifying tests.
123  if (Triple.getOSName() == "darwin" || Triple.getOSName() == "osx") {
124    PlatformName = "macosx";
125    Min = Rev = 0;
126    Maj = 8;
127  } else {
128    // Otherwise, honor all three triple forms ("-darwinNNN[-iphoneos]",
129    // "-osxNNN", and "-iosNNN").
130
131    if (Triple.getOS() == llvm::Triple::Darwin) {
132      // For historical reasons that make little sense, the version passed here
133      // is the "darwin" version, which drops the 10 and offsets by 4.
134      Triple.getOSVersion(Maj, Min, Rev);
135
136      if (Triple.getEnvironmentName() == "iphoneos") {
137        PlatformName = "ios";
138      } else {
139        PlatformName = "macosx";
140        Rev = Min;
141        Min = Maj - 4;
142        Maj = 10;
143      }
144    } else {
145      Triple.getOSVersion(Maj, Min, Rev);
146      PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
147    }
148  }
149
150  // If -ccc-host-triple arch-pc-win32-macho option specified, we're
151  // generating code for Win32 ABI. No need to emit
152  // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
153  if (PlatformName == "win32") {
154    PlatformMinVersion = VersionTuple(Maj, Min, Rev);
155    return;
156  }
157
158  // Set the appropriate OS version define.
159  if (PlatformName == "ios") {
160    assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
161    char Str[6];
162    Str[0] = '0' + Maj;
163    Str[1] = '0' + (Min / 10);
164    Str[2] = '0' + (Min % 10);
165    Str[3] = '0' + (Rev / 10);
166    Str[4] = '0' + (Rev % 10);
167    Str[5] = '\0';
168    Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
169  } else {
170    // Note that the Driver allows versions which aren't representable in the
171    // define (because we only get a single digit for the minor and micro
172    // revision numbers). So, we limit them to the maximum representable
173    // version.
174    assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
175    assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
176    char Str[5];
177    Str[0] = '0' + (Maj / 10);
178    Str[1] = '0' + (Maj % 10);
179    Str[2] = '0' + std::min(Min, 9U);
180    Str[3] = '0' + std::min(Rev, 9U);
181    Str[4] = '\0';
182    Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
183  }
184
185  PlatformMinVersion = VersionTuple(Maj, Min, Rev);
186}
187
188namespace {
189template<typename Target>
190class DarwinTargetInfo : public OSTargetInfo<Target> {
191protected:
192  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
193                            MacroBuilder &Builder) const {
194    getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
195                     this->PlatformMinVersion);
196  }
197
198public:
199  DarwinTargetInfo(const std::string& triple) :
200    OSTargetInfo<Target>(triple) {
201      llvm::Triple T = llvm::Triple(triple);
202      this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
203      this->MCountName = "\01mcount";
204    }
205
206  virtual std::string isValidSectionSpecifier(StringRef SR) const {
207    // Let MCSectionMachO validate this.
208    StringRef Segment, Section;
209    unsigned TAA, StubSize;
210    bool HasTAA;
211    return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
212                                                       TAA, HasTAA, StubSize);
213  }
214
215  virtual const char *getStaticInitSectionSpecifier() const {
216    // FIXME: We should return 0 when building kexts.
217    return "__TEXT,__StaticInit,regular,pure_instructions";
218  }
219
220};
221
222
223// DragonFlyBSD Target
224template<typename Target>
225class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
226protected:
227  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
228                            MacroBuilder &Builder) const {
229    // DragonFly defines; list based off of gcc output
230    Builder.defineMacro("__DragonFly__");
231    Builder.defineMacro("__DragonFly_cc_version", "100001");
232    Builder.defineMacro("__ELF__");
233    Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
234    Builder.defineMacro("__tune_i386__");
235    DefineStd(Builder, "unix", Opts);
236  }
237public:
238  DragonFlyBSDTargetInfo(const std::string &triple)
239    : OSTargetInfo<Target>(triple) {}
240};
241
242// FreeBSD Target
243template<typename Target>
244class FreeBSDTargetInfo : public OSTargetInfo<Target> {
245protected:
246  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
247                            MacroBuilder &Builder) const {
248    // FreeBSD defines; list based off of gcc output
249
250    unsigned Release = Triple.getOSMajorVersion();
251    if (Release == 0U)
252      Release = 8;
253
254    Builder.defineMacro("__FreeBSD__", Twine(Release));
255    Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
256    Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
257    DefineStd(Builder, "unix", Opts);
258    Builder.defineMacro("__ELF__");
259  }
260public:
261  FreeBSDTargetInfo(const std::string &triple)
262    : OSTargetInfo<Target>(triple) {
263      this->UserLabelPrefix = "";
264
265      llvm::Triple Triple(triple);
266      switch (Triple.getArch()) {
267        default:
268        case llvm::Triple::x86:
269        case llvm::Triple::x86_64:
270          this->MCountName = ".mcount";
271          break;
272        case llvm::Triple::mips:
273        case llvm::Triple::mipsel:
274        case llvm::Triple::ppc:
275        case llvm::Triple::ppc64:
276          this->MCountName = "_mcount";
277          break;
278        case llvm::Triple::arm:
279          this->MCountName = "__mcount";
280          break;
281      }
282
283    }
284};
285
286// Minix Target
287template<typename Target>
288class MinixTargetInfo : public OSTargetInfo<Target> {
289protected:
290  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
291                            MacroBuilder &Builder) const {
292    // Minix defines
293
294    Builder.defineMacro("__minix", "3");
295    Builder.defineMacro("_EM_WSIZE", "4");
296    Builder.defineMacro("_EM_PSIZE", "4");
297    Builder.defineMacro("_EM_SSIZE", "2");
298    Builder.defineMacro("_EM_LSIZE", "4");
299    Builder.defineMacro("_EM_FSIZE", "4");
300    Builder.defineMacro("_EM_DSIZE", "8");
301    DefineStd(Builder, "unix", Opts);
302  }
303public:
304  MinixTargetInfo(const std::string &triple)
305    : OSTargetInfo<Target>(triple) {
306      this->UserLabelPrefix = "";
307    }
308};
309
310// Linux target
311template<typename Target>
312class LinuxTargetInfo : public OSTargetInfo<Target> {
313protected:
314  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
315                            MacroBuilder &Builder) const {
316    // Linux defines; list based off of gcc output
317    DefineStd(Builder, "unix", Opts);
318    DefineStd(Builder, "linux", Opts);
319    Builder.defineMacro("__gnu_linux__");
320    Builder.defineMacro("__ELF__");
321    if (Opts.POSIXThreads)
322      Builder.defineMacro("_REENTRANT");
323    if (Opts.CPlusPlus)
324      Builder.defineMacro("_GNU_SOURCE");
325  }
326public:
327  LinuxTargetInfo(const std::string& triple)
328    : OSTargetInfo<Target>(triple) {
329    this->UserLabelPrefix = "";
330    this->WIntType = TargetInfo::UnsignedInt;
331  }
332
333  virtual const char *getStaticInitSectionSpecifier() const {
334    return ".text.startup";
335  }
336};
337
338// NetBSD Target
339template<typename Target>
340class NetBSDTargetInfo : public OSTargetInfo<Target> {
341protected:
342  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
343                            MacroBuilder &Builder) const {
344    // NetBSD defines; list based off of gcc output
345    Builder.defineMacro("__NetBSD__");
346    Builder.defineMacro("__unix__");
347    Builder.defineMacro("__ELF__");
348    if (Opts.POSIXThreads)
349      Builder.defineMacro("_POSIX_THREADS");
350  }
351public:
352  NetBSDTargetInfo(const std::string &triple)
353    : OSTargetInfo<Target>(triple) {
354      this->UserLabelPrefix = "";
355    }
356};
357
358// OpenBSD Target
359template<typename Target>
360class OpenBSDTargetInfo : public OSTargetInfo<Target> {
361protected:
362  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
363                            MacroBuilder &Builder) const {
364    // OpenBSD defines; list based off of gcc output
365
366    Builder.defineMacro("__OpenBSD__");
367    DefineStd(Builder, "unix", Opts);
368    Builder.defineMacro("__ELF__");
369    if (Opts.POSIXThreads)
370      Builder.defineMacro("_POSIX_THREADS");
371  }
372public:
373  OpenBSDTargetInfo(const std::string &triple)
374    : OSTargetInfo<Target>(triple) {}
375};
376
377// PSP Target
378template<typename Target>
379class PSPTargetInfo : public OSTargetInfo<Target> {
380protected:
381  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
382                            MacroBuilder &Builder) const {
383    // PSP defines; list based on the output of the pspdev gcc toolchain.
384    Builder.defineMacro("PSP");
385    Builder.defineMacro("_PSP");
386    Builder.defineMacro("__psp__");
387    Builder.defineMacro("__ELF__");
388  }
389public:
390  PSPTargetInfo(const std::string& triple)
391    : OSTargetInfo<Target>(triple) {
392    this->UserLabelPrefix = "";
393  }
394};
395
396// PS3 PPU Target
397template<typename Target>
398class PS3PPUTargetInfo : public OSTargetInfo<Target> {
399protected:
400  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
401                            MacroBuilder &Builder) const {
402    // PS3 PPU defines.
403    Builder.defineMacro("__PPC__");
404    Builder.defineMacro("__PPU__");
405    Builder.defineMacro("__CELLOS_LV2__");
406    Builder.defineMacro("__ELF__");
407    Builder.defineMacro("__LP32__");
408    Builder.defineMacro("_ARCH_PPC64");
409    Builder.defineMacro("__powerpc64__");
410  }
411public:
412  PS3PPUTargetInfo(const std::string& triple)
413    : OSTargetInfo<Target>(triple) {
414    this->UserLabelPrefix = "";
415    this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
416    this->IntMaxType = TargetInfo::SignedLongLong;
417    this->UIntMaxType = TargetInfo::UnsignedLongLong;
418    this->Int64Type = TargetInfo::SignedLongLong;
419    this->SizeType = TargetInfo::UnsignedInt;
420    this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
421                        "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
422  }
423};
424
425// FIXME: Need a real SPU target.
426// PS3 SPU Target
427template<typename Target>
428class PS3SPUTargetInfo : public OSTargetInfo<Target> {
429protected:
430  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
431                            MacroBuilder &Builder) const {
432    // PS3 PPU defines.
433    Builder.defineMacro("__SPU__");
434    Builder.defineMacro("__ELF__");
435  }
436public:
437  PS3SPUTargetInfo(const std::string& triple)
438    : OSTargetInfo<Target>(triple) {
439    this->UserLabelPrefix = "";
440  }
441};
442
443// AuroraUX target
444template<typename Target>
445class AuroraUXTargetInfo : public OSTargetInfo<Target> {
446protected:
447  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
448                            MacroBuilder &Builder) const {
449    DefineStd(Builder, "sun", Opts);
450    DefineStd(Builder, "unix", Opts);
451    Builder.defineMacro("__ELF__");
452    Builder.defineMacro("__svr4__");
453    Builder.defineMacro("__SVR4");
454  }
455public:
456  AuroraUXTargetInfo(const std::string& triple)
457    : OSTargetInfo<Target>(triple) {
458    this->UserLabelPrefix = "";
459    this->WCharType = this->SignedLong;
460    // FIXME: WIntType should be SignedLong
461  }
462};
463
464// Solaris target
465template<typename Target>
466class SolarisTargetInfo : public OSTargetInfo<Target> {
467protected:
468  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
469                            MacroBuilder &Builder) const {
470    DefineStd(Builder, "sun", Opts);
471    DefineStd(Builder, "unix", Opts);
472    Builder.defineMacro("__ELF__");
473    Builder.defineMacro("__svr4__");
474    Builder.defineMacro("__SVR4");
475  }
476public:
477  SolarisTargetInfo(const std::string& triple)
478    : OSTargetInfo<Target>(triple) {
479    this->UserLabelPrefix = "";
480    this->WCharType = this->SignedLong;
481    // FIXME: WIntType should be SignedLong
482  }
483};
484
485// Windows target
486template<typename Target>
487class WindowsTargetInfo : public OSTargetInfo<Target> {
488protected:
489  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
490                            MacroBuilder &Builder) const {
491    Builder.defineMacro("_WIN32");
492  }
493  void getVisualStudioDefines(const LangOptions &Opts,
494                              MacroBuilder &Builder) const {
495    if (Opts.CPlusPlus) {
496      if (Opts.RTTI)
497        Builder.defineMacro("_CPPRTTI");
498
499      if (Opts.Exceptions)
500        Builder.defineMacro("_CPPUNWIND");
501    }
502
503    if (!Opts.CharIsSigned)
504      Builder.defineMacro("_CHAR_UNSIGNED");
505
506    // FIXME: POSIXThreads isn't exactly the option this should be defined for,
507    //        but it works for now.
508    if (Opts.POSIXThreads)
509      Builder.defineMacro("_MT");
510
511    if (Opts.MSCVersion != 0)
512      Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
513
514    if (Opts.MicrosoftExt) {
515      Builder.defineMacro("_MSC_EXTENSIONS");
516
517      if (Opts.CPlusPlus0x) {
518        Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
519        Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
520        Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
521      }
522    }
523
524    Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
525  }
526
527public:
528  WindowsTargetInfo(const std::string &triple)
529    : OSTargetInfo<Target>(triple) {}
530};
531
532} // end anonymous namespace.
533
534//===----------------------------------------------------------------------===//
535// Specific target implementations.
536//===----------------------------------------------------------------------===//
537
538namespace {
539// PPC abstract base class
540class PPCTargetInfo : public TargetInfo {
541  static const Builtin::Info BuiltinInfo[];
542  static const char * const GCCRegNames[];
543  static const TargetInfo::GCCRegAlias GCCRegAliases[];
544public:
545  PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
546
547  virtual void getTargetBuiltins(const Builtin::Info *&Records,
548                                 unsigned &NumRecords) const {
549    Records = BuiltinInfo;
550    NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
551  }
552
553  virtual void getTargetDefines(const LangOptions &Opts,
554                                MacroBuilder &Builder) const;
555
556  virtual void getGCCRegNames(const char * const *&Names,
557                              unsigned &NumNames) const;
558  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
559                                unsigned &NumAliases) const;
560  virtual bool validateAsmConstraint(const char *&Name,
561                                     TargetInfo::ConstraintInfo &Info) const {
562    switch (*Name) {
563    default: return false;
564    case 'O': // Zero
565      break;
566    case 'b': // Base register
567    case 'f': // Floating point register
568      Info.setAllowsRegister();
569      break;
570    // FIXME: The following are added to allow parsing.
571    // I just took a guess at what the actions should be.
572    // Also, is more specific checking needed?  I.e. specific registers?
573    case 'd': // Floating point register (containing 64-bit value)
574    case 'v': // Altivec vector register
575      Info.setAllowsRegister();
576      break;
577    case 'w':
578      switch (Name[1]) {
579        case 'd':// VSX vector register to hold vector double data
580        case 'f':// VSX vector register to hold vector float data
581        case 's':// VSX vector register to hold scalar float data
582        case 'a':// Any VSX register
583          break;
584        default:
585          return false;
586      }
587      Info.setAllowsRegister();
588      Name++; // Skip over 'w'.
589      break;
590    case 'h': // `MQ', `CTR', or `LINK' register
591    case 'q': // `MQ' register
592    case 'c': // `CTR' register
593    case 'l': // `LINK' register
594    case 'x': // `CR' register (condition register) number 0
595    case 'y': // `CR' register (condition register)
596    case 'z': // `XER[CA]' carry bit (part of the XER register)
597      Info.setAllowsRegister();
598      break;
599    case 'I': // Signed 16-bit constant
600    case 'J': // Unsigned 16-bit constant shifted left 16 bits
601              //  (use `L' instead for SImode constants)
602    case 'K': // Unsigned 16-bit constant
603    case 'L': // Signed 16-bit constant shifted left 16 bits
604    case 'M': // Constant larger than 31
605    case 'N': // Exact power of 2
606    case 'P': // Constant whose negation is a signed 16-bit constant
607    case 'G': // Floating point constant that can be loaded into a
608              // register with one instruction per word
609    case 'H': // Integer/Floating point constant that can be loaded
610              // into a register using three instructions
611      break;
612    case 'm': // Memory operand. Note that on PowerPC targets, m can
613              // include addresses that update the base register. It
614              // is therefore only safe to use `m' in an asm statement
615              // if that asm statement accesses the operand exactly once.
616              // The asm statement must also use `%U<opno>' as a
617              // placeholder for the "update" flag in the corresponding
618              // load or store instruction. For example:
619              // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
620              // is correct but:
621              // asm ("st %1,%0" : "=m" (mem) : "r" (val));
622              // is not. Use es rather than m if you don't want the base
623              // register to be updated.
624    case 'e':
625      if (Name[1] != 's')
626          return false;
627              // es: A "stable" memory operand; that is, one which does not
628              // include any automodification of the base register. Unlike
629              // `m', this constraint can be used in asm statements that
630              // might access the operand several times, or that might not
631              // access it at all.
632      Info.setAllowsMemory();
633      Name++; // Skip over 'e'.
634      break;
635    case 'Q': // Memory operand that is an offset from a register (it is
636              // usually better to use `m' or `es' in asm statements)
637    case 'Z': // Memory operand that is an indexed or indirect from a
638              // register (it is usually better to use `m' or `es' in
639              // asm statements)
640      Info.setAllowsMemory();
641      Info.setAllowsRegister();
642      break;
643    case 'R': // AIX TOC entry
644    case 'a': // Address operand that is an indexed or indirect from a
645              // register (`p' is preferable for asm statements)
646    case 'S': // Constant suitable as a 64-bit mask operand
647    case 'T': // Constant suitable as a 32-bit mask operand
648    case 'U': // System V Release 4 small data area reference
649    case 't': // AND masks that can be performed by two rldic{l, r}
650              // instructions
651    case 'W': // Vector constant that does not require memory
652    case 'j': // Vector constant that is all zeros.
653      break;
654    // End FIXME.
655    }
656    return true;
657  }
658  virtual const char *getClobbers() const {
659    return "";
660  }
661};
662
663const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
664#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
665#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
666                                              ALL_LANGUAGES },
667#include "clang/Basic/BuiltinsPPC.def"
668};
669
670
671/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
672/// #defines that are not tied to a specific subtarget.
673void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
674                                     MacroBuilder &Builder) const {
675  // Target identification.
676  Builder.defineMacro("__ppc__");
677  Builder.defineMacro("_ARCH_PPC");
678  Builder.defineMacro("__powerpc__");
679  Builder.defineMacro("__POWERPC__");
680  if (PointerWidth == 64) {
681    Builder.defineMacro("_ARCH_PPC64");
682    Builder.defineMacro("_LP64");
683    Builder.defineMacro("__LP64__");
684    Builder.defineMacro("__powerpc64__");
685    Builder.defineMacro("__ppc64__");
686  } else {
687    Builder.defineMacro("__ppc__");
688  }
689
690  // Target properties.
691  if (getTriple().getOS() != llvm::Triple::NetBSD)
692    Builder.defineMacro("_BIG_ENDIAN");
693  Builder.defineMacro("__BIG_ENDIAN__");
694
695  // Subtarget options.
696  Builder.defineMacro("__NATURAL_ALIGNMENT__");
697  Builder.defineMacro("__REGISTER_PREFIX__", "");
698
699  // FIXME: Should be controlled by command line option.
700  Builder.defineMacro("__LONG_DOUBLE_128__");
701
702  if (Opts.AltiVec) {
703    Builder.defineMacro("__VEC__", "10206");
704    Builder.defineMacro("__ALTIVEC__");
705  }
706}
707
708
709const char * const PPCTargetInfo::GCCRegNames[] = {
710  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
711  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
712  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
713  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
714  "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
715  "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
716  "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
717  "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
718  "mq", "lr", "ctr", "ap",
719  "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
720  "xer",
721  "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
722  "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
723  "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
724  "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
725  "vrsave", "vscr",
726  "spe_acc", "spefscr",
727  "sfp"
728};
729
730void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
731                                   unsigned &NumNames) const {
732  Names = GCCRegNames;
733  NumNames = llvm::array_lengthof(GCCRegNames);
734}
735
736const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
737  // While some of these aliases do map to different registers
738  // they still share the same register name.
739  { { "0" }, "r0" },
740  { { "1"}, "r1" },
741  { { "2" }, "r2" },
742  { { "3" }, "r3" },
743  { { "4" }, "r4" },
744  { { "5" }, "r5" },
745  { { "6" }, "r6" },
746  { { "7" }, "r7" },
747  { { "8" }, "r8" },
748  { { "9" }, "r9" },
749  { { "10" }, "r10" },
750  { { "11" }, "r11" },
751  { { "12" }, "r12" },
752  { { "13" }, "r13" },
753  { { "14" }, "r14" },
754  { { "15" }, "r15" },
755  { { "16" }, "r16" },
756  { { "17" }, "r17" },
757  { { "18" }, "r18" },
758  { { "19" }, "r19" },
759  { { "20" }, "r20" },
760  { { "21" }, "r21" },
761  { { "22" }, "r22" },
762  { { "23" }, "r23" },
763  { { "24" }, "r24" },
764  { { "25" }, "r25" },
765  { { "26" }, "r26" },
766  { { "27" }, "r27" },
767  { { "28" }, "r28" },
768  { { "29" }, "r29" },
769  { { "30" }, "r30" },
770  { { "31" }, "r31" },
771  { { "fr0" }, "f0" },
772  { { "fr1" }, "f1" },
773  { { "fr2" }, "f2" },
774  { { "fr3" }, "f3" },
775  { { "fr4" }, "f4" },
776  { { "fr5" }, "f5" },
777  { { "fr6" }, "f6" },
778  { { "fr7" }, "f7" },
779  { { "fr8" }, "f8" },
780  { { "fr9" }, "f9" },
781  { { "fr10" }, "f10" },
782  { { "fr11" }, "f11" },
783  { { "fr12" }, "f12" },
784  { { "fr13" }, "f13" },
785  { { "fr14" }, "f14" },
786  { { "fr15" }, "f15" },
787  { { "fr16" }, "f16" },
788  { { "fr17" }, "f17" },
789  { { "fr18" }, "f18" },
790  { { "fr19" }, "f19" },
791  { { "fr20" }, "f20" },
792  { { "fr21" }, "f21" },
793  { { "fr22" }, "f22" },
794  { { "fr23" }, "f23" },
795  { { "fr24" }, "f24" },
796  { { "fr25" }, "f25" },
797  { { "fr26" }, "f26" },
798  { { "fr27" }, "f27" },
799  { { "fr28" }, "f28" },
800  { { "fr29" }, "f29" },
801  { { "fr30" }, "f30" },
802  { { "fr31" }, "f31" },
803  { { "cc" }, "cr0" },
804};
805
806void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
807                                     unsigned &NumAliases) const {
808  Aliases = GCCRegAliases;
809  NumAliases = llvm::array_lengthof(GCCRegAliases);
810}
811} // end anonymous namespace.
812
813namespace {
814class PPC32TargetInfo : public PPCTargetInfo {
815public:
816  PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
817    DescriptionString = "E-p:32:32:32-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";
819
820    switch (getTriple().getOS()) {
821    case llvm::Triple::FreeBSD:
822    case llvm::Triple::NetBSD:
823      SizeType = UnsignedInt;
824      break;
825    default:
826      break;
827    }
828  }
829
830  virtual const char *getVAListDeclaration() const {
831    // This is the ELF definition, and is overridden by the Darwin sub-target
832    return "typedef struct __va_list_tag {"
833           "  unsigned char gpr;"
834           "  unsigned char fpr;"
835           "  unsigned short reserved;"
836           "  void* overflow_arg_area;"
837           "  void* reg_save_area;"
838           "} __builtin_va_list[1];";
839  }
840};
841} // end anonymous namespace.
842
843namespace {
844class PPC64TargetInfo : public PPCTargetInfo {
845public:
846  PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
847    LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
848    IntMaxType = SignedLong;
849    UIntMaxType = UnsignedLong;
850    Int64Type = SignedLong;
851    DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
852                        "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
853  }
854  virtual const char *getVAListDeclaration() const {
855    return "typedef char* __builtin_va_list;";
856  }
857};
858} // end anonymous namespace.
859
860
861namespace {
862class DarwinPPC32TargetInfo :
863  public DarwinTargetInfo<PPC32TargetInfo> {
864public:
865  DarwinPPC32TargetInfo(const std::string& triple)
866    : DarwinTargetInfo<PPC32TargetInfo>(triple) {
867    HasAlignMac68kSupport = true;
868    BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
869  }
870  virtual const char *getVAListDeclaration() const {
871    return "typedef char* __builtin_va_list;";
872  }
873};
874
875class DarwinPPC64TargetInfo :
876  public DarwinTargetInfo<PPC64TargetInfo> {
877public:
878  DarwinPPC64TargetInfo(const std::string& triple)
879    : DarwinTargetInfo<PPC64TargetInfo>(triple) {
880    HasAlignMac68kSupport = true;
881  }
882};
883} // end anonymous namespace.
884
885namespace {
886  static const unsigned PTXAddrSpaceMap[] = {
887    0,    // opencl_global
888    4,    // opencl_local
889    1     // opencl_constant
890  };
891  class PTXTargetInfo : public TargetInfo {
892    static const char * const GCCRegNames[];
893    static const Builtin::Info BuiltinInfo[];
894    std::vector<llvm::StringRef> AvailableFeatures;
895  public:
896    PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
897      TLSSupported = false;
898      LongWidth = LongAlign = 64;
899      AddrSpaceMap = &PTXAddrSpaceMap;
900      // Define available target features
901      // These must be defined in sorted order!
902      AvailableFeatures.push_back("compute10");
903      AvailableFeatures.push_back("compute11");
904      AvailableFeatures.push_back("compute12");
905      AvailableFeatures.push_back("compute13");
906      AvailableFeatures.push_back("compute20");
907      AvailableFeatures.push_back("double");
908      AvailableFeatures.push_back("no-fma");
909      AvailableFeatures.push_back("ptx20");
910      AvailableFeatures.push_back("ptx21");
911      AvailableFeatures.push_back("ptx22");
912      AvailableFeatures.push_back("ptx23");
913      AvailableFeatures.push_back("sm10");
914      AvailableFeatures.push_back("sm11");
915      AvailableFeatures.push_back("sm12");
916      AvailableFeatures.push_back("sm13");
917      AvailableFeatures.push_back("sm20");
918      AvailableFeatures.push_back("sm21");
919      AvailableFeatures.push_back("sm22");
920      AvailableFeatures.push_back("sm23");
921    }
922    virtual void getTargetDefines(const LangOptions &Opts,
923                                  MacroBuilder &Builder) const {
924      Builder.defineMacro("__PTX__");
925    }
926    virtual void getTargetBuiltins(const Builtin::Info *&Records,
927                                   unsigned &NumRecords) const {
928      Records = BuiltinInfo;
929      NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
930    }
931
932    virtual void getGCCRegNames(const char * const *&Names,
933                                unsigned &NumNames) const;
934    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
935                                  unsigned &NumAliases) const {
936      // No aliases.
937      Aliases = 0;
938      NumAliases = 0;
939    }
940    virtual bool validateAsmConstraint(const char *&Name,
941                                       TargetInfo::ConstraintInfo &info) const {
942      // FIXME: implement
943      return true;
944    }
945    virtual const char *getClobbers() const {
946      // FIXME: Is this really right?
947      return "";
948    }
949    virtual const char *getVAListDeclaration() const {
950      // FIXME: implement
951      return "typedef char* __builtin_va_list;";
952    }
953
954    virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
955                                   const std::string &Name,
956                                   bool Enabled) const;
957  };
958
959  const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
960#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
961#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
962                                              ALL_LANGUAGES },
963#include "clang/Basic/BuiltinsPTX.def"
964  };
965
966  const char * const PTXTargetInfo::GCCRegNames[] = {
967    "r0"
968  };
969
970  void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
971                                     unsigned &NumNames) const {
972    Names = GCCRegNames;
973    NumNames = llvm::array_lengthof(GCCRegNames);
974  }
975
976  bool PTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
977                                        const std::string &Name,
978                                        bool Enabled) const {
979    if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
980                          Name)) {
981      Features[Name] = Enabled;
982      return true;
983    } else {
984      return false;
985    }
986  }
987
988  class PTX32TargetInfo : public PTXTargetInfo {
989  public:
990  PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
991      PointerWidth = PointerAlign = 32;
992      SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
993      DescriptionString
994        = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
995    }
996  };
997
998  class PTX64TargetInfo : public PTXTargetInfo {
999  public:
1000  PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1001      PointerWidth = PointerAlign = 64;
1002      SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
1003      DescriptionString
1004        = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
1005    }
1006  };
1007}
1008
1009namespace {
1010// MBlaze abstract base class
1011class MBlazeTargetInfo : public TargetInfo {
1012  static const char * const GCCRegNames[];
1013  static const TargetInfo::GCCRegAlias GCCRegAliases[];
1014
1015public:
1016  MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
1017    DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
1018  }
1019
1020  virtual void getTargetBuiltins(const Builtin::Info *&Records,
1021                                 unsigned &NumRecords) const {
1022    // FIXME: Implement.
1023    Records = 0;
1024    NumRecords = 0;
1025  }
1026
1027  virtual void getTargetDefines(const LangOptions &Opts,
1028                                MacroBuilder &Builder) const;
1029
1030  virtual const char *getVAListDeclaration() const {
1031    return "typedef char* __builtin_va_list;";
1032  }
1033  virtual const char *getTargetPrefix() const {
1034    return "mblaze";
1035  }
1036  virtual void getGCCRegNames(const char * const *&Names,
1037                              unsigned &NumNames) const;
1038  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1039                                unsigned &NumAliases) const;
1040  virtual bool validateAsmConstraint(const char *&Name,
1041                                     TargetInfo::ConstraintInfo &Info) const {
1042    switch (*Name) {
1043    default: return false;
1044    case 'O': // Zero
1045      return true;
1046    case 'b': // Base register
1047    case 'f': // Floating point register
1048      Info.setAllowsRegister();
1049      return true;
1050    }
1051  }
1052  virtual const char *getClobbers() const {
1053    return "";
1054  }
1055};
1056
1057/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1058/// #defines that are not tied to a specific subtarget.
1059void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1060                                     MacroBuilder &Builder) const {
1061  // Target identification.
1062  Builder.defineMacro("__microblaze__");
1063  Builder.defineMacro("_ARCH_MICROBLAZE");
1064  Builder.defineMacro("__MICROBLAZE__");
1065
1066  // Target properties.
1067  Builder.defineMacro("_BIG_ENDIAN");
1068  Builder.defineMacro("__BIG_ENDIAN__");
1069
1070  // Subtarget options.
1071  Builder.defineMacro("__REGISTER_PREFIX__", "");
1072}
1073
1074
1075const char * const MBlazeTargetInfo::GCCRegNames[] = {
1076  "r0",   "r1",   "r2",   "r3",   "r4",   "r5",   "r6",   "r7",
1077  "r8",   "r9",   "r10",  "r11",  "r12",  "r13",  "r14",  "r15",
1078  "r16",  "r17",  "r18",  "r19",  "r20",  "r21",  "r22",  "r23",
1079  "r24",  "r25",  "r26",  "r27",  "r28",  "r29",  "r30",  "r31",
1080  "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
1081  "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1082  "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1083  "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1084  "hi",   "lo",   "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1085  "$fcc5","$fcc6","$fcc7","$ap",  "$rap", "$frp"
1086};
1087
1088void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1089                                   unsigned &NumNames) const {
1090  Names = GCCRegNames;
1091  NumNames = llvm::array_lengthof(GCCRegNames);
1092}
1093
1094const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1095  { {"f0"},  "r0" },
1096  { {"f1"},  "r1" },
1097  { {"f2"},  "r2" },
1098  { {"f3"},  "r3" },
1099  { {"f4"},  "r4" },
1100  { {"f5"},  "r5" },
1101  { {"f6"},  "r6" },
1102  { {"f7"},  "r7" },
1103  { {"f8"},  "r8" },
1104  { {"f9"},  "r9" },
1105  { {"f10"}, "r10" },
1106  { {"f11"}, "r11" },
1107  { {"f12"}, "r12" },
1108  { {"f13"}, "r13" },
1109  { {"f14"}, "r14" },
1110  { {"f15"}, "r15" },
1111  { {"f16"}, "r16" },
1112  { {"f17"}, "r17" },
1113  { {"f18"}, "r18" },
1114  { {"f19"}, "r19" },
1115  { {"f20"}, "r20" },
1116  { {"f21"}, "r21" },
1117  { {"f22"}, "r22" },
1118  { {"f23"}, "r23" },
1119  { {"f24"}, "r24" },
1120  { {"f25"}, "r25" },
1121  { {"f26"}, "r26" },
1122  { {"f27"}, "r27" },
1123  { {"f28"}, "r28" },
1124  { {"f29"}, "r29" },
1125  { {"f30"}, "r30" },
1126  { {"f31"}, "r31" },
1127};
1128
1129void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1130                                     unsigned &NumAliases) const {
1131  Aliases = GCCRegAliases;
1132  NumAliases = llvm::array_lengthof(GCCRegAliases);
1133}
1134} // end anonymous namespace.
1135
1136namespace {
1137// Namespace for x86 abstract base class
1138const Builtin::Info BuiltinInfo[] = {
1139#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1140#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1141                                              ALL_LANGUAGES },
1142#include "clang/Basic/BuiltinsX86.def"
1143};
1144
1145static const char* const GCCRegNames[] = {
1146  "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1147  "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
1148  "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
1149  "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1150  "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1151  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1152  "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
1153};
1154
1155const TargetInfo::AddlRegName AddlRegNames[] = {
1156  { { "al", "ah", "eax", "rax" }, 0 },
1157  { { "bl", "bh", "ebx", "rbx" }, 3 },
1158  { { "cl", "ch", "ecx", "rcx" }, 2 },
1159  { { "dl", "dh", "edx", "rdx" }, 1 },
1160  { { "esi", "rsi" }, 4 },
1161  { { "edi", "rdi" }, 5 },
1162  { { "esp", "rsp" }, 7 },
1163  { { "ebp", "rbp" }, 6 },
1164};
1165
1166// X86 target abstract base class; x86-32 and x86-64 are very close, so
1167// most of the implementation can be shared.
1168class X86TargetInfo : public TargetInfo {
1169  enum X86SSEEnum {
1170    NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
1171  } SSELevel;
1172  enum MMX3DNowEnum {
1173    NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1174  } MMX3DNowLevel;
1175
1176  bool HasAES;
1177  bool HasAVX;
1178
1179  /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1180  ///
1181  /// Each enumeration represents a particular CPU supported by Clang. These
1182  /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1183  enum CPUKind {
1184    CK_Generic,
1185
1186    /// \name i386
1187    /// i386-generation processors.
1188    //@{
1189    CK_i386,
1190    //@}
1191
1192    /// \name i486
1193    /// i486-generation processors.
1194    //@{
1195    CK_i486,
1196    CK_WinChipC6,
1197    CK_WinChip2,
1198    CK_C3,
1199    //@}
1200
1201    /// \name i586
1202    /// i586-generation processors, P5 microarchitecture based.
1203    //@{
1204    CK_i586,
1205    CK_Pentium,
1206    CK_PentiumMMX,
1207    //@}
1208
1209    /// \name i686
1210    /// i686-generation processors, P6 / Pentium M microarchitecture based.
1211    //@{
1212    CK_i686,
1213    CK_PentiumPro,
1214    CK_Pentium2,
1215    CK_Pentium3,
1216    CK_Pentium3M,
1217    CK_PentiumM,
1218    CK_C3_2,
1219
1220    /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1221    /// Clang however has some logic to suport this.
1222    // FIXME: Warn, deprecate, and potentially remove this.
1223    CK_Yonah,
1224    //@}
1225
1226    /// \name Netburst
1227    /// Netburst microarchitecture based processors.
1228    //@{
1229    CK_Pentium4,
1230    CK_Pentium4M,
1231    CK_Prescott,
1232    CK_Nocona,
1233    //@}
1234
1235    /// \name Core
1236    /// Core microarchitecture based processors.
1237    //@{
1238    CK_Core2,
1239
1240    /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1241    /// codename which GCC no longer accepts as an option to -march, but Clang
1242    /// has some logic for recognizing it.
1243    // FIXME: Warn, deprecate, and potentially remove this.
1244    CK_Penryn,
1245    //@}
1246
1247    /// \name Atom
1248    /// Atom processors
1249    //@{
1250    CK_Atom,
1251    //@}
1252
1253    /// \name Nehalem
1254    /// Nehalem microarchitecture based processors.
1255    //@{
1256    CK_Corei7,
1257    CK_Corei7AVX,
1258    CK_CoreAVXi,
1259    //@}
1260
1261    /// \name K6
1262    /// K6 architecture processors.
1263    //@{
1264    CK_K6,
1265    CK_K6_2,
1266    CK_K6_3,
1267    //@}
1268
1269    /// \name K7
1270    /// K7 architecture processors.
1271    //@{
1272    CK_Athlon,
1273    CK_AthlonThunderbird,
1274    CK_Athlon4,
1275    CK_AthlonXP,
1276    CK_AthlonMP,
1277    //@}
1278
1279    /// \name K8
1280    /// K8 architecture processors.
1281    //@{
1282    CK_Athlon64,
1283    CK_Athlon64SSE3,
1284    CK_AthlonFX,
1285    CK_K8,
1286    CK_K8SSE3,
1287    CK_Opteron,
1288    CK_OpteronSSE3,
1289
1290    /// This specification is deprecated and will be removed in the future.
1291    /// Users should prefer \see CK_K8.
1292    // FIXME: Warn on this when the CPU is set to it.
1293    CK_x86_64,
1294    //@}
1295
1296    /// \name Geode
1297    /// Geode processors.
1298    //@{
1299    CK_Geode
1300    //@}
1301  } CPU;
1302
1303public:
1304  X86TargetInfo(const std::string& triple)
1305    : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
1306      HasAES(false), HasAVX(false), CPU(CK_Generic) {
1307    LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
1308  }
1309  virtual void getTargetBuiltins(const Builtin::Info *&Records,
1310                                 unsigned &NumRecords) const {
1311    Records = BuiltinInfo;
1312    NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
1313  }
1314  virtual void getGCCRegNames(const char * const *&Names,
1315                              unsigned &NumNames) const {
1316    Names = GCCRegNames;
1317    NumNames = llvm::array_lengthof(GCCRegNames);
1318  }
1319  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1320                                unsigned &NumAliases) const {
1321    Aliases = 0;
1322    NumAliases = 0;
1323  }
1324  virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1325				  unsigned &NumNames) const {
1326    Names = AddlRegNames;
1327    NumNames = llvm::array_lengthof(AddlRegNames);
1328  }
1329  virtual bool validateAsmConstraint(const char *&Name,
1330                                     TargetInfo::ConstraintInfo &info) const;
1331  virtual std::string convertConstraint(const char *&Constraint) const;
1332  virtual const char *getClobbers() const {
1333    return "~{dirflag},~{fpsr},~{flags}";
1334  }
1335  virtual void getTargetDefines(const LangOptions &Opts,
1336                                MacroBuilder &Builder) const;
1337  virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1338                                 const std::string &Name,
1339                                 bool Enabled) const;
1340  virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
1341  virtual void HandleTargetFeatures(std::vector<std::string> &Features);
1342  virtual const char* getABI() const {
1343    return MMX3DNowLevel == NoMMX3DNow ? "no-mmx" : "";
1344  }
1345  virtual bool setCPU(const std::string &Name) {
1346    CPU = llvm::StringSwitch<CPUKind>(Name)
1347      .Case("i386", CK_i386)
1348      .Case("i486", CK_i486)
1349      .Case("winchip-c6", CK_WinChipC6)
1350      .Case("winchip2", CK_WinChip2)
1351      .Case("c3", CK_C3)
1352      .Case("i586", CK_i586)
1353      .Case("pentium", CK_Pentium)
1354      .Case("pentium-mmx", CK_PentiumMMX)
1355      .Case("i686", CK_i686)
1356      .Case("pentiumpro", CK_PentiumPro)
1357      .Case("pentium2", CK_Pentium2)
1358      .Case("pentium3", CK_Pentium3)
1359      .Case("pentium3m", CK_Pentium3M)
1360      .Case("pentium-m", CK_PentiumM)
1361      .Case("c3-2", CK_C3_2)
1362      .Case("yonah", CK_Yonah)
1363      .Case("pentium4", CK_Pentium4)
1364      .Case("pentium4m", CK_Pentium4M)
1365      .Case("prescott", CK_Prescott)
1366      .Case("nocona", CK_Nocona)
1367      .Case("core2", CK_Core2)
1368      .Case("penryn", CK_Penryn)
1369      .Case("atom", CK_Atom)
1370      .Case("corei7", CK_Corei7)
1371      .Case("corei7-avx", CK_Corei7AVX)
1372      .Case("core-avx-i", CK_CoreAVXi)
1373      .Case("k6", CK_K6)
1374      .Case("k6-2", CK_K6_2)
1375      .Case("k6-3", CK_K6_3)
1376      .Case("athlon", CK_Athlon)
1377      .Case("athlon-tbird", CK_AthlonThunderbird)
1378      .Case("athlon-4", CK_Athlon4)
1379      .Case("athlon-xp", CK_AthlonXP)
1380      .Case("athlon-mp", CK_AthlonMP)
1381      .Case("athlon64", CK_Athlon64)
1382      .Case("athlon64-sse3", CK_Athlon64SSE3)
1383      .Case("athlon-fx", CK_AthlonFX)
1384      .Case("k8", CK_K8)
1385      .Case("k8-sse3", CK_K8SSE3)
1386      .Case("opteron", CK_Opteron)
1387      .Case("opteron-sse3", CK_OpteronSSE3)
1388      .Case("x86-64", CK_x86_64)
1389      .Case("geode", CK_Geode)
1390      .Default(CK_Generic);
1391
1392    // Perform any per-CPU checks necessary to determine if this CPU is
1393    // acceptable.
1394    // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1395    // invalid without explaining *why*.
1396    switch (CPU) {
1397    case CK_Generic:
1398      // No processor selected!
1399      return false;
1400
1401    case CK_i386:
1402    case CK_i486:
1403    case CK_WinChipC6:
1404    case CK_WinChip2:
1405    case CK_C3:
1406    case CK_i586:
1407    case CK_Pentium:
1408    case CK_PentiumMMX:
1409    case CK_i686:
1410    case CK_PentiumPro:
1411    case CK_Pentium2:
1412    case CK_Pentium3:
1413    case CK_Pentium3M:
1414    case CK_PentiumM:
1415    case CK_Yonah:
1416    case CK_C3_2:
1417    case CK_Pentium4:
1418    case CK_Pentium4M:
1419    case CK_Prescott:
1420    case CK_K6:
1421    case CK_K6_2:
1422    case CK_K6_3:
1423    case CK_Athlon:
1424    case CK_AthlonThunderbird:
1425    case CK_Athlon4:
1426    case CK_AthlonXP:
1427    case CK_AthlonMP:
1428    case CK_Geode:
1429      // Only accept certain architectures when compiling in 32-bit mode.
1430      if (PointerWidth != 32)
1431        return false;
1432
1433      // Fallthrough
1434    case CK_Nocona:
1435    case CK_Core2:
1436    case CK_Penryn:
1437    case CK_Atom:
1438    case CK_Corei7:
1439    case CK_Corei7AVX:
1440    case CK_CoreAVXi:
1441    case CK_Athlon64:
1442    case CK_Athlon64SSE3:
1443    case CK_AthlonFX:
1444    case CK_K8:
1445    case CK_K8SSE3:
1446    case CK_Opteron:
1447    case CK_OpteronSSE3:
1448    case CK_x86_64:
1449      return true;
1450    }
1451    llvm_unreachable("Unhandled CPU kind");
1452  }
1453};
1454
1455void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1456  // FIXME: This should not be here.
1457  Features["3dnow"] = false;
1458  Features["3dnowa"] = false;
1459  Features["mmx"] = false;
1460  Features["sse"] = false;
1461  Features["sse2"] = false;
1462  Features["sse3"] = false;
1463  Features["ssse3"] = false;
1464  Features["sse41"] = false;
1465  Features["sse42"] = false;
1466  Features["aes"] = false;
1467  Features["avx"] = false;
1468
1469  // LLVM does not currently recognize this.
1470  // Features["sse4a"] = false;
1471
1472  // FIXME: This *really* should not be here.
1473
1474  // X86_64 always has SSE2.
1475  if (PointerWidth == 64)
1476    Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1477
1478  switch (CPU) {
1479  case CK_Generic:
1480  case CK_i386:
1481  case CK_i486:
1482  case CK_i586:
1483  case CK_Pentium:
1484  case CK_i686:
1485  case CK_PentiumPro:
1486    break;
1487  case CK_PentiumMMX:
1488  case CK_Pentium2:
1489    setFeatureEnabled(Features, "mmx", true);
1490    break;
1491  case CK_Pentium3:
1492  case CK_Pentium3M:
1493    setFeatureEnabled(Features, "mmx", true);
1494    setFeatureEnabled(Features, "sse", true);
1495    break;
1496  case CK_PentiumM:
1497  case CK_Pentium4:
1498  case CK_Pentium4M:
1499  case CK_x86_64:
1500    setFeatureEnabled(Features, "mmx", true);
1501    setFeatureEnabled(Features, "sse2", true);
1502    break;
1503  case CK_Yonah:
1504  case CK_Prescott:
1505  case CK_Nocona:
1506    setFeatureEnabled(Features, "mmx", true);
1507    setFeatureEnabled(Features, "sse3", true);
1508    break;
1509  case CK_Core2:
1510    setFeatureEnabled(Features, "mmx", true);
1511    setFeatureEnabled(Features, "ssse3", true);
1512    break;
1513  case CK_Penryn:
1514    setFeatureEnabled(Features, "mmx", true);
1515    setFeatureEnabled(Features, "sse4", true);
1516    Features["sse42"] = false;
1517    break;
1518  case CK_Atom:
1519    setFeatureEnabled(Features, "mmx", true);
1520    setFeatureEnabled(Features, "ssse3", true);
1521    break;
1522  case CK_Corei7:
1523    setFeatureEnabled(Features, "mmx", true);
1524    setFeatureEnabled(Features, "sse4", true);
1525    setFeatureEnabled(Features, "aes", true);
1526    break;
1527  case CK_Corei7AVX:
1528  case CK_CoreAVXi:
1529    setFeatureEnabled(Features, "mmx", true);
1530    setFeatureEnabled(Features, "sse4", true);
1531    setFeatureEnabled(Features, "aes", true);
1532    //setFeatureEnabled(Features, "avx", true);
1533    break;
1534  case CK_K6:
1535  case CK_WinChipC6:
1536    setFeatureEnabled(Features, "mmx", true);
1537    break;
1538  case CK_K6_2:
1539  case CK_K6_3:
1540  case CK_WinChip2:
1541  case CK_C3:
1542    setFeatureEnabled(Features, "3dnow", true);
1543    break;
1544  case CK_Athlon:
1545  case CK_AthlonThunderbird:
1546  case CK_Geode:
1547    setFeatureEnabled(Features, "3dnowa", true);
1548    break;
1549  case CK_Athlon4:
1550  case CK_AthlonXP:
1551  case CK_AthlonMP:
1552    setFeatureEnabled(Features, "sse", true);
1553    setFeatureEnabled(Features, "3dnowa", true);
1554    break;
1555  case CK_K8:
1556  case CK_Opteron:
1557  case CK_Athlon64:
1558  case CK_AthlonFX:
1559    setFeatureEnabled(Features, "sse2", true);
1560    setFeatureEnabled(Features, "3dnowa", true);
1561    break;
1562  case CK_K8SSE3:
1563  case CK_OpteronSSE3:
1564  case CK_Athlon64SSE3:
1565    setFeatureEnabled(Features, "sse3", true);
1566    setFeatureEnabled(Features, "3dnowa", true);
1567    break;
1568  case CK_C3_2:
1569    setFeatureEnabled(Features, "mmx", true);
1570    setFeatureEnabled(Features, "sse", true);
1571    break;
1572  }
1573}
1574
1575bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1576                                      const std::string &Name,
1577                                      bool Enabled) const {
1578  // FIXME: This *really* should not be here.  We need some way of translating
1579  // options into llvm subtarget features.
1580  if (!Features.count(Name) &&
1581      (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
1582    return false;
1583
1584  if (Enabled) {
1585    if (Name == "mmx")
1586      Features["mmx"] = true;
1587    else if (Name == "sse")
1588      Features["sse"] = true;
1589    else if (Name == "sse2")
1590      Features["sse"] = Features["sse2"] = true;
1591    else if (Name == "sse3")
1592      Features["sse"] = Features["sse2"] = Features["sse3"] = true;
1593    else if (Name == "ssse3")
1594      Features["sse"] = Features["sse2"] = Features["sse3"] =
1595        Features["ssse3"] = true;
1596    else if (Name == "sse4" || Name == "sse4.2")
1597      Features["sse"] = Features["sse2"] = Features["sse3"] =
1598        Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
1599    else if (Name == "sse4.1")
1600      Features["sse"] = Features["sse2"] = Features["sse3"] =
1601        Features["ssse3"] = Features["sse41"] = true;
1602    else if (Name == "3dnow")
1603      Features["mmx"] = Features["3dnow"] = true;
1604    else if (Name == "3dnowa")
1605      Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
1606    else if (Name == "aes")
1607      Features["aes"] = true;
1608    else if (Name == "avx")
1609      Features["avx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1610        Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
1611  } else {
1612    if (Name == "mmx")
1613      Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
1614    else if (Name == "sse")
1615      Features["sse"] = Features["sse2"] = Features["sse3"] =
1616        Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1617    else if (Name == "sse2")
1618      Features["sse2"] = Features["sse3"] = Features["ssse3"] =
1619        Features["sse41"] = Features["sse42"] = false;
1620    else if (Name == "sse3")
1621      Features["sse3"] = Features["ssse3"] = Features["sse41"] =
1622        Features["sse42"] = false;
1623    else if (Name == "ssse3")
1624      Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1625    else if (Name == "sse4" || Name == "sse4.1")
1626      Features["sse41"] = Features["sse42"] = false;
1627    else if (Name == "sse4.2")
1628      Features["sse42"] = false;
1629    else if (Name == "3dnow")
1630      Features["3dnow"] = Features["3dnowa"] = false;
1631    else if (Name == "3dnowa")
1632      Features["3dnowa"] = false;
1633    else if (Name == "aes")
1634      Features["aes"] = false;
1635    else if (Name == "avx")
1636      Features["avx"] = false;
1637  }
1638
1639  return true;
1640}
1641
1642/// HandleTargetOptions - Perform initialization based on the user
1643/// configured set of features.
1644void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
1645  // Remember the maximum enabled sselevel.
1646  for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1647    // Ignore disabled features.
1648    if (Features[i][0] == '-')
1649      continue;
1650
1651    if (Features[i].substr(1) == "aes") {
1652      HasAES = true;
1653      continue;
1654    }
1655
1656    // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1657    // For now let it be enabled together with other SSE levels.
1658    if (Features[i].substr(1) == "avx") {
1659      HasAVX = true;
1660      continue;
1661    }
1662
1663    assert(Features[i][0] == '+' && "Invalid target feature!");
1664    X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1665      .Case("sse42", SSE42)
1666      .Case("sse41", SSE41)
1667      .Case("ssse3", SSSE3)
1668      .Case("sse3", SSE3)
1669      .Case("sse2", SSE2)
1670      .Case("sse", SSE1)
1671      .Default(NoSSE);
1672    SSELevel = std::max(SSELevel, Level);
1673
1674    MMX3DNowEnum ThreeDNowLevel =
1675      llvm::StringSwitch<MMX3DNowEnum>(Features[i].substr(1))
1676        .Case("3dnowa", AMD3DNowAthlon)
1677        .Case("3dnow", AMD3DNow)
1678        .Case("mmx", MMX)
1679        .Default(NoMMX3DNow);
1680
1681    MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
1682  }
1683
1684  // Don't tell the backend if we're turning off mmx; it will end up disabling
1685  // SSE, which we don't want.
1686  std::vector<std::string>::iterator it;
1687  it = std::find(Features.begin(), Features.end(), "-mmx");
1688  if (it != Features.end())
1689    Features.erase(it);
1690}
1691
1692/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
1693/// definitions for this particular subtarget.
1694void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
1695                                     MacroBuilder &Builder) const {
1696  // Target identification.
1697  if (PointerWidth == 64) {
1698    Builder.defineMacro("_LP64");
1699    Builder.defineMacro("__LP64__");
1700    Builder.defineMacro("__amd64__");
1701    Builder.defineMacro("__amd64");
1702    Builder.defineMacro("__x86_64");
1703    Builder.defineMacro("__x86_64__");
1704  } else {
1705    DefineStd(Builder, "i386", Opts);
1706  }
1707
1708  // Subtarget options.
1709  // FIXME: We are hard-coding the tune parameters based on the CPU, but they
1710  // truly should be based on -mtune options.
1711  switch (CPU) {
1712  case CK_Generic:
1713    break;
1714  case CK_i386:
1715    // The rest are coming from the i386 define above.
1716    Builder.defineMacro("__tune_i386__");
1717    break;
1718  case CK_i486:
1719  case CK_WinChipC6:
1720  case CK_WinChip2:
1721  case CK_C3:
1722    Builder.defineMacro("__i486");
1723    Builder.defineMacro("__i486__");
1724    Builder.defineMacro("__tune_i486__");
1725    break;
1726  case CK_PentiumMMX:
1727    Builder.defineMacro("__pentium_mmx__");
1728    Builder.defineMacro("__tune_pentium_mmx__");
1729    // Fallthrough
1730  case CK_i586:
1731  case CK_Pentium:
1732    Builder.defineMacro("__i586");
1733    Builder.defineMacro("__i586__");
1734    Builder.defineMacro("__tune_i586__");
1735    Builder.defineMacro("__pentium");
1736    Builder.defineMacro("__pentium__");
1737    Builder.defineMacro("__tune_pentium__");
1738    break;
1739  case CK_Pentium3:
1740  case CK_Pentium3M:
1741  case CK_PentiumM:
1742    Builder.defineMacro("__tune_pentium3__");
1743    // Fallthrough
1744  case CK_Pentium2:
1745  case CK_C3_2:
1746    Builder.defineMacro("__tune_pentium2__");
1747    // Fallthrough
1748  case CK_PentiumPro:
1749    Builder.defineMacro("__tune_i686__");
1750    Builder.defineMacro("__tune_pentiumpro__");
1751    // Fallthrough
1752  case CK_i686:
1753    Builder.defineMacro("__i686");
1754    Builder.defineMacro("__i686__");
1755    // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
1756    Builder.defineMacro("__pentiumpro");
1757    Builder.defineMacro("__pentiumpro__");
1758    break;
1759  case CK_Pentium4:
1760  case CK_Pentium4M:
1761    Builder.defineMacro("__pentium4");
1762    Builder.defineMacro("__pentium4__");
1763    Builder.defineMacro("__tune_pentium4__");
1764    break;
1765  case CK_Yonah:
1766  case CK_Prescott:
1767  case CK_Nocona:
1768    Builder.defineMacro("__nocona");
1769    Builder.defineMacro("__nocona__");
1770    Builder.defineMacro("__tune_nocona__");
1771    break;
1772  case CK_Core2:
1773  case CK_Penryn:
1774    Builder.defineMacro("__core2");
1775    Builder.defineMacro("__core2__");
1776    Builder.defineMacro("__tune_core2__");
1777    break;
1778  case CK_Atom:
1779    Builder.defineMacro("__atom");
1780    Builder.defineMacro("__atom__");
1781    Builder.defineMacro("__tune_atom__");
1782    break;
1783  case CK_Corei7:
1784  case CK_Corei7AVX:
1785  case CK_CoreAVXi:
1786    Builder.defineMacro("__corei7");
1787    Builder.defineMacro("__corei7__");
1788    Builder.defineMacro("__tune_corei7__");
1789    break;
1790  case CK_K6_2:
1791    Builder.defineMacro("__k6_2__");
1792    Builder.defineMacro("__tune_k6_2__");
1793    // Fallthrough
1794  case CK_K6_3:
1795    if (CPU != CK_K6_2) {  // In case of fallthrough
1796      // FIXME: GCC may be enabling these in cases where some other k6
1797      // architecture is specified but -m3dnow is explicitly provided. The
1798      // exact semantics need to be determined and emulated here.
1799      Builder.defineMacro("__k6_3__");
1800      Builder.defineMacro("__tune_k6_3__");
1801    }
1802    // Fallthrough
1803  case CK_K6:
1804    Builder.defineMacro("__k6");
1805    Builder.defineMacro("__k6__");
1806    Builder.defineMacro("__tune_k6__");
1807    break;
1808  case CK_Athlon:
1809  case CK_AthlonThunderbird:
1810  case CK_Athlon4:
1811  case CK_AthlonXP:
1812  case CK_AthlonMP:
1813    Builder.defineMacro("__athlon");
1814    Builder.defineMacro("__athlon__");
1815    Builder.defineMacro("__tune_athlon__");
1816    if (SSELevel != NoSSE) {
1817      Builder.defineMacro("__athlon_sse__");
1818      Builder.defineMacro("__tune_athlon_sse__");
1819    }
1820    break;
1821  case CK_K8:
1822  case CK_K8SSE3:
1823  case CK_x86_64:
1824  case CK_Opteron:
1825  case CK_OpteronSSE3:
1826  case CK_Athlon64:
1827  case CK_Athlon64SSE3:
1828  case CK_AthlonFX:
1829    Builder.defineMacro("__k8");
1830    Builder.defineMacro("__k8__");
1831    Builder.defineMacro("__tune_k8__");
1832    break;
1833  case CK_Geode:
1834    Builder.defineMacro("__geode");
1835    Builder.defineMacro("__geode__");
1836    Builder.defineMacro("__tune_geode__");
1837    break;
1838  }
1839
1840  // Target properties.
1841  Builder.defineMacro("__LITTLE_ENDIAN__");
1842  Builder.defineMacro("__REGISTER_PREFIX__", "");
1843
1844  // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1845  // functions in glibc header files that use FP Stack inline asm which the
1846  // backend can't deal with (PR879).
1847  Builder.defineMacro("__NO_MATH_INLINES");
1848
1849  if (HasAES)
1850    Builder.defineMacro("__AES__");
1851
1852  if (HasAVX)
1853    Builder.defineMacro("__AVX__");
1854
1855  // Each case falls through to the previous one here.
1856  switch (SSELevel) {
1857  case SSE42:
1858    Builder.defineMacro("__SSE4_2__");
1859  case SSE41:
1860    Builder.defineMacro("__SSE4_1__");
1861  case SSSE3:
1862    Builder.defineMacro("__SSSE3__");
1863  case SSE3:
1864    Builder.defineMacro("__SSE3__");
1865  case SSE2:
1866    Builder.defineMacro("__SSE2__");
1867    Builder.defineMacro("__SSE2_MATH__");  // -mfp-math=sse always implied.
1868  case SSE1:
1869    Builder.defineMacro("__SSE__");
1870    Builder.defineMacro("__SSE_MATH__");   // -mfp-math=sse always implied.
1871  case NoSSE:
1872    break;
1873  }
1874
1875  if (Opts.MicrosoftExt && PointerWidth == 32) {
1876    switch (SSELevel) {
1877    case SSE42:
1878    case SSE41:
1879    case SSSE3:
1880    case SSE3:
1881    case SSE2:
1882      Builder.defineMacro("_M_IX86_FP", Twine(2));
1883      break;
1884    case SSE1:
1885      Builder.defineMacro("_M_IX86_FP", Twine(1));
1886      break;
1887    default:
1888      Builder.defineMacro("_M_IX86_FP", Twine(0));
1889    }
1890  }
1891
1892  // Each case falls through to the previous one here.
1893  switch (MMX3DNowLevel) {
1894  case AMD3DNowAthlon:
1895    Builder.defineMacro("__3dNOW_A__");
1896  case AMD3DNow:
1897    Builder.defineMacro("__3dNOW__");
1898  case MMX:
1899    Builder.defineMacro("__MMX__");
1900  case NoMMX3DNow:
1901    break;
1902  }
1903}
1904
1905
1906bool
1907X86TargetInfo::validateAsmConstraint(const char *&Name,
1908                                     TargetInfo::ConstraintInfo &Info) const {
1909  switch (*Name) {
1910  default: return false;
1911  case 'Y': // first letter of a pair:
1912    switch (*(Name+1)) {
1913    default: return false;
1914    case '0':  // First SSE register.
1915    case 't':  // Any SSE register, when SSE2 is enabled.
1916    case 'i':  // Any SSE register, when SSE2 and inter-unit moves enabled.
1917    case 'm':  // any MMX register, when inter-unit moves enabled.
1918      break;   // falls through to setAllowsRegister.
1919  }
1920  case 'a': // eax.
1921  case 'b': // ebx.
1922  case 'c': // ecx.
1923  case 'd': // edx.
1924  case 'S': // esi.
1925  case 'D': // edi.
1926  case 'A': // edx:eax.
1927  case 'f': // any x87 floating point stack register.
1928  case 't': // top of floating point stack.
1929  case 'u': // second from top of floating point stack.
1930  case 'q': // Any register accessible as [r]l: a, b, c, and d.
1931  case 'y': // Any MMX register.
1932  case 'x': // Any SSE register.
1933  case 'Q': // Any register accessible as [r]h: a, b, c, and d.
1934  case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1935  case 'l': // "Index" registers: any general register that can be used as an
1936            // index in a base+index memory access.
1937    Info.setAllowsRegister();
1938    return true;
1939  case 'C': // SSE floating point constant.
1940  case 'G': // x87 floating point constant.
1941  case 'e': // 32-bit signed integer constant for use with zero-extending
1942            // x86_64 instructions.
1943  case 'Z': // 32-bit unsigned integer constant for use with zero-extending
1944            // x86_64 instructions.
1945    return true;
1946  }
1947  return false;
1948}
1949
1950
1951std::string
1952X86TargetInfo::convertConstraint(const char *&Constraint) const {
1953  switch (*Constraint) {
1954  case 'a': return std::string("{ax}");
1955  case 'b': return std::string("{bx}");
1956  case 'c': return std::string("{cx}");
1957  case 'd': return std::string("{dx}");
1958  case 'S': return std::string("{si}");
1959  case 'D': return std::string("{di}");
1960  case 'p': // address
1961    return std::string("im");
1962  case 't': // top of floating point stack.
1963    return std::string("{st}");
1964  case 'u': // second from top of floating point stack.
1965    return std::string("{st(1)}"); // second from top of floating point stack.
1966  default:
1967    return std::string(1, *Constraint);
1968  }
1969}
1970} // end anonymous namespace
1971
1972namespace {
1973// X86-32 generic target
1974class X86_32TargetInfo : public X86TargetInfo {
1975public:
1976  X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1977    DoubleAlign = LongLongAlign = 32;
1978    LongDoubleWidth = 96;
1979    LongDoubleAlign = 32;
1980    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1981                        "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
1982                        "a0:0:64-f80:32:32-n8:16:32-S128";
1983    SizeType = UnsignedInt;
1984    PtrDiffType = SignedInt;
1985    IntPtrType = SignedInt;
1986    RegParmMax = 3;
1987
1988    // Use fpret for all types.
1989    RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1990                             (1 << TargetInfo::Double) |
1991                             (1 << TargetInfo::LongDouble));
1992
1993    // x86-32 has atomics up to 8 bytes
1994    // FIXME: Check that we actually have cmpxchg8b before setting
1995    // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
1996    MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
1997  }
1998  virtual const char *getVAListDeclaration() const {
1999    return "typedef char* __builtin_va_list;";
2000  }
2001
2002  int getEHDataRegisterNumber(unsigned RegNo) const {
2003    if (RegNo == 0) return 0;
2004    if (RegNo == 1) return 2;
2005    return -1;
2006  }
2007};
2008} // end anonymous namespace
2009
2010namespace {
2011class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2012public:
2013  OpenBSDI386TargetInfo(const std::string& triple) :
2014    OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2015    SizeType = UnsignedLong;
2016    IntPtrType = SignedLong;
2017    PtrDiffType = SignedLong;
2018  }
2019};
2020} // end anonymous namespace
2021
2022namespace {
2023class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
2024public:
2025  DarwinI386TargetInfo(const std::string& triple) :
2026    DarwinTargetInfo<X86_32TargetInfo>(triple) {
2027    LongDoubleWidth = 128;
2028    LongDoubleAlign = 128;
2029    SizeType = UnsignedLong;
2030    IntPtrType = SignedLong;
2031    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2032                        "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
2033                        "a0:0:64-f80:128:128-n8:16:32-S128";
2034    HasAlignMac68kSupport = true;
2035  }
2036
2037};
2038} // end anonymous namespace
2039
2040namespace {
2041// x86-32 Windows target
2042class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
2043public:
2044  WindowsX86_32TargetInfo(const std::string& triple)
2045    : WindowsTargetInfo<X86_32TargetInfo>(triple) {
2046    TLSSupported = false;
2047    WCharType = UnsignedShort;
2048    DoubleAlign = LongLongAlign = 64;
2049    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2050                        "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
2051                        "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
2052  }
2053  virtual void getTargetDefines(const LangOptions &Opts,
2054                                MacroBuilder &Builder) const {
2055    WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2056  }
2057};
2058} // end anonymous namespace
2059
2060namespace {
2061
2062// x86-32 Windows Visual Studio target
2063class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2064public:
2065  VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2066    : WindowsX86_32TargetInfo(triple) {
2067    LongDoubleWidth = LongDoubleAlign = 64;
2068    LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2069  }
2070  virtual void getTargetDefines(const LangOptions &Opts,
2071                                MacroBuilder &Builder) const {
2072    WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2073    WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2074    // The value of the following reflects processor type.
2075    // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2076    // We lost the original triple, so we use the default.
2077    Builder.defineMacro("_M_IX86", "600");
2078  }
2079};
2080} // end anonymous namespace
2081
2082namespace {
2083// x86-32 MinGW target
2084class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2085public:
2086  MinGWX86_32TargetInfo(const std::string& triple)
2087    : WindowsX86_32TargetInfo(triple) {
2088  }
2089  virtual void getTargetDefines(const LangOptions &Opts,
2090                                MacroBuilder &Builder) const {
2091    WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2092    DefineStd(Builder, "WIN32", Opts);
2093    DefineStd(Builder, "WINNT", Opts);
2094    Builder.defineMacro("_X86_");
2095    Builder.defineMacro("__MSVCRT__");
2096    Builder.defineMacro("__MINGW32__");
2097
2098    // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2099    // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
2100    if (Opts.MicrosoftExt)
2101      // Provide "as-is" __declspec.
2102      Builder.defineMacro("__declspec", "__declspec");
2103    else
2104      // Provide alias of __attribute__ like mingw32-gcc.
2105      Builder.defineMacro("__declspec(a)", "__attribute__((a))");
2106  }
2107};
2108} // end anonymous namespace
2109
2110namespace {
2111// x86-32 Cygwin target
2112class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2113public:
2114  CygwinX86_32TargetInfo(const std::string& triple)
2115    : X86_32TargetInfo(triple) {
2116    TLSSupported = false;
2117    WCharType = UnsignedShort;
2118    DoubleAlign = LongLongAlign = 64;
2119    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2120                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
2121                        "a0:0:64-f80:32:32-n8:16:32-S32";
2122  }
2123  virtual void getTargetDefines(const LangOptions &Opts,
2124                                MacroBuilder &Builder) const {
2125    X86_32TargetInfo::getTargetDefines(Opts, Builder);
2126    Builder.defineMacro("__CYGWIN__");
2127    Builder.defineMacro("__CYGWIN32__");
2128    DefineStd(Builder, "unix", Opts);
2129    if (Opts.CPlusPlus)
2130      Builder.defineMacro("_GNU_SOURCE");
2131  }
2132};
2133} // end anonymous namespace
2134
2135namespace {
2136// x86-32 Haiku target
2137class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2138public:
2139  HaikuX86_32TargetInfo(const std::string& triple)
2140    : X86_32TargetInfo(triple) {
2141    SizeType = UnsignedLong;
2142    IntPtrType = SignedLong;
2143    PtrDiffType = SignedLong;
2144    this->UserLabelPrefix = "";
2145  }
2146  virtual void getTargetDefines(const LangOptions &Opts,
2147                                MacroBuilder &Builder) const {
2148    X86_32TargetInfo::getTargetDefines(Opts, Builder);
2149    Builder.defineMacro("__INTEL__");
2150    Builder.defineMacro("__HAIKU__");
2151  }
2152};
2153} // end anonymous namespace
2154
2155// RTEMS Target
2156template<typename Target>
2157class RTEMSTargetInfo : public OSTargetInfo<Target> {
2158protected:
2159  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2160                            MacroBuilder &Builder) const {
2161    // RTEMS defines; list based off of gcc output
2162
2163    Builder.defineMacro("__rtems__");
2164    Builder.defineMacro("__ELF__");
2165  }
2166public:
2167  RTEMSTargetInfo(const std::string &triple)
2168    : OSTargetInfo<Target>(triple) {
2169      this->UserLabelPrefix = "";
2170
2171      llvm::Triple Triple(triple);
2172      switch (Triple.getArch()) {
2173        default:
2174        case llvm::Triple::x86:
2175          // this->MCountName = ".mcount";
2176          break;
2177        case llvm::Triple::mips:
2178        case llvm::Triple::mipsel:
2179        case llvm::Triple::ppc:
2180        case llvm::Triple::ppc64:
2181          // this->MCountName = "_mcount";
2182          break;
2183        case llvm::Triple::arm:
2184          // this->MCountName = "__mcount";
2185          break;
2186      }
2187
2188    }
2189};
2190
2191namespace {
2192// x86-32 RTEMS target
2193class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
2194public:
2195  RTEMSX86_32TargetInfo(const std::string& triple)
2196    : X86_32TargetInfo(triple) {
2197    SizeType = UnsignedLong;
2198    IntPtrType = SignedLong;
2199    PtrDiffType = SignedLong;
2200    this->UserLabelPrefix = "";
2201  }
2202  virtual void getTargetDefines(const LangOptions &Opts,
2203                                MacroBuilder &Builder) const {
2204    X86_32TargetInfo::getTargetDefines(Opts, Builder);
2205    Builder.defineMacro("__INTEL__");
2206    Builder.defineMacro("__rtems__");
2207  }
2208};
2209} // end anonymous namespace
2210
2211namespace {
2212// x86-64 generic target
2213class X86_64TargetInfo : public X86TargetInfo {
2214public:
2215  X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
2216    LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
2217    LongDoubleWidth = 128;
2218    LongDoubleAlign = 128;
2219    LargeArrayMinWidth = 128;
2220    LargeArrayAlign = 128;
2221    IntMaxType = SignedLong;
2222    UIntMaxType = UnsignedLong;
2223    Int64Type = SignedLong;
2224    RegParmMax = 6;
2225
2226    DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2227                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
2228                        "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
2229
2230    // Use fpret only for long double.
2231    RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
2232
2233    // x86-64 has atomics up to 16 bytes.
2234    // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
2235    // on CPUs with cmpxchg16b
2236    MaxAtomicPromoteWidth = 128;
2237    MaxAtomicInlineWidth = 64;
2238  }
2239  virtual const char *getVAListDeclaration() const {
2240    return "typedef struct __va_list_tag {"
2241           "  unsigned gp_offset;"
2242           "  unsigned fp_offset;"
2243           "  void* overflow_arg_area;"
2244           "  void* reg_save_area;"
2245           "} __va_list_tag;"
2246           "typedef __va_list_tag __builtin_va_list[1];";
2247  }
2248
2249  int getEHDataRegisterNumber(unsigned RegNo) const {
2250    if (RegNo == 0) return 0;
2251    if (RegNo == 1) return 1;
2252    return -1;
2253  }
2254};
2255} // end anonymous namespace
2256
2257namespace {
2258// x86-64 Windows target
2259class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
2260public:
2261  WindowsX86_64TargetInfo(const std::string& triple)
2262    : WindowsTargetInfo<X86_64TargetInfo>(triple) {
2263    TLSSupported = false;
2264    WCharType = UnsignedShort;
2265    LongWidth = LongAlign = 32;
2266    DoubleAlign = LongLongAlign = 64;
2267    IntMaxType = SignedLongLong;
2268    UIntMaxType = UnsignedLongLong;
2269    Int64Type = SignedLongLong;
2270    SizeType = UnsignedLongLong;
2271    PtrDiffType = SignedLongLong;
2272    IntPtrType = SignedLongLong;
2273    this->UserLabelPrefix = "";
2274  }
2275  virtual void getTargetDefines(const LangOptions &Opts,
2276                                MacroBuilder &Builder) const {
2277    WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
2278    Builder.defineMacro("_WIN64");
2279  }
2280  virtual const char *getVAListDeclaration() const {
2281    return "typedef char* __builtin_va_list;";
2282  }
2283};
2284} // end anonymous namespace
2285
2286namespace {
2287// x86-64 Windows Visual Studio target
2288class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
2289public:
2290  VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
2291    : WindowsX86_64TargetInfo(triple) {
2292    LongDoubleWidth = LongDoubleAlign = 64;
2293    LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2294  }
2295  virtual void getTargetDefines(const LangOptions &Opts,
2296                                MacroBuilder &Builder) const {
2297    WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2298    WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
2299    Builder.defineMacro("_M_X64");
2300    Builder.defineMacro("_M_AMD64");
2301  }
2302};
2303} // end anonymous namespace
2304
2305namespace {
2306// x86-64 MinGW target
2307class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
2308public:
2309  MinGWX86_64TargetInfo(const std::string& triple)
2310    : WindowsX86_64TargetInfo(triple) {
2311  }
2312  virtual void getTargetDefines(const LangOptions &Opts,
2313                                MacroBuilder &Builder) const {
2314    WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2315    DefineStd(Builder, "WIN64", Opts);
2316    Builder.defineMacro("__MSVCRT__");
2317    Builder.defineMacro("__MINGW32__");
2318    Builder.defineMacro("__MINGW64__");
2319
2320    // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2321    // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
2322    if (Opts.MicrosoftExt)
2323      // Provide "as-is" __declspec.
2324      Builder.defineMacro("__declspec", "__declspec");
2325    else
2326      // Provide alias of __attribute__ like mingw32-gcc.
2327      Builder.defineMacro("__declspec(a)", "__attribute__((a))");
2328  }
2329};
2330} // end anonymous namespace
2331
2332namespace {
2333class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
2334public:
2335  DarwinX86_64TargetInfo(const std::string& triple)
2336      : DarwinTargetInfo<X86_64TargetInfo>(triple) {
2337    Int64Type = SignedLongLong;
2338  }
2339};
2340} // end anonymous namespace
2341
2342namespace {
2343class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
2344public:
2345  OpenBSDX86_64TargetInfo(const std::string& triple)
2346      : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
2347    IntMaxType = SignedLongLong;
2348    UIntMaxType = UnsignedLongLong;
2349    Int64Type = SignedLongLong;
2350  }
2351};
2352} // end anonymous namespace
2353
2354namespace {
2355class ARMTargetInfo : public TargetInfo {
2356  // Possible FPU choices.
2357  enum FPUMode {
2358    NoFPU,
2359    VFP2FPU,
2360    VFP3FPU,
2361    NeonFPU
2362  };
2363
2364  static bool FPUModeIsVFP(FPUMode Mode) {
2365    return Mode >= VFP2FPU && Mode <= NeonFPU;
2366  }
2367
2368  static const TargetInfo::GCCRegAlias GCCRegAliases[];
2369  static const char * const GCCRegNames[];
2370
2371  std::string ABI, CPU;
2372
2373  unsigned FPU : 3;
2374
2375  unsigned IsThumb : 1;
2376
2377  // Initialized via features.
2378  unsigned SoftFloat : 1;
2379  unsigned SoftFloatABI : 1;
2380
2381  static const Builtin::Info BuiltinInfo[];
2382
2383public:
2384  ARMTargetInfo(const std::string &TripleStr)
2385    : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
2386  {
2387    SizeType = UnsignedInt;
2388    PtrDiffType = SignedInt;
2389
2390    // {} in inline assembly are neon specifiers, not assembly variant
2391    // specifiers.
2392    NoAsmVariants = true;
2393
2394    // FIXME: Should we just treat this as a feature?
2395    IsThumb = getTriple().getArchName().startswith("thumb");
2396    if (IsThumb) {
2397      // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2398      // so set preferred for small types to 32.
2399      DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2400                           "i64:64:64-f32:32:32-f64:64:64-"
2401                           "v64:64:64-v128:64:128-a0:0:32-n32-S64");
2402    } else {
2403      DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2404                           "i64:64:64-f32:32:32-f64:64:64-"
2405                           "v64:64:64-v128:64:128-a0:0:64-n32-S64");
2406    }
2407
2408    // ARM targets default to using the ARM C++ ABI.
2409    CXXABI = CXXABI_ARM;
2410
2411    // ARM has atomics up to 8 bytes
2412    // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
2413    MaxAtomicPromoteWidth = 64;
2414  }
2415  virtual const char *getABI() const { return ABI.c_str(); }
2416  virtual bool setABI(const std::string &Name) {
2417    ABI = Name;
2418
2419    // The defaults (above) are for AAPCS, check if we need to change them.
2420    //
2421    // FIXME: We need support for -meabi... we could just mangle it into the
2422    // name.
2423    if (Name == "apcs-gnu") {
2424      DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
2425      SizeType = UnsignedLong;
2426
2427      // Do not respect the alignment of bit-field types when laying out
2428      // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
2429      UseBitFieldTypeAlignment = false;
2430
2431      /// Do force alignment of members that follow zero length bitfields.  If
2432      /// the alignment of the zero-length bitfield is greater than the member
2433      /// that follows it, `bar', `bar' will be aligned as the  type of the
2434      /// zero length bitfield.
2435      UseZeroLengthBitfieldAlignment = true;
2436
2437      /// gcc forces the alignment to 4 bytes, regardless of the type of the
2438      /// zero length bitfield.  This corresponds to EMPTY_FIELD_BOUNDARY in
2439      /// gcc.
2440      ZeroLengthBitfieldBoundary = 32;
2441
2442      if (IsThumb) {
2443        // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2444        // so set preferred for small types to 32.
2445        DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2446                             "i64:32:64-f32:32:32-f64:32:64-"
2447                             "v64:32:64-v128:32:128-a0:0:32-n32-S32");
2448      } else {
2449        DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2450                             "i64:32:64-f32:32:32-f64:32:64-"
2451                             "v64:32:64-v128:32:128-a0:0:32-n32-S32");
2452      }
2453
2454      // FIXME: Override "preferred align" for double and long long.
2455    } else if (Name == "aapcs") {
2456      // FIXME: Enumerated types are variable width in straight AAPCS.
2457    } else if (Name == "aapcs-linux") {
2458      ;
2459    } else
2460      return false;
2461
2462    return true;
2463  }
2464
2465  void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
2466    if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
2467      Features["vfp2"] = true;
2468    else if (CPU == "cortex-a8" || CPU == "cortex-a9")
2469      Features["neon"] = true;
2470  }
2471
2472  virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2473                                 const std::string &Name,
2474                                 bool Enabled) const {
2475    if (Name == "soft-float" || Name == "soft-float-abi" ||
2476        Name == "vfp2" || Name == "vfp3" || Name == "neon" ||
2477        Name == "long64") {
2478      Features[Name] = Enabled;
2479    } else
2480      return false;
2481
2482    return true;
2483  }
2484
2485  virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2486    FPU = NoFPU;
2487    SoftFloat = SoftFloatABI = false;
2488    for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2489      if (Features[i] == "+soft-float")
2490        SoftFloat = true;
2491      else if (Features[i] == "+soft-float-abi")
2492        SoftFloatABI = true;
2493      else if (Features[i] == "+vfp2")
2494        FPU = VFP2FPU;
2495      else if (Features[i] == "+vfp3")
2496        FPU = VFP3FPU;
2497      else if (Features[i] == "+neon")
2498        FPU = NeonFPU;
2499      else if (Features[i] == "+long64")
2500        LongWidth = LongAlign = 64;  // RenderScript uses a 64-bit long type
2501    }
2502
2503    // Remove front-end specific options which the backend handles differently.
2504    std::vector<std::string>::iterator it;
2505    it = std::find(Features.begin(), Features.end(), "+soft-float");
2506    if (it != Features.end())
2507      Features.erase(it);
2508    it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2509    if (it != Features.end())
2510      Features.erase(it);
2511  }
2512
2513  static const char *getCPUDefineSuffix(StringRef Name) {
2514    return llvm::StringSwitch<const char*>(Name)
2515      .Cases("arm8", "arm810", "4")
2516      .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2517      .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2518      .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2519      .Case("ep9312", "4T")
2520      .Cases("arm10tdmi", "arm1020t", "5T")
2521      .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2522      .Case("arm926ej-s", "5TEJ")
2523      .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2524      .Cases("xscale", "iwmmxt", "5TE")
2525      .Case("arm1136j-s", "6J")
2526      .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
2527      .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
2528      .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2529      .Cases("cortex-a8", "cortex-a9", "7A")
2530      .Case("cortex-m3", "7M")
2531      .Case("cortex-m0", "6M")
2532      .Default(0);
2533  }
2534  virtual bool setCPU(const std::string &Name) {
2535    if (!getCPUDefineSuffix(Name))
2536      return false;
2537
2538    CPU = Name;
2539    return true;
2540  }
2541  virtual void getTargetDefines(const LangOptions &Opts,
2542                                MacroBuilder &Builder) const {
2543    // Target identification.
2544    Builder.defineMacro("__arm");
2545    Builder.defineMacro("__arm__");
2546
2547    // Target properties.
2548    Builder.defineMacro("__ARMEL__");
2549    Builder.defineMacro("__LITTLE_ENDIAN__");
2550    Builder.defineMacro("__REGISTER_PREFIX__", "");
2551
2552    StringRef CPUArch = getCPUDefineSuffix(CPU);
2553    Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
2554
2555    // Subtarget options.
2556
2557    // FIXME: It's more complicated than this and we don't really support
2558    // interworking.
2559    if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
2560      Builder.defineMacro("__THUMB_INTERWORK__");
2561
2562    if (ABI == "aapcs" || ABI == "aapcs-linux")
2563      Builder.defineMacro("__ARM_EABI__");
2564
2565    if (SoftFloat)
2566      Builder.defineMacro("__SOFTFP__");
2567
2568    if (CPU == "xscale")
2569      Builder.defineMacro("__XSCALE__");
2570
2571    bool IsARMv7 = CPUArch.startswith("7");
2572    if (IsThumb) {
2573      Builder.defineMacro("__THUMBEL__");
2574      Builder.defineMacro("__thumb__");
2575      if (CPUArch == "6T2" || IsARMv7)
2576        Builder.defineMacro("__thumb2__");
2577    }
2578
2579    // Note, this is always on in gcc, even though it doesn't make sense.
2580    Builder.defineMacro("__APCS_32__");
2581
2582    if (FPUModeIsVFP((FPUMode) FPU))
2583      Builder.defineMacro("__VFP_FP__");
2584
2585    // This only gets set when Neon instructions are actually available, unlike
2586    // the VFP define, hence the soft float and arch check. This is subtly
2587    // different from gcc, we follow the intent which was that it should be set
2588    // when Neon instructions are actually available.
2589    if (FPU == NeonFPU && !SoftFloat && IsARMv7)
2590      Builder.defineMacro("__ARM_NEON__");
2591  }
2592  virtual void getTargetBuiltins(const Builtin::Info *&Records,
2593                                 unsigned &NumRecords) const {
2594    Records = BuiltinInfo;
2595    NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
2596  }
2597  virtual const char *getVAListDeclaration() const {
2598    return "typedef void* __builtin_va_list;";
2599  }
2600  virtual void getGCCRegNames(const char * const *&Names,
2601                              unsigned &NumNames) const;
2602  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2603                                unsigned &NumAliases) const;
2604  virtual bool validateAsmConstraint(const char *&Name,
2605                                     TargetInfo::ConstraintInfo &Info) const {
2606    // FIXME: Check if this is complete
2607    switch (*Name) {
2608    default:
2609    case 'l': // r0-r7
2610    case 'h': // r8-r15
2611    case 'w': // VFP Floating point register single precision
2612    case 'P': // VFP Floating point register double precision
2613      Info.setAllowsRegister();
2614      return true;
2615    case 'Q': // A memory address that is a single base register.
2616      Info.setAllowsMemory();
2617      return true;
2618    case 'U': // a memory reference...
2619      switch (Name[1]) {
2620      case 'q': // ...ARMV4 ldrsb
2621      case 'v': // ...VFP load/store (reg+constant offset)
2622      case 'y': // ...iWMMXt load/store
2623      case 't': // address valid for load/store opaque types wider
2624	        // than 128-bits
2625      case 'n': // valid address for Neon doubleword vector load/store
2626      case 'm': // valid address for Neon element and structure load/store
2627      case 's': // valid address for non-offset loads/stores of quad-word
2628	        // values in four ARM registers
2629        Info.setAllowsMemory();
2630        Name++;
2631        return true;
2632      }
2633    }
2634    return false;
2635  }
2636  virtual std::string convertConstraint(const char *&Constraint) const {
2637    std::string R;
2638    switch (*Constraint) {
2639    case 'U':   // Two-character constraint; add "^" hint for later parsing.
2640      R = std::string("^") + std::string(Constraint, 2);
2641      Constraint++;
2642      break;
2643    case 'p': // 'p' should be translated to 'r' by default.
2644      R = std::string("r");
2645      break;
2646    default:
2647      return std::string(1, *Constraint);
2648    }
2649    return R;
2650  }
2651  virtual const char *getClobbers() const {
2652    // FIXME: Is this really right?
2653    return "";
2654  }
2655};
2656
2657const char * const ARMTargetInfo::GCCRegNames[] = {
2658  // Integer registers
2659  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2660  "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2661
2662  // Float registers
2663  "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2664  "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2665  "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2666  "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2667
2668  // Double registers
2669  "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2670  "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
2671  "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2672  "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
2673
2674  // Quad registers
2675  "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2676  "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
2677};
2678
2679void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
2680                                   unsigned &NumNames) const {
2681  Names = GCCRegNames;
2682  NumNames = llvm::array_lengthof(GCCRegNames);
2683}
2684
2685const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
2686  { { "a1" }, "r0" },
2687  { { "a2" }, "r1" },
2688  { { "a3" }, "r2" },
2689  { { "a4" }, "r3" },
2690  { { "v1" }, "r4" },
2691  { { "v2" }, "r5" },
2692  { { "v3" }, "r6" },
2693  { { "v4" }, "r7" },
2694  { { "v5" }, "r8" },
2695  { { "v6", "rfp" }, "r9" },
2696  { { "sl" }, "r10" },
2697  { { "fp" }, "r11" },
2698  { { "ip" }, "r12" },
2699  { { "r13" }, "sp" },
2700  { { "r14" }, "lr" },
2701  { { "r15" }, "pc" },
2702  // The S, D and Q registers overlap, but aren't really aliases; we
2703  // don't want to substitute one of these for a different-sized one.
2704};
2705
2706void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2707                                       unsigned &NumAliases) const {
2708  Aliases = GCCRegAliases;
2709  NumAliases = llvm::array_lengthof(GCCRegAliases);
2710}
2711
2712const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
2713#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
2714#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
2715                                              ALL_LANGUAGES },
2716#include "clang/Basic/BuiltinsARM.def"
2717};
2718} // end anonymous namespace.
2719
2720
2721namespace {
2722class DarwinARMTargetInfo :
2723  public DarwinTargetInfo<ARMTargetInfo> {
2724protected:
2725  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2726                            MacroBuilder &Builder) const {
2727    getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
2728  }
2729
2730public:
2731  DarwinARMTargetInfo(const std::string& triple)
2732    : DarwinTargetInfo<ARMTargetInfo>(triple) {
2733    HasAlignMac68kSupport = true;
2734    // iOS always has 64-bit atomic instructions.
2735    // FIXME: This should be based off of the target features in ARMTargetInfo.
2736    MaxAtomicInlineWidth = 64;
2737  }
2738};
2739} // end anonymous namespace.
2740
2741namespace {
2742class SparcV8TargetInfo : public TargetInfo {
2743  static const TargetInfo::GCCRegAlias GCCRegAliases[];
2744  static const char * const GCCRegNames[];
2745  bool SoftFloat;
2746public:
2747  SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2748    // FIXME: Support Sparc quad-precision long double?
2749    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2750                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
2751  }
2752  virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2753                                 const std::string &Name,
2754                                 bool Enabled) const {
2755    if (Name == "soft-float")
2756      Features[Name] = Enabled;
2757    else
2758      return false;
2759
2760    return true;
2761  }
2762  virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2763    SoftFloat = false;
2764    for (unsigned i = 0, e = Features.size(); i != e; ++i)
2765      if (Features[i] == "+soft-float")
2766        SoftFloat = true;
2767  }
2768  virtual void getTargetDefines(const LangOptions &Opts,
2769                                MacroBuilder &Builder) const {
2770    DefineStd(Builder, "sparc", Opts);
2771    Builder.defineMacro("__sparcv8");
2772    Builder.defineMacro("__REGISTER_PREFIX__", "");
2773
2774    if (SoftFloat)
2775      Builder.defineMacro("SOFT_FLOAT", "1");
2776  }
2777  virtual void getTargetBuiltins(const Builtin::Info *&Records,
2778                                 unsigned &NumRecords) const {
2779    // FIXME: Implement!
2780  }
2781  virtual const char *getVAListDeclaration() const {
2782    return "typedef void* __builtin_va_list;";
2783  }
2784  virtual void getGCCRegNames(const char * const *&Names,
2785                              unsigned &NumNames) const;
2786  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2787                                unsigned &NumAliases) const;
2788  virtual bool validateAsmConstraint(const char *&Name,
2789                                     TargetInfo::ConstraintInfo &info) const {
2790    // FIXME: Implement!
2791    return false;
2792  }
2793  virtual const char *getClobbers() const {
2794    // FIXME: Implement!
2795    return "";
2796  }
2797};
2798
2799const char * const SparcV8TargetInfo::GCCRegNames[] = {
2800  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2801  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2802  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2803  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2804};
2805
2806void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
2807                                       unsigned &NumNames) const {
2808  Names = GCCRegNames;
2809  NumNames = llvm::array_lengthof(GCCRegNames);
2810}
2811
2812const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
2813  { { "g0" }, "r0" },
2814  { { "g1" }, "r1" },
2815  { { "g2" }, "r2" },
2816  { { "g3" }, "r3" },
2817  { { "g4" }, "r4" },
2818  { { "g5" }, "r5" },
2819  { { "g6" }, "r6" },
2820  { { "g7" }, "r7" },
2821  { { "o0" }, "r8" },
2822  { { "o1" }, "r9" },
2823  { { "o2" }, "r10" },
2824  { { "o3" }, "r11" },
2825  { { "o4" }, "r12" },
2826  { { "o5" }, "r13" },
2827  { { "o6", "sp" }, "r14" },
2828  { { "o7" }, "r15" },
2829  { { "l0" }, "r16" },
2830  { { "l1" }, "r17" },
2831  { { "l2" }, "r18" },
2832  { { "l3" }, "r19" },
2833  { { "l4" }, "r20" },
2834  { { "l5" }, "r21" },
2835  { { "l6" }, "r22" },
2836  { { "l7" }, "r23" },
2837  { { "i0" }, "r24" },
2838  { { "i1" }, "r25" },
2839  { { "i2" }, "r26" },
2840  { { "i3" }, "r27" },
2841  { { "i4" }, "r28" },
2842  { { "i5" }, "r29" },
2843  { { "i6", "fp" }, "r30" },
2844  { { "i7" }, "r31" },
2845};
2846
2847void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2848                                         unsigned &NumAliases) const {
2849  Aliases = GCCRegAliases;
2850  NumAliases = llvm::array_lengthof(GCCRegAliases);
2851}
2852} // end anonymous namespace.
2853
2854namespace {
2855class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2856public:
2857  AuroraUXSparcV8TargetInfo(const std::string& triple) :
2858      AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2859    SizeType = UnsignedInt;
2860    PtrDiffType = SignedInt;
2861  }
2862};
2863class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
2864public:
2865  SolarisSparcV8TargetInfo(const std::string& triple) :
2866      SolarisTargetInfo<SparcV8TargetInfo>(triple) {
2867    SizeType = UnsignedInt;
2868    PtrDiffType = SignedInt;
2869  }
2870};
2871} // end anonymous namespace.
2872
2873namespace {
2874  class MSP430TargetInfo : public TargetInfo {
2875    static const char * const GCCRegNames[];
2876  public:
2877    MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2878      TLSSupported = false;
2879      IntWidth = 16; IntAlign = 16;
2880      LongWidth = 32; LongLongWidth = 64;
2881      LongAlign = LongLongAlign = 16;
2882      PointerWidth = 16; PointerAlign = 16;
2883      SizeType = UnsignedInt;
2884      IntMaxType = SignedLong;
2885      UIntMaxType = UnsignedLong;
2886      IntPtrType = SignedShort;
2887      PtrDiffType = SignedInt;
2888      SigAtomicType = SignedLong;
2889      DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
2890   }
2891    virtual void getTargetDefines(const LangOptions &Opts,
2892                                  MacroBuilder &Builder) const {
2893      Builder.defineMacro("MSP430");
2894      Builder.defineMacro("__MSP430__");
2895      // FIXME: defines for different 'flavours' of MCU
2896    }
2897    virtual void getTargetBuiltins(const Builtin::Info *&Records,
2898                                   unsigned &NumRecords) const {
2899     // FIXME: Implement.
2900      Records = 0;
2901      NumRecords = 0;
2902    }
2903    virtual void getGCCRegNames(const char * const *&Names,
2904                                unsigned &NumNames) const;
2905    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2906                                  unsigned &NumAliases) const {
2907      // No aliases.
2908      Aliases = 0;
2909      NumAliases = 0;
2910    }
2911    virtual bool validateAsmConstraint(const char *&Name,
2912                                       TargetInfo::ConstraintInfo &info) const {
2913      // No target constraints for now.
2914      return false;
2915    }
2916    virtual const char *getClobbers() const {
2917      // FIXME: Is this really right?
2918      return "";
2919    }
2920    virtual const char *getVAListDeclaration() const {
2921      // FIXME: implement
2922      return "typedef char* __builtin_va_list;";
2923   }
2924  };
2925
2926  const char * const MSP430TargetInfo::GCCRegNames[] = {
2927    "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2928    "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2929  };
2930
2931  void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2932                                        unsigned &NumNames) const {
2933    Names = GCCRegNames;
2934    NumNames = llvm::array_lengthof(GCCRegNames);
2935  }
2936}
2937
2938
2939namespace {
2940  class SystemZTargetInfo : public TargetInfo {
2941    static const char * const GCCRegNames[];
2942  public:
2943    SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2944      TLSSupported = false;
2945      IntWidth = IntAlign = 32;
2946      LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2947      PointerWidth = PointerAlign = 64;
2948      DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2949      "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
2950   }
2951    virtual void getTargetDefines(const LangOptions &Opts,
2952                                  MacroBuilder &Builder) const {
2953      Builder.defineMacro("__s390__");
2954      Builder.defineMacro("__s390x__");
2955    }
2956    virtual void getTargetBuiltins(const Builtin::Info *&Records,
2957                                   unsigned &NumRecords) const {
2958      // FIXME: Implement.
2959      Records = 0;
2960      NumRecords = 0;
2961    }
2962
2963    virtual void getGCCRegNames(const char * const *&Names,
2964                                unsigned &NumNames) const;
2965    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2966                                  unsigned &NumAliases) const {
2967      // No aliases.
2968      Aliases = 0;
2969      NumAliases = 0;
2970    }
2971    virtual bool validateAsmConstraint(const char *&Name,
2972                                       TargetInfo::ConstraintInfo &info) const {
2973      // FIXME: implement
2974      return true;
2975    }
2976    virtual const char *getClobbers() const {
2977      // FIXME: Is this really right?
2978      return "";
2979    }
2980    virtual const char *getVAListDeclaration() const {
2981      // FIXME: implement
2982      return "typedef char* __builtin_va_list;";
2983   }
2984  };
2985
2986  const char * const SystemZTargetInfo::GCCRegNames[] = {
2987    "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2988    "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2989  };
2990
2991  void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2992                                         unsigned &NumNames) const {
2993    Names = GCCRegNames;
2994    NumNames = llvm::array_lengthof(GCCRegNames);
2995  }
2996}
2997
2998namespace {
2999  class BlackfinTargetInfo : public TargetInfo {
3000    static const char * const GCCRegNames[];
3001  public:
3002    BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
3003      TLSSupported = false;
3004      DoubleAlign = 32;
3005      LongLongAlign = 32;
3006      LongDoubleAlign = 32;
3007      DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
3008    }
3009
3010    virtual void getTargetDefines(const LangOptions &Opts,
3011                                  MacroBuilder &Builder) const {
3012      DefineStd(Builder, "bfin", Opts);
3013      DefineStd(Builder, "BFIN", Opts);
3014      Builder.defineMacro("__ADSPBLACKFIN__");
3015      // FIXME: This one is really dependent on -mcpu
3016      Builder.defineMacro("__ADSPLPBLACKFIN__");
3017      // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
3018    }
3019
3020    virtual void getTargetBuiltins(const Builtin::Info *&Records,
3021                                   unsigned &NumRecords) const {
3022      // FIXME: Implement.
3023      Records = 0;
3024      NumRecords = 0;
3025    }
3026
3027    virtual void getGCCRegNames(const char * const *&Names,
3028                                unsigned &NumNames) const;
3029
3030    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3031                                  unsigned &NumAliases) const {
3032      // No aliases.
3033      Aliases = 0;
3034      NumAliases = 0;
3035    }
3036
3037    virtual bool validateAsmConstraint(const char *&Name,
3038                                       TargetInfo::ConstraintInfo &Info) const {
3039      if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
3040        Info.setAllowsRegister();
3041        return true;
3042      }
3043      return false;
3044    }
3045
3046    virtual const char *getClobbers() const {
3047      return "";
3048    }
3049
3050    virtual const char *getVAListDeclaration() const {
3051      return "typedef char* __builtin_va_list;";
3052    }
3053  };
3054
3055  const char * const BlackfinTargetInfo::GCCRegNames[] = {
3056    "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3057    "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
3058    "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
3059    "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
3060    "a0", "a1", "cc",
3061    "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
3062    "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
3063  };
3064
3065  void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
3066                                          unsigned &NumNames) const {
3067    Names = GCCRegNames;
3068    NumNames = llvm::array_lengthof(GCCRegNames);
3069  }
3070}
3071
3072namespace {
3073
3074  // LLVM and Clang cannot be used directly to output native binaries for
3075  // target, but is used to compile C code to llvm bitcode with correct
3076  // type and alignment information.
3077  //
3078  // TCE uses the llvm bitcode as input and uses it for generating customized
3079  // target processor and program binary. TCE co-design environment is
3080  // publicly available in http://tce.cs.tut.fi
3081
3082  static const unsigned TCEOpenCLAddrSpaceMap[] = {
3083      3, // opencl_global
3084      4, // opencl_local
3085      5  // opencl_constant
3086  };
3087
3088  class TCETargetInfo : public TargetInfo{
3089  public:
3090    TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
3091      TLSSupported = false;
3092      IntWidth = 32;
3093      LongWidth = LongLongWidth = 32;
3094      PointerWidth = 32;
3095      IntAlign = 32;
3096      LongAlign = LongLongAlign = 32;
3097      PointerAlign = 32;
3098      SizeType = UnsignedInt;
3099      IntMaxType = SignedLong;
3100      UIntMaxType = UnsignedLong;
3101      IntPtrType = SignedInt;
3102      PtrDiffType = SignedInt;
3103      FloatWidth = 32;
3104      FloatAlign = 32;
3105      DoubleWidth = 32;
3106      DoubleAlign = 32;
3107      LongDoubleWidth = 32;
3108      LongDoubleAlign = 32;
3109      FloatFormat = &llvm::APFloat::IEEEsingle;
3110      DoubleFormat = &llvm::APFloat::IEEEsingle;
3111      LongDoubleFormat = &llvm::APFloat::IEEEsingle;
3112      DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
3113                          "i16:16:32-i32:32:32-i64:32:32-"
3114                          "f32:32:32-f64:32:32-v64:32:32-"
3115                          "v128:32:32-a0:0:32-n32";
3116      AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
3117    }
3118
3119    virtual void getTargetDefines(const LangOptions &Opts,
3120                                  MacroBuilder &Builder) const {
3121      DefineStd(Builder, "tce", Opts);
3122      Builder.defineMacro("__TCE__");
3123      Builder.defineMacro("__TCE_V1__");
3124    }
3125    virtual void getTargetBuiltins(const Builtin::Info *&Records,
3126                                   unsigned &NumRecords) const {}
3127    virtual const char *getClobbers() const {
3128      return "";
3129    }
3130    virtual const char *getVAListDeclaration() const {
3131      return "typedef void* __builtin_va_list;";
3132    }
3133    virtual void getGCCRegNames(const char * const *&Names,
3134                                unsigned &NumNames) const {}
3135    virtual bool validateAsmConstraint(const char *&Name,
3136                                       TargetInfo::ConstraintInfo &info) const {
3137      return true;
3138    }
3139    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3140                                  unsigned &NumAliases) const {}
3141  };
3142}
3143
3144namespace {
3145class MipsTargetInfoBase : public TargetInfo {
3146  std::string CPU;
3147protected:
3148  std::string ABI;
3149public:
3150  MipsTargetInfoBase(const std::string& triple, const std::string& ABIStr)
3151    : TargetInfo(triple), ABI(ABIStr) {
3152    SizeType = UnsignedInt;
3153    PtrDiffType = SignedInt;
3154  }
3155  virtual const char *getABI() const { return ABI.c_str(); }
3156  virtual bool setABI(const std::string &Name) = 0;
3157  virtual bool setCPU(const std::string &Name) {
3158    CPU = Name;
3159    return true;
3160  }
3161  void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
3162    Features[ABI] = true;
3163    Features[CPU] = true;
3164  }
3165  virtual void getArchDefines(const LangOptions &Opts,
3166                              MacroBuilder &Builder) const = 0;
3167  virtual void getTargetDefines(const LangOptions &Opts,
3168                                MacroBuilder &Builder) const = 0;
3169  virtual void getTargetBuiltins(const Builtin::Info *&Records,
3170                                 unsigned &NumRecords) const {
3171    // FIXME: Implement!
3172  }
3173  virtual const char *getVAListDeclaration() const {
3174    return "typedef void* __builtin_va_list;";
3175  }
3176  virtual void getGCCRegNames(const char * const *&Names,
3177                              unsigned &NumNames) const {
3178    static const char * const GCCRegNames[] = {
3179      "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
3180      "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
3181      "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
3182      "$24",  "$25",  "$26",  "$27",  "$28",  "$sp",  "$fp",  "$31",
3183      "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
3184      "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
3185      "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
3186      "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
3187      "hi",   "lo",   "",     "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
3188      "$fcc5","$fcc6","$fcc7"
3189    };
3190    Names = GCCRegNames;
3191    NumNames = llvm::array_lengthof(GCCRegNames);
3192  }
3193  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3194                                unsigned &NumAliases) const = 0;
3195  virtual bool validateAsmConstraint(const char *&Name,
3196                                     TargetInfo::ConstraintInfo &Info) const {
3197    switch (*Name) {
3198    default:
3199    case 'r': // CPU registers.
3200    case 'd': // Equivalent to "r" unless generating MIPS16 code.
3201    case 'y': // Equivalent to "r", backwards compatibility only.
3202    case 'f': // floating-point registers.
3203      Info.setAllowsRegister();
3204      return true;
3205    }
3206    return false;
3207  }
3208
3209  virtual const char *getClobbers() const {
3210    // FIXME: Implement!
3211    return "";
3212  }
3213};
3214
3215class Mips32TargetInfoBase : public MipsTargetInfoBase {
3216public:
3217  Mips32TargetInfoBase(const std::string& triple) :
3218    MipsTargetInfoBase(triple, "o32") {}
3219  virtual bool setABI(const std::string &Name) {
3220    if ((Name == "o32") || (Name == "eabi")) {
3221      ABI = Name;
3222      return true;
3223    } else
3224      return false;
3225  }
3226  virtual void getArchDefines(const LangOptions &Opts,
3227                              MacroBuilder &Builder) const {
3228    if (ABI == "o32") {
3229      Builder.defineMacro("__mips_o32");
3230      Builder.defineMacro("_ABIO32", "1");
3231      Builder.defineMacro("_MIPS_SIM", "_ABIO32");
3232    }
3233    else if (ABI == "eabi")
3234      Builder.defineMacro("__mips_eabi");
3235    else
3236      llvm_unreachable("Invalid ABI for Mips32.");
3237  }
3238  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3239                                unsigned &NumAliases) const {
3240    static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3241      { { "at" },  "$1" },
3242      { { "v0" },  "$2" },
3243      { { "v1" },  "$3" },
3244      { { "a0" },  "$4" },
3245      { { "a1" },  "$5" },
3246      { { "a2" },  "$6" },
3247      { { "a3" },  "$7" },
3248      { { "t0" },  "$8" },
3249      { { "t1" },  "$9" },
3250      { { "t2" }, "$10" },
3251      { { "t3" }, "$11" },
3252      { { "t4" }, "$12" },
3253      { { "t5" }, "$13" },
3254      { { "t6" }, "$14" },
3255      { { "t7" }, "$15" },
3256      { { "s0" }, "$16" },
3257      { { "s1" }, "$17" },
3258      { { "s2" }, "$18" },
3259      { { "s3" }, "$19" },
3260      { { "s4" }, "$20" },
3261      { { "s5" }, "$21" },
3262      { { "s6" }, "$22" },
3263      { { "s7" }, "$23" },
3264      { { "t8" }, "$24" },
3265      { { "t9" }, "$25" },
3266      { { "k0" }, "$26" },
3267      { { "k1" }, "$27" },
3268      { { "gp" }, "$28" },
3269      { { "sp" }, "$29" },
3270      { { "fp" }, "$30" },
3271      { { "ra" }, "$31" }
3272    };
3273    Aliases = GCCRegAliases;
3274    NumAliases = llvm::array_lengthof(GCCRegAliases);
3275  }
3276};
3277
3278class Mips32EBTargetInfo : public Mips32TargetInfoBase {
3279public:
3280  Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3281    DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3282                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3283  }
3284  virtual void getTargetDefines(const LangOptions &Opts,
3285                                MacroBuilder &Builder) const {
3286    DefineStd(Builder, "mips", Opts);
3287    Builder.defineMacro("_mips");
3288    DefineStd(Builder, "MIPSEB", Opts);
3289    Builder.defineMacro("_MIPSEB");
3290    Builder.defineMacro("__REGISTER_PREFIX__", "");
3291    getArchDefines(Opts, Builder);
3292  }
3293};
3294
3295class Mips32ELTargetInfo : public Mips32TargetInfoBase {
3296public:
3297  Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3298    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3299                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3300  }
3301  virtual void getTargetDefines(const LangOptions &Opts,
3302                                MacroBuilder &Builder) const {
3303    DefineStd(Builder, "mips", Opts);
3304    Builder.defineMacro("_mips");
3305    DefineStd(Builder, "MIPSEL", Opts);
3306    Builder.defineMacro("_MIPSEL");
3307    Builder.defineMacro("__REGISTER_PREFIX__", "");
3308    getArchDefines(Opts, Builder);
3309  }
3310};
3311
3312class Mips64TargetInfoBase : public MipsTargetInfoBase {
3313  virtual void SetDescriptionString(const std::string &Name) = 0;
3314public:
3315  Mips64TargetInfoBase(const std::string& triple) :
3316    MipsTargetInfoBase(triple, "n64") {}
3317  virtual bool setABI(const std::string &Name) {
3318    SetDescriptionString(Name);
3319    if ((Name == "n32") || (Name == "n64")) {
3320      ABI = Name;
3321      return true;
3322    } else
3323      return false;
3324  }
3325  virtual void getArchDefines(const LangOptions &Opts,
3326                              MacroBuilder &Builder) const {
3327    if (ABI == "n32") {
3328      Builder.defineMacro("__mips_n32");
3329      Builder.defineMacro("_ABIN32", "2");
3330      Builder.defineMacro("_MIPS_SIM", "_ABIN32");
3331    }
3332    else if (ABI == "n64") {
3333      Builder.defineMacro("__mips_n64");
3334      Builder.defineMacro("_ABI64", "3");
3335      Builder.defineMacro("_MIPS_SIM", "_ABI64");
3336    }
3337    else
3338      llvm_unreachable("Invalid ABI for Mips64.");
3339  }
3340  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3341                                unsigned &NumAliases) const {
3342    static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3343      { { "at" },  "$1" },
3344      { { "v0" },  "$2" },
3345      { { "v1" },  "$3" },
3346      { { "a0" },  "$4" },
3347      { { "a1" },  "$5" },
3348      { { "a2" },  "$6" },
3349      { { "a3" },  "$7" },
3350      { { "a4" },  "$8" },
3351      { { "a5" },  "$9" },
3352      { { "a6" }, "$10" },
3353      { { "a7" }, "$11" },
3354      { { "t0" }, "$12" },
3355      { { "t1" }, "$13" },
3356      { { "t2" }, "$14" },
3357      { { "t3" }, "$15" },
3358      { { "s0" }, "$16" },
3359      { { "s1" }, "$17" },
3360      { { "s2" }, "$18" },
3361      { { "s3" }, "$19" },
3362      { { "s4" }, "$20" },
3363      { { "s5" }, "$21" },
3364      { { "s6" }, "$22" },
3365      { { "s7" }, "$23" },
3366      { { "t8" }, "$24" },
3367      { { "t9" }, "$25" },
3368      { { "k0" }, "$26" },
3369      { { "k1" }, "$27" },
3370      { { "gp" }, "$28" },
3371      { { "sp" }, "$29" },
3372      { { "fp" }, "$30" },
3373      { { "ra" }, "$31" }
3374    };
3375    Aliases = GCCRegAliases;
3376    NumAliases = llvm::array_lengthof(GCCRegAliases);
3377  }
3378};
3379
3380class Mips64EBTargetInfo : public Mips64TargetInfoBase {
3381  virtual void SetDescriptionString(const std::string &Name) {
3382    // Change DescriptionString only if ABI is n32.
3383    if (Name == "n32")
3384      DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3385                          "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3386  }
3387public:
3388  Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
3389    // Default ABI is n64.
3390    DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3391                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3392  }
3393  virtual void getTargetDefines(const LangOptions &Opts,
3394                                MacroBuilder &Builder) const {
3395    DefineStd(Builder, "mips", Opts);
3396    Builder.defineMacro("_mips");
3397    DefineStd(Builder, "MIPSEB", Opts);
3398    Builder.defineMacro("_MIPSEB");
3399    Builder.defineMacro("__REGISTER_PREFIX__", "");
3400    getArchDefines(Opts, Builder);
3401  }
3402};
3403
3404class Mips64ELTargetInfo : public Mips64TargetInfoBase {
3405  virtual void SetDescriptionString(const std::string &Name) {
3406    // Change DescriptionString only if ABI is n32.
3407    if (Name == "n32")
3408      DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3409                          "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3410  }
3411public:
3412  Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
3413    // Default ABI is n64.
3414    DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3415                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3416  }
3417  virtual void getTargetDefines(const LangOptions &Opts,
3418                                MacroBuilder &Builder) const {
3419    DefineStd(Builder, "mips", Opts);
3420    Builder.defineMacro("_mips");
3421    DefineStd(Builder, "MIPSEL", Opts);
3422    Builder.defineMacro("_MIPSEL");
3423    Builder.defineMacro("__REGISTER_PREFIX__", "");
3424    getArchDefines(Opts, Builder);
3425  }
3426};
3427} // end anonymous namespace.
3428
3429namespace {
3430class PNaClTargetInfo : public TargetInfo {
3431public:
3432  PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
3433    this->UserLabelPrefix = "";
3434    this->LongAlign = 32;
3435    this->LongWidth = 32;
3436    this->PointerAlign = 32;
3437    this->PointerWidth = 32;
3438    this->IntMaxType = TargetInfo::SignedLongLong;
3439    this->UIntMaxType = TargetInfo::UnsignedLongLong;
3440    this->Int64Type = TargetInfo::SignedLongLong;
3441    this->DoubleAlign = 64;
3442    this->LongDoubleWidth = 64;
3443    this->LongDoubleAlign = 64;
3444    this->SizeType = TargetInfo::UnsignedInt;
3445    this->PtrDiffType = TargetInfo::SignedInt;
3446    this->IntPtrType = TargetInfo::SignedInt;
3447    this->RegParmMax = 2;
3448    DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
3449                        "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
3450  }
3451
3452  void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
3453  }
3454  virtual void getArchDefines(const LangOptions &Opts,
3455                              MacroBuilder &Builder) const {
3456    Builder.defineMacro("__le32__");
3457    Builder.defineMacro("__pnacl__");
3458  }
3459  virtual void getTargetDefines(const LangOptions &Opts,
3460                                MacroBuilder &Builder) const {
3461    DefineStd(Builder, "unix", Opts);
3462    Builder.defineMacro("__ELF__");
3463    if (Opts.POSIXThreads)
3464      Builder.defineMacro("_REENTRANT");
3465    if (Opts.CPlusPlus)
3466      Builder.defineMacro("_GNU_SOURCE");
3467
3468    Builder.defineMacro("__native_client__");
3469    getArchDefines(Opts, Builder);
3470  }
3471  virtual void getTargetBuiltins(const Builtin::Info *&Records,
3472                                 unsigned &NumRecords) const {
3473  }
3474  virtual const char *getVAListDeclaration() const {
3475    return "typedef int __builtin_va_list[4];";
3476  }
3477  virtual void getGCCRegNames(const char * const *&Names,
3478                              unsigned &NumNames) const;
3479  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3480                                unsigned &NumAliases) const;
3481  virtual bool validateAsmConstraint(const char *&Name,
3482                                     TargetInfo::ConstraintInfo &Info) const {
3483    return false;
3484  }
3485
3486  virtual const char *getClobbers() const {
3487    return "";
3488  }
3489};
3490
3491void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
3492                                     unsigned &NumNames) const {
3493  Names = NULL;
3494  NumNames = 0;
3495}
3496
3497void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3498                                       unsigned &NumAliases) const {
3499  Aliases = NULL;
3500  NumAliases = 0;
3501}
3502} // end anonymous namespace.
3503
3504
3505//===----------------------------------------------------------------------===//
3506// Driver code
3507//===----------------------------------------------------------------------===//
3508
3509static TargetInfo *AllocateTarget(const std::string &T) {
3510  llvm::Triple Triple(T);
3511  llvm::Triple::OSType os = Triple.getOS();
3512
3513  switch (Triple.getArch()) {
3514  default:
3515    return NULL;
3516
3517  case llvm::Triple::arm:
3518  case llvm::Triple::thumb:
3519    if (Triple.isOSDarwin())
3520      return new DarwinARMTargetInfo(T);
3521
3522    switch (os) {
3523    case llvm::Triple::Linux:
3524      return new LinuxTargetInfo<ARMTargetInfo>(T);
3525    case llvm::Triple::FreeBSD:
3526      return new FreeBSDTargetInfo<ARMTargetInfo>(T);
3527    case llvm::Triple::NetBSD:
3528      return new NetBSDTargetInfo<ARMTargetInfo>(T);
3529    case llvm::Triple::RTEMS:
3530      return new RTEMSTargetInfo<ARMTargetInfo>(T);
3531    default:
3532      return new ARMTargetInfo(T);
3533    }
3534
3535  case llvm::Triple::bfin:
3536    if ( os == llvm::Triple::RTEMS )
3537      return new RTEMSTargetInfo<BlackfinTargetInfo>(T);
3538    return new BlackfinTargetInfo(T);
3539
3540  case llvm::Triple::msp430:
3541    return new MSP430TargetInfo(T);
3542
3543  case llvm::Triple::mips:
3544    switch (os) {
3545    case llvm::Triple::Linux:
3546      return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
3547    case llvm::Triple::RTEMS:
3548      return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
3549    case llvm::Triple::FreeBSD:
3550      return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
3551    case llvm::Triple::NetBSD:
3552      return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
3553    default:
3554      return new Mips32EBTargetInfo(T);
3555    }
3556
3557  case llvm::Triple::mipsel:
3558    switch (os) {
3559    case llvm::Triple::Linux:
3560      return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
3561    case llvm::Triple::RTEMS:
3562      return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
3563    case llvm::Triple::FreeBSD:
3564      return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
3565    case llvm::Triple::NetBSD:
3566      return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
3567    default:
3568      return new Mips32ELTargetInfo(T);
3569    }
3570
3571  case llvm::Triple::mips64:
3572    switch (os) {
3573    case llvm::Triple::Linux:
3574      return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
3575    case llvm::Triple::RTEMS:
3576      return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
3577    case llvm::Triple::FreeBSD:
3578      return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
3579    case llvm::Triple::NetBSD:
3580      return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
3581    default:
3582      return new Mips64EBTargetInfo(T);
3583    }
3584
3585  case llvm::Triple::mips64el:
3586    switch (os) {
3587    case llvm::Triple::Linux:
3588      return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
3589    case llvm::Triple::RTEMS:
3590      return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
3591    case llvm::Triple::FreeBSD:
3592      return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
3593    case llvm::Triple::NetBSD:
3594      return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
3595    default:
3596      return new Mips64ELTargetInfo(T);
3597    }
3598
3599  case llvm::Triple::le32:
3600    switch (os) {
3601      case llvm::Triple::NativeClient:
3602        return new PNaClTargetInfo(T);
3603      default:
3604        return NULL;
3605    }
3606
3607  case llvm::Triple::ppc:
3608    if (Triple.isOSDarwin())
3609      return new DarwinPPC32TargetInfo(T);
3610    switch (os) {
3611    case llvm::Triple::Linux:
3612      return new LinuxTargetInfo<PPC32TargetInfo>(T);
3613    case llvm::Triple::FreeBSD:
3614      return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
3615    case llvm::Triple::NetBSD:
3616      return new NetBSDTargetInfo<PPC32TargetInfo>(T);
3617    case llvm::Triple::RTEMS:
3618      return new RTEMSTargetInfo<PPC32TargetInfo>(T);
3619    default:
3620      return new PPC32TargetInfo(T);
3621    }
3622
3623  case llvm::Triple::ppc64:
3624    if (Triple.isOSDarwin())
3625      return new DarwinPPC64TargetInfo(T);
3626    switch (os) {
3627    case llvm::Triple::Linux:
3628      return new LinuxTargetInfo<PPC64TargetInfo>(T);
3629    case llvm::Triple::Lv2:
3630      return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
3631    case llvm::Triple::FreeBSD:
3632      return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
3633    case llvm::Triple::NetBSD:
3634      return new NetBSDTargetInfo<PPC64TargetInfo>(T);
3635    default:
3636      return new PPC64TargetInfo(T);
3637    }
3638
3639  case llvm::Triple::ptx32:
3640    return new PTX32TargetInfo(T);
3641  case llvm::Triple::ptx64:
3642    return new PTX64TargetInfo(T);
3643
3644  case llvm::Triple::mblaze:
3645    return new MBlazeTargetInfo(T);
3646
3647  case llvm::Triple::sparc:
3648    switch (os) {
3649    case llvm::Triple::Linux:
3650      return new LinuxTargetInfo<SparcV8TargetInfo>(T);
3651    case llvm::Triple::AuroraUX:
3652      return new AuroraUXSparcV8TargetInfo(T);
3653    case llvm::Triple::Solaris:
3654      return new SolarisSparcV8TargetInfo(T);
3655    case llvm::Triple::NetBSD:
3656      return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
3657    case llvm::Triple::RTEMS:
3658      return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
3659    default:
3660      return new SparcV8TargetInfo(T);
3661    }
3662
3663  // FIXME: Need a real SPU target.
3664  case llvm::Triple::cellspu:
3665    return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
3666
3667  case llvm::Triple::systemz:
3668    return new SystemZTargetInfo(T);
3669
3670  case llvm::Triple::tce:
3671    return new TCETargetInfo(T);
3672
3673  case llvm::Triple::x86:
3674    if (Triple.isOSDarwin())
3675      return new DarwinI386TargetInfo(T);
3676
3677    switch (os) {
3678    case llvm::Triple::AuroraUX:
3679      return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
3680    case llvm::Triple::Linux:
3681      return new LinuxTargetInfo<X86_32TargetInfo>(T);
3682    case llvm::Triple::DragonFly:
3683      return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
3684    case llvm::Triple::NetBSD:
3685      return new NetBSDTargetInfo<X86_32TargetInfo>(T);
3686    case llvm::Triple::OpenBSD:
3687      return new OpenBSDI386TargetInfo(T);
3688    case llvm::Triple::FreeBSD:
3689      return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
3690    case llvm::Triple::Minix:
3691      return new MinixTargetInfo<X86_32TargetInfo>(T);
3692    case llvm::Triple::Solaris:
3693      return new SolarisTargetInfo<X86_32TargetInfo>(T);
3694    case llvm::Triple::Cygwin:
3695      return new CygwinX86_32TargetInfo(T);
3696    case llvm::Triple::MinGW32:
3697      return new MinGWX86_32TargetInfo(T);
3698    case llvm::Triple::Win32:
3699      return new VisualStudioWindowsX86_32TargetInfo(T);
3700    case llvm::Triple::Haiku:
3701      return new HaikuX86_32TargetInfo(T);
3702    case llvm::Triple::RTEMS:
3703      return new RTEMSX86_32TargetInfo(T);
3704    default:
3705      return new X86_32TargetInfo(T);
3706    }
3707
3708  case llvm::Triple::x86_64:
3709    if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
3710      return new DarwinX86_64TargetInfo(T);
3711
3712    switch (os) {
3713    case llvm::Triple::AuroraUX:
3714      return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
3715    case llvm::Triple::Linux:
3716      return new LinuxTargetInfo<X86_64TargetInfo>(T);
3717    case llvm::Triple::DragonFly:
3718      return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
3719    case llvm::Triple::NetBSD:
3720      return new NetBSDTargetInfo<X86_64TargetInfo>(T);
3721    case llvm::Triple::OpenBSD:
3722      return new OpenBSDX86_64TargetInfo(T);
3723    case llvm::Triple::FreeBSD:
3724      return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
3725    case llvm::Triple::Solaris:
3726      return new SolarisTargetInfo<X86_64TargetInfo>(T);
3727    case llvm::Triple::MinGW32:
3728      return new MinGWX86_64TargetInfo(T);
3729    case llvm::Triple::Win32:   // This is what Triple.h supports now.
3730      return new VisualStudioWindowsX86_64TargetInfo(T);
3731    default:
3732      return new X86_64TargetInfo(T);
3733    }
3734  }
3735}
3736
3737/// CreateTargetInfo - Return the target info object for the specified target
3738/// triple.
3739TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
3740                                         TargetOptions &Opts) {
3741  llvm::Triple Triple(Opts.Triple);
3742
3743  // Construct the target
3744  llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
3745  if (!Target) {
3746    Diags.Report(diag::err_target_unknown_triple) << Triple.str();
3747    return 0;
3748  }
3749
3750  // Set the target CPU if specified.
3751  if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
3752    Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
3753    return 0;
3754  }
3755
3756  // Set the target ABI if specified.
3757  if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
3758    Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
3759    return 0;
3760  }
3761
3762  // Set the target C++ ABI.
3763  if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
3764    Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
3765    return 0;
3766  }
3767
3768  // Compute the default target features, we need the target to handle this
3769  // because features may have dependencies on one another.
3770  llvm::StringMap<bool> Features;
3771  Target->getDefaultFeatures(Features);
3772
3773  // Apply the user specified deltas.
3774  for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
3775         ie = Opts.Features.end(); it != ie; ++it) {
3776    const char *Name = it->c_str();
3777
3778    // Apply the feature via the target.
3779    if ((Name[0] != '-' && Name[0] != '+') ||
3780        !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
3781      Diags.Report(diag::err_target_invalid_feature) << Name;
3782      return 0;
3783    }
3784  }
3785
3786  // Add the features to the compile options.
3787  //
3788  // FIXME: If we are completely confident that we have the right set, we only
3789  // need to pass the minuses.
3790  Opts.Features.clear();
3791  for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
3792         ie = Features.end(); it != ie; ++it)
3793    Opts.Features.push_back(std::string(it->second ? "+" : "-") +
3794                            it->first().str());
3795  Target->HandleTargetFeatures(Opts.Features);
3796
3797  return Target.take();
3798}
3799