• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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>
32 using 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.
DefineStd(MacroBuilder & Builder,StringRef MacroName,const LangOptions & Opts)41 static 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 
defineCPUMacros(MacroBuilder & Builder,StringRef CPUName,bool Tuning=true)57 static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58                             bool Tuning = true) {
59   Builder.defineMacro("__" + CPUName);
60   Builder.defineMacro("__" + CPUName + "__");
61   if (Tuning)
62     Builder.defineMacro("__tune_" + CPUName + "__");
63 }
64 
65 //===----------------------------------------------------------------------===//
66 // Defines specific to certain operating systems.
67 //===----------------------------------------------------------------------===//
68 
69 namespace {
70 template<typename TgtInfo>
71 class OSTargetInfo : public TgtInfo {
72 protected:
73   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
74                             MacroBuilder &Builder) const=0;
75 public:
OSTargetInfo(const std::string & triple)76   OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const77   virtual void getTargetDefines(const LangOptions &Opts,
78                                 MacroBuilder &Builder) const {
79     TgtInfo::getTargetDefines(Opts, Builder);
80     getOSDefines(Opts, TgtInfo::getTriple(), Builder);
81   }
82 
83 };
84 } // end anonymous namespace
85 
86 
getDarwinDefines(MacroBuilder & Builder,const LangOptions & Opts,const llvm::Triple & Triple,StringRef & PlatformName,VersionTuple & PlatformMinVersion)87 static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
88                              const llvm::Triple &Triple,
89                              StringRef &PlatformName,
90                              VersionTuple &PlatformMinVersion) {
91   Builder.defineMacro("__APPLE_CC__", "5621");
92   Builder.defineMacro("__APPLE__");
93   Builder.defineMacro("__MACH__");
94   Builder.defineMacro("OBJC_NEW_PROPERTIES");
95 
96   if (!Opts.ObjCAutoRefCount) {
97     // __weak is always defined, for use in blocks and with objc pointers.
98     Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
99 
100     // Darwin defines __strong even in C mode (just to nothing).
101     if (Opts.getGC() != LangOptions::NonGC)
102       Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
103     else
104       Builder.defineMacro("__strong", "");
105 
106     // __unsafe_unretained is defined to nothing in non-ARC mode. We even
107     // allow this in C, since one might have block pointers in structs that
108     // are used in pure C code and in Objective-C ARC.
109     Builder.defineMacro("__unsafe_unretained", "");
110   }
111 
112   if (Opts.Static)
113     Builder.defineMacro("__STATIC__");
114   else
115     Builder.defineMacro("__DYNAMIC__");
116 
117   if (Opts.POSIXThreads)
118     Builder.defineMacro("_REENTRANT");
119 
120   // Get the platform type and version number from the triple.
121   unsigned Maj, Min, Rev;
122   if (Triple.isMacOSX()) {
123     Triple.getMacOSXVersion(Maj, Min, Rev);
124     PlatformName = "macosx";
125   } else {
126     Triple.getOSVersion(Maj, Min, Rev);
127     PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
128   }
129 
130   // If -target arch-pc-win32-macho option specified, we're
131   // generating code for Win32 ABI. No need to emit
132   // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
133   if (PlatformName == "win32") {
134     PlatformMinVersion = VersionTuple(Maj, Min, Rev);
135     return;
136   }
137 
138   // Set the appropriate OS version define.
139   if (Triple.getOS() == llvm::Triple::IOS) {
140     assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
141     char Str[6];
142     Str[0] = '0' + Maj;
143     Str[1] = '0' + (Min / 10);
144     Str[2] = '0' + (Min % 10);
145     Str[3] = '0' + (Rev / 10);
146     Str[4] = '0' + (Rev % 10);
147     Str[5] = '\0';
148     Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
149   } else {
150     // Note that the Driver allows versions which aren't representable in the
151     // define (because we only get a single digit for the minor and micro
152     // revision numbers). So, we limit them to the maximum representable
153     // version.
154     assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
155     assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
156     char Str[5];
157     Str[0] = '0' + (Maj / 10);
158     Str[1] = '0' + (Maj % 10);
159     Str[2] = '0' + std::min(Min, 9U);
160     Str[3] = '0' + std::min(Rev, 9U);
161     Str[4] = '\0';
162     Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
163   }
164 
165   PlatformMinVersion = VersionTuple(Maj, Min, Rev);
166 }
167 
168 namespace {
169 template<typename Target>
170 class DarwinTargetInfo : public OSTargetInfo<Target> {
171 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const172   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
173                             MacroBuilder &Builder) const {
174     getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
175                      this->PlatformMinVersion);
176   }
177 
178 public:
DarwinTargetInfo(const std::string & triple)179   DarwinTargetInfo(const std::string& triple) :
180     OSTargetInfo<Target>(triple) {
181       llvm::Triple T = llvm::Triple(triple);
182       this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
183       this->MCountName = "\01mcount";
184     }
185 
isValidSectionSpecifier(StringRef SR) const186   virtual std::string isValidSectionSpecifier(StringRef SR) const {
187     // Let MCSectionMachO validate this.
188     StringRef Segment, Section;
189     unsigned TAA, StubSize;
190     bool HasTAA;
191     return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
192                                                        TAA, HasTAA, StubSize);
193   }
194 
getStaticInitSectionSpecifier() const195   virtual const char *getStaticInitSectionSpecifier() const {
196     // FIXME: We should return 0 when building kexts.
197     return "__TEXT,__StaticInit,regular,pure_instructions";
198   }
199 
200   /// Darwin does not support protected visibility.  Darwin's "default"
201   /// is very similar to ELF's "protected";  Darwin requires a "weak"
202   /// attribute on declarations that can be dynamically replaced.
hasProtectedVisibility() const203   virtual bool hasProtectedVisibility() const {
204     return false;
205   }
206 };
207 
208 
209 // DragonFlyBSD Target
210 template<typename Target>
211 class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
212 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const213   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
214                             MacroBuilder &Builder) const {
215     // DragonFly defines; list based off of gcc output
216     Builder.defineMacro("__DragonFly__");
217     Builder.defineMacro("__DragonFly_cc_version", "100001");
218     Builder.defineMacro("__ELF__");
219     Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
220     Builder.defineMacro("__tune_i386__");
221     DefineStd(Builder, "unix", Opts);
222   }
223 public:
DragonFlyBSDTargetInfo(const std::string & triple)224   DragonFlyBSDTargetInfo(const std::string &triple)
225     : OSTargetInfo<Target>(triple) {
226       this->UserLabelPrefix = "";
227 
228       llvm::Triple Triple(triple);
229       switch (Triple.getArch()) {
230         default:
231         case llvm::Triple::x86:
232         case llvm::Triple::x86_64:
233           this->MCountName = ".mcount";
234           break;
235       }
236   }
237 };
238 
239 // FreeBSD Target
240 template<typename Target>
241 class FreeBSDTargetInfo : public OSTargetInfo<Target> {
242 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const243   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
244                             MacroBuilder &Builder) const {
245     // FreeBSD defines; list based off of gcc output
246 
247     unsigned Release = Triple.getOSMajorVersion();
248     if (Release == 0U)
249       Release = 8;
250 
251     Builder.defineMacro("__FreeBSD__", Twine(Release));
252     Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
253     Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
254     DefineStd(Builder, "unix", Opts);
255     Builder.defineMacro("__ELF__");
256   }
257 public:
FreeBSDTargetInfo(const std::string & triple)258   FreeBSDTargetInfo(const std::string &triple)
259     : OSTargetInfo<Target>(triple) {
260       this->UserLabelPrefix = "";
261 
262       llvm::Triple Triple(triple);
263       switch (Triple.getArch()) {
264         default:
265         case llvm::Triple::x86:
266         case llvm::Triple::x86_64:
267           this->MCountName = ".mcount";
268           break;
269         case llvm::Triple::mips:
270         case llvm::Triple::mipsel:
271         case llvm::Triple::ppc:
272         case llvm::Triple::ppc64:
273           this->MCountName = "_mcount";
274           break;
275         case llvm::Triple::arm:
276           this->MCountName = "__mcount";
277           break;
278       }
279 
280     }
281 };
282 
283 // Minix Target
284 template<typename Target>
285 class MinixTargetInfo : public OSTargetInfo<Target> {
286 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const287   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
288                             MacroBuilder &Builder) const {
289     // Minix defines
290 
291     Builder.defineMacro("__minix", "3");
292     Builder.defineMacro("_EM_WSIZE", "4");
293     Builder.defineMacro("_EM_PSIZE", "4");
294     Builder.defineMacro("_EM_SSIZE", "2");
295     Builder.defineMacro("_EM_LSIZE", "4");
296     Builder.defineMacro("_EM_FSIZE", "4");
297     Builder.defineMacro("_EM_DSIZE", "8");
298     Builder.defineMacro("__ELF__");
299     DefineStd(Builder, "unix", Opts);
300   }
301 public:
MinixTargetInfo(const std::string & triple)302   MinixTargetInfo(const std::string &triple)
303     : OSTargetInfo<Target>(triple) {
304       this->UserLabelPrefix = "";
305     }
306 };
307 
308 // Linux target
309 template<typename Target>
310 class LinuxTargetInfo : public OSTargetInfo<Target> {
311 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const312   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
313                             MacroBuilder &Builder) const {
314     // Linux defines; list based off of gcc output
315     DefineStd(Builder, "unix", Opts);
316     DefineStd(Builder, "linux", Opts);
317     Builder.defineMacro("__gnu_linux__");
318     Builder.defineMacro("__ELF__");
319     if (Triple.getEnvironment() == llvm::Triple::Android)
320       Builder.defineMacro("__ANDROID__", "1");
321     if (Opts.POSIXThreads)
322       Builder.defineMacro("_REENTRANT");
323     if (Opts.CPlusPlus)
324       Builder.defineMacro("_GNU_SOURCE");
325   }
326 public:
LinuxTargetInfo(const std::string & triple)327   LinuxTargetInfo(const std::string& triple)
328     : OSTargetInfo<Target>(triple) {
329     this->UserLabelPrefix = "";
330     this->WIntType = TargetInfo::UnsignedInt;
331   }
332 
getStaticInitSectionSpecifier() const333   virtual const char *getStaticInitSectionSpecifier() const {
334     return ".text.startup";
335   }
336 };
337 
338 // NetBSD Target
339 template<typename Target>
340 class NetBSDTargetInfo : public OSTargetInfo<Target> {
341 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const342   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   }
351 public:
NetBSDTargetInfo(const std::string & triple)352   NetBSDTargetInfo(const std::string &triple)
353     : OSTargetInfo<Target>(triple) {
354       this->UserLabelPrefix = "";
355     }
356 };
357 
358 // OpenBSD Target
359 template<typename Target>
360 class OpenBSDTargetInfo : public OSTargetInfo<Target> {
361 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const362   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("_REENTRANT");
371   }
372 public:
OpenBSDTargetInfo(const std::string & triple)373   OpenBSDTargetInfo(const std::string &triple)
374     : OSTargetInfo<Target>(triple) {
375       this->UserLabelPrefix = "";
376       this->TLSSupported = false;
377 
378       llvm::Triple Triple(triple);
379       switch (Triple.getArch()) {
380         default:
381         case llvm::Triple::x86:
382         case llvm::Triple::x86_64:
383         case llvm::Triple::arm:
384 	case llvm::Triple::sparc:
385           this->MCountName = "__mcount";
386           break;
387         case llvm::Triple::mips64:
388         case llvm::Triple::mips64el:
389         case llvm::Triple::ppc:
390 	case llvm::Triple::sparcv9:
391           this->MCountName = "_mcount";
392           break;
393       }
394   }
395 };
396 
397 // Bitrig Target
398 template<typename Target>
399 class BitrigTargetInfo : public OSTargetInfo<Target> {
400 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const401   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
402                             MacroBuilder &Builder) const {
403     // Bitrig defines; list based off of gcc output
404 
405     Builder.defineMacro("__Bitrig__");
406     DefineStd(Builder, "unix", Opts);
407     Builder.defineMacro("__ELF__");
408     if (Opts.POSIXThreads)
409       Builder.defineMacro("_REENTRANT");
410   }
411 public:
BitrigTargetInfo(const std::string & triple)412   BitrigTargetInfo(const std::string &triple)
413     : OSTargetInfo<Target>(triple) {
414       this->UserLabelPrefix = "";
415       this->TLSSupported = false;
416       this->MCountName = "__mcount";
417   }
418 };
419 
420 // PSP Target
421 template<typename Target>
422 class PSPTargetInfo : public OSTargetInfo<Target> {
423 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const424   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
425                             MacroBuilder &Builder) const {
426     // PSP defines; list based on the output of the pspdev gcc toolchain.
427     Builder.defineMacro("PSP");
428     Builder.defineMacro("_PSP");
429     Builder.defineMacro("__psp__");
430     Builder.defineMacro("__ELF__");
431   }
432 public:
PSPTargetInfo(const std::string & triple)433   PSPTargetInfo(const std::string& triple)
434     : OSTargetInfo<Target>(triple) {
435     this->UserLabelPrefix = "";
436   }
437 };
438 
439 // PS3 PPU Target
440 template<typename Target>
441 class PS3PPUTargetInfo : public OSTargetInfo<Target> {
442 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const443   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
444                             MacroBuilder &Builder) const {
445     // PS3 PPU defines.
446     Builder.defineMacro("__PPC__");
447     Builder.defineMacro("__PPU__");
448     Builder.defineMacro("__CELLOS_LV2__");
449     Builder.defineMacro("__ELF__");
450     Builder.defineMacro("__LP32__");
451     Builder.defineMacro("_ARCH_PPC64");
452     Builder.defineMacro("__powerpc64__");
453   }
454 public:
PS3PPUTargetInfo(const std::string & triple)455   PS3PPUTargetInfo(const std::string& triple)
456     : OSTargetInfo<Target>(triple) {
457     this->UserLabelPrefix = "";
458     this->LongWidth = this->LongAlign = 32;
459     this->PointerWidth = this->PointerAlign = 32;
460     this->IntMaxType = TargetInfo::SignedLongLong;
461     this->UIntMaxType = TargetInfo::UnsignedLongLong;
462     this->Int64Type = TargetInfo::SignedLongLong;
463     this->SizeType = TargetInfo::UnsignedInt;
464     this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
465                               "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
466   }
467 };
468 
469 // FIXME: Need a real SPU target.
470 // PS3 SPU Target
471 template<typename Target>
472 class PS3SPUTargetInfo : public OSTargetInfo<Target> {
473 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const474   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
475                             MacroBuilder &Builder) const {
476     // PS3 PPU defines.
477     Builder.defineMacro("__SPU__");
478     Builder.defineMacro("__ELF__");
479   }
480 public:
PS3SPUTargetInfo(const std::string & triple)481   PS3SPUTargetInfo(const std::string& triple)
482     : OSTargetInfo<Target>(triple) {
483     this->UserLabelPrefix = "";
484   }
485 };
486 
487 // AuroraUX target
488 template<typename Target>
489 class AuroraUXTargetInfo : public OSTargetInfo<Target> {
490 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const491   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
492                             MacroBuilder &Builder) const {
493     DefineStd(Builder, "sun", Opts);
494     DefineStd(Builder, "unix", Opts);
495     Builder.defineMacro("__ELF__");
496     Builder.defineMacro("__svr4__");
497     Builder.defineMacro("__SVR4");
498   }
499 public:
AuroraUXTargetInfo(const std::string & triple)500   AuroraUXTargetInfo(const std::string& triple)
501     : OSTargetInfo<Target>(triple) {
502     this->UserLabelPrefix = "";
503     this->WCharType = this->SignedLong;
504     // FIXME: WIntType should be SignedLong
505   }
506 };
507 
508 // Solaris target
509 template<typename Target>
510 class SolarisTargetInfo : public OSTargetInfo<Target> {
511 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const512   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
513                             MacroBuilder &Builder) const {
514     DefineStd(Builder, "sun", Opts);
515     DefineStd(Builder, "unix", Opts);
516     Builder.defineMacro("__ELF__");
517     Builder.defineMacro("__svr4__");
518     Builder.defineMacro("__SVR4");
519     // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
520     // newer, but to 500 for everything else.  feature_test.h has a check to
521     // ensure that you are not using C99 with an old version of X/Open or C89
522     // with a new version.
523     if (Opts.C99 || Opts.C11)
524       Builder.defineMacro("_XOPEN_SOURCE", "600");
525     else
526       Builder.defineMacro("_XOPEN_SOURCE", "500");
527     if (Opts.CPlusPlus)
528       Builder.defineMacro("__C99FEATURES__");
529     Builder.defineMacro("_LARGEFILE_SOURCE");
530     Builder.defineMacro("_LARGEFILE64_SOURCE");
531     Builder.defineMacro("__EXTENSIONS__");
532     Builder.defineMacro("_REENTRANT");
533   }
534 public:
SolarisTargetInfo(const std::string & triple)535   SolarisTargetInfo(const std::string& triple)
536     : OSTargetInfo<Target>(triple) {
537     this->UserLabelPrefix = "";
538     this->WCharType = this->SignedInt;
539     // FIXME: WIntType should be SignedLong
540   }
541 };
542 
543 // Windows target
544 template<typename Target>
545 class WindowsTargetInfo : public OSTargetInfo<Target> {
546 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const547   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
548                             MacroBuilder &Builder) const {
549     Builder.defineMacro("_WIN32");
550   }
getVisualStudioDefines(const LangOptions & Opts,MacroBuilder & Builder) const551   void getVisualStudioDefines(const LangOptions &Opts,
552                               MacroBuilder &Builder) const {
553     if (Opts.CPlusPlus) {
554       if (Opts.RTTI)
555         Builder.defineMacro("_CPPRTTI");
556 
557       if (Opts.Exceptions)
558         Builder.defineMacro("_CPPUNWIND");
559     }
560 
561     if (!Opts.CharIsSigned)
562       Builder.defineMacro("_CHAR_UNSIGNED");
563 
564     // FIXME: POSIXThreads isn't exactly the option this should be defined for,
565     //        but it works for now.
566     if (Opts.POSIXThreads)
567       Builder.defineMacro("_MT");
568 
569     if (Opts.MSCVersion != 0)
570       Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
571 
572     if (Opts.MicrosoftExt) {
573       Builder.defineMacro("_MSC_EXTENSIONS");
574 
575       if (Opts.CPlusPlus0x) {
576         Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
577         Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
578         Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
579       }
580     }
581 
582     Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
583   }
584 
585 public:
WindowsTargetInfo(const std::string & triple)586   WindowsTargetInfo(const std::string &triple)
587     : OSTargetInfo<Target>(triple) {}
588 };
589 
590 } // end anonymous namespace.
591 
592 //===----------------------------------------------------------------------===//
593 // Specific target implementations.
594 //===----------------------------------------------------------------------===//
595 
596 namespace {
597 // PPC abstract base class
598 class PPCTargetInfo : public TargetInfo {
599   static const Builtin::Info BuiltinInfo[];
600   static const char * const GCCRegNames[];
601   static const TargetInfo::GCCRegAlias GCCRegAliases[];
602   std::string CPU;
603 public:
PPCTargetInfo(const std::string & triple)604   PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
605     LongDoubleWidth = LongDoubleAlign = 128;
606     LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
607   }
608 
609   /// \brief Flags for architecture specific defines.
610   typedef enum {
611     ArchDefineNone  = 0,
612     ArchDefineName  = 1 << 0, // <name> is substituted for arch name.
613     ArchDefinePpcgr = 1 << 1,
614     ArchDefinePpcsq = 1 << 2,
615     ArchDefine440   = 1 << 3,
616     ArchDefine603   = 1 << 4,
617     ArchDefine604   = 1 << 5,
618     ArchDefinePwr4  = 1 << 6,
619     ArchDefinePwr6  = 1 << 7
620   } ArchDefineTypes;
621 
setCPU(const std::string & Name)622   virtual bool setCPU(const std::string &Name) {
623     bool CPUKnown = llvm::StringSwitch<bool>(Name)
624       .Case("generic", true)
625       .Case("440", true)
626       .Case("450", true)
627       .Case("601", true)
628       .Case("602", true)
629       .Case("603", true)
630       .Case("603e", true)
631       .Case("603ev", true)
632       .Case("604", true)
633       .Case("604e", true)
634       .Case("620", true)
635       .Case("g3", true)
636       .Case("7400", true)
637       .Case("g4", true)
638       .Case("7450", true)
639       .Case("g4+", true)
640       .Case("750", true)
641       .Case("970", true)
642       .Case("g5", true)
643       .Case("a2", true)
644       .Case("pwr6", true)
645       .Case("pwr7", true)
646       .Case("ppc", true)
647       .Case("ppc64", true)
648       .Default(false);
649 
650     if (CPUKnown)
651       CPU = Name;
652 
653     return CPUKnown;
654   }
655 
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const656   virtual void getTargetBuiltins(const Builtin::Info *&Records,
657                                  unsigned &NumRecords) const {
658     Records = BuiltinInfo;
659     NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
660   }
661 
isCLZForZeroUndef() const662   virtual bool isCLZForZeroUndef() const { return false; }
663 
664   virtual void getTargetDefines(const LangOptions &Opts,
665                                 MacroBuilder &Builder) const;
666 
667   virtual bool hasFeature(StringRef Feature) const;
668 
669   virtual void getGCCRegNames(const char * const *&Names,
670                               unsigned &NumNames) const;
671   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
672                                 unsigned &NumAliases) const;
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info) const673   virtual bool validateAsmConstraint(const char *&Name,
674                                      TargetInfo::ConstraintInfo &Info) const {
675     switch (*Name) {
676     default: return false;
677     case 'O': // Zero
678       break;
679     case 'b': // Base register
680     case 'f': // Floating point register
681       Info.setAllowsRegister();
682       break;
683     // FIXME: The following are added to allow parsing.
684     // I just took a guess at what the actions should be.
685     // Also, is more specific checking needed?  I.e. specific registers?
686     case 'd': // Floating point register (containing 64-bit value)
687     case 'v': // Altivec vector register
688       Info.setAllowsRegister();
689       break;
690     case 'w':
691       switch (Name[1]) {
692         case 'd':// VSX vector register to hold vector double data
693         case 'f':// VSX vector register to hold vector float data
694         case 's':// VSX vector register to hold scalar float data
695         case 'a':// Any VSX register
696           break;
697         default:
698           return false;
699       }
700       Info.setAllowsRegister();
701       Name++; // Skip over 'w'.
702       break;
703     case 'h': // `MQ', `CTR', or `LINK' register
704     case 'q': // `MQ' register
705     case 'c': // `CTR' register
706     case 'l': // `LINK' register
707     case 'x': // `CR' register (condition register) number 0
708     case 'y': // `CR' register (condition register)
709     case 'z': // `XER[CA]' carry bit (part of the XER register)
710       Info.setAllowsRegister();
711       break;
712     case 'I': // Signed 16-bit constant
713     case 'J': // Unsigned 16-bit constant shifted left 16 bits
714               //  (use `L' instead for SImode constants)
715     case 'K': // Unsigned 16-bit constant
716     case 'L': // Signed 16-bit constant shifted left 16 bits
717     case 'M': // Constant larger than 31
718     case 'N': // Exact power of 2
719     case 'P': // Constant whose negation is a signed 16-bit constant
720     case 'G': // Floating point constant that can be loaded into a
721               // register with one instruction per word
722     case 'H': // Integer/Floating point constant that can be loaded
723               // into a register using three instructions
724       break;
725     case 'm': // Memory operand. Note that on PowerPC targets, m can
726               // include addresses that update the base register. It
727               // is therefore only safe to use `m' in an asm statement
728               // if that asm statement accesses the operand exactly once.
729               // The asm statement must also use `%U<opno>' as a
730               // placeholder for the "update" flag in the corresponding
731               // load or store instruction. For example:
732               // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
733               // is correct but:
734               // asm ("st %1,%0" : "=m" (mem) : "r" (val));
735               // is not. Use es rather than m if you don't want the base
736               // register to be updated.
737     case 'e':
738       if (Name[1] != 's')
739           return false;
740               // es: A "stable" memory operand; that is, one which does not
741               // include any automodification of the base register. Unlike
742               // `m', this constraint can be used in asm statements that
743               // might access the operand several times, or that might not
744               // access it at all.
745       Info.setAllowsMemory();
746       Name++; // Skip over 'e'.
747       break;
748     case 'Q': // Memory operand that is an offset from a register (it is
749               // usually better to use `m' or `es' in asm statements)
750     case 'Z': // Memory operand that is an indexed or indirect from a
751               // register (it is usually better to use `m' or `es' in
752               // asm statements)
753       Info.setAllowsMemory();
754       Info.setAllowsRegister();
755       break;
756     case 'R': // AIX TOC entry
757     case 'a': // Address operand that is an indexed or indirect from a
758               // register (`p' is preferable for asm statements)
759     case 'S': // Constant suitable as a 64-bit mask operand
760     case 'T': // Constant suitable as a 32-bit mask operand
761     case 'U': // System V Release 4 small data area reference
762     case 't': // AND masks that can be performed by two rldic{l, r}
763               // instructions
764     case 'W': // Vector constant that does not require memory
765     case 'j': // Vector constant that is all zeros.
766       break;
767     // End FIXME.
768     }
769     return true;
770   }
getClobbers() const771   virtual const char *getClobbers() const {
772     return "";
773   }
774 };
775 
776 const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
777 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
778 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
779                                               ALL_LANGUAGES },
780 #include "clang/Basic/BuiltinsPPC.def"
781 };
782 
783 
784 /// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
785 /// #defines that are not tied to a specific subtarget.
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const786 void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
787                                      MacroBuilder &Builder) const {
788   // Target identification.
789   Builder.defineMacro("__ppc__");
790   Builder.defineMacro("_ARCH_PPC");
791   Builder.defineMacro("__powerpc__");
792   Builder.defineMacro("__POWERPC__");
793   if (PointerWidth == 64) {
794     Builder.defineMacro("_ARCH_PPC64");
795     Builder.defineMacro("__powerpc64__");
796     Builder.defineMacro("__ppc64__");
797   } else {
798     Builder.defineMacro("__ppc__");
799   }
800 
801   // Target properties.
802   if (getTriple().getOS() != llvm::Triple::NetBSD &&
803       getTriple().getOS() != llvm::Triple::OpenBSD)
804     Builder.defineMacro("_BIG_ENDIAN");
805   Builder.defineMacro("__BIG_ENDIAN__");
806 
807   // Subtarget options.
808   Builder.defineMacro("__NATURAL_ALIGNMENT__");
809   Builder.defineMacro("__REGISTER_PREFIX__", "");
810 
811   // FIXME: Should be controlled by command line option.
812   Builder.defineMacro("__LONG_DOUBLE_128__");
813 
814   if (Opts.AltiVec) {
815     Builder.defineMacro("__VEC__", "10206");
816     Builder.defineMacro("__ALTIVEC__");
817   }
818 
819   // CPU identification.
820   ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
821     .Case("440",   ArchDefineName)
822     .Case("450",   ArchDefineName | ArchDefine440)
823     .Case("601",   ArchDefineName)
824     .Case("602",   ArchDefineName | ArchDefinePpcgr)
825     .Case("603",   ArchDefineName | ArchDefinePpcgr)
826     .Case("603e",  ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
827     .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
828     .Case("604",   ArchDefineName | ArchDefinePpcgr)
829     .Case("604e",  ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
830     .Case("620",   ArchDefineName | ArchDefinePpcgr)
831     .Case("7400",  ArchDefineName | ArchDefinePpcgr)
832     .Case("7450",  ArchDefineName | ArchDefinePpcgr)
833     .Case("750",   ArchDefineName | ArchDefinePpcgr)
834     .Case("970",   ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
835                      | ArchDefinePpcsq)
836     .Case("pwr6",  ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
837     .Case("pwr7",  ArchDefineName | ArchDefinePwr6 | ArchDefinePpcgr
838                      | ArchDefinePpcsq)
839     .Default(ArchDefineNone);
840 
841   if (defs & ArchDefineName)
842     Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
843   if (defs & ArchDefinePpcgr)
844     Builder.defineMacro("_ARCH_PPCGR");
845   if (defs & ArchDefinePpcsq)
846     Builder.defineMacro("_ARCH_PPCSQ");
847   if (defs & ArchDefine440)
848     Builder.defineMacro("_ARCH_440");
849   if (defs & ArchDefine603)
850     Builder.defineMacro("_ARCH_603");
851   if (defs & ArchDefine604)
852     Builder.defineMacro("_ARCH_604");
853   if (defs & (ArchDefinePwr4 | ArchDefinePwr6))
854     Builder.defineMacro("_ARCH_PWR4");
855   if (defs & ArchDefinePwr6) {
856     Builder.defineMacro("_ARCH_PWR5");
857     Builder.defineMacro("_ARCH_PWR6");
858   }
859 }
860 
hasFeature(StringRef Feature) const861 bool PPCTargetInfo::hasFeature(StringRef Feature) const {
862   return Feature == "powerpc";
863 }
864 
865 
866 const char * const PPCTargetInfo::GCCRegNames[] = {
867   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
868   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
869   "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
870   "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
871   "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
872   "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
873   "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
874   "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
875   "mq", "lr", "ctr", "ap",
876   "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
877   "xer",
878   "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
879   "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
880   "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
881   "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
882   "vrsave", "vscr",
883   "spe_acc", "spefscr",
884   "sfp"
885 };
886 
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const887 void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
888                                    unsigned &NumNames) const {
889   Names = GCCRegNames;
890   NumNames = llvm::array_lengthof(GCCRegNames);
891 }
892 
893 const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
894   // While some of these aliases do map to different registers
895   // they still share the same register name.
896   { { "0" }, "r0" },
897   { { "1"}, "r1" },
898   { { "2" }, "r2" },
899   { { "3" }, "r3" },
900   { { "4" }, "r4" },
901   { { "5" }, "r5" },
902   { { "6" }, "r6" },
903   { { "7" }, "r7" },
904   { { "8" }, "r8" },
905   { { "9" }, "r9" },
906   { { "10" }, "r10" },
907   { { "11" }, "r11" },
908   { { "12" }, "r12" },
909   { { "13" }, "r13" },
910   { { "14" }, "r14" },
911   { { "15" }, "r15" },
912   { { "16" }, "r16" },
913   { { "17" }, "r17" },
914   { { "18" }, "r18" },
915   { { "19" }, "r19" },
916   { { "20" }, "r20" },
917   { { "21" }, "r21" },
918   { { "22" }, "r22" },
919   { { "23" }, "r23" },
920   { { "24" }, "r24" },
921   { { "25" }, "r25" },
922   { { "26" }, "r26" },
923   { { "27" }, "r27" },
924   { { "28" }, "r28" },
925   { { "29" }, "r29" },
926   { { "30" }, "r30" },
927   { { "31" }, "r31" },
928   { { "fr0" }, "f0" },
929   { { "fr1" }, "f1" },
930   { { "fr2" }, "f2" },
931   { { "fr3" }, "f3" },
932   { { "fr4" }, "f4" },
933   { { "fr5" }, "f5" },
934   { { "fr6" }, "f6" },
935   { { "fr7" }, "f7" },
936   { { "fr8" }, "f8" },
937   { { "fr9" }, "f9" },
938   { { "fr10" }, "f10" },
939   { { "fr11" }, "f11" },
940   { { "fr12" }, "f12" },
941   { { "fr13" }, "f13" },
942   { { "fr14" }, "f14" },
943   { { "fr15" }, "f15" },
944   { { "fr16" }, "f16" },
945   { { "fr17" }, "f17" },
946   { { "fr18" }, "f18" },
947   { { "fr19" }, "f19" },
948   { { "fr20" }, "f20" },
949   { { "fr21" }, "f21" },
950   { { "fr22" }, "f22" },
951   { { "fr23" }, "f23" },
952   { { "fr24" }, "f24" },
953   { { "fr25" }, "f25" },
954   { { "fr26" }, "f26" },
955   { { "fr27" }, "f27" },
956   { { "fr28" }, "f28" },
957   { { "fr29" }, "f29" },
958   { { "fr30" }, "f30" },
959   { { "fr31" }, "f31" },
960   { { "cc" }, "cr0" },
961 };
962 
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const963 void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
964                                      unsigned &NumAliases) const {
965   Aliases = GCCRegAliases;
966   NumAliases = llvm::array_lengthof(GCCRegAliases);
967 }
968 } // end anonymous namespace.
969 
970 namespace {
971 class PPC32TargetInfo : public PPCTargetInfo {
972 public:
PPC32TargetInfo(const std::string & triple)973   PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
974     DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
975                         "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
976 
977     switch (getTriple().getOS()) {
978     case llvm::Triple::Linux:
979     case llvm::Triple::FreeBSD:
980     case llvm::Triple::NetBSD:
981       SizeType = UnsignedInt;
982       PtrDiffType = SignedInt;
983       IntPtrType = SignedInt;
984       break;
985     default:
986       break;
987     }
988 
989     if (getTriple().getOS() == llvm::Triple::FreeBSD) {
990       LongDoubleWidth = LongDoubleAlign = 64;
991       LongDoubleFormat = &llvm::APFloat::IEEEdouble;
992     }
993   }
994 
getBuiltinVaListKind() const995   virtual BuiltinVaListKind getBuiltinVaListKind() const {
996     // This is the ELF definition, and is overridden by the Darwin sub-target
997     return TargetInfo::PowerABIBuiltinVaList;
998   }
999 };
1000 } // end anonymous namespace.
1001 
1002 namespace {
1003 class PPC64TargetInfo : public PPCTargetInfo {
1004 public:
PPC64TargetInfo(const std::string & triple)1005   PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
1006     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
1007     IntMaxType = SignedLong;
1008     UIntMaxType = UnsignedLong;
1009     Int64Type = SignedLong;
1010     DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1011                         "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
1012 
1013     if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1014       LongDoubleWidth = LongDoubleAlign = 64;
1015       LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1016     }
1017   }
getBuiltinVaListKind() const1018   virtual BuiltinVaListKind getBuiltinVaListKind() const {
1019     return TargetInfo::CharPtrBuiltinVaList;
1020   }
1021 };
1022 } // end anonymous namespace.
1023 
1024 
1025 namespace {
1026 class DarwinPPC32TargetInfo :
1027   public DarwinTargetInfo<PPC32TargetInfo> {
1028 public:
DarwinPPC32TargetInfo(const std::string & triple)1029   DarwinPPC32TargetInfo(const std::string& triple)
1030     : DarwinTargetInfo<PPC32TargetInfo>(triple) {
1031     HasAlignMac68kSupport = true;
1032     BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
1033     LongLongAlign = 32;
1034     SuitableAlign = 128;
1035     DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1036                         "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
1037   }
getBuiltinVaListKind() const1038   virtual BuiltinVaListKind getBuiltinVaListKind() const {
1039     return TargetInfo::CharPtrBuiltinVaList;
1040   }
1041 };
1042 
1043 class DarwinPPC64TargetInfo :
1044   public DarwinTargetInfo<PPC64TargetInfo> {
1045 public:
DarwinPPC64TargetInfo(const std::string & triple)1046   DarwinPPC64TargetInfo(const std::string& triple)
1047     : DarwinTargetInfo<PPC64TargetInfo>(triple) {
1048     HasAlignMac68kSupport = true;
1049     SuitableAlign = 128;
1050   }
1051 };
1052 } // end anonymous namespace.
1053 
1054 namespace {
1055   static const unsigned NVPTXAddrSpaceMap[] = {
1056     1,    // opencl_global
1057     3,    // opencl_local
1058     4,    // opencl_constant
1059     1,    // cuda_device
1060     4,    // cuda_constant
1061     3,    // cuda_shared
1062   };
1063   class NVPTXTargetInfo : public TargetInfo {
1064     static const char * const GCCRegNames[];
1065     static const Builtin::Info BuiltinInfo[];
1066     std::vector<llvm::StringRef> AvailableFeatures;
1067   public:
NVPTXTargetInfo(const std::string & triple)1068     NVPTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
1069       BigEndian = false;
1070       TLSSupported = false;
1071       LongWidth = LongAlign = 64;
1072       AddrSpaceMap = &NVPTXAddrSpaceMap;
1073       // Define available target features
1074       // These must be defined in sorted order!
1075       NoAsmVariants = true;
1076     }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const1077     virtual void getTargetDefines(const LangOptions &Opts,
1078                                   MacroBuilder &Builder) const {
1079       Builder.defineMacro("__PTX__");
1080       Builder.defineMacro("__NVPTX__");
1081     }
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const1082     virtual void getTargetBuiltins(const Builtin::Info *&Records,
1083                                    unsigned &NumRecords) const {
1084       Records = BuiltinInfo;
1085       NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
1086     }
hasFeature(StringRef Feature) const1087     virtual bool hasFeature(StringRef Feature) const {
1088       return Feature == "ptx" || Feature == "nvptx";
1089     }
1090 
1091     virtual void getGCCRegNames(const char * const *&Names,
1092                                 unsigned &NumNames) const;
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const1093     virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1094                                   unsigned &NumAliases) const {
1095       // No aliases.
1096       Aliases = 0;
1097       NumAliases = 0;
1098     }
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & info) const1099     virtual bool validateAsmConstraint(const char *&Name,
1100                                        TargetInfo::ConstraintInfo &info) const {
1101       // FIXME: implement
1102       return true;
1103     }
getClobbers() const1104     virtual const char *getClobbers() const {
1105       // FIXME: Is this really right?
1106       return "";
1107     }
getBuiltinVaListKind() const1108     virtual BuiltinVaListKind getBuiltinVaListKind() const {
1109       // FIXME: implement
1110       return TargetInfo::CharPtrBuiltinVaList;
1111     }
setCPU(const std::string & Name)1112     virtual bool setCPU(const std::string &Name) {
1113       return Name == "sm_10" || Name == "sm_13" || Name == "sm_20";
1114     }
1115     virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1116                                    StringRef Name,
1117                                    bool Enabled) const;
1118   };
1119 
1120   const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1121 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1122 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1123                                               ALL_LANGUAGES },
1124 #include "clang/Basic/BuiltinsNVPTX.def"
1125   };
1126 
1127   const char * const NVPTXTargetInfo::GCCRegNames[] = {
1128     "r0"
1129   };
1130 
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const1131   void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1132                                      unsigned &NumNames) const {
1133     Names = GCCRegNames;
1134     NumNames = llvm::array_lengthof(GCCRegNames);
1135   }
1136 
setFeatureEnabled(llvm::StringMap<bool> & Features,StringRef Name,bool Enabled) const1137   bool NVPTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1138                                           StringRef Name,
1139                                           bool Enabled) const {
1140     if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1141                           Name)) {
1142       Features[Name] = Enabled;
1143       return true;
1144     } else {
1145       return false;
1146     }
1147   }
1148 
1149   class NVPTX32TargetInfo : public NVPTXTargetInfo {
1150   public:
NVPTX32TargetInfo(const std::string & triple)1151     NVPTX32TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
1152       PointerWidth = PointerAlign = 32;
1153       SizeType     = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
1154       DescriptionString
1155         = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1156           "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1157           "n16:32:64";
1158   }
1159   };
1160 
1161   class NVPTX64TargetInfo : public NVPTXTargetInfo {
1162   public:
NVPTX64TargetInfo(const std::string & triple)1163     NVPTX64TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
1164       PointerWidth = PointerAlign = 64;
1165       SizeType     = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
1166       DescriptionString
1167         = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1168           "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1169           "n16:32:64";
1170   }
1171   };
1172 }
1173 
1174 namespace {
1175 // MBlaze abstract base class
1176 class MBlazeTargetInfo : public TargetInfo {
1177   static const char * const GCCRegNames[];
1178   static const TargetInfo::GCCRegAlias GCCRegAliases[];
1179 
1180 public:
MBlazeTargetInfo(const std::string & triple)1181   MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
1182     DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
1183   }
1184 
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const1185   virtual void getTargetBuiltins(const Builtin::Info *&Records,
1186                                  unsigned &NumRecords) const {
1187     // FIXME: Implement.
1188     Records = 0;
1189     NumRecords = 0;
1190   }
1191 
1192   virtual void getTargetDefines(const LangOptions &Opts,
1193                                 MacroBuilder &Builder) const;
1194 
hasFeature(StringRef Feature) const1195   virtual bool hasFeature(StringRef Feature) const {
1196     return Feature == "mblaze";
1197   }
1198 
getBuiltinVaListKind() const1199   virtual BuiltinVaListKind getBuiltinVaListKind() const {
1200     return TargetInfo::CharPtrBuiltinVaList;
1201   }
getTargetPrefix() const1202   virtual const char *getTargetPrefix() const {
1203     return "mblaze";
1204   }
1205   virtual void getGCCRegNames(const char * const *&Names,
1206                               unsigned &NumNames) const;
1207   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1208                                 unsigned &NumAliases) const;
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info) const1209   virtual bool validateAsmConstraint(const char *&Name,
1210                                      TargetInfo::ConstraintInfo &Info) const {
1211     switch (*Name) {
1212     default: return false;
1213     case 'O': // Zero
1214       return true;
1215     case 'b': // Base register
1216     case 'f': // Floating point register
1217       Info.setAllowsRegister();
1218       return true;
1219     }
1220   }
getClobbers() const1221   virtual const char *getClobbers() const {
1222     return "";
1223   }
1224 };
1225 
1226 /// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1227 /// #defines that are not tied to a specific subtarget.
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const1228 void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1229                                      MacroBuilder &Builder) const {
1230   // Target identification.
1231   Builder.defineMacro("__microblaze__");
1232   Builder.defineMacro("_ARCH_MICROBLAZE");
1233   Builder.defineMacro("__MICROBLAZE__");
1234 
1235   // Target properties.
1236   Builder.defineMacro("_BIG_ENDIAN");
1237   Builder.defineMacro("__BIG_ENDIAN__");
1238 
1239   // Subtarget options.
1240   Builder.defineMacro("__REGISTER_PREFIX__", "");
1241 }
1242 
1243 
1244 const char * const MBlazeTargetInfo::GCCRegNames[] = {
1245   "r0",   "r1",   "r2",   "r3",   "r4",   "r5",   "r6",   "r7",
1246   "r8",   "r9",   "r10",  "r11",  "r12",  "r13",  "r14",  "r15",
1247   "r16",  "r17",  "r18",  "r19",  "r20",  "r21",  "r22",  "r23",
1248   "r24",  "r25",  "r26",  "r27",  "r28",  "r29",  "r30",  "r31",
1249   "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
1250   "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1251   "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1252   "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1253   "hi",   "lo",   "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1254   "$fcc5","$fcc6","$fcc7","$ap",  "$rap", "$frp"
1255 };
1256 
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const1257 void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1258                                    unsigned &NumNames) const {
1259   Names = GCCRegNames;
1260   NumNames = llvm::array_lengthof(GCCRegNames);
1261 }
1262 
1263 const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1264   { {"f0"},  "r0" },
1265   { {"f1"},  "r1" },
1266   { {"f2"},  "r2" },
1267   { {"f3"},  "r3" },
1268   { {"f4"},  "r4" },
1269   { {"f5"},  "r5" },
1270   { {"f6"},  "r6" },
1271   { {"f7"},  "r7" },
1272   { {"f8"},  "r8" },
1273   { {"f9"},  "r9" },
1274   { {"f10"}, "r10" },
1275   { {"f11"}, "r11" },
1276   { {"f12"}, "r12" },
1277   { {"f13"}, "r13" },
1278   { {"f14"}, "r14" },
1279   { {"f15"}, "r15" },
1280   { {"f16"}, "r16" },
1281   { {"f17"}, "r17" },
1282   { {"f18"}, "r18" },
1283   { {"f19"}, "r19" },
1284   { {"f20"}, "r20" },
1285   { {"f21"}, "r21" },
1286   { {"f22"}, "r22" },
1287   { {"f23"}, "r23" },
1288   { {"f24"}, "r24" },
1289   { {"f25"}, "r25" },
1290   { {"f26"}, "r26" },
1291   { {"f27"}, "r27" },
1292   { {"f28"}, "r28" },
1293   { {"f29"}, "r29" },
1294   { {"f30"}, "r30" },
1295   { {"f31"}, "r31" },
1296 };
1297 
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const1298 void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1299                                      unsigned &NumAliases) const {
1300   Aliases = GCCRegAliases;
1301   NumAliases = llvm::array_lengthof(GCCRegAliases);
1302 }
1303 } // end anonymous namespace.
1304 
1305 namespace {
1306 // Namespace for x86 abstract base class
1307 const Builtin::Info BuiltinInfo[] = {
1308 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1309 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1310                                               ALL_LANGUAGES },
1311 #include "clang/Basic/BuiltinsX86.def"
1312 };
1313 
1314 static const char* const GCCRegNames[] = {
1315   "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1316   "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
1317   "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
1318   "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1319   "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1320   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1321   "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
1322   "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1323   "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
1324 };
1325 
1326 const TargetInfo::AddlRegName AddlRegNames[] = {
1327   { { "al", "ah", "eax", "rax" }, 0 },
1328   { { "bl", "bh", "ebx", "rbx" }, 3 },
1329   { { "cl", "ch", "ecx", "rcx" }, 2 },
1330   { { "dl", "dh", "edx", "rdx" }, 1 },
1331   { { "esi", "rsi" }, 4 },
1332   { { "edi", "rdi" }, 5 },
1333   { { "esp", "rsp" }, 7 },
1334   { { "ebp", "rbp" }, 6 },
1335 };
1336 
1337 // X86 target abstract base class; x86-32 and x86-64 are very close, so
1338 // most of the implementation can be shared.
1339 class X86TargetInfo : public TargetInfo {
1340   enum X86SSEEnum {
1341     NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
1342   } SSELevel;
1343   enum MMX3DNowEnum {
1344     NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1345   } MMX3DNowLevel;
1346 
1347   bool HasAES;
1348   bool HasPCLMUL;
1349   bool HasLZCNT;
1350   bool HasRDRND;
1351   bool HasBMI;
1352   bool HasBMI2;
1353   bool HasPOPCNT;
1354   bool HasSSE4a;
1355   bool HasFMA4;
1356   bool HasFMA;
1357   bool HasXOP;
1358 
1359   /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1360   ///
1361   /// Each enumeration represents a particular CPU supported by Clang. These
1362   /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1363   enum CPUKind {
1364     CK_Generic,
1365 
1366     /// \name i386
1367     /// i386-generation processors.
1368     //@{
1369     CK_i386,
1370     //@}
1371 
1372     /// \name i486
1373     /// i486-generation processors.
1374     //@{
1375     CK_i486,
1376     CK_WinChipC6,
1377     CK_WinChip2,
1378     CK_C3,
1379     //@}
1380 
1381     /// \name i586
1382     /// i586-generation processors, P5 microarchitecture based.
1383     //@{
1384     CK_i586,
1385     CK_Pentium,
1386     CK_PentiumMMX,
1387     //@}
1388 
1389     /// \name i686
1390     /// i686-generation processors, P6 / Pentium M microarchitecture based.
1391     //@{
1392     CK_i686,
1393     CK_PentiumPro,
1394     CK_Pentium2,
1395     CK_Pentium3,
1396     CK_Pentium3M,
1397     CK_PentiumM,
1398     CK_C3_2,
1399 
1400     /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1401     /// Clang however has some logic to suport this.
1402     // FIXME: Warn, deprecate, and potentially remove this.
1403     CK_Yonah,
1404     //@}
1405 
1406     /// \name Netburst
1407     /// Netburst microarchitecture based processors.
1408     //@{
1409     CK_Pentium4,
1410     CK_Pentium4M,
1411     CK_Prescott,
1412     CK_Nocona,
1413     //@}
1414 
1415     /// \name Core
1416     /// Core microarchitecture based processors.
1417     //@{
1418     CK_Core2,
1419 
1420     /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1421     /// codename which GCC no longer accepts as an option to -march, but Clang
1422     /// has some logic for recognizing it.
1423     // FIXME: Warn, deprecate, and potentially remove this.
1424     CK_Penryn,
1425     //@}
1426 
1427     /// \name Atom
1428     /// Atom processors
1429     //@{
1430     CK_Atom,
1431     //@}
1432 
1433     /// \name Nehalem
1434     /// Nehalem microarchitecture based processors.
1435     //@{
1436     CK_Corei7,
1437     CK_Corei7AVX,
1438     CK_CoreAVXi,
1439     CK_CoreAVX2,
1440     //@}
1441 
1442     /// \name K6
1443     /// K6 architecture processors.
1444     //@{
1445     CK_K6,
1446     CK_K6_2,
1447     CK_K6_3,
1448     //@}
1449 
1450     /// \name K7
1451     /// K7 architecture processors.
1452     //@{
1453     CK_Athlon,
1454     CK_AthlonThunderbird,
1455     CK_Athlon4,
1456     CK_AthlonXP,
1457     CK_AthlonMP,
1458     //@}
1459 
1460     /// \name K8
1461     /// K8 architecture processors.
1462     //@{
1463     CK_Athlon64,
1464     CK_Athlon64SSE3,
1465     CK_AthlonFX,
1466     CK_K8,
1467     CK_K8SSE3,
1468     CK_Opteron,
1469     CK_OpteronSSE3,
1470     CK_AMDFAM10,
1471     //@}
1472 
1473     /// \name Bobcat
1474     /// Bobcat architecture processors.
1475     //@{
1476     CK_BTVER1,
1477     //@}
1478 
1479     /// \name Bulldozer
1480     /// Bulldozer architecture processors.
1481     //@{
1482     CK_BDVER1,
1483     CK_BDVER2,
1484     //@}
1485 
1486     /// This specification is deprecated and will be removed in the future.
1487     /// Users should prefer \see CK_K8.
1488     // FIXME: Warn on this when the CPU is set to it.
1489     CK_x86_64,
1490     //@}
1491 
1492     /// \name Geode
1493     /// Geode processors.
1494     //@{
1495     CK_Geode
1496     //@}
1497   } CPU;
1498 
1499 public:
X86TargetInfo(const std::string & triple)1500   X86TargetInfo(const std::string& triple)
1501     : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
1502       HasAES(false), HasPCLMUL(false), HasLZCNT(false), HasRDRND(false),
1503       HasBMI(false), HasBMI2(false), HasPOPCNT(false), HasSSE4a(false),
1504       HasFMA4(false), HasFMA(false), HasXOP(false), CPU(CK_Generic) {
1505     BigEndian = false;
1506     LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
1507   }
getFloatEvalMethod() const1508   virtual unsigned getFloatEvalMethod() const {
1509     // X87 evaluates with 80 bits "long double" precision.
1510     return SSELevel == NoSSE ? 2 : 0;
1511   }
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const1512   virtual void getTargetBuiltins(const Builtin::Info *&Records,
1513                                  unsigned &NumRecords) const {
1514     Records = BuiltinInfo;
1515     NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
1516   }
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const1517   virtual void getGCCRegNames(const char * const *&Names,
1518                               unsigned &NumNames) const {
1519     Names = GCCRegNames;
1520     NumNames = llvm::array_lengthof(GCCRegNames);
1521   }
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const1522   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1523                                 unsigned &NumAliases) const {
1524     Aliases = 0;
1525     NumAliases = 0;
1526   }
getGCCAddlRegNames(const AddlRegName * & Names,unsigned & NumNames) const1527   virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1528 				  unsigned &NumNames) const {
1529     Names = AddlRegNames;
1530     NumNames = llvm::array_lengthof(AddlRegNames);
1531   }
1532   virtual bool validateAsmConstraint(const char *&Name,
1533                                      TargetInfo::ConstraintInfo &info) const;
1534   virtual std::string convertConstraint(const char *&Constraint) const;
getClobbers() const1535   virtual const char *getClobbers() const {
1536     return "~{dirflag},~{fpsr},~{flags}";
1537   }
1538   virtual void getTargetDefines(const LangOptions &Opts,
1539                                 MacroBuilder &Builder) const;
1540   virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1541                                  StringRef Name,
1542                                  bool Enabled) const;
1543   virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
1544   virtual bool hasFeature(StringRef Feature) const;
1545   virtual void HandleTargetFeatures(std::vector<std::string> &Features);
getABI() const1546   virtual const char* getABI() const {
1547     if (PointerWidth == 64 && SSELevel >= AVX)
1548       return "avx";
1549     else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow)
1550       return "no-mmx";
1551     return "";
1552   }
setCPU(const std::string & Name)1553   virtual bool setCPU(const std::string &Name) {
1554     CPU = llvm::StringSwitch<CPUKind>(Name)
1555       .Case("i386", CK_i386)
1556       .Case("i486", CK_i486)
1557       .Case("winchip-c6", CK_WinChipC6)
1558       .Case("winchip2", CK_WinChip2)
1559       .Case("c3", CK_C3)
1560       .Case("i586", CK_i586)
1561       .Case("pentium", CK_Pentium)
1562       .Case("pentium-mmx", CK_PentiumMMX)
1563       .Case("i686", CK_i686)
1564       .Case("pentiumpro", CK_PentiumPro)
1565       .Case("pentium2", CK_Pentium2)
1566       .Case("pentium3", CK_Pentium3)
1567       .Case("pentium3m", CK_Pentium3M)
1568       .Case("pentium-m", CK_PentiumM)
1569       .Case("c3-2", CK_C3_2)
1570       .Case("yonah", CK_Yonah)
1571       .Case("pentium4", CK_Pentium4)
1572       .Case("pentium4m", CK_Pentium4M)
1573       .Case("prescott", CK_Prescott)
1574       .Case("nocona", CK_Nocona)
1575       .Case("core2", CK_Core2)
1576       .Case("penryn", CK_Penryn)
1577       .Case("atom", CK_Atom)
1578       .Case("corei7", CK_Corei7)
1579       .Case("corei7-avx", CK_Corei7AVX)
1580       .Case("core-avx-i", CK_CoreAVXi)
1581       .Case("core-avx2", CK_CoreAVX2)
1582       .Case("k6", CK_K6)
1583       .Case("k6-2", CK_K6_2)
1584       .Case("k6-3", CK_K6_3)
1585       .Case("athlon", CK_Athlon)
1586       .Case("athlon-tbird", CK_AthlonThunderbird)
1587       .Case("athlon-4", CK_Athlon4)
1588       .Case("athlon-xp", CK_AthlonXP)
1589       .Case("athlon-mp", CK_AthlonMP)
1590       .Case("athlon64", CK_Athlon64)
1591       .Case("athlon64-sse3", CK_Athlon64SSE3)
1592       .Case("athlon-fx", CK_AthlonFX)
1593       .Case("k8", CK_K8)
1594       .Case("k8-sse3", CK_K8SSE3)
1595       .Case("opteron", CK_Opteron)
1596       .Case("opteron-sse3", CK_OpteronSSE3)
1597       .Case("amdfam10", CK_AMDFAM10)
1598       .Case("btver1", CK_BTVER1)
1599       .Case("bdver1", CK_BDVER1)
1600       .Case("bdver2", CK_BDVER2)
1601       .Case("x86-64", CK_x86_64)
1602       .Case("geode", CK_Geode)
1603       .Default(CK_Generic);
1604 
1605     // Perform any per-CPU checks necessary to determine if this CPU is
1606     // acceptable.
1607     // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1608     // invalid without explaining *why*.
1609     switch (CPU) {
1610     case CK_Generic:
1611       // No processor selected!
1612       return false;
1613 
1614     case CK_i386:
1615     case CK_i486:
1616     case CK_WinChipC6:
1617     case CK_WinChip2:
1618     case CK_C3:
1619     case CK_i586:
1620     case CK_Pentium:
1621     case CK_PentiumMMX:
1622     case CK_i686:
1623     case CK_PentiumPro:
1624     case CK_Pentium2:
1625     case CK_Pentium3:
1626     case CK_Pentium3M:
1627     case CK_PentiumM:
1628     case CK_Yonah:
1629     case CK_C3_2:
1630     case CK_Pentium4:
1631     case CK_Pentium4M:
1632     case CK_Prescott:
1633     case CK_K6:
1634     case CK_K6_2:
1635     case CK_K6_3:
1636     case CK_Athlon:
1637     case CK_AthlonThunderbird:
1638     case CK_Athlon4:
1639     case CK_AthlonXP:
1640     case CK_AthlonMP:
1641     case CK_Geode:
1642       // Only accept certain architectures when compiling in 32-bit mode.
1643       if (PointerWidth != 32)
1644         return false;
1645 
1646       // Fallthrough
1647     case CK_Nocona:
1648     case CK_Core2:
1649     case CK_Penryn:
1650     case CK_Atom:
1651     case CK_Corei7:
1652     case CK_Corei7AVX:
1653     case CK_CoreAVXi:
1654     case CK_CoreAVX2:
1655     case CK_Athlon64:
1656     case CK_Athlon64SSE3:
1657     case CK_AthlonFX:
1658     case CK_K8:
1659     case CK_K8SSE3:
1660     case CK_Opteron:
1661     case CK_OpteronSSE3:
1662     case CK_AMDFAM10:
1663     case CK_BTVER1:
1664     case CK_BDVER1:
1665     case CK_BDVER2:
1666     case CK_x86_64:
1667       return true;
1668     }
1669     llvm_unreachable("Unhandled CPU kind");
1670   }
1671 };
1672 
getDefaultFeatures(llvm::StringMap<bool> & Features) const1673 void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1674   // FIXME: This should not be here.
1675   Features["3dnow"] = false;
1676   Features["3dnowa"] = false;
1677   Features["mmx"] = false;
1678   Features["sse"] = false;
1679   Features["sse2"] = false;
1680   Features["sse3"] = false;
1681   Features["ssse3"] = false;
1682   Features["sse41"] = false;
1683   Features["sse42"] = false;
1684   Features["sse4a"] = false;
1685   Features["aes"] = false;
1686   Features["pclmul"] = false;
1687   Features["avx"] = false;
1688   Features["avx2"] = false;
1689   Features["lzcnt"] = false;
1690   Features["rdrand"] = false;
1691   Features["bmi"] = false;
1692   Features["bmi2"] = false;
1693   Features["popcnt"] = false;
1694   Features["fma4"] = false;
1695   Features["fma"] = false;
1696   Features["xop"] = false;
1697 
1698   // FIXME: This *really* should not be here.
1699 
1700   // X86_64 always has SSE2.
1701   if (PointerWidth == 64)
1702     Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1703 
1704   switch (CPU) {
1705   case CK_Generic:
1706   case CK_i386:
1707   case CK_i486:
1708   case CK_i586:
1709   case CK_Pentium:
1710   case CK_i686:
1711   case CK_PentiumPro:
1712     break;
1713   case CK_PentiumMMX:
1714   case CK_Pentium2:
1715     setFeatureEnabled(Features, "mmx", true);
1716     break;
1717   case CK_Pentium3:
1718   case CK_Pentium3M:
1719     setFeatureEnabled(Features, "mmx", true);
1720     setFeatureEnabled(Features, "sse", true);
1721     break;
1722   case CK_PentiumM:
1723   case CK_Pentium4:
1724   case CK_Pentium4M:
1725   case CK_x86_64:
1726     setFeatureEnabled(Features, "mmx", true);
1727     setFeatureEnabled(Features, "sse2", true);
1728     break;
1729   case CK_Yonah:
1730   case CK_Prescott:
1731   case CK_Nocona:
1732     setFeatureEnabled(Features, "mmx", true);
1733     setFeatureEnabled(Features, "sse3", true);
1734     break;
1735   case CK_Core2:
1736     setFeatureEnabled(Features, "mmx", true);
1737     setFeatureEnabled(Features, "ssse3", true);
1738     break;
1739   case CK_Penryn:
1740     setFeatureEnabled(Features, "mmx", true);
1741     setFeatureEnabled(Features, "sse4.1", true);
1742     break;
1743   case CK_Atom:
1744     setFeatureEnabled(Features, "mmx", true);
1745     setFeatureEnabled(Features, "ssse3", true);
1746     break;
1747   case CK_Corei7:
1748     setFeatureEnabled(Features, "mmx", true);
1749     setFeatureEnabled(Features, "sse4", true);
1750     break;
1751   case CK_Corei7AVX:
1752     setFeatureEnabled(Features, "mmx", true);
1753     setFeatureEnabled(Features, "avx", true);
1754     setFeatureEnabled(Features, "aes", true);
1755     setFeatureEnabled(Features, "pclmul", true);
1756     break;
1757   case CK_CoreAVXi:
1758     setFeatureEnabled(Features, "mmx", true);
1759     setFeatureEnabled(Features, "avx", true);
1760     setFeatureEnabled(Features, "aes", true);
1761     setFeatureEnabled(Features, "pclmul", true);
1762     setFeatureEnabled(Features, "rdrnd", true);
1763     break;
1764   case CK_CoreAVX2:
1765     setFeatureEnabled(Features, "mmx", true);
1766     setFeatureEnabled(Features, "avx2", true);
1767     setFeatureEnabled(Features, "aes", true);
1768     setFeatureEnabled(Features, "pclmul", true);
1769     setFeatureEnabled(Features, "lzcnt", true);
1770     setFeatureEnabled(Features, "rdrnd", true);
1771     setFeatureEnabled(Features, "bmi", true);
1772     setFeatureEnabled(Features, "bmi2", true);
1773     setFeatureEnabled(Features, "fma", true);
1774     break;
1775   case CK_K6:
1776   case CK_WinChipC6:
1777     setFeatureEnabled(Features, "mmx", true);
1778     break;
1779   case CK_K6_2:
1780   case CK_K6_3:
1781   case CK_WinChip2:
1782   case CK_C3:
1783     setFeatureEnabled(Features, "3dnow", true);
1784     break;
1785   case CK_Athlon:
1786   case CK_AthlonThunderbird:
1787   case CK_Geode:
1788     setFeatureEnabled(Features, "3dnowa", true);
1789     break;
1790   case CK_Athlon4:
1791   case CK_AthlonXP:
1792   case CK_AthlonMP:
1793     setFeatureEnabled(Features, "sse", true);
1794     setFeatureEnabled(Features, "3dnowa", true);
1795     break;
1796   case CK_K8:
1797   case CK_Opteron:
1798   case CK_Athlon64:
1799   case CK_AthlonFX:
1800     setFeatureEnabled(Features, "sse2", true);
1801     setFeatureEnabled(Features, "3dnowa", true);
1802     break;
1803   case CK_K8SSE3:
1804   case CK_OpteronSSE3:
1805   case CK_Athlon64SSE3:
1806     setFeatureEnabled(Features, "sse3", true);
1807     setFeatureEnabled(Features, "3dnowa", true);
1808     break;
1809   case CK_AMDFAM10:
1810     setFeatureEnabled(Features, "sse3", true);
1811     setFeatureEnabled(Features, "sse4a", true);
1812     setFeatureEnabled(Features, "3dnowa", true);
1813     break;
1814   case CK_BTVER1:
1815     setFeatureEnabled(Features, "ssse3", true);
1816     setFeatureEnabled(Features, "sse4a", true);
1817     break;
1818   case CK_BDVER1:
1819   case CK_BDVER2:
1820     setFeatureEnabled(Features, "avx", true);
1821     setFeatureEnabled(Features, "xop", true);
1822     setFeatureEnabled(Features, "aes", true);
1823     setFeatureEnabled(Features, "pclmul", true);
1824     break;
1825   case CK_C3_2:
1826     setFeatureEnabled(Features, "mmx", true);
1827     setFeatureEnabled(Features, "sse", true);
1828     break;
1829   }
1830 }
1831 
setFeatureEnabled(llvm::StringMap<bool> & Features,StringRef Name,bool Enabled) const1832 bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1833                                       StringRef Name,
1834                                       bool Enabled) const {
1835   // FIXME: This *really* should not be here.  We need some way of translating
1836   // options into llvm subtarget features.
1837   if (!Features.count(Name) &&
1838       (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1" &&
1839        Name != "rdrnd"))
1840     return false;
1841 
1842   // FIXME: this should probably use a switch with fall through.
1843 
1844   if (Enabled) {
1845     if (Name == "mmx")
1846       Features["mmx"] = true;
1847     else if (Name == "sse")
1848       Features["mmx"] = Features["sse"] = true;
1849     else if (Name == "sse2")
1850       Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1851     else if (Name == "sse3")
1852       Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1853         true;
1854     else if (Name == "ssse3")
1855       Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1856         Features["ssse3"] = true;
1857     else if (Name == "sse4" || Name == "sse4.2")
1858       Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1859         Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1860         Features["popcnt"] = true;
1861     else if (Name == "sse4.1")
1862       Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1863         Features["ssse3"] = Features["sse41"] = true;
1864     else if (Name == "3dnow")
1865       Features["mmx"] = Features["3dnow"] = true;
1866     else if (Name == "3dnowa")
1867       Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
1868     else if (Name == "aes")
1869       Features["sse"] = Features["sse2"] = Features["aes"] = true;
1870     else if (Name == "pclmul")
1871       Features["sse"] = Features["sse2"] = Features["pclmul"] = true;
1872     else if (Name == "avx")
1873       Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1874         Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1875         Features["popcnt"] = Features["avx"] = true;
1876     else if (Name == "avx2")
1877       Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1878         Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1879         Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
1880     else if (Name == "fma")
1881       Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1882         Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1883         Features["popcnt"] = Features["avx"] = Features["fma"] = true;
1884     else if (Name == "fma4")
1885         Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1886         Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1887         Features["popcnt"] = Features["avx"] = Features["sse4a"] =
1888         Features["fma4"] = true;
1889     else if (Name == "xop")
1890         Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1891         Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1892         Features["popcnt"] = Features["avx"] = Features["sse4a"] =
1893         Features["fma4"] = Features["xop"] = true;
1894     else if (Name == "sse4a")
1895       Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1896         Features["sse4a"] = true;
1897     else if (Name == "lzcnt")
1898       Features["lzcnt"] = true;
1899     else if (Name == "rdrnd")
1900       Features["rdrand"] = true;
1901     else if (Name == "bmi")
1902       Features["bmi"] = true;
1903     else if (Name == "bmi2")
1904       Features["bmi2"] = true;
1905     else if (Name == "popcnt")
1906       Features["popcnt"] = true;
1907   } else {
1908     if (Name == "mmx")
1909       Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
1910     else if (Name == "sse")
1911       Features["sse"] = Features["sse2"] = Features["sse3"] =
1912         Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1913         Features["sse4a"] = Features["avx"] = Features["avx2"] =
1914         Features["fma"] = Features["fma4"] = Features["aes"] =
1915         Features["pclmul"] = Features["xop"] = false;
1916     else if (Name == "sse2")
1917       Features["sse2"] = Features["sse3"] = Features["ssse3"] =
1918         Features["sse41"] = Features["sse42"] = Features["sse4a"] =
1919         Features["avx"] = Features["avx2"] = Features["fma"] =
1920         Features["fma4"] = Features["aes"] = Features["pclmul"] =
1921         Features["xop"] = false;
1922     else if (Name == "sse3")
1923       Features["sse3"] = Features["ssse3"] = Features["sse41"] =
1924         Features["sse42"] = Features["sse4a"] = Features["avx"] =
1925         Features["avx2"] = Features["fma"] = Features["fma4"] =
1926         Features["xop"] = false;
1927     else if (Name == "ssse3")
1928       Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1929         Features["avx"] = Features["avx2"] = Features["fma"] = false;
1930     else if (Name == "sse4" || Name == "sse4.1")
1931       Features["sse41"] = Features["sse42"] = Features["avx"] =
1932         Features["avx2"] = Features["fma"] = false;
1933     else if (Name == "sse4.2")
1934       Features["sse42"] = Features["avx"] = Features["avx2"] =
1935         Features["fma"] = false;
1936     else if (Name == "3dnow")
1937       Features["3dnow"] = Features["3dnowa"] = false;
1938     else if (Name == "3dnowa")
1939       Features["3dnowa"] = false;
1940     else if (Name == "aes")
1941       Features["aes"] = false;
1942     else if (Name == "pclmul")
1943       Features["pclmul"] = false;
1944     else if (Name == "avx")
1945       Features["avx"] = Features["avx2"] = Features["fma"] =
1946         Features["fma4"] = Features["xop"] = false;
1947     else if (Name == "avx2")
1948       Features["avx2"] = false;
1949     else if (Name == "fma")
1950       Features["fma"] = false;
1951     else if (Name == "sse4a")
1952       Features["sse4a"] = Features["fma4"] = Features["xop"] = false;
1953     else if (Name == "lzcnt")
1954       Features["lzcnt"] = false;
1955     else if (Name == "rdrnd")
1956       Features["rdrand"] = false;
1957     else if (Name == "bmi")
1958       Features["bmi"] = false;
1959     else if (Name == "bmi2")
1960       Features["bmi2"] = false;
1961     else if (Name == "popcnt")
1962       Features["popcnt"] = false;
1963     else if (Name == "fma4")
1964       Features["fma4"] = Features["xop"] = false;
1965     else if (Name == "xop")
1966       Features["xop"] = false;
1967   }
1968 
1969   return true;
1970 }
1971 
1972 /// HandleTargetOptions - Perform initialization based on the user
1973 /// configured set of features.
HandleTargetFeatures(std::vector<std::string> & Features)1974 void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
1975   // Remember the maximum enabled sselevel.
1976   for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1977     // Ignore disabled features.
1978     if (Features[i][0] == '-')
1979       continue;
1980 
1981     StringRef Feature = StringRef(Features[i]).substr(1);
1982 
1983     if (Feature == "aes") {
1984       HasAES = true;
1985       continue;
1986     }
1987 
1988     if (Feature == "pclmul") {
1989       HasPCLMUL = true;
1990       continue;
1991     }
1992 
1993     if (Feature == "lzcnt") {
1994       HasLZCNT = true;
1995       continue;
1996     }
1997 
1998     if (Feature == "rdrand") {
1999       HasRDRND = true;
2000       continue;
2001     }
2002 
2003     if (Feature == "bmi") {
2004       HasBMI = true;
2005       continue;
2006     }
2007 
2008     if (Feature == "bmi2") {
2009       HasBMI2 = true;
2010       continue;
2011     }
2012 
2013     if (Feature == "popcnt") {
2014       HasPOPCNT = true;
2015       continue;
2016     }
2017 
2018     if (Feature == "sse4a") {
2019       HasSSE4a = true;
2020       continue;
2021     }
2022 
2023     if (Feature == "fma4") {
2024       HasFMA4 = true;
2025       continue;
2026     }
2027 
2028     if (Feature == "fma") {
2029       HasFMA = true;
2030       continue;
2031     }
2032 
2033     if (Feature == "xop") {
2034       HasXOP = true;
2035       continue;
2036     }
2037 
2038     assert(Features[i][0] == '+' && "Invalid target feature!");
2039     X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
2040       .Case("avx2", AVX2)
2041       .Case("avx", AVX)
2042       .Case("sse42", SSE42)
2043       .Case("sse41", SSE41)
2044       .Case("ssse3", SSSE3)
2045       .Case("sse3", SSE3)
2046       .Case("sse2", SSE2)
2047       .Case("sse", SSE1)
2048       .Default(NoSSE);
2049     SSELevel = std::max(SSELevel, Level);
2050 
2051     MMX3DNowEnum ThreeDNowLevel =
2052       llvm::StringSwitch<MMX3DNowEnum>(Feature)
2053         .Case("3dnowa", AMD3DNowAthlon)
2054         .Case("3dnow", AMD3DNow)
2055         .Case("mmx", MMX)
2056         .Default(NoMMX3DNow);
2057 
2058     MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
2059   }
2060 
2061   // Don't tell the backend if we're turning off mmx; it will end up disabling
2062   // SSE, which we don't want.
2063   std::vector<std::string>::iterator it;
2064   it = std::find(Features.begin(), Features.end(), "-mmx");
2065   if (it != Features.end())
2066     Features.erase(it);
2067 }
2068 
2069 /// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2070 /// definitions for this particular subtarget.
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2071 void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
2072                                      MacroBuilder &Builder) const {
2073   // Target identification.
2074   if (PointerWidth == 64) {
2075     Builder.defineMacro("__amd64__");
2076     Builder.defineMacro("__amd64");
2077     Builder.defineMacro("__x86_64");
2078     Builder.defineMacro("__x86_64__");
2079   } else {
2080     DefineStd(Builder, "i386", Opts);
2081   }
2082 
2083   // Subtarget options.
2084   // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2085   // truly should be based on -mtune options.
2086   switch (CPU) {
2087   case CK_Generic:
2088     break;
2089   case CK_i386:
2090     // The rest are coming from the i386 define above.
2091     Builder.defineMacro("__tune_i386__");
2092     break;
2093   case CK_i486:
2094   case CK_WinChipC6:
2095   case CK_WinChip2:
2096   case CK_C3:
2097     defineCPUMacros(Builder, "i486");
2098     break;
2099   case CK_PentiumMMX:
2100     Builder.defineMacro("__pentium_mmx__");
2101     Builder.defineMacro("__tune_pentium_mmx__");
2102     // Fallthrough
2103   case CK_i586:
2104   case CK_Pentium:
2105     defineCPUMacros(Builder, "i586");
2106     defineCPUMacros(Builder, "pentium");
2107     break;
2108   case CK_Pentium3:
2109   case CK_Pentium3M:
2110   case CK_PentiumM:
2111     Builder.defineMacro("__tune_pentium3__");
2112     // Fallthrough
2113   case CK_Pentium2:
2114   case CK_C3_2:
2115     Builder.defineMacro("__tune_pentium2__");
2116     // Fallthrough
2117   case CK_PentiumPro:
2118     Builder.defineMacro("__tune_i686__");
2119     Builder.defineMacro("__tune_pentiumpro__");
2120     // Fallthrough
2121   case CK_i686:
2122     Builder.defineMacro("__i686");
2123     Builder.defineMacro("__i686__");
2124     // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2125     Builder.defineMacro("__pentiumpro");
2126     Builder.defineMacro("__pentiumpro__");
2127     break;
2128   case CK_Pentium4:
2129   case CK_Pentium4M:
2130     defineCPUMacros(Builder, "pentium4");
2131     break;
2132   case CK_Yonah:
2133   case CK_Prescott:
2134   case CK_Nocona:
2135     defineCPUMacros(Builder, "nocona");
2136     break;
2137   case CK_Core2:
2138   case CK_Penryn:
2139     defineCPUMacros(Builder, "core2");
2140     break;
2141   case CK_Atom:
2142     defineCPUMacros(Builder, "atom");
2143     break;
2144   case CK_Corei7:
2145   case CK_Corei7AVX:
2146   case CK_CoreAVXi:
2147   case CK_CoreAVX2:
2148     defineCPUMacros(Builder, "corei7");
2149     break;
2150   case CK_K6_2:
2151     Builder.defineMacro("__k6_2__");
2152     Builder.defineMacro("__tune_k6_2__");
2153     // Fallthrough
2154   case CK_K6_3:
2155     if (CPU != CK_K6_2) {  // In case of fallthrough
2156       // FIXME: GCC may be enabling these in cases where some other k6
2157       // architecture is specified but -m3dnow is explicitly provided. The
2158       // exact semantics need to be determined and emulated here.
2159       Builder.defineMacro("__k6_3__");
2160       Builder.defineMacro("__tune_k6_3__");
2161     }
2162     // Fallthrough
2163   case CK_K6:
2164     defineCPUMacros(Builder, "k6");
2165     break;
2166   case CK_Athlon:
2167   case CK_AthlonThunderbird:
2168   case CK_Athlon4:
2169   case CK_AthlonXP:
2170   case CK_AthlonMP:
2171     defineCPUMacros(Builder, "athlon");
2172     if (SSELevel != NoSSE) {
2173       Builder.defineMacro("__athlon_sse__");
2174       Builder.defineMacro("__tune_athlon_sse__");
2175     }
2176     break;
2177   case CK_K8:
2178   case CK_K8SSE3:
2179   case CK_x86_64:
2180   case CK_Opteron:
2181   case CK_OpteronSSE3:
2182   case CK_Athlon64:
2183   case CK_Athlon64SSE3:
2184   case CK_AthlonFX:
2185     defineCPUMacros(Builder, "k8");
2186     break;
2187   case CK_AMDFAM10:
2188     defineCPUMacros(Builder, "amdfam10");
2189     break;
2190   case CK_BTVER1:
2191     defineCPUMacros(Builder, "btver1");
2192     break;
2193   case CK_BDVER1:
2194     defineCPUMacros(Builder, "bdver1");
2195     break;
2196   case CK_BDVER2:
2197     defineCPUMacros(Builder, "bdver2");
2198     break;
2199   case CK_Geode:
2200     defineCPUMacros(Builder, "geode");
2201     break;
2202   }
2203 
2204   // Target properties.
2205   Builder.defineMacro("__LITTLE_ENDIAN__");
2206   Builder.defineMacro("__REGISTER_PREFIX__", "");
2207 
2208   // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2209   // functions in glibc header files that use FP Stack inline asm which the
2210   // backend can't deal with (PR879).
2211   Builder.defineMacro("__NO_MATH_INLINES");
2212 
2213   if (HasAES)
2214     Builder.defineMacro("__AES__");
2215 
2216   if (HasPCLMUL)
2217     Builder.defineMacro("__PCLMUL__");
2218 
2219   if (HasLZCNT)
2220     Builder.defineMacro("__LZCNT__");
2221 
2222   if (HasRDRND)
2223     Builder.defineMacro("__RDRND__");
2224 
2225   if (HasBMI)
2226     Builder.defineMacro("__BMI__");
2227 
2228   if (HasBMI2)
2229     Builder.defineMacro("__BMI2__");
2230 
2231   if (HasPOPCNT)
2232     Builder.defineMacro("__POPCNT__");
2233 
2234   if (HasSSE4a)
2235     Builder.defineMacro("__SSE4A__");
2236 
2237   if (HasFMA4)
2238     Builder.defineMacro("__FMA4__");
2239 
2240   if (HasFMA)
2241     Builder.defineMacro("__FMA__");
2242 
2243   if (HasXOP)
2244     Builder.defineMacro("__XOP__");
2245 
2246   // Each case falls through to the previous one here.
2247   switch (SSELevel) {
2248   case AVX2:
2249     Builder.defineMacro("__AVX2__");
2250   case AVX:
2251     Builder.defineMacro("__AVX__");
2252   case SSE42:
2253     Builder.defineMacro("__SSE4_2__");
2254   case SSE41:
2255     Builder.defineMacro("__SSE4_1__");
2256   case SSSE3:
2257     Builder.defineMacro("__SSSE3__");
2258   case SSE3:
2259     Builder.defineMacro("__SSE3__");
2260   case SSE2:
2261     Builder.defineMacro("__SSE2__");
2262     Builder.defineMacro("__SSE2_MATH__");  // -mfp-math=sse always implied.
2263   case SSE1:
2264     Builder.defineMacro("__SSE__");
2265     Builder.defineMacro("__SSE_MATH__");   // -mfp-math=sse always implied.
2266   case NoSSE:
2267     break;
2268   }
2269 
2270   if (Opts.MicrosoftExt && PointerWidth == 32) {
2271     switch (SSELevel) {
2272     case AVX2:
2273     case AVX:
2274     case SSE42:
2275     case SSE41:
2276     case SSSE3:
2277     case SSE3:
2278     case SSE2:
2279       Builder.defineMacro("_M_IX86_FP", Twine(2));
2280       break;
2281     case SSE1:
2282       Builder.defineMacro("_M_IX86_FP", Twine(1));
2283       break;
2284     default:
2285       Builder.defineMacro("_M_IX86_FP", Twine(0));
2286     }
2287   }
2288 
2289   // Each case falls through to the previous one here.
2290   switch (MMX3DNowLevel) {
2291   case AMD3DNowAthlon:
2292     Builder.defineMacro("__3dNOW_A__");
2293   case AMD3DNow:
2294     Builder.defineMacro("__3dNOW__");
2295   case MMX:
2296     Builder.defineMacro("__MMX__");
2297   case NoMMX3DNow:
2298     break;
2299   }
2300 }
2301 
hasFeature(StringRef Feature) const2302 bool X86TargetInfo::hasFeature(StringRef Feature) const {
2303   return llvm::StringSwitch<bool>(Feature)
2304       .Case("aes", HasAES)
2305       .Case("avx", SSELevel >= AVX)
2306       .Case("avx2", SSELevel >= AVX2)
2307       .Case("bmi", HasBMI)
2308       .Case("bmi2", HasBMI2)
2309       .Case("fma", HasFMA)
2310       .Case("fma4", HasFMA4)
2311       .Case("lzcnt", HasLZCNT)
2312       .Case("rdrnd", HasRDRND)
2313       .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2314       .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2315       .Case("mmx", MMX3DNowLevel >= MMX)
2316       .Case("pclmul", HasPCLMUL)
2317       .Case("popcnt", HasPOPCNT)
2318       .Case("sse", SSELevel >= SSE1)
2319       .Case("sse2", SSELevel >= SSE2)
2320       .Case("sse3", SSELevel >= SSE3)
2321       .Case("ssse3", SSELevel >= SSSE3)
2322       .Case("sse41", SSELevel >= SSE41)
2323       .Case("sse42", SSELevel >= SSE42)
2324       .Case("sse4a", HasSSE4a)
2325       .Case("x86", true)
2326       .Case("x86_32", PointerWidth == 32)
2327       .Case("x86_64", PointerWidth == 64)
2328       .Case("xop", HasXOP)
2329       .Default(false);
2330 }
2331 
2332 bool
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info) const2333 X86TargetInfo::validateAsmConstraint(const char *&Name,
2334                                      TargetInfo::ConstraintInfo &Info) const {
2335   switch (*Name) {
2336   default: return false;
2337   case 'Y': // first letter of a pair:
2338     switch (*(Name+1)) {
2339     default: return false;
2340     case '0':  // First SSE register.
2341     case 't':  // Any SSE register, when SSE2 is enabled.
2342     case 'i':  // Any SSE register, when SSE2 and inter-unit moves enabled.
2343     case 'm':  // any MMX register, when inter-unit moves enabled.
2344       break;   // falls through to setAllowsRegister.
2345   }
2346   case 'a': // eax.
2347   case 'b': // ebx.
2348   case 'c': // ecx.
2349   case 'd': // edx.
2350   case 'S': // esi.
2351   case 'D': // edi.
2352   case 'A': // edx:eax.
2353   case 'f': // any x87 floating point stack register.
2354   case 't': // top of floating point stack.
2355   case 'u': // second from top of floating point stack.
2356   case 'q': // Any register accessible as [r]l: a, b, c, and d.
2357   case 'y': // Any MMX register.
2358   case 'x': // Any SSE register.
2359   case 'Q': // Any register accessible as [r]h: a, b, c, and d.
2360   case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2361   case 'l': // "Index" registers: any general register that can be used as an
2362             // index in a base+index memory access.
2363     Info.setAllowsRegister();
2364     return true;
2365   case 'C': // SSE floating point constant.
2366   case 'G': // x87 floating point constant.
2367   case 'e': // 32-bit signed integer constant for use with zero-extending
2368             // x86_64 instructions.
2369   case 'Z': // 32-bit unsigned integer constant for use with zero-extending
2370             // x86_64 instructions.
2371     return true;
2372   }
2373 }
2374 
2375 
2376 std::string
convertConstraint(const char * & Constraint) const2377 X86TargetInfo::convertConstraint(const char *&Constraint) const {
2378   switch (*Constraint) {
2379   case 'a': return std::string("{ax}");
2380   case 'b': return std::string("{bx}");
2381   case 'c': return std::string("{cx}");
2382   case 'd': return std::string("{dx}");
2383   case 'S': return std::string("{si}");
2384   case 'D': return std::string("{di}");
2385   case 'p': // address
2386     return std::string("im");
2387   case 't': // top of floating point stack.
2388     return std::string("{st}");
2389   case 'u': // second from top of floating point stack.
2390     return std::string("{st(1)}"); // second from top of floating point stack.
2391   default:
2392     return std::string(1, *Constraint);
2393   }
2394 }
2395 } // end anonymous namespace
2396 
2397 namespace {
2398 // X86-32 generic target
2399 class X86_32TargetInfo : public X86TargetInfo {
2400 public:
X86_32TargetInfo(const std::string & triple)2401   X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2402     DoubleAlign = LongLongAlign = 32;
2403     LongDoubleWidth = 96;
2404     LongDoubleAlign = 32;
2405     SuitableAlign = 128;
2406     DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2407                         "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
2408                         "a0:0:64-f80:32:32-n8:16:32-S128";
2409     SizeType = UnsignedInt;
2410     PtrDiffType = SignedInt;
2411     IntPtrType = SignedInt;
2412     RegParmMax = 3;
2413 
2414     // Use fpret for all types.
2415     RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2416                              (1 << TargetInfo::Double) |
2417                              (1 << TargetInfo::LongDouble));
2418 
2419     // x86-32 has atomics up to 8 bytes
2420     // FIXME: Check that we actually have cmpxchg8b before setting
2421     // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2422     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
2423   }
getBuiltinVaListKind() const2424   virtual BuiltinVaListKind getBuiltinVaListKind() const {
2425     return TargetInfo::CharPtrBuiltinVaList;
2426   }
2427 
getEHDataRegisterNumber(unsigned RegNo) const2428   int getEHDataRegisterNumber(unsigned RegNo) const {
2429     if (RegNo == 0) return 0;
2430     if (RegNo == 1) return 2;
2431     return -1;
2432   }
2433 };
2434 } // end anonymous namespace
2435 
2436 namespace {
2437 class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2438 public:
NetBSDI386TargetInfo(const std::string & triple)2439   NetBSDI386TargetInfo(const std::string &triple) :
2440     NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2441   }
2442 
getFloatEvalMethod() const2443   virtual unsigned getFloatEvalMethod() const {
2444     // NetBSD defaults to "double" rounding
2445     return 1;
2446   }
2447 };
2448 } // end anonymous namespace
2449 
2450 namespace {
2451 class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2452 public:
OpenBSDI386TargetInfo(const std::string & triple)2453   OpenBSDI386TargetInfo(const std::string& triple) :
2454     OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2455     SizeType = UnsignedLong;
2456     IntPtrType = SignedLong;
2457     PtrDiffType = SignedLong;
2458   }
2459 };
2460 } // end anonymous namespace
2461 
2462 namespace {
2463 class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
2464 public:
BitrigI386TargetInfo(const std::string & triple)2465   BitrigI386TargetInfo(const std::string& triple) :
2466     BitrigTargetInfo<X86_32TargetInfo>(triple) {
2467     SizeType = UnsignedLong;
2468     IntPtrType = SignedLong;
2469     PtrDiffType = SignedLong;
2470   }
2471 };
2472 } // end anonymous namespace
2473 
2474 namespace {
2475 class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
2476 public:
DarwinI386TargetInfo(const std::string & triple)2477   DarwinI386TargetInfo(const std::string& triple) :
2478     DarwinTargetInfo<X86_32TargetInfo>(triple) {
2479     LongDoubleWidth = 128;
2480     LongDoubleAlign = 128;
2481     SuitableAlign = 128;
2482     MaxVectorAlign = 256;
2483     SizeType = UnsignedLong;
2484     IntPtrType = SignedLong;
2485     DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2486                         "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
2487                         "a0:0:64-f80:128:128-n8:16:32-S128";
2488     HasAlignMac68kSupport = true;
2489   }
2490 
2491 };
2492 } // end anonymous namespace
2493 
2494 namespace {
2495 // x86-32 Windows target
2496 class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
2497 public:
WindowsX86_32TargetInfo(const std::string & triple)2498   WindowsX86_32TargetInfo(const std::string& triple)
2499     : WindowsTargetInfo<X86_32TargetInfo>(triple) {
2500     TLSSupported = false;
2501     WCharType = UnsignedShort;
2502     DoubleAlign = LongLongAlign = 64;
2503     DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2504                         "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
2505                         "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
2506   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2507   virtual void getTargetDefines(const LangOptions &Opts,
2508                                 MacroBuilder &Builder) const {
2509     WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2510   }
2511 };
2512 } // end anonymous namespace
2513 
2514 namespace {
2515 
2516 // x86-32 Windows Visual Studio target
2517 class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2518 public:
VisualStudioWindowsX86_32TargetInfo(const std::string & triple)2519   VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2520     : WindowsX86_32TargetInfo(triple) {
2521     LongDoubleWidth = LongDoubleAlign = 64;
2522     LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2523   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2524   virtual void getTargetDefines(const LangOptions &Opts,
2525                                 MacroBuilder &Builder) const {
2526     WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2527     WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2528     // The value of the following reflects processor type.
2529     // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2530     // We lost the original triple, so we use the default.
2531     Builder.defineMacro("_M_IX86", "600");
2532   }
2533 };
2534 } // end anonymous namespace
2535 
2536 namespace {
2537 // x86-32 MinGW target
2538 class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2539 public:
MinGWX86_32TargetInfo(const std::string & triple)2540   MinGWX86_32TargetInfo(const std::string& triple)
2541     : WindowsX86_32TargetInfo(triple) {
2542   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2543   virtual void getTargetDefines(const LangOptions &Opts,
2544                                 MacroBuilder &Builder) const {
2545     WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2546     DefineStd(Builder, "WIN32", Opts);
2547     DefineStd(Builder, "WINNT", Opts);
2548     Builder.defineMacro("_X86_");
2549     Builder.defineMacro("__MSVCRT__");
2550     Builder.defineMacro("__MINGW32__");
2551 
2552     // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2553     // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
2554     if (Opts.MicrosoftExt)
2555       // Provide "as-is" __declspec.
2556       Builder.defineMacro("__declspec", "__declspec");
2557     else
2558       // Provide alias of __attribute__ like mingw32-gcc.
2559       Builder.defineMacro("__declspec(a)", "__attribute__((a))");
2560   }
2561 };
2562 } // end anonymous namespace
2563 
2564 namespace {
2565 // x86-32 Cygwin target
2566 class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2567 public:
CygwinX86_32TargetInfo(const std::string & triple)2568   CygwinX86_32TargetInfo(const std::string& triple)
2569     : X86_32TargetInfo(triple) {
2570     TLSSupported = false;
2571     WCharType = UnsignedShort;
2572     DoubleAlign = LongLongAlign = 64;
2573     DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2574                         "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
2575                         "a0:0:64-f80:32:32-n8:16:32-S32";
2576   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2577   virtual void getTargetDefines(const LangOptions &Opts,
2578                                 MacroBuilder &Builder) const {
2579     X86_32TargetInfo::getTargetDefines(Opts, Builder);
2580     Builder.defineMacro("__CYGWIN__");
2581     Builder.defineMacro("__CYGWIN32__");
2582     DefineStd(Builder, "unix", Opts);
2583     if (Opts.CPlusPlus)
2584       Builder.defineMacro("_GNU_SOURCE");
2585   }
2586 };
2587 } // end anonymous namespace
2588 
2589 namespace {
2590 // x86-32 Haiku target
2591 class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2592 public:
HaikuX86_32TargetInfo(const std::string & triple)2593   HaikuX86_32TargetInfo(const std::string& triple)
2594     : X86_32TargetInfo(triple) {
2595     SizeType = UnsignedLong;
2596     IntPtrType = SignedLong;
2597     PtrDiffType = SignedLong;
2598     this->UserLabelPrefix = "";
2599   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2600   virtual void getTargetDefines(const LangOptions &Opts,
2601                                 MacroBuilder &Builder) const {
2602     X86_32TargetInfo::getTargetDefines(Opts, Builder);
2603     Builder.defineMacro("__INTEL__");
2604     Builder.defineMacro("__HAIKU__");
2605   }
2606 };
2607 } // end anonymous namespace
2608 
2609 // RTEMS Target
2610 template<typename Target>
2611 class RTEMSTargetInfo : public OSTargetInfo<Target> {
2612 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const2613   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2614                             MacroBuilder &Builder) const {
2615     // RTEMS defines; list based off of gcc output
2616 
2617     Builder.defineMacro("__rtems__");
2618     Builder.defineMacro("__ELF__");
2619   }
2620 public:
RTEMSTargetInfo(const std::string & triple)2621   RTEMSTargetInfo(const std::string &triple)
2622     : OSTargetInfo<Target>(triple) {
2623       this->UserLabelPrefix = "";
2624 
2625       llvm::Triple Triple(triple);
2626       switch (Triple.getArch()) {
2627         default:
2628         case llvm::Triple::x86:
2629           // this->MCountName = ".mcount";
2630           break;
2631         case llvm::Triple::mips:
2632         case llvm::Triple::mipsel:
2633         case llvm::Triple::ppc:
2634         case llvm::Triple::ppc64:
2635           // this->MCountName = "_mcount";
2636           break;
2637         case llvm::Triple::arm:
2638           // this->MCountName = "__mcount";
2639           break;
2640       }
2641 
2642     }
2643 };
2644 
2645 namespace {
2646 // x86-32 RTEMS target
2647 class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
2648 public:
RTEMSX86_32TargetInfo(const std::string & triple)2649   RTEMSX86_32TargetInfo(const std::string& triple)
2650     : X86_32TargetInfo(triple) {
2651     SizeType = UnsignedLong;
2652     IntPtrType = SignedLong;
2653     PtrDiffType = SignedLong;
2654     this->UserLabelPrefix = "";
2655   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2656   virtual void getTargetDefines(const LangOptions &Opts,
2657                                 MacroBuilder &Builder) const {
2658     X86_32TargetInfo::getTargetDefines(Opts, Builder);
2659     Builder.defineMacro("__INTEL__");
2660     Builder.defineMacro("__rtems__");
2661   }
2662 };
2663 } // end anonymous namespace
2664 
2665 namespace {
2666 // x86-64 generic target
2667 class X86_64TargetInfo : public X86TargetInfo {
2668 public:
X86_64TargetInfo(const std::string & triple)2669   X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
2670     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
2671     LongDoubleWidth = 128;
2672     LongDoubleAlign = 128;
2673     LargeArrayMinWidth = 128;
2674     LargeArrayAlign = 128;
2675     SuitableAlign = 128;
2676     IntMaxType = SignedLong;
2677     UIntMaxType = UnsignedLong;
2678     Int64Type = SignedLong;
2679     RegParmMax = 6;
2680 
2681     DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2682                         "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
2683                         "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
2684 
2685     // Use fpret only for long double.
2686     RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
2687 
2688     // Use fp2ret for _Complex long double.
2689     ComplexLongDoubleUsesFP2Ret = true;
2690 
2691     // x86-64 has atomics up to 16 bytes.
2692     // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
2693     // on CPUs with cmpxchg16b
2694     MaxAtomicPromoteWidth = 128;
2695     MaxAtomicInlineWidth = 64;
2696   }
getBuiltinVaListKind() const2697   virtual BuiltinVaListKind getBuiltinVaListKind() const {
2698     return TargetInfo::X86_64ABIBuiltinVaList;
2699   }
2700 
getEHDataRegisterNumber(unsigned RegNo) const2701   int getEHDataRegisterNumber(unsigned RegNo) const {
2702     if (RegNo == 0) return 0;
2703     if (RegNo == 1) return 1;
2704     return -1;
2705   }
2706 };
2707 } // end anonymous namespace
2708 
2709 namespace {
2710 // x86-64 Windows target
2711 class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
2712 public:
WindowsX86_64TargetInfo(const std::string & triple)2713   WindowsX86_64TargetInfo(const std::string& triple)
2714     : WindowsTargetInfo<X86_64TargetInfo>(triple) {
2715     TLSSupported = false;
2716     WCharType = UnsignedShort;
2717     LongWidth = LongAlign = 32;
2718     DoubleAlign = LongLongAlign = 64;
2719     IntMaxType = SignedLongLong;
2720     UIntMaxType = UnsignedLongLong;
2721     Int64Type = SignedLongLong;
2722     SizeType = UnsignedLongLong;
2723     PtrDiffType = SignedLongLong;
2724     IntPtrType = SignedLongLong;
2725     this->UserLabelPrefix = "";
2726   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2727   virtual void getTargetDefines(const LangOptions &Opts,
2728                                 MacroBuilder &Builder) const {
2729     WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
2730     Builder.defineMacro("_WIN64");
2731   }
getBuiltinVaListKind() const2732   virtual BuiltinVaListKind getBuiltinVaListKind() const {
2733     return TargetInfo::CharPtrBuiltinVaList;
2734   }
2735 };
2736 } // end anonymous namespace
2737 
2738 namespace {
2739 // x86-64 Windows Visual Studio target
2740 class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
2741 public:
VisualStudioWindowsX86_64TargetInfo(const std::string & triple)2742   VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
2743     : WindowsX86_64TargetInfo(triple) {
2744     LongDoubleWidth = LongDoubleAlign = 64;
2745     LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2746   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2747   virtual void getTargetDefines(const LangOptions &Opts,
2748                                 MacroBuilder &Builder) const {
2749     WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2750     WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
2751     Builder.defineMacro("_M_X64");
2752     Builder.defineMacro("_M_AMD64");
2753   }
2754 };
2755 } // end anonymous namespace
2756 
2757 namespace {
2758 // x86-64 MinGW target
2759 class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
2760 public:
MinGWX86_64TargetInfo(const std::string & triple)2761   MinGWX86_64TargetInfo(const std::string& triple)
2762     : WindowsX86_64TargetInfo(triple) {
2763   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2764   virtual void getTargetDefines(const LangOptions &Opts,
2765                                 MacroBuilder &Builder) const {
2766     WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2767     DefineStd(Builder, "WIN64", Opts);
2768     Builder.defineMacro("__MSVCRT__");
2769     Builder.defineMacro("__MINGW32__");
2770     Builder.defineMacro("__MINGW64__");
2771 
2772     // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2773     // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
2774     if (Opts.MicrosoftExt)
2775       // Provide "as-is" __declspec.
2776       Builder.defineMacro("__declspec", "__declspec");
2777     else
2778       // Provide alias of __attribute__ like mingw32-gcc.
2779       Builder.defineMacro("__declspec(a)", "__attribute__((a))");
2780   }
2781 };
2782 } // end anonymous namespace
2783 
2784 namespace {
2785 class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
2786 public:
DarwinX86_64TargetInfo(const std::string & triple)2787   DarwinX86_64TargetInfo(const std::string& triple)
2788       : DarwinTargetInfo<X86_64TargetInfo>(triple) {
2789     Int64Type = SignedLongLong;
2790     MaxVectorAlign = 256;
2791   }
2792 };
2793 } // end anonymous namespace
2794 
2795 namespace {
2796 class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
2797 public:
OpenBSDX86_64TargetInfo(const std::string & triple)2798   OpenBSDX86_64TargetInfo(const std::string& triple)
2799       : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
2800     IntMaxType = SignedLongLong;
2801     UIntMaxType = UnsignedLongLong;
2802     Int64Type = SignedLongLong;
2803   }
2804 };
2805 } // end anonymous namespace
2806 
2807 namespace {
2808 class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
2809 public:
BitrigX86_64TargetInfo(const std::string & triple)2810   BitrigX86_64TargetInfo(const std::string& triple)
2811       : BitrigTargetInfo<X86_64TargetInfo>(triple) {
2812      IntMaxType = SignedLongLong;
2813      UIntMaxType = UnsignedLongLong;
2814      Int64Type = SignedLongLong;
2815   }
2816 };
2817 } // end anonymous namespace
2818 
2819 namespace {
2820 class ARMTargetInfo : public TargetInfo {
2821   // Possible FPU choices.
2822   enum FPUMode {
2823     NoFPU,
2824     VFP2FPU,
2825     VFP3FPU,
2826     NeonFPU
2827   };
2828 
FPUModeIsVFP(FPUMode Mode)2829   static bool FPUModeIsVFP(FPUMode Mode) {
2830     return Mode >= VFP2FPU && Mode <= NeonFPU;
2831   }
2832 
2833   static const TargetInfo::GCCRegAlias GCCRegAliases[];
2834   static const char * const GCCRegNames[];
2835 
2836   std::string ABI, CPU;
2837 
2838   unsigned FPU : 3;
2839 
2840   unsigned IsThumb : 1;
2841 
2842   // Initialized via features.
2843   unsigned SoftFloat : 1;
2844   unsigned SoftFloatABI : 1;
2845 
2846   static const Builtin::Info BuiltinInfo[];
2847 
2848 public:
ARMTargetInfo(const std::string & TripleStr)2849   ARMTargetInfo(const std::string &TripleStr)
2850     : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
2851   {
2852     BigEndian = false;
2853     SizeType = UnsignedInt;
2854     PtrDiffType = SignedInt;
2855     // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
2856     WCharType = UnsignedInt;
2857 
2858     // {} in inline assembly are neon specifiers, not assembly variant
2859     // specifiers.
2860     NoAsmVariants = true;
2861 
2862     // FIXME: Should we just treat this as a feature?
2863     IsThumb = getTriple().getArchName().startswith("thumb");
2864     if (IsThumb) {
2865       // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2866       // so set preferred for small types to 32.
2867       DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2868                            "i64:64:64-f32:32:32-f64:64:64-"
2869                            "v64:64:64-v128:64:128-a0:0:32-n32-S64");
2870     } else {
2871       DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2872                            "i64:64:64-f32:32:32-f64:64:64-"
2873                            "v64:64:64-v128:64:128-a0:0:64-n32-S64");
2874     }
2875 
2876     // ARM targets default to using the ARM C++ ABI.
2877     CXXABI = CXXABI_ARM;
2878 
2879     // ARM has atomics up to 8 bytes
2880     // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
2881     MaxAtomicPromoteWidth = 64;
2882 
2883     // Do force alignment of members that follow zero length bitfields.  If
2884     // the alignment of the zero-length bitfield is greater than the member
2885     // that follows it, `bar', `bar' will be aligned as the  type of the
2886     // zero length bitfield.
2887     UseZeroLengthBitfieldAlignment = true;
2888   }
getABI() const2889   virtual const char *getABI() const { return ABI.c_str(); }
setABI(const std::string & Name)2890   virtual bool setABI(const std::string &Name) {
2891     ABI = Name;
2892 
2893     // The defaults (above) are for AAPCS, check if we need to change them.
2894     //
2895     // FIXME: We need support for -meabi... we could just mangle it into the
2896     // name.
2897     if (Name == "apcs-gnu") {
2898       DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
2899       SizeType = UnsignedLong;
2900 
2901       // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
2902       WCharType = SignedInt;
2903 
2904       // Do not respect the alignment of bit-field types when laying out
2905       // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
2906       UseBitFieldTypeAlignment = false;
2907 
2908       /// gcc forces the alignment to 4 bytes, regardless of the type of the
2909       /// zero length bitfield.  This corresponds to EMPTY_FIELD_BOUNDARY in
2910       /// gcc.
2911       ZeroLengthBitfieldBoundary = 32;
2912 
2913       if (IsThumb) {
2914         // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2915         // so set preferred for small types to 32.
2916         DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2917                              "i64:32:64-f32:32:32-f64:32:64-"
2918                              "v64:32:64-v128:32:128-a0:0:32-n32-S32");
2919       } else {
2920         DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2921                              "i64:32:64-f32:32:32-f64:32:64-"
2922                              "v64:32:64-v128:32:128-a0:0:32-n32-S32");
2923       }
2924 
2925       // FIXME: Override "preferred align" for double and long long.
2926     } else if (Name == "aapcs") {
2927       // FIXME: Enumerated types are variable width in straight AAPCS.
2928     } else if (Name == "aapcs-linux") {
2929       ;
2930     } else
2931       return false;
2932 
2933     return true;
2934   }
2935 
getDefaultFeatures(llvm::StringMap<bool> & Features) const2936   void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
2937     if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
2938       Features["vfp2"] = true;
2939     else if (CPU == "cortex-a8" || CPU == "cortex-a9")
2940       Features["neon"] = true;
2941   }
2942 
setFeatureEnabled(llvm::StringMap<bool> & Features,StringRef Name,bool Enabled) const2943   virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2944                                  StringRef Name,
2945                                  bool Enabled) const {
2946     if (Name == "soft-float" || Name == "soft-float-abi" ||
2947         Name == "vfp2" || Name == "vfp3" || Name == "neon" || Name == "d16" ||
2948         Name == "neonfp" || Name == "long64") {
2949       Features[Name] = Enabled;
2950     } else
2951       return false;
2952 
2953     return true;
2954   }
2955 
HandleTargetFeatures(std::vector<std::string> & Features)2956   virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2957     FPU = NoFPU;
2958     SoftFloat = SoftFloatABI = false;
2959     for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2960       if (Features[i] == "+soft-float")
2961         SoftFloat = true;
2962       else if (Features[i] == "+soft-float-abi")
2963         SoftFloatABI = true;
2964       else if (Features[i] == "+vfp2")
2965         FPU = VFP2FPU;
2966       else if (Features[i] == "+vfp3")
2967         FPU = VFP3FPU;
2968       else if (Features[i] == "+neon")
2969         FPU = NeonFPU;
2970       else if (Features[i] == "+long64")
2971         LongWidth = LongAlign = 64;  // RenderScript uses a 64-bit long type
2972     }
2973 
2974     // Remove front-end specific options which the backend handles differently.
2975     std::vector<std::string>::iterator it;
2976     it = std::find(Features.begin(), Features.end(), "+soft-float");
2977     if (it != Features.end())
2978       Features.erase(it);
2979     it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2980     if (it != Features.end())
2981       Features.erase(it);
2982   }
2983 
hasFeature(StringRef Feature) const2984   virtual bool hasFeature(StringRef Feature) const {
2985     return llvm::StringSwitch<bool>(Feature)
2986         .Case("arm", true)
2987         .Case("softfloat", SoftFloat)
2988         .Case("thumb", IsThumb)
2989         .Case("neon", FPU == NeonFPU && !SoftFloat &&
2990               StringRef(getCPUDefineSuffix(CPU)).startswith("7"))
2991         .Default(false);
2992   }
2993   // FIXME: Should we actually have some table instead of these switches?
getCPUDefineSuffix(StringRef Name)2994   static const char *getCPUDefineSuffix(StringRef Name) {
2995     return llvm::StringSwitch<const char*>(Name)
2996       .Cases("arm8", "arm810", "4")
2997       .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2998       .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2999       .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3000       .Case("ep9312", "4T")
3001       .Cases("arm10tdmi", "arm1020t", "5T")
3002       .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3003       .Case("arm926ej-s", "5TEJ")
3004       .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3005       .Cases("xscale", "iwmmxt", "5TE")
3006       .Case("arm1136j-s", "6J")
3007       .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
3008       .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
3009       .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
3010       .Cases("cortex-a8", "cortex-a9", "7A")
3011       .Cases("cortex-m3", "cortex-m4", "7M")
3012       .Case("cortex-m0", "6M")
3013       .Default(0);
3014   }
getCPUProfile(StringRef Name)3015   static const char *getCPUProfile(StringRef Name) {
3016     return llvm::StringSwitch<const char*>(Name)
3017       .Cases("cortex-a8", "cortex-a9", "A")
3018       .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
3019       .Default("");
3020   }
setCPU(const std::string & Name)3021   virtual bool setCPU(const std::string &Name) {
3022     if (!getCPUDefineSuffix(Name))
3023       return false;
3024 
3025     CPU = Name;
3026     return true;
3027   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3028   virtual void getTargetDefines(const LangOptions &Opts,
3029                                 MacroBuilder &Builder) const {
3030     // Target identification.
3031     Builder.defineMacro("__arm");
3032     Builder.defineMacro("__arm__");
3033 
3034     // Target properties.
3035     Builder.defineMacro("__ARMEL__");
3036     Builder.defineMacro("__LITTLE_ENDIAN__");
3037     Builder.defineMacro("__REGISTER_PREFIX__", "");
3038 
3039     StringRef CPUArch = getCPUDefineSuffix(CPU);
3040     Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
3041     Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3042     StringRef CPUProfile = getCPUProfile(CPU);
3043     if (!CPUProfile.empty())
3044       Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3045 
3046     // Subtarget options.
3047 
3048     // FIXME: It's more complicated than this and we don't really support
3049     // interworking.
3050     if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
3051       Builder.defineMacro("__THUMB_INTERWORK__");
3052 
3053     if (ABI == "aapcs" || ABI == "aapcs-linux") {
3054       Builder.defineMacro("__ARM_EABI__");
3055       Builder.defineMacro("__ARM_PCS", "1");
3056 
3057       if (!SoftFloat && !SoftFloatABI)
3058         Builder.defineMacro("__ARM_PCS_VFP", "1");
3059     }
3060 
3061     if (SoftFloat)
3062       Builder.defineMacro("__SOFTFP__");
3063 
3064     if (CPU == "xscale")
3065       Builder.defineMacro("__XSCALE__");
3066 
3067     bool IsARMv7 = CPUArch.startswith("7");
3068     if (IsThumb) {
3069       Builder.defineMacro("__THUMBEL__");
3070       Builder.defineMacro("__thumb__");
3071       if (CPUArch == "6T2" || IsARMv7)
3072         Builder.defineMacro("__thumb2__");
3073     }
3074 
3075     // Note, this is always on in gcc, even though it doesn't make sense.
3076     Builder.defineMacro("__APCS_32__");
3077 
3078     if (FPUModeIsVFP((FPUMode) FPU))
3079       Builder.defineMacro("__VFP_FP__");
3080 
3081     // This only gets set when Neon instructions are actually available, unlike
3082     // the VFP define, hence the soft float and arch check. This is subtly
3083     // different from gcc, we follow the intent which was that it should be set
3084     // when Neon instructions are actually available.
3085     if (FPU == NeonFPU && !SoftFloat && IsARMv7)
3086       Builder.defineMacro("__ARM_NEON__");
3087   }
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const3088   virtual void getTargetBuiltins(const Builtin::Info *&Records,
3089                                  unsigned &NumRecords) const {
3090     Records = BuiltinInfo;
3091     NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
3092   }
isCLZForZeroUndef() const3093   virtual bool isCLZForZeroUndef() const { return false; }
getBuiltinVaListKind() const3094   virtual BuiltinVaListKind getBuiltinVaListKind() const {
3095     return TargetInfo::VoidPtrBuiltinVaList;
3096   }
3097   virtual void getGCCRegNames(const char * const *&Names,
3098                               unsigned &NumNames) const;
3099   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3100                                 unsigned &NumAliases) const;
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info) const3101   virtual bool validateAsmConstraint(const char *&Name,
3102                                      TargetInfo::ConstraintInfo &Info) const {
3103     switch (*Name) {
3104     default: break;
3105     case 'l': // r0-r7
3106     case 'h': // r8-r15
3107     case 'w': // VFP Floating point register single precision
3108     case 'P': // VFP Floating point register double precision
3109       Info.setAllowsRegister();
3110       return true;
3111     case 'Q': // A memory address that is a single base register.
3112       Info.setAllowsMemory();
3113       return true;
3114     case 'U': // a memory reference...
3115       switch (Name[1]) {
3116       case 'q': // ...ARMV4 ldrsb
3117       case 'v': // ...VFP load/store (reg+constant offset)
3118       case 'y': // ...iWMMXt load/store
3119       case 't': // address valid for load/store opaque types wider
3120 	        // than 128-bits
3121       case 'n': // valid address for Neon doubleword vector load/store
3122       case 'm': // valid address for Neon element and structure load/store
3123       case 's': // valid address for non-offset loads/stores of quad-word
3124 	        // values in four ARM registers
3125         Info.setAllowsMemory();
3126         Name++;
3127         return true;
3128       }
3129     }
3130     return false;
3131   }
convertConstraint(const char * & Constraint) const3132   virtual std::string convertConstraint(const char *&Constraint) const {
3133     std::string R;
3134     switch (*Constraint) {
3135     case 'U':   // Two-character constraint; add "^" hint for later parsing.
3136       R = std::string("^") + std::string(Constraint, 2);
3137       Constraint++;
3138       break;
3139     case 'p': // 'p' should be translated to 'r' by default.
3140       R = std::string("r");
3141       break;
3142     default:
3143       return std::string(1, *Constraint);
3144     }
3145     return R;
3146   }
getClobbers() const3147   virtual const char *getClobbers() const {
3148     // FIXME: Is this really right?
3149     return "";
3150   }
3151 };
3152 
3153 const char * const ARMTargetInfo::GCCRegNames[] = {
3154   // Integer registers
3155   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3156   "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
3157 
3158   // Float registers
3159   "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3160   "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3161   "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3162   "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3163 
3164   // Double registers
3165   "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3166   "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3167   "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3168   "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3169 
3170   // Quad registers
3171   "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3172   "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
3173 };
3174 
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const3175 void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
3176                                    unsigned &NumNames) const {
3177   Names = GCCRegNames;
3178   NumNames = llvm::array_lengthof(GCCRegNames);
3179 }
3180 
3181 const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
3182   { { "a1" }, "r0" },
3183   { { "a2" }, "r1" },
3184   { { "a3" }, "r2" },
3185   { { "a4" }, "r3" },
3186   { { "v1" }, "r4" },
3187   { { "v2" }, "r5" },
3188   { { "v3" }, "r6" },
3189   { { "v4" }, "r7" },
3190   { { "v5" }, "r8" },
3191   { { "v6", "rfp" }, "r9" },
3192   { { "sl" }, "r10" },
3193   { { "fp" }, "r11" },
3194   { { "ip" }, "r12" },
3195   { { "r13" }, "sp" },
3196   { { "r14" }, "lr" },
3197   { { "r15" }, "pc" },
3198   // The S, D and Q registers overlap, but aren't really aliases; we
3199   // don't want to substitute one of these for a different-sized one.
3200 };
3201 
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const3202 void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3203                                        unsigned &NumAliases) const {
3204   Aliases = GCCRegAliases;
3205   NumAliases = llvm::array_lengthof(GCCRegAliases);
3206 }
3207 
3208 const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
3209 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3210 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3211                                               ALL_LANGUAGES },
3212 #include "clang/Basic/BuiltinsARM.def"
3213 };
3214 } // end anonymous namespace.
3215 
3216 namespace {
3217 class DarwinARMTargetInfo :
3218   public DarwinTargetInfo<ARMTargetInfo> {
3219 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const3220   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3221                             MacroBuilder &Builder) const {
3222     getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
3223   }
3224 
3225 public:
DarwinARMTargetInfo(const std::string & triple)3226   DarwinARMTargetInfo(const std::string& triple)
3227     : DarwinTargetInfo<ARMTargetInfo>(triple) {
3228     HasAlignMac68kSupport = true;
3229     // iOS always has 64-bit atomic instructions.
3230     // FIXME: This should be based off of the target features in ARMTargetInfo.
3231     MaxAtomicInlineWidth = 64;
3232   }
3233 };
3234 } // end anonymous namespace.
3235 
3236 
3237 namespace {
3238 // Hexagon abstract base class
3239 class HexagonTargetInfo : public TargetInfo {
3240   static const Builtin::Info BuiltinInfo[];
3241   static const char * const GCCRegNames[];
3242   static const TargetInfo::GCCRegAlias GCCRegAliases[];
3243   std::string CPU;
3244 public:
HexagonTargetInfo(const std::string & triple)3245   HexagonTargetInfo(const std::string& triple) : TargetInfo(triple)  {
3246     BigEndian = false;
3247     DescriptionString = ("e-p:32:32:32-"
3248                          "i64:64:64-i32:32:32-i16:16:16-i1:32:32"
3249                          "f64:64:64-f32:32:32-a0:0-n32");
3250 
3251     // {} in inline assembly are packet specifiers, not assembly variant
3252     // specifiers.
3253     NoAsmVariants = true;
3254   }
3255 
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const3256   virtual void getTargetBuiltins(const Builtin::Info *&Records,
3257                                  unsigned &NumRecords) const {
3258     Records = BuiltinInfo;
3259     NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
3260   }
3261 
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info) const3262   virtual bool validateAsmConstraint(const char *&Name,
3263                                      TargetInfo::ConstraintInfo &Info) const {
3264     return true;
3265   }
3266 
3267   virtual void getTargetDefines(const LangOptions &Opts,
3268                                 MacroBuilder &Builder) const;
3269 
hasFeature(StringRef Feature) const3270   virtual bool hasFeature(StringRef Feature) const {
3271     return Feature == "hexagon";
3272   }
3273 
getBuiltinVaListKind() const3274   virtual BuiltinVaListKind getBuiltinVaListKind() const {
3275     return TargetInfo::CharPtrBuiltinVaList;
3276   }
3277   virtual void getGCCRegNames(const char * const *&Names,
3278                               unsigned &NumNames) const;
3279   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3280                                 unsigned &NumAliases) const;
getClobbers() const3281   virtual const char *getClobbers() const {
3282     return "";
3283   }
3284 
getHexagonCPUSuffix(StringRef Name)3285   static const char *getHexagonCPUSuffix(StringRef Name) {
3286     return llvm::StringSwitch<const char*>(Name)
3287       .Case("hexagonv2", "2")
3288       .Case("hexagonv3", "3")
3289       .Case("hexagonv4", "4")
3290       .Case("hexagonv5", "5")
3291       .Default(0);
3292   }
3293 
setCPU(const std::string & Name)3294   virtual bool setCPU(const std::string &Name) {
3295     if (!getHexagonCPUSuffix(Name))
3296       return false;
3297 
3298     CPU = Name;
3299     return true;
3300   }
3301 };
3302 
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3303 void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
3304                                 MacroBuilder &Builder) const {
3305   Builder.defineMacro("qdsp6");
3306   Builder.defineMacro("__qdsp6", "1");
3307   Builder.defineMacro("__qdsp6__", "1");
3308 
3309   Builder.defineMacro("hexagon");
3310   Builder.defineMacro("__hexagon", "1");
3311   Builder.defineMacro("__hexagon__", "1");
3312 
3313   if(CPU == "hexagonv1") {
3314     Builder.defineMacro("__HEXAGON_V1__");
3315     Builder.defineMacro("__HEXAGON_ARCH__", "1");
3316     if(Opts.HexagonQdsp6Compat) {
3317       Builder.defineMacro("__QDSP6_V1__");
3318       Builder.defineMacro("__QDSP6_ARCH__", "1");
3319     }
3320   }
3321   else if(CPU == "hexagonv2") {
3322     Builder.defineMacro("__HEXAGON_V2__");
3323     Builder.defineMacro("__HEXAGON_ARCH__", "2");
3324     if(Opts.HexagonQdsp6Compat) {
3325       Builder.defineMacro("__QDSP6_V2__");
3326       Builder.defineMacro("__QDSP6_ARCH__", "2");
3327     }
3328   }
3329   else if(CPU == "hexagonv3") {
3330     Builder.defineMacro("__HEXAGON_V3__");
3331     Builder.defineMacro("__HEXAGON_ARCH__", "3");
3332     if(Opts.HexagonQdsp6Compat) {
3333       Builder.defineMacro("__QDSP6_V3__");
3334       Builder.defineMacro("__QDSP6_ARCH__", "3");
3335     }
3336   }
3337   else if(CPU == "hexagonv4") {
3338     Builder.defineMacro("__HEXAGON_V4__");
3339     Builder.defineMacro("__HEXAGON_ARCH__", "4");
3340     if(Opts.HexagonQdsp6Compat) {
3341       Builder.defineMacro("__QDSP6_V4__");
3342       Builder.defineMacro("__QDSP6_ARCH__", "4");
3343     }
3344   }
3345   else if(CPU == "hexagonv5") {
3346     Builder.defineMacro("__HEXAGON_V5__");
3347     Builder.defineMacro("__HEXAGON_ARCH__", "5");
3348     if(Opts.HexagonQdsp6Compat) {
3349       Builder.defineMacro("__QDSP6_V5__");
3350       Builder.defineMacro("__QDSP6_ARCH__", "5");
3351     }
3352   }
3353 }
3354 
3355 const char * const HexagonTargetInfo::GCCRegNames[] = {
3356   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3357   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3358   "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3359   "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3360   "p0", "p1", "p2", "p3",
3361   "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
3362 };
3363 
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const3364 void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
3365                                    unsigned &NumNames) const {
3366   Names = GCCRegNames;
3367   NumNames = llvm::array_lengthof(GCCRegNames);
3368 }
3369 
3370 
3371 const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
3372   { { "sp" }, "r29" },
3373   { { "fp" }, "r30" },
3374   { { "lr" }, "r31" },
3375  };
3376 
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const3377 void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3378                                      unsigned &NumAliases) const {
3379   Aliases = GCCRegAliases;
3380   NumAliases = llvm::array_lengthof(GCCRegAliases);
3381 }
3382 
3383 
3384 const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
3385 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3386 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3387                                               ALL_LANGUAGES },
3388 #include "clang/Basic/BuiltinsHexagon.def"
3389 };
3390 }
3391 
3392 
3393 namespace {
3394 class SparcV8TargetInfo : public TargetInfo {
3395   static const TargetInfo::GCCRegAlias GCCRegAliases[];
3396   static const char * const GCCRegNames[];
3397   bool SoftFloat;
3398 public:
SparcV8TargetInfo(const std::string & triple)3399   SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
3400     // FIXME: Support Sparc quad-precision long double?
3401     DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3402                         "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3403   }
setFeatureEnabled(llvm::StringMap<bool> & Features,StringRef Name,bool Enabled) const3404   virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3405                                  StringRef Name,
3406                                  bool Enabled) const {
3407     if (Name == "soft-float")
3408       Features[Name] = Enabled;
3409     else
3410       return false;
3411 
3412     return true;
3413   }
HandleTargetFeatures(std::vector<std::string> & Features)3414   virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3415     SoftFloat = false;
3416     for (unsigned i = 0, e = Features.size(); i != e; ++i)
3417       if (Features[i] == "+soft-float")
3418         SoftFloat = true;
3419   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3420   virtual void getTargetDefines(const LangOptions &Opts,
3421                                 MacroBuilder &Builder) const {
3422     DefineStd(Builder, "sparc", Opts);
3423     Builder.defineMacro("__sparcv8");
3424     Builder.defineMacro("__REGISTER_PREFIX__", "");
3425 
3426     if (SoftFloat)
3427       Builder.defineMacro("SOFT_FLOAT", "1");
3428   }
3429 
hasFeature(StringRef Feature) const3430   virtual bool hasFeature(StringRef Feature) const {
3431     return llvm::StringSwitch<bool>(Feature)
3432              .Case("softfloat", SoftFloat)
3433              .Case("sparc", true)
3434              .Default(false);
3435   }
3436 
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const3437   virtual void getTargetBuiltins(const Builtin::Info *&Records,
3438                                  unsigned &NumRecords) const {
3439     // FIXME: Implement!
3440   }
getBuiltinVaListKind() const3441   virtual BuiltinVaListKind getBuiltinVaListKind() const {
3442     return TargetInfo::VoidPtrBuiltinVaList;
3443   }
3444   virtual void getGCCRegNames(const char * const *&Names,
3445                               unsigned &NumNames) const;
3446   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3447                                 unsigned &NumAliases) const;
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & info) const3448   virtual bool validateAsmConstraint(const char *&Name,
3449                                      TargetInfo::ConstraintInfo &info) const {
3450     // FIXME: Implement!
3451     return false;
3452   }
getClobbers() const3453   virtual const char *getClobbers() const {
3454     // FIXME: Implement!
3455     return "";
3456   }
3457 };
3458 
3459 const char * const SparcV8TargetInfo::GCCRegNames[] = {
3460   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3461   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3462   "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3463   "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
3464 };
3465 
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const3466 void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
3467                                        unsigned &NumNames) const {
3468   Names = GCCRegNames;
3469   NumNames = llvm::array_lengthof(GCCRegNames);
3470 }
3471 
3472 const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
3473   { { "g0" }, "r0" },
3474   { { "g1" }, "r1" },
3475   { { "g2" }, "r2" },
3476   { { "g3" }, "r3" },
3477   { { "g4" }, "r4" },
3478   { { "g5" }, "r5" },
3479   { { "g6" }, "r6" },
3480   { { "g7" }, "r7" },
3481   { { "o0" }, "r8" },
3482   { { "o1" }, "r9" },
3483   { { "o2" }, "r10" },
3484   { { "o3" }, "r11" },
3485   { { "o4" }, "r12" },
3486   { { "o5" }, "r13" },
3487   { { "o6", "sp" }, "r14" },
3488   { { "o7" }, "r15" },
3489   { { "l0" }, "r16" },
3490   { { "l1" }, "r17" },
3491   { { "l2" }, "r18" },
3492   { { "l3" }, "r19" },
3493   { { "l4" }, "r20" },
3494   { { "l5" }, "r21" },
3495   { { "l6" }, "r22" },
3496   { { "l7" }, "r23" },
3497   { { "i0" }, "r24" },
3498   { { "i1" }, "r25" },
3499   { { "i2" }, "r26" },
3500   { { "i3" }, "r27" },
3501   { { "i4" }, "r28" },
3502   { { "i5" }, "r29" },
3503   { { "i6", "fp" }, "r30" },
3504   { { "i7" }, "r31" },
3505 };
3506 
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const3507 void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3508                                          unsigned &NumAliases) const {
3509   Aliases = GCCRegAliases;
3510   NumAliases = llvm::array_lengthof(GCCRegAliases);
3511 }
3512 } // end anonymous namespace.
3513 
3514 namespace {
3515 class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
3516 public:
AuroraUXSparcV8TargetInfo(const std::string & triple)3517   AuroraUXSparcV8TargetInfo(const std::string& triple) :
3518       AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
3519     SizeType = UnsignedInt;
3520     PtrDiffType = SignedInt;
3521   }
3522 };
3523 class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
3524 public:
SolarisSparcV8TargetInfo(const std::string & triple)3525   SolarisSparcV8TargetInfo(const std::string& triple) :
3526       SolarisTargetInfo<SparcV8TargetInfo>(triple) {
3527     SizeType = UnsignedInt;
3528     PtrDiffType = SignedInt;
3529   }
3530 };
3531 } // end anonymous namespace.
3532 
3533 namespace {
3534   class MSP430TargetInfo : public TargetInfo {
3535     static const char * const GCCRegNames[];
3536   public:
MSP430TargetInfo(const std::string & triple)3537     MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
3538       BigEndian = false;
3539       TLSSupported = false;
3540       IntWidth = 16; IntAlign = 16;
3541       LongWidth = 32; LongLongWidth = 64;
3542       LongAlign = LongLongAlign = 16;
3543       PointerWidth = 16; PointerAlign = 16;
3544       SuitableAlign = 16;
3545       SizeType = UnsignedInt;
3546       IntMaxType = SignedLong;
3547       UIntMaxType = UnsignedLong;
3548       IntPtrType = SignedShort;
3549       PtrDiffType = SignedInt;
3550       SigAtomicType = SignedLong;
3551       DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
3552    }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3553     virtual void getTargetDefines(const LangOptions &Opts,
3554                                   MacroBuilder &Builder) const {
3555       Builder.defineMacro("MSP430");
3556       Builder.defineMacro("__MSP430__");
3557       // FIXME: defines for different 'flavours' of MCU
3558     }
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const3559     virtual void getTargetBuiltins(const Builtin::Info *&Records,
3560                                    unsigned &NumRecords) const {
3561      // FIXME: Implement.
3562       Records = 0;
3563       NumRecords = 0;
3564     }
hasFeature(StringRef Feature) const3565     virtual bool hasFeature(StringRef Feature) const {
3566       return Feature == "msp430";
3567     }
3568     virtual void getGCCRegNames(const char * const *&Names,
3569                                 unsigned &NumNames) const;
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const3570     virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3571                                   unsigned &NumAliases) const {
3572       // No aliases.
3573       Aliases = 0;
3574       NumAliases = 0;
3575     }
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & info) const3576     virtual bool validateAsmConstraint(const char *&Name,
3577                                        TargetInfo::ConstraintInfo &info) const {
3578       // No target constraints for now.
3579       return false;
3580     }
getClobbers() const3581     virtual const char *getClobbers() const {
3582       // FIXME: Is this really right?
3583       return "";
3584     }
getBuiltinVaListKind() const3585     virtual BuiltinVaListKind getBuiltinVaListKind() const {
3586       // FIXME: implement
3587       return TargetInfo::CharPtrBuiltinVaList;
3588    }
3589   };
3590 
3591   const char * const MSP430TargetInfo::GCCRegNames[] = {
3592     "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3593     "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3594   };
3595 
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const3596   void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
3597                                         unsigned &NumNames) const {
3598     Names = GCCRegNames;
3599     NumNames = llvm::array_lengthof(GCCRegNames);
3600   }
3601 }
3602 
3603 namespace {
3604 
3605   // LLVM and Clang cannot be used directly to output native binaries for
3606   // target, but is used to compile C code to llvm bitcode with correct
3607   // type and alignment information.
3608   //
3609   // TCE uses the llvm bitcode as input and uses it for generating customized
3610   // target processor and program binary. TCE co-design environment is
3611   // publicly available in http://tce.cs.tut.fi
3612 
3613   static const unsigned TCEOpenCLAddrSpaceMap[] = {
3614       3, // opencl_global
3615       4, // opencl_local
3616       5, // opencl_constant
3617       0, // cuda_device
3618       0, // cuda_constant
3619       0  // cuda_shared
3620   };
3621 
3622   class TCETargetInfo : public TargetInfo{
3623   public:
TCETargetInfo(const std::string & triple)3624     TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
3625       TLSSupported = false;
3626       IntWidth = 32;
3627       LongWidth = LongLongWidth = 32;
3628       PointerWidth = 32;
3629       IntAlign = 32;
3630       LongAlign = LongLongAlign = 32;
3631       PointerAlign = 32;
3632       SuitableAlign = 32;
3633       SizeType = UnsignedInt;
3634       IntMaxType = SignedLong;
3635       UIntMaxType = UnsignedLong;
3636       IntPtrType = SignedInt;
3637       PtrDiffType = SignedInt;
3638       FloatWidth = 32;
3639       FloatAlign = 32;
3640       DoubleWidth = 32;
3641       DoubleAlign = 32;
3642       LongDoubleWidth = 32;
3643       LongDoubleAlign = 32;
3644       FloatFormat = &llvm::APFloat::IEEEsingle;
3645       DoubleFormat = &llvm::APFloat::IEEEsingle;
3646       LongDoubleFormat = &llvm::APFloat::IEEEsingle;
3647       DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
3648                           "i16:16:32-i32:32:32-i64:32:32-"
3649                           "f32:32:32-f64:32:32-v64:32:32-"
3650                           "v128:32:32-a0:0:32-n32";
3651       AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
3652     }
3653 
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3654     virtual void getTargetDefines(const LangOptions &Opts,
3655                                   MacroBuilder &Builder) const {
3656       DefineStd(Builder, "tce", Opts);
3657       Builder.defineMacro("__TCE__");
3658       Builder.defineMacro("__TCE_V1__");
3659     }
hasFeature(StringRef Feature) const3660     virtual bool hasFeature(StringRef Feature) const {
3661       return Feature == "tce";
3662     }
3663 
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const3664     virtual void getTargetBuiltins(const Builtin::Info *&Records,
3665                                    unsigned &NumRecords) const {}
getClobbers() const3666     virtual const char *getClobbers() const {
3667       return "";
3668     }
getBuiltinVaListKind() const3669     virtual BuiltinVaListKind getBuiltinVaListKind() const {
3670       return TargetInfo::VoidPtrBuiltinVaList;
3671     }
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const3672     virtual void getGCCRegNames(const char * const *&Names,
3673                                 unsigned &NumNames) const {}
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & info) const3674     virtual bool validateAsmConstraint(const char *&Name,
3675                                        TargetInfo::ConstraintInfo &info) const {
3676       return true;
3677     }
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const3678     virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3679                                   unsigned &NumAliases) const {}
3680   };
3681 }
3682 
3683 namespace {
3684 class MipsTargetInfoBase : public TargetInfo {
3685   static const Builtin::Info BuiltinInfo[];
3686   std::string CPU;
3687   bool IsMips16;
3688   enum MipsFloatABI {
3689     HardFloat, SingleFloat, SoftFloat
3690   } FloatABI;
3691   enum DspRevEnum {
3692     NoDSP, DSP1, DSP2
3693   } DspRev;
3694 
3695 protected:
3696   std::string ABI;
3697 
3698 public:
MipsTargetInfoBase(const std::string & triple,const std::string & ABIStr,const std::string & CPUStr)3699   MipsTargetInfoBase(const std::string& triple,
3700                      const std::string& ABIStr,
3701                      const std::string& CPUStr)
3702     : TargetInfo(triple),
3703       CPU(CPUStr),
3704       IsMips16(false),
3705       FloatABI(HardFloat),
3706       DspRev(NoDSP),
3707       ABI(ABIStr)
3708   {}
3709 
getABI() const3710   virtual const char *getABI() const { return ABI.c_str(); }
3711   virtual bool setABI(const std::string &Name) = 0;
setCPU(const std::string & Name)3712   virtual bool setCPU(const std::string &Name) {
3713     CPU = Name;
3714     return true;
3715   }
getDefaultFeatures(llvm::StringMap<bool> & Features) const3716   void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
3717     Features[ABI] = true;
3718     Features[CPU] = true;
3719   }
3720 
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3721   virtual void getTargetDefines(const LangOptions &Opts,
3722                                 MacroBuilder &Builder) const {
3723     DefineStd(Builder, "mips", Opts);
3724     Builder.defineMacro("_mips");
3725     Builder.defineMacro("__REGISTER_PREFIX__", "");
3726 
3727     switch (FloatABI) {
3728     case HardFloat:
3729       Builder.defineMacro("__mips_hard_float", Twine(1));
3730       break;
3731     case SingleFloat:
3732       Builder.defineMacro("__mips_hard_float", Twine(1));
3733       Builder.defineMacro("__mips_single_float", Twine(1));
3734       break;
3735     case SoftFloat:
3736       Builder.defineMacro("__mips_soft_float", Twine(1));
3737       break;
3738     }
3739 
3740     if (IsMips16)
3741       Builder.defineMacro("__mips16", Twine(1));
3742 
3743     switch (DspRev) {
3744     default:
3745       break;
3746     case DSP1:
3747       Builder.defineMacro("__mips_dsp_rev", Twine(1));
3748       Builder.defineMacro("__mips_dsp", Twine(1));
3749       break;
3750     case DSP2:
3751       Builder.defineMacro("__mips_dsp_rev", Twine(2));
3752       Builder.defineMacro("__mips_dspr2", Twine(1));
3753       Builder.defineMacro("__mips_dsp", Twine(1));
3754       break;
3755     }
3756 
3757     Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
3758     Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
3759     Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
3760 
3761     Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
3762     Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
3763   }
3764 
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const3765   virtual void getTargetBuiltins(const Builtin::Info *&Records,
3766                                  unsigned &NumRecords) const {
3767     Records = BuiltinInfo;
3768     NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
3769   }
hasFeature(StringRef Feature) const3770   virtual bool hasFeature(StringRef Feature) const {
3771     return Feature == "mips";
3772   }
getBuiltinVaListKind() const3773   virtual BuiltinVaListKind getBuiltinVaListKind() const {
3774     return TargetInfo::VoidPtrBuiltinVaList;
3775   }
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const3776   virtual void getGCCRegNames(const char * const *&Names,
3777                               unsigned &NumNames) const {
3778     static const char * const GCCRegNames[] = {
3779       // CPU register names
3780       // Must match second column of GCCRegAliases
3781       "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
3782       "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
3783       "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
3784       "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31",
3785       // Floating point register names
3786       "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
3787       "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
3788       "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
3789       "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
3790       // Hi/lo and condition register names
3791       "hi",   "lo",   "",     "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
3792       "$fcc5","$fcc6","$fcc7"
3793     };
3794     Names = GCCRegNames;
3795     NumNames = llvm::array_lengthof(GCCRegNames);
3796   }
3797   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3798                                 unsigned &NumAliases) const = 0;
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info) const3799   virtual bool validateAsmConstraint(const char *&Name,
3800                                      TargetInfo::ConstraintInfo &Info) const {
3801     switch (*Name) {
3802     default:
3803       return false;
3804 
3805     case 'r': // CPU registers.
3806     case 'd': // Equivalent to "r" unless generating MIPS16 code.
3807     case 'y': // Equivalent to "r", backwards compatibility only.
3808     case 'f': // floating-point registers.
3809     case 'c': // $25 for indirect jumps
3810     case 'l': // lo register
3811     case 'x': // hilo register pair
3812       Info.setAllowsRegister();
3813       return true;
3814     }
3815   }
3816 
getClobbers() const3817   virtual const char *getClobbers() const {
3818     // FIXME: Implement!
3819     return "";
3820   }
3821 
setFeatureEnabled(llvm::StringMap<bool> & Features,StringRef Name,bool Enabled) const3822   virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3823                                  StringRef Name,
3824                                  bool Enabled) const {
3825     if (Name == "soft-float" || Name == "single-float" ||
3826         Name == "o32" || Name == "n32" || Name == "n64" || Name == "eabi" ||
3827         Name == "mips32" || Name == "mips32r2" ||
3828         Name == "mips64" || Name == "mips64r2" ||
3829         Name == "mips16" || Name == "dsp" || Name == "dspr2") {
3830       Features[Name] = Enabled;
3831       return true;
3832     }
3833     return false;
3834   }
3835 
HandleTargetFeatures(std::vector<std::string> & Features)3836   virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3837     IsMips16 = false;
3838     FloatABI = HardFloat;
3839     DspRev = NoDSP;
3840 
3841     for (std::vector<std::string>::iterator it = Features.begin(),
3842          ie = Features.end(); it != ie; ++it) {
3843       if (*it == "+single-float")
3844         FloatABI = SingleFloat;
3845       else if (*it == "+soft-float")
3846         FloatABI = SoftFloat;
3847       else if (*it == "+mips16")
3848         IsMips16 = true;
3849       else if (*it == "+dsp")
3850         DspRev = std::max(DspRev, DSP1);
3851       else if (*it == "+dspr2")
3852         DspRev = std::max(DspRev, DSP2);
3853     }
3854 
3855     // Remove front-end specific option.
3856     std::vector<std::string>::iterator it =
3857       std::find(Features.begin(), Features.end(), "+soft-float");
3858     if (it != Features.end())
3859       Features.erase(it);
3860   }
3861 };
3862 
3863 const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
3864 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3865 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3866                                               ALL_LANGUAGES },
3867 #include "clang/Basic/BuiltinsMips.def"
3868 };
3869 
3870 class Mips32TargetInfoBase : public MipsTargetInfoBase {
3871 public:
Mips32TargetInfoBase(const std::string & triple)3872   Mips32TargetInfoBase(const std::string& triple) :
3873     MipsTargetInfoBase(triple, "o32", "mips32") {
3874     SizeType = UnsignedInt;
3875     PtrDiffType = SignedInt;
3876   }
setABI(const std::string & Name)3877   virtual bool setABI(const std::string &Name) {
3878     if ((Name == "o32") || (Name == "eabi")) {
3879       ABI = Name;
3880       return true;
3881     } else
3882       return false;
3883   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3884   virtual void getTargetDefines(const LangOptions &Opts,
3885                                 MacroBuilder &Builder) const {
3886     MipsTargetInfoBase::getTargetDefines(Opts, Builder);
3887 
3888     if (ABI == "o32") {
3889       Builder.defineMacro("__mips_o32");
3890       Builder.defineMacro("_ABIO32", "1");
3891       Builder.defineMacro("_MIPS_SIM", "_ABIO32");
3892     }
3893     else if (ABI == "eabi")
3894       Builder.defineMacro("__mips_eabi");
3895     else
3896       llvm_unreachable("Invalid ABI for Mips32.");
3897   }
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const3898   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3899                                 unsigned &NumAliases) const {
3900     static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3901       { { "at" },  "$1" },
3902       { { "v0" },  "$2" },
3903       { { "v1" },  "$3" },
3904       { { "a0" },  "$4" },
3905       { { "a1" },  "$5" },
3906       { { "a2" },  "$6" },
3907       { { "a3" },  "$7" },
3908       { { "t0" },  "$8" },
3909       { { "t1" },  "$9" },
3910       { { "t2" }, "$10" },
3911       { { "t3" }, "$11" },
3912       { { "t4" }, "$12" },
3913       { { "t5" }, "$13" },
3914       { { "t6" }, "$14" },
3915       { { "t7" }, "$15" },
3916       { { "s0" }, "$16" },
3917       { { "s1" }, "$17" },
3918       { { "s2" }, "$18" },
3919       { { "s3" }, "$19" },
3920       { { "s4" }, "$20" },
3921       { { "s5" }, "$21" },
3922       { { "s6" }, "$22" },
3923       { { "s7" }, "$23" },
3924       { { "t8" }, "$24" },
3925       { { "t9" }, "$25" },
3926       { { "k0" }, "$26" },
3927       { { "k1" }, "$27" },
3928       { { "gp" }, "$28" },
3929       { { "sp","$sp" }, "$29" },
3930       { { "fp","$fp" }, "$30" },
3931       { { "ra" }, "$31" }
3932     };
3933     Aliases = GCCRegAliases;
3934     NumAliases = llvm::array_lengthof(GCCRegAliases);
3935   }
3936 };
3937 
3938 class Mips32EBTargetInfo : public Mips32TargetInfoBase {
3939 public:
Mips32EBTargetInfo(const std::string & triple)3940   Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3941     DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3942                         "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3943   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3944   virtual void getTargetDefines(const LangOptions &Opts,
3945                                 MacroBuilder &Builder) const {
3946     DefineStd(Builder, "MIPSEB", Opts);
3947     Builder.defineMacro("_MIPSEB");
3948     Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
3949   }
3950 };
3951 
3952 class Mips32ELTargetInfo : public Mips32TargetInfoBase {
3953 public:
Mips32ELTargetInfo(const std::string & triple)3954   Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3955     BigEndian = false;
3956     DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3957                         "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3958   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3959   virtual void getTargetDefines(const LangOptions &Opts,
3960                                 MacroBuilder &Builder) const {
3961     DefineStd(Builder, "MIPSEL", Opts);
3962     Builder.defineMacro("_MIPSEL");
3963     Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
3964   }
3965 };
3966 
3967 class Mips64TargetInfoBase : public MipsTargetInfoBase {
3968   virtual void SetDescriptionString(const std::string &Name) = 0;
3969 public:
Mips64TargetInfoBase(const std::string & triple)3970   Mips64TargetInfoBase(const std::string& triple) :
3971     MipsTargetInfoBase(triple, "n64", "mips64") {
3972     LongWidth = LongAlign = 64;
3973     PointerWidth = PointerAlign = 64;
3974     LongDoubleWidth = LongDoubleAlign = 128;
3975     LongDoubleFormat = &llvm::APFloat::IEEEquad;
3976     SuitableAlign = 128;
3977   }
setABI(const std::string & Name)3978   virtual bool setABI(const std::string &Name) {
3979     SetDescriptionString(Name);
3980 
3981     if (Name != "n32" && Name != "n64")
3982       return false;
3983 
3984     ABI = Name;
3985 
3986     if (Name == "n32") {
3987       LongWidth = LongAlign = 32;
3988       PointerWidth = PointerAlign = 32;
3989     }
3990 
3991     return true;
3992   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3993   virtual void getTargetDefines(const LangOptions &Opts,
3994                                 MacroBuilder &Builder) const {
3995     MipsTargetInfoBase::getTargetDefines(Opts, Builder);
3996 
3997     Builder.defineMacro("__mips64");
3998     Builder.defineMacro("__mips64__");
3999 
4000     if (ABI == "n32") {
4001       Builder.defineMacro("__mips_n32");
4002       Builder.defineMacro("_ABIN32", "2");
4003       Builder.defineMacro("_MIPS_SIM", "_ABIN32");
4004     }
4005     else if (ABI == "n64") {
4006       Builder.defineMacro("__mips_n64");
4007       Builder.defineMacro("_ABI64", "3");
4008       Builder.defineMacro("_MIPS_SIM", "_ABI64");
4009     }
4010     else
4011       llvm_unreachable("Invalid ABI for Mips64.");
4012   }
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const4013   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4014                                 unsigned &NumAliases) const {
4015     static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4016       { { "at" },  "$1" },
4017       { { "v0" },  "$2" },
4018       { { "v1" },  "$3" },
4019       { { "a0" },  "$4" },
4020       { { "a1" },  "$5" },
4021       { { "a2" },  "$6" },
4022       { { "a3" },  "$7" },
4023       { { "a4" },  "$8" },
4024       { { "a5" },  "$9" },
4025       { { "a6" }, "$10" },
4026       { { "a7" }, "$11" },
4027       { { "t0" }, "$12" },
4028       { { "t1" }, "$13" },
4029       { { "t2" }, "$14" },
4030       { { "t3" }, "$15" },
4031       { { "s0" }, "$16" },
4032       { { "s1" }, "$17" },
4033       { { "s2" }, "$18" },
4034       { { "s3" }, "$19" },
4035       { { "s4" }, "$20" },
4036       { { "s5" }, "$21" },
4037       { { "s6" }, "$22" },
4038       { { "s7" }, "$23" },
4039       { { "t8" }, "$24" },
4040       { { "t9" }, "$25" },
4041       { { "k0" }, "$26" },
4042       { { "k1" }, "$27" },
4043       { { "gp" }, "$28" },
4044       { { "sp","$sp" }, "$29" },
4045       { { "fp","$fp" }, "$30" },
4046       { { "ra" }, "$31" }
4047     };
4048     Aliases = GCCRegAliases;
4049     NumAliases = llvm::array_lengthof(GCCRegAliases);
4050   }
4051 };
4052 
4053 class Mips64EBTargetInfo : public Mips64TargetInfoBase {
SetDescriptionString(const std::string & Name)4054   virtual void SetDescriptionString(const std::string &Name) {
4055     // Change DescriptionString only if ABI is n32.
4056     if (Name == "n32")
4057       DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
4058                           "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
4059                           "v64:64:64-n32";
4060   }
4061 public:
Mips64EBTargetInfo(const std::string & triple)4062   Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
4063     // Default ABI is n64.
4064     DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
4065                         "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
4066                         "v64:64:64-n32";
4067   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const4068   virtual void getTargetDefines(const LangOptions &Opts,
4069                                 MacroBuilder &Builder) const {
4070     DefineStd(Builder, "MIPSEB", Opts);
4071     Builder.defineMacro("_MIPSEB");
4072     Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
4073   }
4074 };
4075 
4076 class Mips64ELTargetInfo : public Mips64TargetInfoBase {
SetDescriptionString(const std::string & Name)4077   virtual void SetDescriptionString(const std::string &Name) {
4078     // Change DescriptionString only if ABI is n32.
4079     if (Name == "n32")
4080       DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
4081                           "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
4082                           "-v64:64:64-n32";
4083   }
4084 public:
Mips64ELTargetInfo(const std::string & triple)4085   Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
4086     // Default ABI is n64.
4087     BigEndian = false;
4088     DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
4089                         "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
4090                         "v64:64:64-n32";
4091   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const4092   virtual void getTargetDefines(const LangOptions &Opts,
4093                                 MacroBuilder &Builder) const {
4094     DefineStd(Builder, "MIPSEL", Opts);
4095     Builder.defineMacro("_MIPSEL");
4096     Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
4097   }
4098 };
4099 } // end anonymous namespace.
4100 
4101 namespace {
4102 class PNaClTargetInfo : public TargetInfo {
4103 public:
PNaClTargetInfo(const std::string & triple)4104   PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
4105     BigEndian = false;
4106     this->UserLabelPrefix = "";
4107     this->LongAlign = 32;
4108     this->LongWidth = 32;
4109     this->PointerAlign = 32;
4110     this->PointerWidth = 32;
4111     this->IntMaxType = TargetInfo::SignedLongLong;
4112     this->UIntMaxType = TargetInfo::UnsignedLongLong;
4113     this->Int64Type = TargetInfo::SignedLongLong;
4114     this->DoubleAlign = 64;
4115     this->LongDoubleWidth = 64;
4116     this->LongDoubleAlign = 64;
4117     this->SizeType = TargetInfo::UnsignedInt;
4118     this->PtrDiffType = TargetInfo::SignedInt;
4119     this->IntPtrType = TargetInfo::SignedInt;
4120     this->RegParmMax = 2;
4121     DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
4122                         "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
4123   }
4124 
getDefaultFeatures(llvm::StringMap<bool> & Features) const4125   void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
4126   }
getArchDefines(const LangOptions & Opts,MacroBuilder & Builder) const4127   virtual void getArchDefines(const LangOptions &Opts,
4128                               MacroBuilder &Builder) const {
4129     Builder.defineMacro("__le32__");
4130     Builder.defineMacro("__pnacl__");
4131   }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const4132   virtual void getTargetDefines(const LangOptions &Opts,
4133                                 MacroBuilder &Builder) const {
4134     DefineStd(Builder, "unix", Opts);
4135     Builder.defineMacro("__ELF__");
4136     if (Opts.POSIXThreads)
4137       Builder.defineMacro("_REENTRANT");
4138     if (Opts.CPlusPlus)
4139       Builder.defineMacro("_GNU_SOURCE");
4140 
4141     Builder.defineMacro("__LITTLE_ENDIAN__");
4142     Builder.defineMacro("__native_client__");
4143     getArchDefines(Opts, Builder);
4144   }
hasFeature(StringRef Feature) const4145   virtual bool hasFeature(StringRef Feature) const {
4146     return Feature == "pnacl";
4147   }
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const4148   virtual void getTargetBuiltins(const Builtin::Info *&Records,
4149                                  unsigned &NumRecords) const {
4150   }
getBuiltinVaListKind() const4151   virtual BuiltinVaListKind getBuiltinVaListKind() const {
4152     return TargetInfo::PNaClABIBuiltinVaList;
4153   }
4154   virtual void getGCCRegNames(const char * const *&Names,
4155                               unsigned &NumNames) const;
4156   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4157                                 unsigned &NumAliases) const;
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info) const4158   virtual bool validateAsmConstraint(const char *&Name,
4159                                      TargetInfo::ConstraintInfo &Info) const {
4160     return false;
4161   }
4162 
getClobbers() const4163   virtual const char *getClobbers() const {
4164     return "";
4165   }
4166 };
4167 
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const4168 void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
4169                                      unsigned &NumNames) const {
4170   Names = NULL;
4171   NumNames = 0;
4172 }
4173 
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const4174 void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4175                                        unsigned &NumAliases) const {
4176   Aliases = NULL;
4177   NumAliases = 0;
4178 }
4179 } // end anonymous namespace.
4180 
4181 
4182 //===----------------------------------------------------------------------===//
4183 // Driver code
4184 //===----------------------------------------------------------------------===//
4185 
AllocateTarget(const std::string & T)4186 static TargetInfo *AllocateTarget(const std::string &T) {
4187   llvm::Triple Triple(T);
4188   llvm::Triple::OSType os = Triple.getOS();
4189 
4190   switch (Triple.getArch()) {
4191   default:
4192     return NULL;
4193 
4194   case llvm::Triple::hexagon:
4195     return new HexagonTargetInfo(T);
4196 
4197   case llvm::Triple::arm:
4198   case llvm::Triple::thumb:
4199     if (Triple.isOSDarwin())
4200       return new DarwinARMTargetInfo(T);
4201 
4202     switch (os) {
4203     case llvm::Triple::Linux:
4204       return new LinuxTargetInfo<ARMTargetInfo>(T);
4205     case llvm::Triple::FreeBSD:
4206       return new FreeBSDTargetInfo<ARMTargetInfo>(T);
4207     case llvm::Triple::NetBSD:
4208       return new NetBSDTargetInfo<ARMTargetInfo>(T);
4209     case llvm::Triple::OpenBSD:
4210       return new OpenBSDTargetInfo<ARMTargetInfo>(T);
4211     case llvm::Triple::Bitrig:
4212       return new BitrigTargetInfo<ARMTargetInfo>(T);
4213     case llvm::Triple::RTEMS:
4214       return new RTEMSTargetInfo<ARMTargetInfo>(T);
4215     default:
4216       return new ARMTargetInfo(T);
4217     }
4218 
4219   case llvm::Triple::msp430:
4220     return new MSP430TargetInfo(T);
4221 
4222   case llvm::Triple::mips:
4223     switch (os) {
4224     case llvm::Triple::Linux:
4225       return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
4226     case llvm::Triple::RTEMS:
4227       return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
4228     case llvm::Triple::FreeBSD:
4229       return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
4230     case llvm::Triple::NetBSD:
4231       return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
4232     default:
4233       return new Mips32EBTargetInfo(T);
4234     }
4235 
4236   case llvm::Triple::mipsel:
4237     switch (os) {
4238     case llvm::Triple::Linux:
4239       return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
4240     case llvm::Triple::RTEMS:
4241       return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
4242     case llvm::Triple::FreeBSD:
4243       return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
4244     case llvm::Triple::NetBSD:
4245       return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
4246     default:
4247       return new Mips32ELTargetInfo(T);
4248     }
4249 
4250   case llvm::Triple::mips64:
4251     switch (os) {
4252     case llvm::Triple::Linux:
4253       return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
4254     case llvm::Triple::RTEMS:
4255       return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
4256     case llvm::Triple::FreeBSD:
4257       return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
4258     case llvm::Triple::NetBSD:
4259       return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
4260     case llvm::Triple::OpenBSD:
4261       return new OpenBSDTargetInfo<Mips64EBTargetInfo>(T);
4262     default:
4263       return new Mips64EBTargetInfo(T);
4264     }
4265 
4266   case llvm::Triple::mips64el:
4267     switch (os) {
4268     case llvm::Triple::Linux:
4269       return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
4270     case llvm::Triple::RTEMS:
4271       return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
4272     case llvm::Triple::FreeBSD:
4273       return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
4274     case llvm::Triple::NetBSD:
4275       return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
4276     case llvm::Triple::OpenBSD:
4277       return new OpenBSDTargetInfo<Mips64ELTargetInfo>(T);
4278     default:
4279       return new Mips64ELTargetInfo(T);
4280     }
4281 
4282   case llvm::Triple::le32:
4283     switch (os) {
4284       case llvm::Triple::NativeClient:
4285         return new PNaClTargetInfo(T);
4286       default:
4287         return NULL;
4288     }
4289 
4290   case llvm::Triple::ppc:
4291     if (Triple.isOSDarwin())
4292       return new DarwinPPC32TargetInfo(T);
4293     switch (os) {
4294     case llvm::Triple::Linux:
4295       return new LinuxTargetInfo<PPC32TargetInfo>(T);
4296     case llvm::Triple::FreeBSD:
4297       return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
4298     case llvm::Triple::NetBSD:
4299       return new NetBSDTargetInfo<PPC32TargetInfo>(T);
4300     case llvm::Triple::OpenBSD:
4301       return new OpenBSDTargetInfo<PPC32TargetInfo>(T);
4302     case llvm::Triple::RTEMS:
4303       return new RTEMSTargetInfo<PPC32TargetInfo>(T);
4304     default:
4305       return new PPC32TargetInfo(T);
4306     }
4307 
4308   case llvm::Triple::ppc64:
4309     if (Triple.isOSDarwin())
4310       return new DarwinPPC64TargetInfo(T);
4311     switch (os) {
4312     case llvm::Triple::Linux:
4313       return new LinuxTargetInfo<PPC64TargetInfo>(T);
4314     case llvm::Triple::Lv2:
4315       return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
4316     case llvm::Triple::FreeBSD:
4317       return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
4318     case llvm::Triple::NetBSD:
4319       return new NetBSDTargetInfo<PPC64TargetInfo>(T);
4320     default:
4321       return new PPC64TargetInfo(T);
4322     }
4323 
4324   case llvm::Triple::nvptx:
4325     return new NVPTX32TargetInfo(T);
4326   case llvm::Triple::nvptx64:
4327     return new NVPTX64TargetInfo(T);
4328 
4329   case llvm::Triple::mblaze:
4330     return new MBlazeTargetInfo(T);
4331 
4332   case llvm::Triple::sparc:
4333     switch (os) {
4334     case llvm::Triple::Linux:
4335       return new LinuxTargetInfo<SparcV8TargetInfo>(T);
4336     case llvm::Triple::AuroraUX:
4337       return new AuroraUXSparcV8TargetInfo(T);
4338     case llvm::Triple::Solaris:
4339       return new SolarisSparcV8TargetInfo(T);
4340     case llvm::Triple::NetBSD:
4341       return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
4342     case llvm::Triple::OpenBSD:
4343       return new OpenBSDTargetInfo<SparcV8TargetInfo>(T);
4344     case llvm::Triple::RTEMS:
4345       return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
4346     default:
4347       return new SparcV8TargetInfo(T);
4348     }
4349 
4350   // FIXME: Need a real SPU target.
4351   case llvm::Triple::cellspu:
4352     return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
4353 
4354   case llvm::Triple::tce:
4355     return new TCETargetInfo(T);
4356 
4357   case llvm::Triple::x86:
4358     if (Triple.isOSDarwin())
4359       return new DarwinI386TargetInfo(T);
4360 
4361     switch (os) {
4362     case llvm::Triple::AuroraUX:
4363       return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
4364     case llvm::Triple::Linux:
4365       return new LinuxTargetInfo<X86_32TargetInfo>(T);
4366     case llvm::Triple::DragonFly:
4367       return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
4368     case llvm::Triple::NetBSD:
4369       return new NetBSDI386TargetInfo(T);
4370     case llvm::Triple::OpenBSD:
4371       return new OpenBSDI386TargetInfo(T);
4372     case llvm::Triple::Bitrig:
4373       return new BitrigI386TargetInfo(T);
4374     case llvm::Triple::FreeBSD:
4375       return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
4376     case llvm::Triple::Minix:
4377       return new MinixTargetInfo<X86_32TargetInfo>(T);
4378     case llvm::Triple::Solaris:
4379       return new SolarisTargetInfo<X86_32TargetInfo>(T);
4380     case llvm::Triple::Cygwin:
4381       return new CygwinX86_32TargetInfo(T);
4382     case llvm::Triple::MinGW32:
4383       return new MinGWX86_32TargetInfo(T);
4384     case llvm::Triple::Win32:
4385       return new VisualStudioWindowsX86_32TargetInfo(T);
4386     case llvm::Triple::Haiku:
4387       return new HaikuX86_32TargetInfo(T);
4388     case llvm::Triple::RTEMS:
4389       return new RTEMSX86_32TargetInfo(T);
4390     default:
4391       return new X86_32TargetInfo(T);
4392     }
4393 
4394   case llvm::Triple::x86_64:
4395     if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
4396       return new DarwinX86_64TargetInfo(T);
4397 
4398     switch (os) {
4399     case llvm::Triple::AuroraUX:
4400       return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
4401     case llvm::Triple::Linux:
4402       return new LinuxTargetInfo<X86_64TargetInfo>(T);
4403     case llvm::Triple::DragonFly:
4404       return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
4405     case llvm::Triple::NetBSD:
4406       return new NetBSDTargetInfo<X86_64TargetInfo>(T);
4407     case llvm::Triple::OpenBSD:
4408       return new OpenBSDX86_64TargetInfo(T);
4409     case llvm::Triple::Bitrig:
4410       return new BitrigX86_64TargetInfo(T);
4411     case llvm::Triple::FreeBSD:
4412       return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
4413     case llvm::Triple::Solaris:
4414       return new SolarisTargetInfo<X86_64TargetInfo>(T);
4415     case llvm::Triple::MinGW32:
4416       return new MinGWX86_64TargetInfo(T);
4417     case llvm::Triple::Win32:   // This is what Triple.h supports now.
4418       return new VisualStudioWindowsX86_64TargetInfo(T);
4419     default:
4420       return new X86_64TargetInfo(T);
4421     }
4422   }
4423 }
4424 
4425 /// CreateTargetInfo - Return the target info object for the specified target
4426 /// triple.
CreateTargetInfo(DiagnosticsEngine & Diags,TargetOptions & Opts)4427 TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
4428                                          TargetOptions &Opts) {
4429   llvm::Triple Triple(Opts.Triple);
4430 
4431   // Construct the target
4432   OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
4433   if (!Target) {
4434     Diags.Report(diag::err_target_unknown_triple) << Triple.str();
4435     return 0;
4436   }
4437 
4438   // Set the target CPU if specified.
4439   if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
4440     Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
4441     return 0;
4442   }
4443 
4444   // Set the target ABI if specified.
4445   if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
4446     Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
4447     return 0;
4448   }
4449 
4450   // Set the target C++ ABI.
4451   if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
4452     Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
4453     return 0;
4454   }
4455 
4456   // Compute the default target features, we need the target to handle this
4457   // because features may have dependencies on one another.
4458   llvm::StringMap<bool> Features;
4459   Target->getDefaultFeatures(Features);
4460 
4461   // Apply the user specified deltas.
4462   // First the enables.
4463   for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
4464          ie = Opts.Features.end(); it != ie; ++it) {
4465     const char *Name = it->c_str();
4466 
4467     if (Name[0] != '+')
4468       continue;
4469 
4470     // Apply the feature via the target.
4471     if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
4472       Diags.Report(diag::err_target_invalid_feature) << Name;
4473       return 0;
4474     }
4475   }
4476 
4477   // Then the disables.
4478   for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
4479          ie = Opts.Features.end(); it != ie; ++it) {
4480     const char *Name = it->c_str();
4481 
4482     if (Name[0] == '+')
4483       continue;
4484 
4485     // Apply the feature via the target.
4486     if (Name[0] != '-' ||
4487         !Target->setFeatureEnabled(Features, Name + 1, false)) {
4488       Diags.Report(diag::err_target_invalid_feature) << Name;
4489       return 0;
4490     }
4491   }
4492 
4493   // Add the features to the compile options.
4494   //
4495   // FIXME: If we are completely confident that we have the right set, we only
4496   // need to pass the minuses.
4497   Opts.Features.clear();
4498   for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
4499          ie = Features.end(); it != ie; ++it)
4500     Opts.Features.push_back((it->second ? "+" : "-") + it->first().str());
4501   Target->HandleTargetFeatures(Opts.Features);
4502 
4503   return Target.take();
4504 }
4505