1 //===--- Targets.cpp - Implement -arch option and targets -----------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements construction of a TargetInfo object from a
13 //===----------------------------------------------------------------------===//
15 #include "clang/Basic/TargetInfo.h"
16 #include "clang/Basic/Builtins.h"
17 #include "clang/Basic/Diagnostic.h"
18 #include "clang/Basic/LangOptions.h"
19 #include "clang/Basic/MacroBuilder.h"
20 #include "clang/Basic/TargetBuiltins.h"
21 #include "clang/Basic/TargetOptions.h"
22 #include "llvm/ADT/APFloat.h"
23 #include "llvm/ADT/OwningPtr.h"
24 #include "llvm/ADT/STLExtras.h"
25 #include "llvm/ADT/StringRef.h"
26 #include "llvm/ADT/StringSwitch.h"
27 #include "llvm/ADT/Triple.h"
28 #include "llvm/MC/MCSectionMachO.h"
29 #include "llvm/Type.h"
31 using namespace clang;
33 //===----------------------------------------------------------------------===//
34 // Common code shared among targets.
35 //===----------------------------------------------------------------------===//
37 /// DefineStd - Define a macro name and standard variants. For example if
38 /// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40 static void DefineStd(MacroBuilder &Builder, llvm::StringRef MacroName,
41 const LangOptions &Opts) {
42 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
44 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
45 // in the user's namespace.
47 Builder.defineMacro(MacroName);
50 Builder.defineMacro("__" + MacroName);
53 Builder.defineMacro("__" + MacroName + "__");
56 //===----------------------------------------------------------------------===//
57 // Defines specific to certain operating systems.
58 //===----------------------------------------------------------------------===//
61 template<typename TgtInfo>
62 class OSTargetInfo : public TgtInfo {
64 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
65 MacroBuilder &Builder) const=0;
67 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
68 virtual void getTargetDefines(const LangOptions &Opts,
69 MacroBuilder &Builder) const {
70 TgtInfo::getTargetDefines(Opts, Builder);
71 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
75 } // end anonymous namespace
78 static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
79 const llvm::Triple &Triple,
80 llvm::StringRef &PlatformName,
81 VersionTuple &PlatformMinVersion) {
82 Builder.defineMacro("__APPLE_CC__", "5621");
83 Builder.defineMacro("__APPLE__");
84 Builder.defineMacro("__MACH__");
85 Builder.defineMacro("OBJC_NEW_PROPERTIES");
87 // __weak is always defined, for use in blocks and with objc pointers.
88 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
90 // Darwin defines __strong even in C mode (just to nothing).
91 if (!Opts.ObjC1 || Opts.getGCMode() == LangOptions::NonGC)
92 Builder.defineMacro("__strong", "");
94 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
97 Builder.defineMacro("__STATIC__");
99 Builder.defineMacro("__DYNAMIC__");
101 if (Opts.POSIXThreads)
102 Builder.defineMacro("_REENTRANT");
104 // Get the platform type and version number from the triple.
105 unsigned Maj, Min, Rev;
107 // If no version was given, default to to 10.4.0, for simplifying tests.
108 if (Triple.getOSName() == "darwin" || Triple.getOSName() == "osx") {
109 PlatformName = "macosx";
113 // Otherwise, honor all three triple forms ("-darwinNNN[-iphoneos]",
114 // "-osxNNN", and "-iosNNN").
116 if (Triple.getOS() == llvm::Triple::Darwin) {
117 // For historical reasons that make little sense, the version passed here
118 // is the "darwin" version, which drops the 10 and offsets by 4.
119 Triple.getOSVersion(Maj, Min, Rev);
121 if (Triple.getEnvironmentName() == "iphoneos") {
122 PlatformName = "ios";
124 PlatformName = "macosx";
130 Triple.getOSVersion(Maj, Min, Rev);
131 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
135 // Set the appropriate OS version define.
136 if (PlatformName == "ios") {
137 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
140 Str[1] = '0' + (Min / 10);
141 Str[2] = '0' + (Min % 10);
142 Str[3] = '0' + (Rev / 10);
143 Str[4] = '0' + (Rev % 10);
145 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
147 // Note that the Driver allows versions which aren't representable in the
148 // define (because we only get a single digit for the minor and micro
149 // revision numbers). So, we limit them to the maximum representable
151 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
152 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
154 Str[0] = '0' + (Maj / 10);
155 Str[1] = '0' + (Maj % 10);
156 Str[2] = '0' + std::min(Min, 9U);
157 Str[3] = '0' + std::min(Rev, 9U);
159 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
162 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
166 template<typename Target>
167 class DarwinTargetInfo : public OSTargetInfo<Target> {
169 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
170 MacroBuilder &Builder) const {
171 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
172 this->PlatformMinVersion);
176 DarwinTargetInfo(const std::string& triple) :
177 OSTargetInfo<Target>(triple) {
178 this->TLSSupported = llvm::Triple(triple).getDarwinMajorNumber() > 10;
179 this->MCountName = "\01mcount";
182 virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
183 // Let MCSectionMachO validate this.
184 llvm::StringRef Segment, Section;
185 unsigned TAA, StubSize;
187 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
188 TAA, HasTAA, StubSize);
191 virtual const char *getStaticInitSectionSpecifier() const {
192 // FIXME: We should return 0 when building kexts.
193 return "__TEXT,__StaticInit,regular,pure_instructions";
199 // DragonFlyBSD Target
200 template<typename Target>
201 class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
203 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
204 MacroBuilder &Builder) const {
205 // DragonFly defines; list based off of gcc output
206 Builder.defineMacro("__DragonFly__");
207 Builder.defineMacro("__DragonFly_cc_version", "100001");
208 Builder.defineMacro("__ELF__");
209 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
210 Builder.defineMacro("__tune_i386__");
211 DefineStd(Builder, "unix", Opts);
214 DragonFlyBSDTargetInfo(const std::string &triple)
215 : OSTargetInfo<Target>(triple) {}
219 template<typename Target>
220 class FreeBSDTargetInfo : public OSTargetInfo<Target> {
222 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
223 MacroBuilder &Builder) const {
224 // FreeBSD defines; list based off of gcc output
226 // FIXME: Move version number handling to llvm::Triple.
227 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
229 Builder.defineMacro("__FreeBSD__", Release);
230 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
231 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
232 DefineStd(Builder, "unix", Opts);
233 Builder.defineMacro("__ELF__");
236 FreeBSDTargetInfo(const std::string &triple)
237 : OSTargetInfo<Target>(triple) {
238 this->UserLabelPrefix = "";
240 llvm::Triple Triple(triple);
241 switch (Triple.getArch()) {
243 case llvm::Triple::x86:
244 case llvm::Triple::x86_64:
245 this->MCountName = ".mcount";
247 case llvm::Triple::mips:
248 case llvm::Triple::mipsel:
249 case llvm::Triple::ppc:
250 case llvm::Triple::ppc64:
251 this->MCountName = "_mcount";
253 case llvm::Triple::arm:
254 this->MCountName = "__mcount";
262 template<typename Target>
263 class MinixTargetInfo : public OSTargetInfo<Target> {
265 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
266 MacroBuilder &Builder) const {
269 Builder.defineMacro("__minix", "3");
270 Builder.defineMacro("_EM_WSIZE", "4");
271 Builder.defineMacro("_EM_PSIZE", "4");
272 Builder.defineMacro("_EM_SSIZE", "2");
273 Builder.defineMacro("_EM_LSIZE", "4");
274 Builder.defineMacro("_EM_FSIZE", "4");
275 Builder.defineMacro("_EM_DSIZE", "8");
276 DefineStd(Builder, "unix", Opts);
279 MinixTargetInfo(const std::string &triple)
280 : OSTargetInfo<Target>(triple) {
281 this->UserLabelPrefix = "";
286 template<typename Target>
287 class LinuxTargetInfo : public OSTargetInfo<Target> {
289 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
290 MacroBuilder &Builder) const {
291 // Linux defines; list based off of gcc output
292 DefineStd(Builder, "unix", Opts);
293 DefineStd(Builder, "linux", Opts);
294 Builder.defineMacro("__gnu_linux__");
295 Builder.defineMacro("__ELF__");
296 if (Opts.POSIXThreads)
297 Builder.defineMacro("_REENTRANT");
299 Builder.defineMacro("_GNU_SOURCE");
302 LinuxTargetInfo(const std::string& triple)
303 : OSTargetInfo<Target>(triple) {
304 this->UserLabelPrefix = "";
305 this->WIntType = TargetInfo::UnsignedInt;
310 template<typename Target>
311 class NetBSDTargetInfo : public OSTargetInfo<Target> {
313 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
314 MacroBuilder &Builder) const {
315 // NetBSD defines; list based off of gcc output
316 Builder.defineMacro("__NetBSD__");
317 Builder.defineMacro("__unix__");
318 Builder.defineMacro("__ELF__");
319 if (Opts.POSIXThreads)
320 Builder.defineMacro("_POSIX_THREADS");
323 NetBSDTargetInfo(const std::string &triple)
324 : OSTargetInfo<Target>(triple) {
325 this->UserLabelPrefix = "";
330 template<typename Target>
331 class OpenBSDTargetInfo : public OSTargetInfo<Target> {
333 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
334 MacroBuilder &Builder) const {
335 // OpenBSD defines; list based off of gcc output
337 Builder.defineMacro("__OpenBSD__");
338 DefineStd(Builder, "unix", Opts);
339 Builder.defineMacro("__ELF__");
340 if (Opts.POSIXThreads)
341 Builder.defineMacro("_POSIX_THREADS");
344 OpenBSDTargetInfo(const std::string &triple)
345 : OSTargetInfo<Target>(triple) {}
349 template<typename Target>
350 class PSPTargetInfo : public OSTargetInfo<Target> {
352 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
353 MacroBuilder &Builder) const {
354 // PSP defines; list based on the output of the pspdev gcc toolchain.
355 Builder.defineMacro("PSP");
356 Builder.defineMacro("_PSP");
357 Builder.defineMacro("__psp__");
358 Builder.defineMacro("__ELF__");
361 PSPTargetInfo(const std::string& triple)
362 : OSTargetInfo<Target>(triple) {
363 this->UserLabelPrefix = "";
368 template<typename Target>
369 class PS3PPUTargetInfo : public OSTargetInfo<Target> {
371 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
372 MacroBuilder &Builder) const {
374 Builder.defineMacro("__PPC__");
375 Builder.defineMacro("__PPU__");
376 Builder.defineMacro("__CELLOS_LV2__");
377 Builder.defineMacro("__ELF__");
378 Builder.defineMacro("__LP32__");
379 Builder.defineMacro("_ARCH_PPC64");
380 Builder.defineMacro("__powerpc64__");
383 PS3PPUTargetInfo(const std::string& triple)
384 : OSTargetInfo<Target>(triple) {
385 this->UserLabelPrefix = "";
386 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
387 this->IntMaxType = TargetInfo::SignedLongLong;
388 this->UIntMaxType = TargetInfo::UnsignedLongLong;
389 this->Int64Type = TargetInfo::SignedLongLong;
390 this->SizeType = TargetInfo::UnsignedInt;
391 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
392 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
396 // FIXME: Need a real SPU target.
398 template<typename Target>
399 class PS3SPUTargetInfo : public OSTargetInfo<Target> {
401 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
402 MacroBuilder &Builder) const {
404 Builder.defineMacro("__SPU__");
405 Builder.defineMacro("__ELF__");
408 PS3SPUTargetInfo(const std::string& triple)
409 : OSTargetInfo<Target>(triple) {
410 this->UserLabelPrefix = "";
415 template<typename Target>
416 class AuroraUXTargetInfo : public OSTargetInfo<Target> {
418 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
419 MacroBuilder &Builder) const {
420 DefineStd(Builder, "sun", Opts);
421 DefineStd(Builder, "unix", Opts);
422 Builder.defineMacro("__ELF__");
423 Builder.defineMacro("__svr4__");
424 Builder.defineMacro("__SVR4");
427 AuroraUXTargetInfo(const std::string& triple)
428 : OSTargetInfo<Target>(triple) {
429 this->UserLabelPrefix = "";
430 this->WCharType = this->SignedLong;
431 // FIXME: WIntType should be SignedLong
436 template<typename Target>
437 class SolarisTargetInfo : public OSTargetInfo<Target> {
439 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
440 MacroBuilder &Builder) const {
441 DefineStd(Builder, "sun", Opts);
442 DefineStd(Builder, "unix", Opts);
443 Builder.defineMacro("__ELF__");
444 Builder.defineMacro("__svr4__");
445 Builder.defineMacro("__SVR4");
448 SolarisTargetInfo(const std::string& triple)
449 : OSTargetInfo<Target>(triple) {
450 this->UserLabelPrefix = "";
451 this->WCharType = this->SignedLong;
452 // FIXME: WIntType should be SignedLong
457 template<typename Target>
458 class WindowsTargetInfo : public OSTargetInfo<Target> {
460 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
461 MacroBuilder &Builder) const {
462 Builder.defineMacro("_WIN32");
464 void getVisualStudioDefines(const LangOptions &Opts,
465 MacroBuilder &Builder) const {
466 if (Opts.CPlusPlus) {
468 Builder.defineMacro("_CPPRTTI");
471 Builder.defineMacro("_CPPUNWIND");
474 if (!Opts.CharIsSigned)
475 Builder.defineMacro("_CHAR_UNSIGNED");
477 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
478 // but it works for now.
479 if (Opts.POSIXThreads)
480 Builder.defineMacro("_MT");
482 if (Opts.MSCVersion != 0)
483 Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
485 if (Opts.Microsoft) {
486 Builder.defineMacro("_MSC_EXTENSIONS");
488 if (Opts.CPlusPlus0x) {
489 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
490 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
491 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
495 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
499 WindowsTargetInfo(const std::string &triple)
500 : OSTargetInfo<Target>(triple) {}
503 } // end anonymous namespace.
505 //===----------------------------------------------------------------------===//
506 // Specific target implementations.
507 //===----------------------------------------------------------------------===//
510 // PPC abstract base class
511 class PPCTargetInfo : public TargetInfo {
512 static const Builtin::Info BuiltinInfo[];
513 static const char * const GCCRegNames[];
514 static const TargetInfo::GCCRegAlias GCCRegAliases[];
517 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
519 virtual void getTargetBuiltins(const Builtin::Info *&Records,
520 unsigned &NumRecords) const {
521 Records = BuiltinInfo;
522 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
525 virtual void getTargetDefines(const LangOptions &Opts,
526 MacroBuilder &Builder) const;
528 virtual void getGCCRegNames(const char * const *&Names,
529 unsigned &NumNames) const;
530 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
531 unsigned &NumAliases) const;
532 virtual bool validateAsmConstraint(const char *&Name,
533 TargetInfo::ConstraintInfo &Info) const {
535 default: return false;
538 case 'b': // Base register
539 case 'f': // Floating point register
540 Info.setAllowsRegister();
542 // FIXME: The following are added to allow parsing.
543 // I just took a guess at what the actions should be.
544 // Also, is more specific checking needed? I.e. specific registers?
545 case 'd': // Floating point register (containing 64-bit value)
546 case 'v': // Altivec vector register
547 Info.setAllowsRegister();
551 case 'd':// VSX vector register to hold vector double data
552 case 'f':// VSX vector register to hold vector float data
553 case 's':// VSX vector register to hold scalar float data
554 case 'a':// Any VSX register
559 Info.setAllowsRegister();
560 Name++; // Skip over 'w'.
562 case 'h': // `MQ', `CTR', or `LINK' register
563 case 'q': // `MQ' register
564 case 'c': // `CTR' register
565 case 'l': // `LINK' register
566 case 'x': // `CR' register (condition register) number 0
567 case 'y': // `CR' register (condition register)
568 case 'z': // `XER[CA]' carry bit (part of the XER register)
569 Info.setAllowsRegister();
571 case 'I': // Signed 16-bit constant
572 case 'J': // Unsigned 16-bit constant shifted left 16 bits
573 // (use `L' instead for SImode constants)
574 case 'K': // Unsigned 16-bit constant
575 case 'L': // Signed 16-bit constant shifted left 16 bits
576 case 'M': // Constant larger than 31
577 case 'N': // Exact power of 2
578 case 'P': // Constant whose negation is a signed 16-bit constant
579 case 'G': // Floating point constant that can be loaded into a
580 // register with one instruction per word
581 case 'H': // Integer/Floating point constant that can be loaded
582 // into a register using three instructions
584 case 'm': // Memory operand. Note that on PowerPC targets, m can
585 // include addresses that update the base register. It
586 // is therefore only safe to use `m' in an asm statement
587 // if that asm statement accesses the operand exactly once.
588 // The asm statement must also use `%U<opno>' as a
589 // placeholder for the "update" flag in the corresponding
590 // load or store instruction. For example:
591 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
593 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
594 // is not. Use es rather than m if you don't want the base
595 // register to be updated.
599 // es: A "stable" memory operand; that is, one which does not
600 // include any automodification of the base register. Unlike
601 // `m', this constraint can be used in asm statements that
602 // might access the operand several times, or that might not
604 Info.setAllowsMemory();
605 Name++; // Skip over 'e'.
607 case 'Q': // Memory operand that is an offset from a register (it is
608 // usually better to use `m' or `es' in asm statements)
609 case 'Z': // Memory operand that is an indexed or indirect from a
610 // register (it is usually better to use `m' or `es' in
612 Info.setAllowsMemory();
613 Info.setAllowsRegister();
615 case 'R': // AIX TOC entry
616 case 'a': // Address operand that is an indexed or indirect from a
617 // register (`p' is preferable for asm statements)
618 case 'S': // Constant suitable as a 64-bit mask operand
619 case 'T': // Constant suitable as a 32-bit mask operand
620 case 'U': // System V Release 4 small data area reference
621 case 't': // AND masks that can be performed by two rldic{l, r}
623 case 'W': // Vector constant that does not require memory
624 case 'j': // Vector constant that is all zeros.
630 virtual const char *getClobbers() const {
635 const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
636 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
637 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
638 ALL_LANGUAGES, false },
639 #include "clang/Basic/BuiltinsPPC.def"
643 /// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
644 /// #defines that are not tied to a specific subtarget.
645 void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
646 MacroBuilder &Builder) const {
647 // Target identification.
648 Builder.defineMacro("__ppc__");
649 Builder.defineMacro("_ARCH_PPC");
650 Builder.defineMacro("__powerpc__");
651 Builder.defineMacro("__POWERPC__");
652 if (PointerWidth == 64) {
653 Builder.defineMacro("_ARCH_PPC64");
654 Builder.defineMacro("_LP64");
655 Builder.defineMacro("__LP64__");
656 Builder.defineMacro("__powerpc64__");
657 Builder.defineMacro("__ppc64__");
659 Builder.defineMacro("__ppc__");
662 // Target properties.
663 Builder.defineMacro("_BIG_ENDIAN");
664 Builder.defineMacro("__BIG_ENDIAN__");
666 // Subtarget options.
667 Builder.defineMacro("__NATURAL_ALIGNMENT__");
668 Builder.defineMacro("__REGISTER_PREFIX__", "");
670 // FIXME: Should be controlled by command line option.
671 Builder.defineMacro("__LONG_DOUBLE_128__");
674 Builder.defineMacro("__VEC__", "10206");
675 Builder.defineMacro("__ALTIVEC__");
680 const char * const PPCTargetInfo::GCCRegNames[] = {
681 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
682 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
683 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
684 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
685 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
686 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
687 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
688 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
689 "mq", "lr", "ctr", "ap",
690 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
692 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
693 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
694 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
695 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
697 "spe_acc", "spefscr",
701 void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
702 unsigned &NumNames) const {
704 NumNames = llvm::array_lengthof(GCCRegNames);
707 const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
708 // While some of these aliases do map to different registers
709 // they still share the same register name.
752 { { "fr10" }, "f10" },
753 { { "fr11" }, "f11" },
754 { { "fr12" }, "f12" },
755 { { "fr13" }, "f13" },
756 { { "fr14" }, "f14" },
757 { { "fr15" }, "f15" },
758 { { "fr16" }, "f16" },
759 { { "fr17" }, "f17" },
760 { { "fr18" }, "f18" },
761 { { "fr19" }, "f19" },
762 { { "fr20" }, "f20" },
763 { { "fr21" }, "f21" },
764 { { "fr22" }, "f22" },
765 { { "fr23" }, "f23" },
766 { { "fr24" }, "f24" },
767 { { "fr25" }, "f25" },
768 { { "fr26" }, "f26" },
769 { { "fr27" }, "f27" },
770 { { "fr28" }, "f28" },
771 { { "fr29" }, "f29" },
772 { { "fr30" }, "f30" },
773 { { "fr31" }, "f31" },
777 void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
778 unsigned &NumAliases) const {
779 Aliases = GCCRegAliases;
780 NumAliases = llvm::array_lengthof(GCCRegAliases);
782 } // end anonymous namespace.
785 class PPC32TargetInfo : public PPCTargetInfo {
787 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
788 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
789 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
791 if (getTriple().getOS() == llvm::Triple::FreeBSD)
792 SizeType = UnsignedInt;
795 virtual const char *getVAListDeclaration() const {
796 // This is the ELF definition, and is overridden by the Darwin sub-target
797 return "typedef struct __va_list_tag {"
798 " unsigned char gpr;"
799 " unsigned char fpr;"
800 " unsigned short reserved;"
801 " void* overflow_arg_area;"
802 " void* reg_save_area;"
803 "} __builtin_va_list[1];";
806 } // end anonymous namespace.
809 class PPC64TargetInfo : public PPCTargetInfo {
811 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
812 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
813 IntMaxType = SignedLong;
814 UIntMaxType = UnsignedLong;
815 Int64Type = SignedLong;
816 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
817 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
819 virtual const char *getVAListDeclaration() const {
820 return "typedef char* __builtin_va_list;";
823 } // end anonymous namespace.
827 class DarwinPPC32TargetInfo :
828 public DarwinTargetInfo<PPC32TargetInfo> {
830 DarwinPPC32TargetInfo(const std::string& triple)
831 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
832 HasAlignMac68kSupport = true;
833 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
835 virtual const char *getVAListDeclaration() const {
836 return "typedef char* __builtin_va_list;";
840 class DarwinPPC64TargetInfo :
841 public DarwinTargetInfo<PPC64TargetInfo> {
843 DarwinPPC64TargetInfo(const std::string& triple)
844 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
845 HasAlignMac68kSupport = true;
848 } // end anonymous namespace.
851 class PTXTargetInfo : public TargetInfo {
852 static const char * const GCCRegNames[];
853 static const Builtin::Info BuiltinInfo[];
855 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
856 TLSSupported = false;
857 LongWidth = LongAlign = 64;
859 virtual void getTargetDefines(const LangOptions &Opts,
860 MacroBuilder &Builder) const {
861 Builder.defineMacro("__PTX__");
863 virtual void getTargetBuiltins(const Builtin::Info *&Records,
864 unsigned &NumRecords) const {
865 Records = BuiltinInfo;
866 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
869 virtual void getGCCRegNames(const char * const *&Names,
870 unsigned &NumNames) const;
871 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
872 unsigned &NumAliases) const {
877 virtual bool validateAsmConstraint(const char *&Name,
878 TargetInfo::ConstraintInfo &info) const {
882 virtual const char *getClobbers() const {
883 // FIXME: Is this really right?
886 virtual const char *getVAListDeclaration() const {
888 return "typedef char* __builtin_va_list;";
892 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
893 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
894 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
895 ALL_LANGUAGES, false },
896 #include "clang/Basic/BuiltinsPTX.def"
899 const char * const PTXTargetInfo::GCCRegNames[] = {
903 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
904 unsigned &NumNames) const {
906 NumNames = llvm::array_lengthof(GCCRegNames);
910 class PTX32TargetInfo : public PTXTargetInfo {
912 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
913 PointerWidth = PointerAlign = 32;
914 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
916 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
920 class PTX64TargetInfo : public PTXTargetInfo {
922 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
923 PointerWidth = PointerAlign = 64;
924 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
926 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
932 // MBlaze abstract base class
933 class MBlazeTargetInfo : public TargetInfo {
934 static const char * const GCCRegNames[];
935 static const TargetInfo::GCCRegAlias GCCRegAliases[];
938 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
939 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
942 virtual void getTargetBuiltins(const Builtin::Info *&Records,
943 unsigned &NumRecords) const {
949 virtual void getTargetDefines(const LangOptions &Opts,
950 MacroBuilder &Builder) const;
952 virtual const char *getVAListDeclaration() const {
953 return "typedef char* __builtin_va_list;";
955 virtual const char *getTargetPrefix() const {
958 virtual void getGCCRegNames(const char * const *&Names,
959 unsigned &NumNames) const;
960 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
961 unsigned &NumAliases) const;
962 virtual bool validateAsmConstraint(const char *&Name,
963 TargetInfo::ConstraintInfo &Info) const {
965 default: return false;
968 case 'b': // Base register
969 case 'f': // Floating point register
970 Info.setAllowsRegister();
974 virtual const char *getClobbers() const {
979 /// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
980 /// #defines that are not tied to a specific subtarget.
981 void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
982 MacroBuilder &Builder) const {
983 // Target identification.
984 Builder.defineMacro("__microblaze__");
985 Builder.defineMacro("_ARCH_MICROBLAZE");
986 Builder.defineMacro("__MICROBLAZE__");
988 // Target properties.
989 Builder.defineMacro("_BIG_ENDIAN");
990 Builder.defineMacro("__BIG_ENDIAN__");
992 // Subtarget options.
993 Builder.defineMacro("__REGISTER_PREFIX__", "");
997 const char * const MBlazeTargetInfo::GCCRegNames[] = {
998 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
999 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1000 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1001 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1002 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1003 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1004 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1005 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1006 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1007 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1010 void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1011 unsigned &NumNames) const {
1012 Names = GCCRegNames;
1013 NumNames = llvm::array_lengthof(GCCRegNames);
1016 const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1051 void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1052 unsigned &NumAliases) const {
1053 Aliases = GCCRegAliases;
1054 NumAliases = llvm::array_lengthof(GCCRegAliases);
1056 } // end anonymous namespace.
1059 // Namespace for x86 abstract base class
1060 const Builtin::Info BuiltinInfo[] = {
1061 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
1062 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1063 ALL_LANGUAGES, false },
1064 #include "clang/Basic/BuiltinsX86.def"
1067 static const char* const GCCRegNames[] = {
1068 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1069 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
1070 "argp", "flags", "fspr", "dirflag", "frame",
1071 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1072 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1073 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1074 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
1077 const TargetInfo::GCCRegAlias GCCRegAliases[] = {
1078 { { "al", "ah", "eax", "rax" }, "ax" },
1079 { { "bl", "bh", "ebx", "rbx" }, "bx" },
1080 { { "cl", "ch", "ecx", "rcx" }, "cx" },
1081 { { "dl", "dh", "edx", "rdx" }, "dx" },
1082 { { "esi", "rsi" }, "si" },
1083 { { "edi", "rdi" }, "di" },
1084 { { "esp", "rsp" }, "sp" },
1085 { { "ebp", "rbp" }, "bp" },
1088 // X86 target abstract base class; x86-32 and x86-64 are very close, so
1089 // most of the implementation can be shared.
1090 class X86TargetInfo : public TargetInfo {
1092 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
1095 NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
1102 X86TargetInfo(const std::string& triple)
1103 : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
1104 HasAES(false), HasAVX(false) {
1105 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
1107 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1108 unsigned &NumRecords) const {
1109 Records = BuiltinInfo;
1110 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
1112 virtual void getGCCRegNames(const char * const *&Names,
1113 unsigned &NumNames) const {
1114 Names = GCCRegNames;
1115 NumNames = llvm::array_lengthof(GCCRegNames);
1117 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1118 unsigned &NumAliases) const {
1119 Aliases = GCCRegAliases;
1120 NumAliases = llvm::array_lengthof(GCCRegAliases);
1122 virtual bool validateAsmConstraint(const char *&Name,
1123 TargetInfo::ConstraintInfo &info) const;
1124 virtual std::string convertConstraint(const char Constraint) const;
1125 virtual const char *getClobbers() const {
1126 return "~{dirflag},~{fpsr},~{flags}";
1128 virtual void getTargetDefines(const LangOptions &Opts,
1129 MacroBuilder &Builder) const;
1130 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1131 const std::string &Name,
1132 bool Enabled) const;
1133 virtual void getDefaultFeatures(const std::string &CPU,
1134 llvm::StringMap<bool> &Features) const;
1135 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
1138 void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
1139 llvm::StringMap<bool> &Features) const {
1140 // FIXME: This should not be here.
1141 Features["3dnow"] = false;
1142 Features["3dnowa"] = false;
1143 Features["mmx"] = false;
1144 Features["sse"] = false;
1145 Features["sse2"] = false;
1146 Features["sse3"] = false;
1147 Features["ssse3"] = false;
1148 Features["sse41"] = false;
1149 Features["sse42"] = false;
1150 Features["aes"] = false;
1151 Features["avx"] = false;
1153 // LLVM does not currently recognize this.
1154 // Features["sse4a"] = false;
1156 // FIXME: This *really* should not be here.
1158 // X86_64 always has SSE2.
1159 if (PointerWidth == 64)
1160 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1162 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1163 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1165 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1166 setFeatureEnabled(Features, "mmx", true);
1167 else if (CPU == "pentium3")
1168 setFeatureEnabled(Features, "sse", true);
1169 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
1170 setFeatureEnabled(Features, "sse2", true);
1171 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
1172 setFeatureEnabled(Features, "sse3", true);
1173 else if (CPU == "core2")
1174 setFeatureEnabled(Features, "ssse3", true);
1175 else if (CPU == "penryn") {
1176 setFeatureEnabled(Features, "sse4", true);
1177 Features["sse42"] = false;
1178 } else if (CPU == "atom")
1179 setFeatureEnabled(Features, "sse3", true);
1180 else if (CPU == "corei7") {
1181 setFeatureEnabled(Features, "sse4", true);
1182 setFeatureEnabled(Features, "aes", true);
1183 } else if (CPU == "sandybridge") {
1184 setFeatureEnabled(Features, "sse4", true);
1185 setFeatureEnabled(Features, "aes", true);
1186 // setFeatureEnabled(Features, "avx", true);
1187 } else if (CPU == "k6" || CPU == "winchip-c6")
1188 setFeatureEnabled(Features, "mmx", true);
1189 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
1190 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
1191 setFeatureEnabled(Features, "mmx", true);
1192 setFeatureEnabled(Features, "3dnow", true);
1193 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1194 setFeatureEnabled(Features, "sse", true);
1195 setFeatureEnabled(Features, "3dnowa", true);
1196 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1197 CPU == "athlon-fx") {
1198 setFeatureEnabled(Features, "sse2", true);
1199 setFeatureEnabled(Features, "3dnowa", true);
1200 } else if (CPU == "k8-sse3") {
1201 setFeatureEnabled(Features, "sse3", true);
1202 setFeatureEnabled(Features, "3dnowa", true);
1203 } else if (CPU == "c3-2")
1204 setFeatureEnabled(Features, "sse", true);
1207 bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1208 const std::string &Name,
1209 bool Enabled) const {
1210 // FIXME: This *really* should not be here. We need some way of translating
1211 // options into llvm subtarget features.
1212 if (!Features.count(Name) &&
1213 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
1218 Features["mmx"] = true;
1219 else if (Name == "sse")
1220 Features["mmx"] = Features["sse"] = true;
1221 else if (Name == "sse2")
1222 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1223 else if (Name == "sse3")
1224 Features["mmx"] = Features["sse"] = Features["sse2"] =
1225 Features["sse3"] = true;
1226 else if (Name == "ssse3")
1227 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1228 Features["ssse3"] = true;
1229 else if (Name == "sse4" || Name == "sse4.2")
1230 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1231 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
1232 else if (Name == "sse4.1")
1233 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1234 Features["ssse3"] = Features["sse41"] = true;
1235 else if (Name == "3dnow")
1236 Features["3dnowa"] = true;
1237 else if (Name == "3dnowa")
1238 Features["3dnow"] = Features["3dnowa"] = true;
1239 else if (Name == "aes")
1240 Features["aes"] = true;
1241 else if (Name == "avx")
1242 Features["avx"] = true;
1245 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] =
1246 Features["sse"] = Features["sse2"] = Features["sse3"] =
1247 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1248 else if (Name == "sse")
1249 Features["sse"] = Features["sse2"] = Features["sse3"] =
1250 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1251 else if (Name == "sse2")
1252 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
1253 Features["sse41"] = Features["sse42"] = false;
1254 else if (Name == "sse3")
1255 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
1256 Features["sse42"] = false;
1257 else if (Name == "ssse3")
1258 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1259 else if (Name == "sse4" || Name == "sse4.1")
1260 Features["sse41"] = Features["sse42"] = false;
1261 else if (Name == "sse4.2")
1262 Features["sse42"] = false;
1263 else if (Name == "3dnow")
1264 Features["3dnow"] = Features["3dnowa"] = false;
1265 else if (Name == "3dnowa")
1266 Features["3dnowa"] = false;
1267 else if (Name == "aes")
1268 Features["aes"] = false;
1269 else if (Name == "avx")
1270 Features["avx"] = false;
1276 /// HandleTargetOptions - Perform initialization based on the user
1277 /// configured set of features.
1278 void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
1279 // Remember the maximum enabled sselevel.
1280 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1281 // Ignore disabled features.
1282 if (Features[i][0] == '-')
1285 if (Features[i].substr(1) == "aes") {
1290 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1291 // For now let it be enabled together with other SSE levels.
1292 if (Features[i].substr(1) == "avx") {
1297 assert(Features[i][0] == '+' && "Invalid target feature!");
1298 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1299 .Case("sse42", SSE42)
1300 .Case("sse41", SSE41)
1301 .Case("ssse3", SSSE3)
1307 SSELevel = std::max(SSELevel, Level);
1309 AMD3DNowEnum ThreeDNowLevel =
1310 llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1311 .Case("3dnowa", AMD3DNowAthlon)
1312 .Case("3dnow", AMD3DNow)
1313 .Default(NoAMD3DNow);
1315 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
1319 /// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1320 /// that are not tied to a specific subtarget.
1321 void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
1322 MacroBuilder &Builder) const {
1323 // Target identification.
1324 if (PointerWidth == 64) {
1325 Builder.defineMacro("_LP64");
1326 Builder.defineMacro("__LP64__");
1327 Builder.defineMacro("__amd64__");
1328 Builder.defineMacro("__amd64");
1329 Builder.defineMacro("__x86_64");
1330 Builder.defineMacro("__x86_64__");
1332 DefineStd(Builder, "i386", Opts);
1336 Builder.defineMacro("__AES__");
1339 Builder.defineMacro("__AVX__");
1341 // Target properties.
1342 Builder.defineMacro("__LITTLE_ENDIAN__");
1344 // Subtarget options.
1345 Builder.defineMacro("__nocona");
1346 Builder.defineMacro("__nocona__");
1347 Builder.defineMacro("__tune_nocona__");
1348 Builder.defineMacro("__REGISTER_PREFIX__", "");
1350 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1351 // functions in glibc header files that use FP Stack inline asm which the
1352 // backend can't deal with (PR879).
1353 Builder.defineMacro("__NO_MATH_INLINES");
1355 // Each case falls through to the previous one here.
1358 Builder.defineMacro("__SSE4_2__");
1360 Builder.defineMacro("__SSE4_1__");
1362 Builder.defineMacro("__SSSE3__");
1364 Builder.defineMacro("__SSE3__");
1366 Builder.defineMacro("__SSE2__");
1367 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
1369 Builder.defineMacro("__SSE__");
1370 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
1372 Builder.defineMacro("__MMX__");
1377 if (Opts.Microsoft && PointerWidth == 32) {
1384 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1387 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1390 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1394 // Each case falls through to the previous one here.
1395 switch (AMD3DNowLevel) {
1396 case AMD3DNowAthlon:
1397 Builder.defineMacro("__3dNOW_A__");
1399 Builder.defineMacro("__3dNOW__");
1407 X86TargetInfo::validateAsmConstraint(const char *&Name,
1408 TargetInfo::ConstraintInfo &Info) const {
1410 default: return false;
1411 case 'Y': // first letter of a pair:
1412 switch (*(Name+1)) {
1413 default: return false;
1414 case '0': // First SSE register.
1415 case 't': // Any SSE register, when SSE2 is enabled.
1416 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1417 case 'm': // any MMX register, when inter-unit moves enabled.
1418 break; // falls through to setAllowsRegister.
1426 case 'A': // edx:eax.
1427 case 'f': // any x87 floating point stack register.
1428 case 't': // top of floating point stack.
1429 case 'u': // second from top of floating point stack.
1430 case 'q': // Any register accessible as [r]l: a, b, c, and d.
1431 case 'y': // Any MMX register.
1432 case 'x': // Any SSE register.
1433 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
1434 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1435 case 'l': // "Index" registers: any general register that can be used as an
1436 // index in a base+index memory access.
1437 Info.setAllowsRegister();
1439 case 'C': // SSE floating point constant.
1440 case 'G': // x87 floating point constant.
1441 case 'e': // 32-bit signed integer constant for use with zero-extending
1442 // x86_64 instructions.
1443 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
1444 // x86_64 instructions.
1452 X86TargetInfo::convertConstraint(const char Constraint) const {
1453 switch (Constraint) {
1454 case 'a': return std::string("{ax}");
1455 case 'b': return std::string("{bx}");
1456 case 'c': return std::string("{cx}");
1457 case 'd': return std::string("{dx}");
1458 case 'S': return std::string("{si}");
1459 case 'D': return std::string("{di}");
1460 case 'p': // address
1461 return std::string("im");
1462 case 't': // top of floating point stack.
1463 return std::string("{st}");
1464 case 'u': // second from top of floating point stack.
1465 return std::string("{st(1)}"); // second from top of floating point stack.
1467 return std::string(1, Constraint);
1470 } // end anonymous namespace
1473 // X86-32 generic target
1474 class X86_32TargetInfo : public X86TargetInfo {
1476 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1477 DoubleAlign = LongLongAlign = 32;
1478 LongDoubleWidth = 96;
1479 LongDoubleAlign = 32;
1480 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1481 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
1482 "a0:0:64-f80:32:32-n8:16:32";
1483 SizeType = UnsignedInt;
1484 PtrDiffType = SignedInt;
1485 IntPtrType = SignedInt;
1488 // Use fpret for all types.
1489 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1490 (1 << TargetInfo::Double) |
1491 (1 << TargetInfo::LongDouble));
1493 virtual const char *getVAListDeclaration() const {
1494 return "typedef char* __builtin_va_list;";
1497 int getEHDataRegisterNumber(unsigned RegNo) const {
1498 if (RegNo == 0) return 0;
1499 if (RegNo == 1) return 2;
1503 } // end anonymous namespace
1506 class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1508 OpenBSDI386TargetInfo(const std::string& triple) :
1509 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1510 SizeType = UnsignedLong;
1511 IntPtrType = SignedLong;
1512 PtrDiffType = SignedLong;
1515 } // end anonymous namespace
1518 class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
1520 DarwinI386TargetInfo(const std::string& triple) :
1521 DarwinTargetInfo<X86_32TargetInfo>(triple) {
1522 LongDoubleWidth = 128;
1523 LongDoubleAlign = 128;
1524 SizeType = UnsignedLong;
1525 IntPtrType = SignedLong;
1526 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1527 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
1528 "a0:0:64-f80:128:128-n8:16:32";
1529 HasAlignMac68kSupport = true;
1533 } // end anonymous namespace
1536 // x86-32 Windows target
1537 class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
1539 WindowsX86_32TargetInfo(const std::string& triple)
1540 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
1541 TLSSupported = false;
1542 WCharType = UnsignedShort;
1543 DoubleAlign = LongLongAlign = 64;
1544 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1545 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1546 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
1548 virtual void getTargetDefines(const LangOptions &Opts,
1549 MacroBuilder &Builder) const {
1550 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1553 } // end anonymous namespace
1557 // x86-32 Windows Visual Studio target
1558 class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1560 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1561 : WindowsX86_32TargetInfo(triple) {
1562 LongDoubleWidth = LongDoubleAlign = 64;
1563 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1565 virtual void getTargetDefines(const LangOptions &Opts,
1566 MacroBuilder &Builder) const {
1567 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1568 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1569 // The value of the following reflects processor type.
1570 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1571 // We lost the original triple, so we use the default.
1572 Builder.defineMacro("_M_IX86", "600");
1575 } // end anonymous namespace
1578 // x86-32 MinGW target
1579 class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1581 MinGWX86_32TargetInfo(const std::string& triple)
1582 : WindowsX86_32TargetInfo(triple) {
1584 virtual void getTargetDefines(const LangOptions &Opts,
1585 MacroBuilder &Builder) const {
1586 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1587 DefineStd(Builder, "WIN32", Opts);
1588 DefineStd(Builder, "WINNT", Opts);
1589 Builder.defineMacro("_X86_");
1590 Builder.defineMacro("__MSVCRT__");
1591 Builder.defineMacro("__MINGW32__");
1593 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1594 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1596 // Provide "as-is" __declspec.
1597 Builder.defineMacro("__declspec", "__declspec");
1599 // Provide alias of __attribute__ like mingw32-gcc.
1600 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
1603 } // end anonymous namespace
1606 // x86-32 Cygwin target
1607 class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1609 CygwinX86_32TargetInfo(const std::string& triple)
1610 : X86_32TargetInfo(triple) {
1611 TLSSupported = false;
1612 WCharType = UnsignedShort;
1613 DoubleAlign = LongLongAlign = 64;
1614 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1615 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
1616 "a0:0:64-f80:32:32-n8:16:32";
1618 virtual void getTargetDefines(const LangOptions &Opts,
1619 MacroBuilder &Builder) const {
1620 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1621 Builder.defineMacro("__CYGWIN__");
1622 Builder.defineMacro("__CYGWIN32__");
1623 DefineStd(Builder, "unix", Opts);
1625 Builder.defineMacro("_GNU_SOURCE");
1628 } // end anonymous namespace
1631 // x86-32 Haiku target
1632 class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1634 HaikuX86_32TargetInfo(const std::string& triple)
1635 : X86_32TargetInfo(triple) {
1636 SizeType = UnsignedLong;
1637 IntPtrType = SignedLong;
1638 PtrDiffType = SignedLong;
1639 this->UserLabelPrefix = "";
1641 virtual void getTargetDefines(const LangOptions &Opts,
1642 MacroBuilder &Builder) const {
1643 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1644 Builder.defineMacro("__INTEL__");
1645 Builder.defineMacro("__HAIKU__");
1648 } // end anonymous namespace
1651 // x86-64 generic target
1652 class X86_64TargetInfo : public X86TargetInfo {
1654 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
1655 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
1656 LongDoubleWidth = 128;
1657 LongDoubleAlign = 128;
1658 LargeArrayMinWidth = 128;
1659 LargeArrayAlign = 128;
1660 IntMaxType = SignedLong;
1661 UIntMaxType = UnsignedLong;
1662 Int64Type = SignedLong;
1665 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1666 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
1667 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
1669 // Use fpret only for long double.
1670 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
1672 virtual const char *getVAListDeclaration() const {
1673 return "typedef struct __va_list_tag {"
1674 " unsigned gp_offset;"
1675 " unsigned fp_offset;"
1676 " void* overflow_arg_area;"
1677 " void* reg_save_area;"
1679 "typedef __va_list_tag __builtin_va_list[1];";
1682 int getEHDataRegisterNumber(unsigned RegNo) const {
1683 if (RegNo == 0) return 0;
1684 if (RegNo == 1) return 1;
1688 } // end anonymous namespace
1691 // x86-64 Windows target
1692 class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
1694 WindowsX86_64TargetInfo(const std::string& triple)
1695 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
1696 TLSSupported = false;
1697 WCharType = UnsignedShort;
1698 LongWidth = LongAlign = 32;
1699 DoubleAlign = LongLongAlign = 64;
1700 IntMaxType = SignedLongLong;
1701 UIntMaxType = UnsignedLongLong;
1702 Int64Type = SignedLongLong;
1703 SizeType = UnsignedLongLong;
1704 PtrDiffType = SignedLongLong;
1705 IntPtrType = SignedLongLong;
1706 this->UserLabelPrefix = "";
1708 virtual void getTargetDefines(const LangOptions &Opts,
1709 MacroBuilder &Builder) const {
1710 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
1711 Builder.defineMacro("_WIN64");
1713 virtual const char *getVAListDeclaration() const {
1714 return "typedef char* __builtin_va_list;";
1717 } // end anonymous namespace
1720 // x86-64 Windows Visual Studio target
1721 class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1723 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1724 : WindowsX86_64TargetInfo(triple) {
1725 LongDoubleWidth = LongDoubleAlign = 64;
1726 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1728 virtual void getTargetDefines(const LangOptions &Opts,
1729 MacroBuilder &Builder) const {
1730 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1731 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
1732 Builder.defineMacro("_M_X64");
1733 Builder.defineMacro("_M_AMD64");
1736 } // end anonymous namespace
1739 // x86-64 MinGW target
1740 class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1742 MinGWX86_64TargetInfo(const std::string& triple)
1743 : WindowsX86_64TargetInfo(triple) {
1745 virtual void getTargetDefines(const LangOptions &Opts,
1746 MacroBuilder &Builder) const {
1747 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1748 DefineStd(Builder, "WIN64", Opts);
1749 Builder.defineMacro("__MSVCRT__");
1750 Builder.defineMacro("__MINGW32__");
1751 Builder.defineMacro("__MINGW64__");
1753 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1754 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1756 // Provide "as-is" __declspec.
1757 Builder.defineMacro("__declspec", "__declspec");
1759 // Provide alias of __attribute__ like mingw32-gcc.
1760 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
1763 } // end anonymous namespace
1766 class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1768 DarwinX86_64TargetInfo(const std::string& triple)
1769 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1770 Int64Type = SignedLongLong;
1773 } // end anonymous namespace
1776 class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1778 OpenBSDX86_64TargetInfo(const std::string& triple)
1779 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1780 IntMaxType = SignedLongLong;
1781 UIntMaxType = UnsignedLongLong;
1782 Int64Type = SignedLongLong;
1785 } // end anonymous namespace
1788 class ARMTargetInfo : public TargetInfo {
1789 // Possible FPU choices.
1797 static bool FPUModeIsVFP(FPUMode Mode) {
1798 return Mode >= VFP2FPU && Mode <= NeonFPU;
1801 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1802 static const char * const GCCRegNames[];
1804 std::string ABI, CPU;
1808 unsigned IsThumb : 1;
1810 // Initialized via features.
1811 unsigned SoftFloat : 1;
1812 unsigned SoftFloatABI : 1;
1814 static const Builtin::Info BuiltinInfo[];
1817 ARMTargetInfo(const std::string &TripleStr)
1818 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
1820 SizeType = UnsignedInt;
1821 PtrDiffType = SignedInt;
1823 // {} in inline assembly are neon specifiers, not assembly variant
1825 NoAsmVariants = true;
1827 // FIXME: Should we just treat this as a feature?
1828 IsThumb = getTriple().getArchName().startswith("thumb");
1830 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1831 // so set preferred for small types to 32.
1832 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1833 "i64:64:64-f32:32:32-f64:64:64-"
1834 "v64:64:64-v128:64:128-a0:0:32-n32");
1836 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1837 "i64:64:64-f32:32:32-f64:64:64-"
1838 "v64:64:64-v128:64:128-a0:0:64-n32");
1841 // ARM targets default to using the ARM C++ ABI.
1842 CXXABI = CXXABI_ARM;
1844 virtual const char *getABI() const { return ABI.c_str(); }
1845 virtual bool setABI(const std::string &Name) {
1848 // The defaults (above) are for AAPCS, check if we need to change them.
1850 // FIXME: We need support for -meabi... we could just mangle it into the
1852 if (Name == "apcs-gnu") {
1853 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
1854 SizeType = UnsignedLong;
1856 // Do not respect the alignment of bit-field types when laying out
1857 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1858 UseBitFieldTypeAlignment = false;
1861 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1862 // so set preferred for small types to 32.
1863 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1864 "i64:32:32-f32:32:32-f64:32:32-"
1865 "v64:32:64-v128:32:128-a0:0:32-n32");
1867 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1868 "i64:32:64-f32:32:32-f64:32:64-"
1869 "v64:32:64-v128:32:128-a0:0:32-n32");
1872 // FIXME: Override "preferred align" for double and long long.
1873 } else if (Name == "aapcs") {
1874 // FIXME: Enumerated types are variable width in straight AAPCS.
1875 } else if (Name == "aapcs-linux") {
1883 void getDefaultFeatures(const std::string &CPU,
1884 llvm::StringMap<bool> &Features) const {
1885 // FIXME: This should not be here.
1886 Features["vfp2"] = false;
1887 Features["vfp3"] = false;
1888 Features["neon"] = false;
1890 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1891 Features["vfp2"] = true;
1892 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1893 Features["neon"] = true;
1896 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1897 const std::string &Name,
1898 bool Enabled) const {
1899 if (Name == "soft-float" || Name == "soft-float-abi") {
1900 Features[Name] = Enabled;
1901 } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1902 // These effectively are a single option, reset them when any is enabled.
1904 Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1905 Features[Name] = Enabled;
1912 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
1914 SoftFloat = SoftFloatABI = false;
1915 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1916 if (Features[i] == "+soft-float")
1918 else if (Features[i] == "+soft-float-abi")
1919 SoftFloatABI = true;
1920 else if (Features[i] == "+vfp2")
1922 else if (Features[i] == "+vfp3")
1924 else if (Features[i] == "+neon")
1928 // Remove front-end specific options which the backend handles differently.
1929 std::vector<std::string>::iterator it;
1930 it = std::find(Features.begin(), Features.end(), "+soft-float");
1931 if (it != Features.end())
1933 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
1934 if (it != Features.end())
1938 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
1939 return llvm::StringSwitch<const char*>(Name)
1940 .Cases("arm8", "arm810", "4")
1941 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
1942 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
1943 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
1944 .Case("ep9312", "4T")
1945 .Cases("arm10tdmi", "arm1020t", "5T")
1946 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
1947 .Case("arm926ej-s", "5TEJ")
1948 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
1949 .Cases("xscale", "iwmmxt", "5TE")
1950 .Case("arm1136j-s", "6J")
1951 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
1952 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
1953 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1954 .Cases("cortex-a8", "cortex-a9", "7A")
1955 .Case("cortex-m3", "7M")
1956 .Case("cortex-m0", "6M")
1959 virtual bool setCPU(const std::string &Name) {
1960 if (!getCPUDefineSuffix(Name))
1966 virtual void getTargetDefines(const LangOptions &Opts,
1967 MacroBuilder &Builder) const {
1968 // Target identification.
1969 Builder.defineMacro("__arm");
1970 Builder.defineMacro("__arm__");
1972 // Target properties.
1973 Builder.defineMacro("__ARMEL__");
1974 Builder.defineMacro("__LITTLE_ENDIAN__");
1975 Builder.defineMacro("__REGISTER_PREFIX__", "");
1977 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
1978 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
1980 // Subtarget options.
1982 // FIXME: It's more complicated than this and we don't really support
1984 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
1985 Builder.defineMacro("__THUMB_INTERWORK__");
1987 if (ABI == "aapcs" || ABI == "aapcs-linux")
1988 Builder.defineMacro("__ARM_EABI__");
1991 Builder.defineMacro("__SOFTFP__");
1993 if (CPU == "xscale")
1994 Builder.defineMacro("__XSCALE__");
1996 bool IsThumb2 = IsThumb && (CPUArch == "6T2" || CPUArch.startswith("7"));
1998 Builder.defineMacro("__THUMBEL__");
1999 Builder.defineMacro("__thumb__");
2001 Builder.defineMacro("__thumb2__");
2004 // Note, this is always on in gcc, even though it doesn't make sense.
2005 Builder.defineMacro("__APCS_32__");
2007 if (FPUModeIsVFP((FPUMode) FPU))
2008 Builder.defineMacro("__VFP_FP__");
2010 // This only gets set when Neon instructions are actually available, unlike
2011 // the VFP define, hence the soft float and arch check. This is subtly
2012 // different from gcc, we follow the intent which was that it should be set
2013 // when Neon instructions are actually available.
2014 if (FPU == NeonFPU && !SoftFloat && IsThumb2)
2015 Builder.defineMacro("__ARM_NEON__");
2017 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2018 unsigned &NumRecords) const {
2019 Records = BuiltinInfo;
2020 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
2022 virtual const char *getVAListDeclaration() const {
2023 return "typedef char* __builtin_va_list;";
2025 virtual void getGCCRegNames(const char * const *&Names,
2026 unsigned &NumNames) const;
2027 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2028 unsigned &NumAliases) const;
2029 virtual bool validateAsmConstraint(const char *&Name,
2030 TargetInfo::ConstraintInfo &Info) const {
2031 // FIXME: Check if this is complete
2036 case 'w': // VFP Floating point register single precision
2037 case 'P': // VFP Floating point register double precision
2038 Info.setAllowsRegister();
2043 virtual const char *getClobbers() const {
2044 // FIXME: Is this really right?
2049 const char * const ARMTargetInfo::GCCRegNames[] = {
2050 // Integer registers
2051 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2052 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2055 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2056 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2057 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2058 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2061 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2062 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
2063 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2064 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
2067 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2068 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
2071 void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
2072 unsigned &NumNames) const {
2073 Names = GCCRegNames;
2074 NumNames = llvm::array_lengthof(GCCRegNames);
2077 const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
2087 { { "v6", "rfp" }, "r9" },
2088 { { "sl" }, "r10" },
2089 { { "fp" }, "r11" },
2090 { { "ip" }, "r12" },
2091 { { "r13" }, "sp" },
2092 { { "r14" }, "lr" },
2093 { { "r15" }, "pc" },
2094 // The S, D and Q registers overlap, but aren't really aliases; we
2095 // don't want to substitute one of these for a different-sized one.
2098 void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2099 unsigned &NumAliases) const {
2100 Aliases = GCCRegAliases;
2101 NumAliases = llvm::array_lengthof(GCCRegAliases);
2104 const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
2105 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
2106 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
2107 ALL_LANGUAGES, false },
2108 #include "clang/Basic/BuiltinsARM.def"
2110 } // end anonymous namespace.
2114 class DarwinARMTargetInfo :
2115 public DarwinTargetInfo<ARMTargetInfo> {
2117 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2118 MacroBuilder &Builder) const {
2119 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
2123 DarwinARMTargetInfo(const std::string& triple)
2124 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2125 HasAlignMac68kSupport = true;
2128 } // end anonymous namespace.
2131 class SparcV8TargetInfo : public TargetInfo {
2132 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2133 static const char * const GCCRegNames[];
2136 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2137 // FIXME: Support Sparc quad-precision long double?
2138 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2139 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
2141 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2142 const std::string &Name,
2143 bool Enabled) const {
2144 if (Name == "soft-float")
2145 Features[Name] = Enabled;
2151 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2153 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2154 if (Features[i] == "+soft-float")
2157 virtual void getTargetDefines(const LangOptions &Opts,
2158 MacroBuilder &Builder) const {
2159 DefineStd(Builder, "sparc", Opts);
2160 Builder.defineMacro("__sparcv8");
2161 Builder.defineMacro("__REGISTER_PREFIX__", "");
2164 Builder.defineMacro("SOFT_FLOAT", "1");
2166 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2167 unsigned &NumRecords) const {
2168 // FIXME: Implement!
2170 virtual const char *getVAListDeclaration() const {
2171 return "typedef void* __builtin_va_list;";
2173 virtual void getGCCRegNames(const char * const *&Names,
2174 unsigned &NumNames) const;
2175 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2176 unsigned &NumAliases) const;
2177 virtual bool validateAsmConstraint(const char *&Name,
2178 TargetInfo::ConstraintInfo &info) const {
2179 // FIXME: Implement!
2182 virtual const char *getClobbers() const {
2183 // FIXME: Implement!
2188 const char * const SparcV8TargetInfo::GCCRegNames[] = {
2189 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2190 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2191 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2192 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2195 void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
2196 unsigned &NumNames) const {
2197 Names = GCCRegNames;
2198 NumNames = llvm::array_lengthof(GCCRegNames);
2201 const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
2212 { { "o2" }, "r10" },
2213 { { "o3" }, "r11" },
2214 { { "o4" }, "r12" },
2215 { { "o5" }, "r13" },
2216 { { "o6", "sp" }, "r14" },
2217 { { "o7" }, "r15" },
2218 { { "l0" }, "r16" },
2219 { { "l1" }, "r17" },
2220 { { "l2" }, "r18" },
2221 { { "l3" }, "r19" },
2222 { { "l4" }, "r20" },
2223 { { "l5" }, "r21" },
2224 { { "l6" }, "r22" },
2225 { { "l7" }, "r23" },
2226 { { "i0" }, "r24" },
2227 { { "i1" }, "r25" },
2228 { { "i2" }, "r26" },
2229 { { "i3" }, "r27" },
2230 { { "i4" }, "r28" },
2231 { { "i5" }, "r29" },
2232 { { "i6", "fp" }, "r30" },
2233 { { "i7" }, "r31" },
2236 void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2237 unsigned &NumAliases) const {
2238 Aliases = GCCRegAliases;
2239 NumAliases = llvm::array_lengthof(GCCRegAliases);
2241 } // end anonymous namespace.
2244 class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2246 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2247 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2248 SizeType = UnsignedInt;
2249 PtrDiffType = SignedInt;
2252 class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
2254 SolarisSparcV8TargetInfo(const std::string& triple) :
2255 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
2256 SizeType = UnsignedInt;
2257 PtrDiffType = SignedInt;
2260 } // end anonymous namespace.
2263 class MSP430TargetInfo : public TargetInfo {
2264 static const char * const GCCRegNames[];
2266 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2267 TLSSupported = false;
2268 IntWidth = 16; IntAlign = 16;
2269 LongWidth = 32; LongLongWidth = 64;
2270 LongAlign = LongLongAlign = 16;
2271 PointerWidth = 16; PointerAlign = 16;
2272 SizeType = UnsignedInt;
2273 IntMaxType = SignedLong;
2274 UIntMaxType = UnsignedLong;
2275 IntPtrType = SignedShort;
2276 PtrDiffType = SignedInt;
2277 SigAtomicType = SignedLong;
2278 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
2280 virtual void getTargetDefines(const LangOptions &Opts,
2281 MacroBuilder &Builder) const {
2282 Builder.defineMacro("MSP430");
2283 Builder.defineMacro("__MSP430__");
2284 // FIXME: defines for different 'flavours' of MCU
2286 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2287 unsigned &NumRecords) const {
2288 // FIXME: Implement.
2292 virtual void getGCCRegNames(const char * const *&Names,
2293 unsigned &NumNames) const;
2294 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2295 unsigned &NumAliases) const {
2300 virtual bool validateAsmConstraint(const char *&Name,
2301 TargetInfo::ConstraintInfo &info) const {
2302 // No target constraints for now.
2305 virtual const char *getClobbers() const {
2306 // FIXME: Is this really right?
2309 virtual const char *getVAListDeclaration() const {
2311 return "typedef char* __builtin_va_list;";
2315 const char * const MSP430TargetInfo::GCCRegNames[] = {
2316 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2317 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2320 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2321 unsigned &NumNames) const {
2322 Names = GCCRegNames;
2323 NumNames = llvm::array_lengthof(GCCRegNames);
2329 class SystemZTargetInfo : public TargetInfo {
2330 static const char * const GCCRegNames[];
2332 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2333 TLSSupported = false;
2334 IntWidth = IntAlign = 32;
2335 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2336 PointerWidth = PointerAlign = 64;
2337 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2338 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
2340 virtual void getTargetDefines(const LangOptions &Opts,
2341 MacroBuilder &Builder) const {
2342 Builder.defineMacro("__s390__");
2343 Builder.defineMacro("__s390x__");
2345 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2346 unsigned &NumRecords) const {
2347 // FIXME: Implement.
2352 virtual void getGCCRegNames(const char * const *&Names,
2353 unsigned &NumNames) const;
2354 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2355 unsigned &NumAliases) const {
2360 virtual bool validateAsmConstraint(const char *&Name,
2361 TargetInfo::ConstraintInfo &info) const {
2365 virtual const char *getClobbers() const {
2366 // FIXME: Is this really right?
2369 virtual const char *getVAListDeclaration() const {
2371 return "typedef char* __builtin_va_list;";
2375 const char * const SystemZTargetInfo::GCCRegNames[] = {
2376 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2377 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2380 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2381 unsigned &NumNames) const {
2382 Names = GCCRegNames;
2383 NumNames = llvm::array_lengthof(GCCRegNames);
2388 class BlackfinTargetInfo : public TargetInfo {
2389 static const char * const GCCRegNames[];
2391 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2392 TLSSupported = false;
2395 LongDoubleAlign = 32;
2396 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
2399 virtual void getTargetDefines(const LangOptions &Opts,
2400 MacroBuilder &Builder) const {
2401 DefineStd(Builder, "bfin", Opts);
2402 DefineStd(Builder, "BFIN", Opts);
2403 Builder.defineMacro("__ADSPBLACKFIN__");
2404 // FIXME: This one is really dependent on -mcpu
2405 Builder.defineMacro("__ADSPLPBLACKFIN__");
2406 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2409 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2410 unsigned &NumRecords) const {
2411 // FIXME: Implement.
2416 virtual void getGCCRegNames(const char * const *&Names,
2417 unsigned &NumNames) const;
2419 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2420 unsigned &NumAliases) const {
2426 virtual bool validateAsmConstraint(const char *&Name,
2427 TargetInfo::ConstraintInfo &Info) const {
2428 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2429 Info.setAllowsRegister();
2435 virtual const char *getClobbers() const {
2439 virtual const char *getVAListDeclaration() const {
2440 return "typedef char* __builtin_va_list;";
2444 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2445 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2446 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2447 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2448 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2450 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2451 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2454 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2455 unsigned &NumNames) const {
2456 Names = GCCRegNames;
2457 NumNames = llvm::array_lengthof(GCCRegNames);
2463 // LLVM and Clang cannot be used directly to output native binaries for
2464 // target, but is used to compile C code to llvm bitcode with correct
2465 // type and alignment information.
2467 // TCE uses the llvm bitcode as input and uses it for generating customized
2468 // target processor and program binary. TCE co-design environment is
2469 // publicly available in http://tce.cs.tut.fi
2471 class TCETargetInfo : public TargetInfo{
2473 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2474 TLSSupported = false;
2476 LongWidth = LongLongWidth = 32;
2479 LongAlign = LongLongAlign = 32;
2481 SizeType = UnsignedInt;
2482 IntMaxType = SignedLong;
2483 UIntMaxType = UnsignedLong;
2484 IntPtrType = SignedInt;
2485 PtrDiffType = SignedInt;
2490 LongDoubleWidth = 32;
2491 LongDoubleAlign = 32;
2492 FloatFormat = &llvm::APFloat::IEEEsingle;
2493 DoubleFormat = &llvm::APFloat::IEEEsingle;
2494 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
2495 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2496 "i16:16:32-i32:32:32-i64:32:32-"
2497 "f32:32:32-f64:32:32-v64:32:32-"
2498 "v128:32:32-a0:0:32-n32";
2501 virtual void getTargetDefines(const LangOptions &Opts,
2502 MacroBuilder &Builder) const {
2503 DefineStd(Builder, "tce", Opts);
2504 Builder.defineMacro("__TCE__");
2505 Builder.defineMacro("__TCE_V1__");
2507 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2508 unsigned &NumRecords) const {}
2509 virtual const char *getClobbers() const {
2512 virtual const char *getVAListDeclaration() const {
2513 return "typedef void* __builtin_va_list;";
2515 virtual void getGCCRegNames(const char * const *&Names,
2516 unsigned &NumNames) const {}
2517 virtual bool validateAsmConstraint(const char *&Name,
2518 TargetInfo::ConstraintInfo &info) const {
2521 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2522 unsigned &NumAliases) const {}
2527 class MipsTargetInfo : public TargetInfo {
2528 std::string ABI, CPU;
2529 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2530 static const char * const GCCRegNames[];
2532 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
2533 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2534 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2536 virtual const char *getABI() const { return ABI.c_str(); }
2537 virtual bool setABI(const std::string &Name) {
2539 if ((Name == "o32") || (Name == "eabi")) {
2545 virtual bool setCPU(const std::string &Name) {
2549 void getDefaultFeatures(const std::string &CPU,
2550 llvm::StringMap<bool> &Features) const {
2551 Features[ABI] = true;
2552 Features[CPU] = true;
2554 virtual void getArchDefines(const LangOptions &Opts,
2555 MacroBuilder &Builder) const {
2557 Builder.defineMacro("__mips_o32");
2558 else if (ABI == "eabi")
2559 Builder.defineMacro("__mips_eabi");
2561 virtual void getTargetDefines(const LangOptions &Opts,
2562 MacroBuilder &Builder) const {
2563 DefineStd(Builder, "mips", Opts);
2564 Builder.defineMacro("_mips");
2565 DefineStd(Builder, "MIPSEB", Opts);
2566 Builder.defineMacro("_MIPSEB");
2567 Builder.defineMacro("__REGISTER_PREFIX__", "");
2568 getArchDefines(Opts, Builder);
2570 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2571 unsigned &NumRecords) const {
2572 // FIXME: Implement!
2574 virtual const char *getVAListDeclaration() const {
2575 return "typedef void* __builtin_va_list;";
2577 virtual void getGCCRegNames(const char * const *&Names,
2578 unsigned &NumNames) const;
2579 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2580 unsigned &NumAliases) const;
2581 virtual bool validateAsmConstraint(const char *&Name,
2582 TargetInfo::ConstraintInfo &Info) const {
2585 case 'r': // CPU registers.
2586 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2587 case 'y': // Equivalent to "r", backwards compatibility only.
2588 case 'f': // floating-point registers.
2589 Info.setAllowsRegister();
2595 virtual const char *getClobbers() const {
2596 // FIXME: Implement!
2601 const char * const MipsTargetInfo::GCCRegNames[] = {
2602 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
2603 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2604 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2605 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2606 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2607 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2608 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2609 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2610 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2611 "$fcc5","$fcc6","$fcc7"
2614 void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2615 unsigned &NumNames) const {
2616 Names = GCCRegNames;
2617 NumNames = llvm::array_lengthof(GCCRegNames);
2620 const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2630 { { "t2" }, "$10" },
2631 { { "t3" }, "$11" },
2632 { { "t4" }, "$12" },
2633 { { "t5" }, "$13" },
2634 { { "t6" }, "$14" },
2635 { { "t7" }, "$15" },
2636 { { "s0" }, "$16" },
2637 { { "s1" }, "$17" },
2638 { { "s2" }, "$18" },
2639 { { "s3" }, "$19" },
2640 { { "s4" }, "$20" },
2641 { { "s5" }, "$21" },
2642 { { "s6" }, "$22" },
2643 { { "s7" }, "$23" },
2644 { { "t8" }, "$24" },
2645 { { "t9" }, "$25" },
2646 { { "k0" }, "$26" },
2647 { { "k1" }, "$27" },
2648 { { "gp" }, "$28" },
2649 { { "sp" }, "$29" },
2650 { { "fp" }, "$30" },
2654 void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2655 unsigned &NumAliases) const {
2656 Aliases = GCCRegAliases;
2657 NumAliases = llvm::array_lengthof(GCCRegAliases);
2659 } // end anonymous namespace.
2662 class MipselTargetInfo : public MipsTargetInfo {
2664 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2665 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2666 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2669 virtual void getTargetDefines(const LangOptions &Opts,
2670 MacroBuilder &Builder) const;
2673 void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
2674 MacroBuilder &Builder) const {
2675 DefineStd(Builder, "mips", Opts);
2676 Builder.defineMacro("_mips");
2677 DefineStd(Builder, "MIPSEL", Opts);
2678 Builder.defineMacro("_MIPSEL");
2679 Builder.defineMacro("__REGISTER_PREFIX__", "");
2680 getArchDefines(Opts, Builder);
2682 } // end anonymous namespace.
2684 //===----------------------------------------------------------------------===//
2686 //===----------------------------------------------------------------------===//
2688 static TargetInfo *AllocateTarget(const std::string &T) {
2689 llvm::Triple Triple(T);
2690 llvm::Triple::OSType os = Triple.getOS();
2692 switch (Triple.getArch()) {
2696 case llvm::Triple::arm:
2697 case llvm::Triple::thumb:
2698 if (Triple.isOSDarwin())
2699 return new DarwinARMTargetInfo(T);
2702 case llvm::Triple::Linux:
2703 return new LinuxTargetInfo<ARMTargetInfo>(T);
2704 case llvm::Triple::FreeBSD:
2705 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
2707 return new ARMTargetInfo(T);
2710 case llvm::Triple::bfin:
2711 return new BlackfinTargetInfo(T);
2713 case llvm::Triple::msp430:
2714 return new MSP430TargetInfo(T);
2716 case llvm::Triple::mips:
2717 if (os == llvm::Triple::Psp)
2718 return new PSPTargetInfo<MipsTargetInfo>(T);
2719 if (os == llvm::Triple::Linux)
2720 return new LinuxTargetInfo<MipsTargetInfo>(T);
2721 return new MipsTargetInfo(T);
2723 case llvm::Triple::mipsel:
2724 if (os == llvm::Triple::Psp)
2725 return new PSPTargetInfo<MipselTargetInfo>(T);
2726 if (os == llvm::Triple::Linux)
2727 return new LinuxTargetInfo<MipselTargetInfo>(T);
2728 return new MipselTargetInfo(T);
2730 case llvm::Triple::ppc:
2731 if (Triple.isOSDarwin())
2732 return new DarwinPPC32TargetInfo(T);
2733 else if (os == llvm::Triple::FreeBSD)
2734 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
2735 return new PPC32TargetInfo(T);
2737 case llvm::Triple::ppc64:
2738 if (Triple.isOSDarwin())
2739 return new DarwinPPC64TargetInfo(T);
2740 else if (os == llvm::Triple::Lv2)
2741 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
2742 else if (os == llvm::Triple::FreeBSD)
2743 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
2744 return new PPC64TargetInfo(T);
2746 case llvm::Triple::ptx32:
2747 return new PTX32TargetInfo(T);
2748 case llvm::Triple::ptx64:
2749 return new PTX64TargetInfo(T);
2751 case llvm::Triple::mblaze:
2752 return new MBlazeTargetInfo(T);
2754 case llvm::Triple::sparc:
2755 if (os == llvm::Triple::AuroraUX)
2756 return new AuroraUXSparcV8TargetInfo(T);
2757 if (os == llvm::Triple::Solaris)
2758 return new SolarisSparcV8TargetInfo(T);
2759 return new SparcV8TargetInfo(T);
2761 // FIXME: Need a real SPU target.
2762 case llvm::Triple::cellspu:
2763 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2765 case llvm::Triple::systemz:
2766 return new SystemZTargetInfo(T);
2768 case llvm::Triple::tce:
2769 return new TCETargetInfo(T);
2771 case llvm::Triple::x86:
2772 if (Triple.isOSDarwin())
2773 return new DarwinI386TargetInfo(T);
2776 case llvm::Triple::AuroraUX:
2777 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
2778 case llvm::Triple::Linux:
2779 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2780 case llvm::Triple::DragonFly:
2781 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2782 case llvm::Triple::NetBSD:
2783 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2784 case llvm::Triple::OpenBSD:
2785 return new OpenBSDI386TargetInfo(T);
2786 case llvm::Triple::FreeBSD:
2787 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
2788 case llvm::Triple::Minix:
2789 return new MinixTargetInfo<X86_32TargetInfo>(T);
2790 case llvm::Triple::Solaris:
2791 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2792 case llvm::Triple::Cygwin:
2793 return new CygwinX86_32TargetInfo(T);
2794 case llvm::Triple::MinGW32:
2795 return new MinGWX86_32TargetInfo(T);
2796 case llvm::Triple::Win32:
2797 return new VisualStudioWindowsX86_32TargetInfo(T);
2798 case llvm::Triple::Haiku:
2799 return new HaikuX86_32TargetInfo(T);
2801 return new X86_32TargetInfo(T);
2804 case llvm::Triple::x86_64:
2805 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
2806 return new DarwinX86_64TargetInfo(T);
2809 case llvm::Triple::AuroraUX:
2810 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
2811 case llvm::Triple::Linux:
2812 return new LinuxTargetInfo<X86_64TargetInfo>(T);
2813 case llvm::Triple::DragonFly:
2814 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
2815 case llvm::Triple::NetBSD:
2816 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2817 case llvm::Triple::OpenBSD:
2818 return new OpenBSDX86_64TargetInfo(T);
2819 case llvm::Triple::FreeBSD:
2820 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2821 case llvm::Triple::Solaris:
2822 return new SolarisTargetInfo<X86_64TargetInfo>(T);
2823 case llvm::Triple::MinGW32:
2824 return new MinGWX86_64TargetInfo(T);
2825 case llvm::Triple::Win32: // This is what Triple.h supports now.
2826 return new VisualStudioWindowsX86_64TargetInfo(T);
2828 return new X86_64TargetInfo(T);
2833 /// CreateTargetInfo - Return the target info object for the specified target
2835 TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
2836 TargetOptions &Opts) {
2837 llvm::Triple Triple(Opts.Triple);
2839 // Construct the target
2840 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2842 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2846 // Set the target CPU if specified.
2847 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2848 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2852 // Set the target ABI if specified.
2853 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2854 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2858 // Set the target C++ ABI.
2859 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
2860 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2864 // Compute the default target features, we need the target to handle this
2865 // because features may have dependencies on one another.
2866 llvm::StringMap<bool> Features;
2867 Target->getDefaultFeatures(Opts.CPU, Features);
2869 // Apply the user specified deltas.
2870 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2871 ie = Opts.Features.end(); it != ie; ++it) {
2872 const char *Name = it->c_str();
2874 // Apply the feature via the target.
2875 if ((Name[0] != '-' && Name[0] != '+') ||
2876 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2877 Diags.Report(diag::err_target_invalid_feature) << Name;
2882 // Add the features to the compile options.
2884 // FIXME: If we are completely confident that we have the right set, we only
2885 // need to pass the minuses.
2886 Opts.Features.clear();
2887 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2888 ie = Features.end(); it != ie; ++it)
2889 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2890 Target->HandleTargetFeatures(Opts.Features);
2892 return Target.take();