Targets.cpp revision 9b79630004fe0a748e0328a19de25840b37d4aa1
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/IR/Type.h" 29#include "llvm/MC/MCSectionMachO.h" 30#include "llvm/Support/ErrorHandling.h" 31#include <algorithm> 32using namespace clang; 33 34//===----------------------------------------------------------------------===// 35// Common code shared among targets. 36//===----------------------------------------------------------------------===// 37 38/// DefineStd - Define a macro name and standard variants. For example if 39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix" 40/// when in GNU mode. 41static void DefineStd(MacroBuilder &Builder, StringRef MacroName, 42 const LangOptions &Opts) { 43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace"); 44 45 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier 46 // in the user's namespace. 47 if (Opts.GNUMode) 48 Builder.defineMacro(MacroName); 49 50 // Define __unix. 51 Builder.defineMacro("__" + MacroName); 52 53 // Define __unix__. 54 Builder.defineMacro("__" + MacroName + "__"); 55} 56 57static 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 69namespace { 70template<typename TgtInfo> 71class OSTargetInfo : public TgtInfo { 72protected: 73 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 74 MacroBuilder &Builder) const=0; 75public: 76 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {} 77 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 87static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts, 88 const llvm::Triple &Triple, 89 StringRef &PlatformName, 90 VersionTuple &PlatformMinVersion) { 91 Builder.defineMacro("__APPLE_CC__", "6000"); 92 Builder.defineMacro("__APPLE__"); 93 Builder.defineMacro("__MACH__"); 94 Builder.defineMacro("OBJC_NEW_PROPERTIES"); 95 // AddressSanitizer doesn't play well with source fortification, which is on 96 // by default on Darwin. 97 if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0"); 98 99 if (!Opts.ObjCAutoRefCount) { 100 // __weak is always defined, for use in blocks and with objc pointers. 101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))"); 102 103 // Darwin defines __strong even in C mode (just to nothing). 104 if (Opts.getGC() != LangOptions::NonGC) 105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))"); 106 else 107 Builder.defineMacro("__strong", ""); 108 109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even 110 // allow this in C, since one might have block pointers in structs that 111 // are used in pure C code and in Objective-C ARC. 112 Builder.defineMacro("__unsafe_unretained", ""); 113 } 114 115 if (Opts.Static) 116 Builder.defineMacro("__STATIC__"); 117 else 118 Builder.defineMacro("__DYNAMIC__"); 119 120 if (Opts.POSIXThreads) 121 Builder.defineMacro("_REENTRANT"); 122 123 // Get the platform type and version number from the triple. 124 unsigned Maj, Min, Rev; 125 if (Triple.isMacOSX()) { 126 Triple.getMacOSXVersion(Maj, Min, Rev); 127 PlatformName = "macosx"; 128 } else { 129 Triple.getOSVersion(Maj, Min, Rev); 130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS()); 131 } 132 133 // If -target arch-pc-win32-macho option specified, we're 134 // generating code for Win32 ABI. No need to emit 135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__. 136 if (PlatformName == "win32") { 137 PlatformMinVersion = VersionTuple(Maj, Min, Rev); 138 return; 139 } 140 141 // Set the appropriate OS version define. 142 if (Triple.isiOS()) { 143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!"); 144 char Str[6]; 145 Str[0] = '0' + Maj; 146 Str[1] = '0' + (Min / 10); 147 Str[2] = '0' + (Min % 10); 148 Str[3] = '0' + (Rev / 10); 149 Str[4] = '0' + (Rev % 10); 150 Str[5] = '\0'; 151 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str); 152 } else if (Triple.getArchName() != "thumbv6m" && 153 Triple.getArchName() != "thumbv7m" && 154 Triple.getArchName() != "thumbv7em") { 155 // Note that the Driver allows versions which aren't representable in the 156 // define (because we only get a single digit for the minor and micro 157 // revision numbers). So, we limit them to the maximum representable 158 // version. 159 assert(Triple.getEnvironmentName().empty() && "Invalid environment!"); 160 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!"); 161 char Str[5]; 162 Str[0] = '0' + (Maj / 10); 163 Str[1] = '0' + (Maj % 10); 164 Str[2] = '0' + std::min(Min, 9U); 165 Str[3] = '0' + std::min(Rev, 9U); 166 Str[4] = '\0'; 167 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str); 168 } 169 170 PlatformMinVersion = VersionTuple(Maj, Min, Rev); 171} 172 173namespace { 174template<typename Target> 175class DarwinTargetInfo : public OSTargetInfo<Target> { 176protected: 177 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 178 MacroBuilder &Builder) const { 179 getDarwinDefines(Builder, Opts, Triple, this->PlatformName, 180 this->PlatformMinVersion); 181 } 182 183public: 184 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 185 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7); 186 this->MCountName = "\01mcount"; 187 } 188 189 virtual std::string isValidSectionSpecifier(StringRef SR) const { 190 // Let MCSectionMachO validate this. 191 StringRef Segment, Section; 192 unsigned TAA, StubSize; 193 bool HasTAA; 194 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section, 195 TAA, HasTAA, StubSize); 196 } 197 198 virtual const char *getStaticInitSectionSpecifier() const { 199 // FIXME: We should return 0 when building kexts. 200 return "__TEXT,__StaticInit,regular,pure_instructions"; 201 } 202 203 /// Darwin does not support protected visibility. Darwin's "default" 204 /// is very similar to ELF's "protected"; Darwin requires a "weak" 205 /// attribute on declarations that can be dynamically replaced. 206 virtual bool hasProtectedVisibility() const { 207 return false; 208 } 209}; 210 211 212// DragonFlyBSD Target 213template<typename Target> 214class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> { 215protected: 216 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 217 MacroBuilder &Builder) const { 218 // DragonFly defines; list based off of gcc output 219 Builder.defineMacro("__DragonFly__"); 220 Builder.defineMacro("__DragonFly_cc_version", "100001"); 221 Builder.defineMacro("__ELF__"); 222 Builder.defineMacro("__KPRINTF_ATTRIBUTE__"); 223 Builder.defineMacro("__tune_i386__"); 224 DefineStd(Builder, "unix", Opts); 225 } 226public: 227 DragonFlyBSDTargetInfo(const llvm::Triple &Triple) 228 : OSTargetInfo<Target>(Triple) { 229 this->UserLabelPrefix = ""; 230 231 switch (Triple.getArch()) { 232 default: 233 case llvm::Triple::x86: 234 case llvm::Triple::x86_64: 235 this->MCountName = ".mcount"; 236 break; 237 } 238 } 239}; 240 241// FreeBSD Target 242template<typename Target> 243class FreeBSDTargetInfo : public OSTargetInfo<Target> { 244protected: 245 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 246 MacroBuilder &Builder) const { 247 // FreeBSD defines; list based off of gcc output 248 249 unsigned Release = Triple.getOSMajorVersion(); 250 if (Release == 0U) 251 Release = 8; 252 253 Builder.defineMacro("__FreeBSD__", Twine(Release)); 254 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U)); 255 Builder.defineMacro("__KPRINTF_ATTRIBUTE__"); 256 DefineStd(Builder, "unix", Opts); 257 Builder.defineMacro("__ELF__"); 258 259 // On FreeBSD, wchar_t contains the number of the code point as 260 // used by the character set of the locale. These character sets are 261 // not necessarily a superset of ASCII. 262 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1"); 263 } 264public: 265 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 266 this->UserLabelPrefix = ""; 267 268 switch (Triple.getArch()) { 269 default: 270 case llvm::Triple::x86: 271 case llvm::Triple::x86_64: 272 this->MCountName = ".mcount"; 273 break; 274 case llvm::Triple::mips: 275 case llvm::Triple::mipsel: 276 case llvm::Triple::ppc: 277 case llvm::Triple::ppc64: 278 case llvm::Triple::ppc64le: 279 this->MCountName = "_mcount"; 280 break; 281 case llvm::Triple::arm: 282 this->MCountName = "__mcount"; 283 break; 284 } 285 } 286}; 287 288// GNU/kFreeBSD Target 289template<typename Target> 290class KFreeBSDTargetInfo : public OSTargetInfo<Target> { 291protected: 292 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 293 MacroBuilder &Builder) const { 294 // GNU/kFreeBSD defines; list based off of gcc output 295 296 DefineStd(Builder, "unix", Opts); 297 Builder.defineMacro("__FreeBSD_kernel__"); 298 Builder.defineMacro("__GLIBC__"); 299 Builder.defineMacro("__ELF__"); 300 if (Opts.POSIXThreads) 301 Builder.defineMacro("_REENTRANT"); 302 if (Opts.CPlusPlus) 303 Builder.defineMacro("_GNU_SOURCE"); 304 } 305public: 306 KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 307 this->UserLabelPrefix = ""; 308 } 309}; 310 311// Minix Target 312template<typename Target> 313class MinixTargetInfo : public OSTargetInfo<Target> { 314protected: 315 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 316 MacroBuilder &Builder) const { 317 // Minix defines 318 319 Builder.defineMacro("__minix", "3"); 320 Builder.defineMacro("_EM_WSIZE", "4"); 321 Builder.defineMacro("_EM_PSIZE", "4"); 322 Builder.defineMacro("_EM_SSIZE", "2"); 323 Builder.defineMacro("_EM_LSIZE", "4"); 324 Builder.defineMacro("_EM_FSIZE", "4"); 325 Builder.defineMacro("_EM_DSIZE", "8"); 326 Builder.defineMacro("__ELF__"); 327 DefineStd(Builder, "unix", Opts); 328 } 329public: 330 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 331 this->UserLabelPrefix = ""; 332 } 333}; 334 335// Linux target 336template<typename Target> 337class LinuxTargetInfo : public OSTargetInfo<Target> { 338protected: 339 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 340 MacroBuilder &Builder) const { 341 // Linux defines; list based off of gcc output 342 DefineStd(Builder, "unix", Opts); 343 DefineStd(Builder, "linux", Opts); 344 Builder.defineMacro("__gnu_linux__"); 345 Builder.defineMacro("__ELF__"); 346 if (Triple.getEnvironment() == llvm::Triple::Android) 347 Builder.defineMacro("__ANDROID__", "1"); 348 if (Opts.POSIXThreads) 349 Builder.defineMacro("_REENTRANT"); 350 if (Opts.CPlusPlus) 351 Builder.defineMacro("_GNU_SOURCE"); 352 } 353public: 354 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 355 this->UserLabelPrefix = ""; 356 this->WIntType = TargetInfo::UnsignedInt; 357 } 358 359 virtual const char *getStaticInitSectionSpecifier() const { 360 return ".text.startup"; 361 } 362}; 363 364// NetBSD Target 365template<typename Target> 366class NetBSDTargetInfo : public OSTargetInfo<Target> { 367protected: 368 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 369 MacroBuilder &Builder) const { 370 // NetBSD defines; list based off of gcc output 371 Builder.defineMacro("__NetBSD__"); 372 Builder.defineMacro("__unix__"); 373 Builder.defineMacro("__ELF__"); 374 if (Opts.POSIXThreads) 375 Builder.defineMacro("_POSIX_THREADS"); 376 } 377public: 378 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 379 this->UserLabelPrefix = ""; 380 } 381}; 382 383// OpenBSD Target 384template<typename Target> 385class OpenBSDTargetInfo : public OSTargetInfo<Target> { 386protected: 387 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 388 MacroBuilder &Builder) const { 389 // OpenBSD defines; list based off of gcc output 390 391 Builder.defineMacro("__OpenBSD__"); 392 DefineStd(Builder, "unix", Opts); 393 Builder.defineMacro("__ELF__"); 394 if (Opts.POSIXThreads) 395 Builder.defineMacro("_REENTRANT"); 396 } 397public: 398 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 399 this->UserLabelPrefix = ""; 400 this->TLSSupported = false; 401 402 switch (Triple.getArch()) { 403 default: 404 case llvm::Triple::x86: 405 case llvm::Triple::x86_64: 406 case llvm::Triple::arm: 407 case llvm::Triple::sparc: 408 this->MCountName = "__mcount"; 409 break; 410 case llvm::Triple::mips64: 411 case llvm::Triple::mips64el: 412 case llvm::Triple::ppc: 413 case llvm::Triple::sparcv9: 414 this->MCountName = "_mcount"; 415 break; 416 } 417 } 418}; 419 420// Bitrig Target 421template<typename Target> 422class BitrigTargetInfo : public OSTargetInfo<Target> { 423protected: 424 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 425 MacroBuilder &Builder) const { 426 // Bitrig defines; list based off of gcc output 427 428 Builder.defineMacro("__Bitrig__"); 429 DefineStd(Builder, "unix", Opts); 430 Builder.defineMacro("__ELF__"); 431 if (Opts.POSIXThreads) 432 Builder.defineMacro("_REENTRANT"); 433 } 434public: 435 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 436 this->UserLabelPrefix = ""; 437 this->TLSSupported = false; 438 this->MCountName = "__mcount"; 439 } 440}; 441 442// PSP Target 443template<typename Target> 444class PSPTargetInfo : public OSTargetInfo<Target> { 445protected: 446 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 447 MacroBuilder &Builder) const { 448 // PSP defines; list based on the output of the pspdev gcc toolchain. 449 Builder.defineMacro("PSP"); 450 Builder.defineMacro("_PSP"); 451 Builder.defineMacro("__psp__"); 452 Builder.defineMacro("__ELF__"); 453 } 454public: 455 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 456 this->UserLabelPrefix = ""; 457 } 458}; 459 460// PS3 PPU Target 461template<typename Target> 462class PS3PPUTargetInfo : public OSTargetInfo<Target> { 463protected: 464 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 465 MacroBuilder &Builder) const { 466 // PS3 PPU defines. 467 Builder.defineMacro("__PPC__"); 468 Builder.defineMacro("__PPU__"); 469 Builder.defineMacro("__CELLOS_LV2__"); 470 Builder.defineMacro("__ELF__"); 471 Builder.defineMacro("__LP32__"); 472 Builder.defineMacro("_ARCH_PPC64"); 473 Builder.defineMacro("__powerpc64__"); 474 } 475public: 476 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 477 this->UserLabelPrefix = ""; 478 this->LongWidth = this->LongAlign = 32; 479 this->PointerWidth = this->PointerAlign = 32; 480 this->IntMaxType = TargetInfo::SignedLongLong; 481 this->UIntMaxType = TargetInfo::UnsignedLongLong; 482 this->Int64Type = TargetInfo::SignedLongLong; 483 this->SizeType = TargetInfo::UnsignedInt; 484 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 485 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32"; 486 } 487}; 488 489// FIXME: Need a real SPU target. 490// PS3 SPU Target 491template<typename Target> 492class PS3SPUTargetInfo : public OSTargetInfo<Target> { 493protected: 494 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 495 MacroBuilder &Builder) const { 496 // PS3 PPU defines. 497 Builder.defineMacro("__SPU__"); 498 Builder.defineMacro("__ELF__"); 499 } 500public: 501 PS3SPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 502 this->UserLabelPrefix = ""; 503 } 504}; 505 506// AuroraUX target 507template<typename Target> 508class AuroraUXTargetInfo : public OSTargetInfo<Target> { 509protected: 510 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 511 MacroBuilder &Builder) const { 512 DefineStd(Builder, "sun", Opts); 513 DefineStd(Builder, "unix", Opts); 514 Builder.defineMacro("__ELF__"); 515 Builder.defineMacro("__svr4__"); 516 Builder.defineMacro("__SVR4"); 517 } 518public: 519 AuroraUXTargetInfo(const llvm::Triple &Triple) 520 : OSTargetInfo<Target>(Triple) { 521 this->UserLabelPrefix = ""; 522 this->WCharType = this->SignedLong; 523 // FIXME: WIntType should be SignedLong 524 } 525}; 526 527// Solaris target 528template<typename Target> 529class SolarisTargetInfo : public OSTargetInfo<Target> { 530protected: 531 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 532 MacroBuilder &Builder) const { 533 DefineStd(Builder, "sun", Opts); 534 DefineStd(Builder, "unix", Opts); 535 Builder.defineMacro("__ELF__"); 536 Builder.defineMacro("__svr4__"); 537 Builder.defineMacro("__SVR4"); 538 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and 539 // newer, but to 500 for everything else. feature_test.h has a check to 540 // ensure that you are not using C99 with an old version of X/Open or C89 541 // with a new version. 542 if (Opts.C99 || Opts.C11) 543 Builder.defineMacro("_XOPEN_SOURCE", "600"); 544 else 545 Builder.defineMacro("_XOPEN_SOURCE", "500"); 546 if (Opts.CPlusPlus) 547 Builder.defineMacro("__C99FEATURES__"); 548 Builder.defineMacro("_LARGEFILE_SOURCE"); 549 Builder.defineMacro("_LARGEFILE64_SOURCE"); 550 Builder.defineMacro("__EXTENSIONS__"); 551 Builder.defineMacro("_REENTRANT"); 552 } 553public: 554 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 555 this->UserLabelPrefix = ""; 556 this->WCharType = this->SignedInt; 557 // FIXME: WIntType should be SignedLong 558 } 559}; 560 561// Windows target 562template<typename Target> 563class WindowsTargetInfo : public OSTargetInfo<Target> { 564protected: 565 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 566 MacroBuilder &Builder) const { 567 Builder.defineMacro("_WIN32"); 568 } 569 void getVisualStudioDefines(const LangOptions &Opts, 570 MacroBuilder &Builder) const { 571 if (Opts.CPlusPlus) { 572 if (Opts.RTTI) 573 Builder.defineMacro("_CPPRTTI"); 574 575 if (Opts.Exceptions) 576 Builder.defineMacro("_CPPUNWIND"); 577 } 578 579 if (!Opts.CharIsSigned) 580 Builder.defineMacro("_CHAR_UNSIGNED"); 581 582 // FIXME: POSIXThreads isn't exactly the option this should be defined for, 583 // but it works for now. 584 if (Opts.POSIXThreads) 585 Builder.defineMacro("_MT"); 586 587 if (Opts.MSCVersion != 0) 588 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion)); 589 590 if (Opts.MicrosoftExt) { 591 Builder.defineMacro("_MSC_EXTENSIONS"); 592 593 if (Opts.CPlusPlus11) { 594 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED"); 595 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED"); 596 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED"); 597 } 598 } 599 600 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64"); 601 } 602 603public: 604 WindowsTargetInfo(const llvm::Triple &Triple) 605 : OSTargetInfo<Target>(Triple) {} 606}; 607 608template <typename Target> 609class NaClTargetInfo : public OSTargetInfo<Target> { 610protected: 611 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 612 MacroBuilder &Builder) const { 613 if (Opts.POSIXThreads) 614 Builder.defineMacro("_REENTRANT"); 615 if (Opts.CPlusPlus) 616 Builder.defineMacro("_GNU_SOURCE"); 617 618 DefineStd(Builder, "unix", Opts); 619 Builder.defineMacro("__ELF__"); 620 Builder.defineMacro("__native_client__"); 621 } 622 623public: 624 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 625 this->UserLabelPrefix = ""; 626 this->LongAlign = 32; 627 this->LongWidth = 32; 628 this->PointerAlign = 32; 629 this->PointerWidth = 32; 630 this->IntMaxType = TargetInfo::SignedLongLong; 631 this->UIntMaxType = TargetInfo::UnsignedLongLong; 632 this->Int64Type = TargetInfo::SignedLongLong; 633 this->DoubleAlign = 64; 634 this->LongDoubleWidth = 64; 635 this->LongDoubleAlign = 64; 636 this->SizeType = TargetInfo::UnsignedInt; 637 this->PtrDiffType = TargetInfo::SignedInt; 638 this->IntPtrType = TargetInfo::SignedInt; 639 // RegParmMax is inherited from the underlying architecture 640 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble; 641 this->DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-" 642 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32"; 643 } 644 virtual typename Target::CallingConvCheckResult checkCallingConvention( 645 CallingConv CC) const { 646 return CC == CC_PnaclCall ? Target::CCCR_OK : 647 Target::checkCallingConvention(CC); 648 } 649}; 650} // end anonymous namespace. 651 652//===----------------------------------------------------------------------===// 653// Specific target implementations. 654//===----------------------------------------------------------------------===// 655 656namespace { 657// PPC abstract base class 658class PPCTargetInfo : public TargetInfo { 659 static const Builtin::Info BuiltinInfo[]; 660 static const char * const GCCRegNames[]; 661 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 662 std::string CPU; 663 664 // Target cpu features. 665 bool HasVSX; 666 667public: 668 PPCTargetInfo(const llvm::Triple &Triple) 669 : TargetInfo(Triple), HasVSX(false) { 670 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le); 671 LongDoubleWidth = LongDoubleAlign = 128; 672 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble; 673 } 674 675 /// \brief Flags for architecture specific defines. 676 typedef enum { 677 ArchDefineNone = 0, 678 ArchDefineName = 1 << 0, // <name> is substituted for arch name. 679 ArchDefinePpcgr = 1 << 1, 680 ArchDefinePpcsq = 1 << 2, 681 ArchDefine440 = 1 << 3, 682 ArchDefine603 = 1 << 4, 683 ArchDefine604 = 1 << 5, 684 ArchDefinePwr4 = 1 << 6, 685 ArchDefinePwr5 = 1 << 7, 686 ArchDefinePwr5x = 1 << 8, 687 ArchDefinePwr6 = 1 << 9, 688 ArchDefinePwr6x = 1 << 10, 689 ArchDefinePwr7 = 1 << 11, 690 ArchDefineA2 = 1 << 12, 691 ArchDefineA2q = 1 << 13 692 } ArchDefineTypes; 693 694 // Note: GCC recognizes the following additional cpus: 695 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801, 696 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell, 697 // titan, rs64. 698 virtual bool setCPU(const std::string &Name) { 699 bool CPUKnown = llvm::StringSwitch<bool>(Name) 700 .Case("generic", true) 701 .Case("440", true) 702 .Case("450", true) 703 .Case("601", true) 704 .Case("602", true) 705 .Case("603", true) 706 .Case("603e", true) 707 .Case("603ev", true) 708 .Case("604", true) 709 .Case("604e", true) 710 .Case("620", true) 711 .Case("630", true) 712 .Case("g3", true) 713 .Case("7400", true) 714 .Case("g4", true) 715 .Case("7450", true) 716 .Case("g4+", true) 717 .Case("750", true) 718 .Case("970", true) 719 .Case("g5", true) 720 .Case("a2", true) 721 .Case("a2q", true) 722 .Case("e500mc", true) 723 .Case("e5500", true) 724 .Case("power3", true) 725 .Case("pwr3", true) 726 .Case("power4", true) 727 .Case("pwr4", true) 728 .Case("power5", true) 729 .Case("pwr5", true) 730 .Case("power5x", true) 731 .Case("pwr5x", true) 732 .Case("power6", true) 733 .Case("pwr6", true) 734 .Case("power6x", true) 735 .Case("pwr6x", true) 736 .Case("power7", true) 737 .Case("pwr7", true) 738 .Case("powerpc", true) 739 .Case("ppc", true) 740 .Case("powerpc64", true) 741 .Case("ppc64", true) 742 .Case("powerpc64le", true) 743 .Case("ppc64le", true) 744 .Default(false); 745 746 if (CPUKnown) 747 CPU = Name; 748 749 return CPUKnown; 750 } 751 752 virtual void getTargetBuiltins(const Builtin::Info *&Records, 753 unsigned &NumRecords) const { 754 Records = BuiltinInfo; 755 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin; 756 } 757 758 virtual bool isCLZForZeroUndef() const { return false; } 759 760 virtual void getTargetDefines(const LangOptions &Opts, 761 MacroBuilder &Builder) const; 762 763 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const; 764 765 virtual bool handleTargetFeatures(std::vector<std::string> &Features, 766 DiagnosticsEngine &Diags); 767 virtual bool hasFeature(StringRef Feature) const; 768 769 virtual void getGCCRegNames(const char * const *&Names, 770 unsigned &NumNames) const; 771 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 772 unsigned &NumAliases) const; 773 virtual bool validateAsmConstraint(const char *&Name, 774 TargetInfo::ConstraintInfo &Info) const { 775 switch (*Name) { 776 default: return false; 777 case 'O': // Zero 778 break; 779 case 'b': // Base register 780 case 'f': // Floating point register 781 Info.setAllowsRegister(); 782 break; 783 // FIXME: The following are added to allow parsing. 784 // I just took a guess at what the actions should be. 785 // Also, is more specific checking needed? I.e. specific registers? 786 case 'd': // Floating point register (containing 64-bit value) 787 case 'v': // Altivec vector register 788 Info.setAllowsRegister(); 789 break; 790 case 'w': 791 switch (Name[1]) { 792 case 'd':// VSX vector register to hold vector double data 793 case 'f':// VSX vector register to hold vector float data 794 case 's':// VSX vector register to hold scalar float data 795 case 'a':// Any VSX register 796 break; 797 default: 798 return false; 799 } 800 Info.setAllowsRegister(); 801 Name++; // Skip over 'w'. 802 break; 803 case 'h': // `MQ', `CTR', or `LINK' register 804 case 'q': // `MQ' register 805 case 'c': // `CTR' register 806 case 'l': // `LINK' register 807 case 'x': // `CR' register (condition register) number 0 808 case 'y': // `CR' register (condition register) 809 case 'z': // `XER[CA]' carry bit (part of the XER register) 810 Info.setAllowsRegister(); 811 break; 812 case 'I': // Signed 16-bit constant 813 case 'J': // Unsigned 16-bit constant shifted left 16 bits 814 // (use `L' instead for SImode constants) 815 case 'K': // Unsigned 16-bit constant 816 case 'L': // Signed 16-bit constant shifted left 16 bits 817 case 'M': // Constant larger than 31 818 case 'N': // Exact power of 2 819 case 'P': // Constant whose negation is a signed 16-bit constant 820 case 'G': // Floating point constant that can be loaded into a 821 // register with one instruction per word 822 case 'H': // Integer/Floating point constant that can be loaded 823 // into a register using three instructions 824 break; 825 case 'm': // Memory operand. Note that on PowerPC targets, m can 826 // include addresses that update the base register. It 827 // is therefore only safe to use `m' in an asm statement 828 // if that asm statement accesses the operand exactly once. 829 // The asm statement must also use `%U<opno>' as a 830 // placeholder for the "update" flag in the corresponding 831 // load or store instruction. For example: 832 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val)); 833 // is correct but: 834 // asm ("st %1,%0" : "=m" (mem) : "r" (val)); 835 // is not. Use es rather than m if you don't want the base 836 // register to be updated. 837 case 'e': 838 if (Name[1] != 's') 839 return false; 840 // es: A "stable" memory operand; that is, one which does not 841 // include any automodification of the base register. Unlike 842 // `m', this constraint can be used in asm statements that 843 // might access the operand several times, or that might not 844 // access it at all. 845 Info.setAllowsMemory(); 846 Name++; // Skip over 'e'. 847 break; 848 case 'Q': // Memory operand that is an offset from a register (it is 849 // usually better to use `m' or `es' in asm statements) 850 case 'Z': // Memory operand that is an indexed or indirect from a 851 // register (it is usually better to use `m' or `es' in 852 // asm statements) 853 Info.setAllowsMemory(); 854 Info.setAllowsRegister(); 855 break; 856 case 'R': // AIX TOC entry 857 case 'a': // Address operand that is an indexed or indirect from a 858 // register (`p' is preferable for asm statements) 859 case 'S': // Constant suitable as a 64-bit mask operand 860 case 'T': // Constant suitable as a 32-bit mask operand 861 case 'U': // System V Release 4 small data area reference 862 case 't': // AND masks that can be performed by two rldic{l, r} 863 // instructions 864 case 'W': // Vector constant that does not require memory 865 case 'j': // Vector constant that is all zeros. 866 break; 867 // End FIXME. 868 } 869 return true; 870 } 871 virtual const char *getClobbers() const { 872 return ""; 873 } 874 int getEHDataRegisterNumber(unsigned RegNo) const { 875 if (RegNo == 0) return 3; 876 if (RegNo == 1) return 4; 877 return -1; 878 } 879}; 880 881const Builtin::Info PPCTargetInfo::BuiltinInfo[] = { 882#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, 883#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ 884 ALL_LANGUAGES }, 885#include "clang/Basic/BuiltinsPPC.def" 886}; 887 888 /// handleTargetFeatures - Perform initialization based on the user 889/// configured set of features. 890bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, 891 DiagnosticsEngine &Diags) { 892 // Remember the maximum enabled sselevel. 893 for (unsigned i = 0, e = Features.size(); i !=e; ++i) { 894 // Ignore disabled features. 895 if (Features[i][0] == '-') 896 continue; 897 898 StringRef Feature = StringRef(Features[i]).substr(1); 899 900 if (Feature == "vsx") { 901 HasVSX = true; 902 continue; 903 } 904 905 // TODO: Finish this list and add an assert that we've handled them 906 // all. 907 } 908 909 return true; 910} 911 912/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific 913/// #defines that are not tied to a specific subtarget. 914void PPCTargetInfo::getTargetDefines(const LangOptions &Opts, 915 MacroBuilder &Builder) const { 916 // Target identification. 917 Builder.defineMacro("__ppc__"); 918 Builder.defineMacro("__PPC__"); 919 Builder.defineMacro("_ARCH_PPC"); 920 Builder.defineMacro("__powerpc__"); 921 Builder.defineMacro("__POWERPC__"); 922 if (PointerWidth == 64) { 923 Builder.defineMacro("_ARCH_PPC64"); 924 Builder.defineMacro("__powerpc64__"); 925 Builder.defineMacro("__ppc64__"); 926 Builder.defineMacro("__PPC64__"); 927 } 928 929 // Target properties. 930 if (getTriple().getArch() == llvm::Triple::ppc64le) { 931 Builder.defineMacro("_LITTLE_ENDIAN"); 932 Builder.defineMacro("__LITTLE_ENDIAN__"); 933 } else { 934 if (getTriple().getOS() != llvm::Triple::NetBSD && 935 getTriple().getOS() != llvm::Triple::OpenBSD) 936 Builder.defineMacro("_BIG_ENDIAN"); 937 Builder.defineMacro("__BIG_ENDIAN__"); 938 } 939 940 // Subtarget options. 941 Builder.defineMacro("__NATURAL_ALIGNMENT__"); 942 Builder.defineMacro("__REGISTER_PREFIX__", ""); 943 944 // FIXME: Should be controlled by command line option. 945 if (LongDoubleWidth == 128) 946 Builder.defineMacro("__LONG_DOUBLE_128__"); 947 948 if (Opts.AltiVec) { 949 Builder.defineMacro("__VEC__", "10206"); 950 Builder.defineMacro("__ALTIVEC__"); 951 } 952 953 // CPU identification. 954 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU) 955 .Case("440", ArchDefineName) 956 .Case("450", ArchDefineName | ArchDefine440) 957 .Case("601", ArchDefineName) 958 .Case("602", ArchDefineName | ArchDefinePpcgr) 959 .Case("603", ArchDefineName | ArchDefinePpcgr) 960 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr) 961 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr) 962 .Case("604", ArchDefineName | ArchDefinePpcgr) 963 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr) 964 .Case("620", ArchDefineName | ArchDefinePpcgr) 965 .Case("630", ArchDefineName | ArchDefinePpcgr) 966 .Case("7400", ArchDefineName | ArchDefinePpcgr) 967 .Case("7450", ArchDefineName | ArchDefinePpcgr) 968 .Case("750", ArchDefineName | ArchDefinePpcgr) 969 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr 970 | ArchDefinePpcsq) 971 .Case("a2", ArchDefineA2) 972 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q) 973 .Case("pwr3", ArchDefinePpcgr) 974 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq) 975 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr 976 | ArchDefinePpcsq) 977 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4 978 | ArchDefinePpcgr | ArchDefinePpcsq) 979 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5 980 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq) 981 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x 982 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr 983 | ArchDefinePpcsq) 984 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6 985 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 986 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq) 987 .Case("power3", ArchDefinePpcgr) 988 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq) 989 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr 990 | ArchDefinePpcsq) 991 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 992 | ArchDefinePpcgr | ArchDefinePpcsq) 993 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 994 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq) 995 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x 996 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr 997 | ArchDefinePpcsq) 998 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6 999 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 1000 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq) 1001 .Default(ArchDefineNone); 1002 1003 if (defs & ArchDefineName) 1004 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper())); 1005 if (defs & ArchDefinePpcgr) 1006 Builder.defineMacro("_ARCH_PPCGR"); 1007 if (defs & ArchDefinePpcsq) 1008 Builder.defineMacro("_ARCH_PPCSQ"); 1009 if (defs & ArchDefine440) 1010 Builder.defineMacro("_ARCH_440"); 1011 if (defs & ArchDefine603) 1012 Builder.defineMacro("_ARCH_603"); 1013 if (defs & ArchDefine604) 1014 Builder.defineMacro("_ARCH_604"); 1015 if (defs & ArchDefinePwr4) 1016 Builder.defineMacro("_ARCH_PWR4"); 1017 if (defs & ArchDefinePwr5) 1018 Builder.defineMacro("_ARCH_PWR5"); 1019 if (defs & ArchDefinePwr5x) 1020 Builder.defineMacro("_ARCH_PWR5X"); 1021 if (defs & ArchDefinePwr6) 1022 Builder.defineMacro("_ARCH_PWR6"); 1023 if (defs & ArchDefinePwr6x) 1024 Builder.defineMacro("_ARCH_PWR6X"); 1025 if (defs & ArchDefinePwr7) 1026 Builder.defineMacro("_ARCH_PWR7"); 1027 if (defs & ArchDefineA2) 1028 Builder.defineMacro("_ARCH_A2"); 1029 if (defs & ArchDefineA2q) { 1030 Builder.defineMacro("_ARCH_A2Q"); 1031 Builder.defineMacro("_ARCH_QP"); 1032 } 1033 1034 if (getTriple().getVendor() == llvm::Triple::BGQ) { 1035 Builder.defineMacro("__bg__"); 1036 Builder.defineMacro("__THW_BLUEGENE__"); 1037 Builder.defineMacro("__bgq__"); 1038 Builder.defineMacro("__TOS_BGQ__"); 1039 } 1040 1041 if (HasVSX) 1042 Builder.defineMacro("__VSX__"); 1043 1044 // FIXME: The following are not yet generated here by Clang, but are 1045 // generated by GCC: 1046 // 1047 // _SOFT_FLOAT_ 1048 // __RECIP_PRECISION__ 1049 // __APPLE_ALTIVEC__ 1050 // __RECIP__ 1051 // __RECIPF__ 1052 // __RSQRTE__ 1053 // __RSQRTEF__ 1054 // _SOFT_DOUBLE_ 1055 // __NO_LWSYNC__ 1056 // __HAVE_BSWAP__ 1057 // __LONGDOUBLE128 1058 // __CMODEL_MEDIUM__ 1059 // __CMODEL_LARGE__ 1060 // _CALL_SYSV 1061 // _CALL_DARWIN 1062 // __NO_FPRS__ 1063} 1064 1065void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const { 1066 Features["altivec"] = llvm::StringSwitch<bool>(CPU) 1067 .Case("7400", true) 1068 .Case("g4", true) 1069 .Case("7450", true) 1070 .Case("g4+", true) 1071 .Case("970", true) 1072 .Case("g5", true) 1073 .Case("pwr6", true) 1074 .Case("pwr7", true) 1075 .Case("ppc64", true) 1076 .Case("ppc64le", true) 1077 .Default(false); 1078 1079 Features["qpx"] = (CPU == "a2q"); 1080} 1081 1082bool PPCTargetInfo::hasFeature(StringRef Feature) const { 1083 return Feature == "powerpc"; 1084} 1085 1086 1087const char * const PPCTargetInfo::GCCRegNames[] = { 1088 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 1089 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 1090 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 1091 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", 1092 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", 1093 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", 1094 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", 1095 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", 1096 "mq", "lr", "ctr", "ap", 1097 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", 1098 "xer", 1099 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", 1100 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", 1101 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", 1102 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", 1103 "vrsave", "vscr", 1104 "spe_acc", "spefscr", 1105 "sfp" 1106}; 1107 1108void PPCTargetInfo::getGCCRegNames(const char * const *&Names, 1109 unsigned &NumNames) const { 1110 Names = GCCRegNames; 1111 NumNames = llvm::array_lengthof(GCCRegNames); 1112} 1113 1114const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = { 1115 // While some of these aliases do map to different registers 1116 // they still share the same register name. 1117 { { "0" }, "r0" }, 1118 { { "1"}, "r1" }, 1119 { { "2" }, "r2" }, 1120 { { "3" }, "r3" }, 1121 { { "4" }, "r4" }, 1122 { { "5" }, "r5" }, 1123 { { "6" }, "r6" }, 1124 { { "7" }, "r7" }, 1125 { { "8" }, "r8" }, 1126 { { "9" }, "r9" }, 1127 { { "10" }, "r10" }, 1128 { { "11" }, "r11" }, 1129 { { "12" }, "r12" }, 1130 { { "13" }, "r13" }, 1131 { { "14" }, "r14" }, 1132 { { "15" }, "r15" }, 1133 { { "16" }, "r16" }, 1134 { { "17" }, "r17" }, 1135 { { "18" }, "r18" }, 1136 { { "19" }, "r19" }, 1137 { { "20" }, "r20" }, 1138 { { "21" }, "r21" }, 1139 { { "22" }, "r22" }, 1140 { { "23" }, "r23" }, 1141 { { "24" }, "r24" }, 1142 { { "25" }, "r25" }, 1143 { { "26" }, "r26" }, 1144 { { "27" }, "r27" }, 1145 { { "28" }, "r28" }, 1146 { { "29" }, "r29" }, 1147 { { "30" }, "r30" }, 1148 { { "31" }, "r31" }, 1149 { { "fr0" }, "f0" }, 1150 { { "fr1" }, "f1" }, 1151 { { "fr2" }, "f2" }, 1152 { { "fr3" }, "f3" }, 1153 { { "fr4" }, "f4" }, 1154 { { "fr5" }, "f5" }, 1155 { { "fr6" }, "f6" }, 1156 { { "fr7" }, "f7" }, 1157 { { "fr8" }, "f8" }, 1158 { { "fr9" }, "f9" }, 1159 { { "fr10" }, "f10" }, 1160 { { "fr11" }, "f11" }, 1161 { { "fr12" }, "f12" }, 1162 { { "fr13" }, "f13" }, 1163 { { "fr14" }, "f14" }, 1164 { { "fr15" }, "f15" }, 1165 { { "fr16" }, "f16" }, 1166 { { "fr17" }, "f17" }, 1167 { { "fr18" }, "f18" }, 1168 { { "fr19" }, "f19" }, 1169 { { "fr20" }, "f20" }, 1170 { { "fr21" }, "f21" }, 1171 { { "fr22" }, "f22" }, 1172 { { "fr23" }, "f23" }, 1173 { { "fr24" }, "f24" }, 1174 { { "fr25" }, "f25" }, 1175 { { "fr26" }, "f26" }, 1176 { { "fr27" }, "f27" }, 1177 { { "fr28" }, "f28" }, 1178 { { "fr29" }, "f29" }, 1179 { { "fr30" }, "f30" }, 1180 { { "fr31" }, "f31" }, 1181 { { "cc" }, "cr0" }, 1182}; 1183 1184void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 1185 unsigned &NumAliases) const { 1186 Aliases = GCCRegAliases; 1187 NumAliases = llvm::array_lengthof(GCCRegAliases); 1188} 1189} // end anonymous namespace. 1190 1191namespace { 1192class PPC32TargetInfo : public PPCTargetInfo { 1193public: 1194 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) { 1195 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 1196 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32"; 1197 1198 switch (getTriple().getOS()) { 1199 case llvm::Triple::Linux: 1200 case llvm::Triple::FreeBSD: 1201 case llvm::Triple::NetBSD: 1202 SizeType = UnsignedInt; 1203 PtrDiffType = SignedInt; 1204 IntPtrType = SignedInt; 1205 break; 1206 default: 1207 break; 1208 } 1209 1210 if (getTriple().getOS() == llvm::Triple::FreeBSD) { 1211 LongDoubleWidth = LongDoubleAlign = 64; 1212 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 1213 } 1214 1215 // PPC32 supports atomics up to 4 bytes. 1216 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32; 1217 } 1218 1219 virtual BuiltinVaListKind getBuiltinVaListKind() const { 1220 // This is the ELF definition, and is overridden by the Darwin sub-target 1221 return TargetInfo::PowerABIBuiltinVaList; 1222 } 1223}; 1224} // end anonymous namespace. 1225 1226// Note: ABI differences may eventually require us to have a separate 1227// TargetInfo for little endian. 1228namespace { 1229class PPC64TargetInfo : public PPCTargetInfo { 1230public: 1231 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) { 1232 LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 1233 IntMaxType = SignedLong; 1234 UIntMaxType = UnsignedLong; 1235 Int64Type = SignedLong; 1236 1237 if (getTriple().getOS() == llvm::Triple::FreeBSD) { 1238 LongDoubleWidth = LongDoubleAlign = 64; 1239 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 1240 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 1241 "i64:64:64-f32:32:32-f64:64:64-" 1242 "v128:128:128-n32:64"; 1243 } else 1244 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 1245 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-" 1246 "v128:128:128-n32:64"; 1247 1248 // PPC64 supports atomics up to 8 bytes. 1249 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 1250 } 1251 virtual BuiltinVaListKind getBuiltinVaListKind() const { 1252 return TargetInfo::CharPtrBuiltinVaList; 1253 } 1254}; 1255} // end anonymous namespace. 1256 1257 1258namespace { 1259class DarwinPPC32TargetInfo : 1260 public DarwinTargetInfo<PPC32TargetInfo> { 1261public: 1262 DarwinPPC32TargetInfo(const llvm::Triple &Triple) 1263 : DarwinTargetInfo<PPC32TargetInfo>(Triple) { 1264 HasAlignMac68kSupport = true; 1265 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool? 1266 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726 1267 LongLongAlign = 32; 1268 SuitableAlign = 128; 1269 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 1270 "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32"; 1271 } 1272 virtual BuiltinVaListKind getBuiltinVaListKind() const { 1273 return TargetInfo::CharPtrBuiltinVaList; 1274 } 1275}; 1276 1277class DarwinPPC64TargetInfo : 1278 public DarwinTargetInfo<PPC64TargetInfo> { 1279public: 1280 DarwinPPC64TargetInfo(const llvm::Triple &Triple) 1281 : DarwinTargetInfo<PPC64TargetInfo>(Triple) { 1282 HasAlignMac68kSupport = true; 1283 SuitableAlign = 128; 1284 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 1285 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64"; 1286 } 1287}; 1288} // end anonymous namespace. 1289 1290namespace { 1291 static const unsigned NVPTXAddrSpaceMap[] = { 1292 1, // opencl_global 1293 3, // opencl_local 1294 4, // opencl_constant 1295 1, // cuda_device 1296 4, // cuda_constant 1297 3, // cuda_shared 1298 }; 1299 class NVPTXTargetInfo : public TargetInfo { 1300 static const char * const GCCRegNames[]; 1301 static const Builtin::Info BuiltinInfo[]; 1302 public: 1303 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 1304 BigEndian = false; 1305 TLSSupported = false; 1306 LongWidth = LongAlign = 64; 1307 AddrSpaceMap = &NVPTXAddrSpaceMap; 1308 UseAddrSpaceMapMangling = true; 1309 // Define available target features 1310 // These must be defined in sorted order! 1311 NoAsmVariants = true; 1312 } 1313 virtual void getTargetDefines(const LangOptions &Opts, 1314 MacroBuilder &Builder) const { 1315 Builder.defineMacro("__PTX__"); 1316 Builder.defineMacro("__NVPTX__"); 1317 } 1318 virtual void getTargetBuiltins(const Builtin::Info *&Records, 1319 unsigned &NumRecords) const { 1320 Records = BuiltinInfo; 1321 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin; 1322 } 1323 virtual bool hasFeature(StringRef Feature) const { 1324 return Feature == "ptx" || Feature == "nvptx"; 1325 } 1326 1327 virtual void getGCCRegNames(const char * const *&Names, 1328 unsigned &NumNames) const; 1329 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 1330 unsigned &NumAliases) const { 1331 // No aliases. 1332 Aliases = 0; 1333 NumAliases = 0; 1334 } 1335 virtual bool validateAsmConstraint(const char *&Name, 1336 TargetInfo::ConstraintInfo &Info) const { 1337 switch (*Name) { 1338 default: return false; 1339 case 'c': 1340 case 'h': 1341 case 'r': 1342 case 'l': 1343 case 'f': 1344 case 'd': 1345 Info.setAllowsRegister(); 1346 return true; 1347 } 1348 } 1349 virtual const char *getClobbers() const { 1350 // FIXME: Is this really right? 1351 return ""; 1352 } 1353 virtual BuiltinVaListKind getBuiltinVaListKind() const { 1354 // FIXME: implement 1355 return TargetInfo::CharPtrBuiltinVaList; 1356 } 1357 virtual bool setCPU(const std::string &Name) { 1358 bool Valid = llvm::StringSwitch<bool>(Name) 1359 .Case("sm_20", true) 1360 .Case("sm_21", true) 1361 .Case("sm_30", true) 1362 .Case("sm_35", true) 1363 .Default(false); 1364 1365 return Valid; 1366 } 1367 }; 1368 1369 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = { 1370#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, 1371#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ 1372 ALL_LANGUAGES }, 1373#include "clang/Basic/BuiltinsNVPTX.def" 1374 }; 1375 1376 const char * const NVPTXTargetInfo::GCCRegNames[] = { 1377 "r0" 1378 }; 1379 1380 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names, 1381 unsigned &NumNames) const { 1382 Names = GCCRegNames; 1383 NumNames = llvm::array_lengthof(GCCRegNames); 1384 } 1385 1386 class NVPTX32TargetInfo : public NVPTXTargetInfo { 1387 public: 1388 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) { 1389 PointerWidth = PointerAlign = 32; 1390 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt; 1391 DescriptionString 1392 = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-" 1393 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-" 1394 "n16:32:64"; 1395 } 1396 }; 1397 1398 class NVPTX64TargetInfo : public NVPTXTargetInfo { 1399 public: 1400 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) { 1401 PointerWidth = PointerAlign = 64; 1402 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong; 1403 DescriptionString 1404 = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-" 1405 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-" 1406 "n16:32:64"; 1407 } 1408 }; 1409} 1410 1411namespace { 1412 1413static const unsigned R600AddrSpaceMap[] = { 1414 1, // opencl_global 1415 3, // opencl_local 1416 2, // opencl_constant 1417 1, // cuda_device 1418 2, // cuda_constant 1419 3 // cuda_shared 1420}; 1421 1422static const char *DescriptionStringR600 = 1423 "e" 1424 "-p:32:32:32" 1425 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32" 1426 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128" 1427 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048" 1428 "-n32:64"; 1429 1430static const char *DescriptionStringR600DoubleOps = 1431 "e" 1432 "-p:32:32:32" 1433 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64" 1434 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128" 1435 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048" 1436 "-n32:64"; 1437 1438static const char *DescriptionStringSI = 1439 "e" 1440 "-p:64:64:64" 1441 "-p3:32:32:32" 1442 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64" 1443 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128" 1444 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048" 1445 "-n32:64"; 1446 1447class R600TargetInfo : public TargetInfo { 1448 /// \brief The GPU profiles supported by the R600 target. 1449 enum GPUKind { 1450 GK_NONE, 1451 GK_R600, 1452 GK_R600_DOUBLE_OPS, 1453 GK_R700, 1454 GK_R700_DOUBLE_OPS, 1455 GK_EVERGREEN, 1456 GK_EVERGREEN_DOUBLE_OPS, 1457 GK_NORTHERN_ISLANDS, 1458 GK_CAYMAN, 1459 GK_SOUTHERN_ISLANDS, 1460 GK_SEA_ISLANDS 1461 } GPU; 1462 1463public: 1464 R600TargetInfo(const llvm::Triple &Triple) 1465 : TargetInfo(Triple), GPU(GK_R600) { 1466 DescriptionString = DescriptionStringR600; 1467 AddrSpaceMap = &R600AddrSpaceMap; 1468 UseAddrSpaceMapMangling = true; 1469 } 1470 1471 virtual const char * getClobbers() const { 1472 return ""; 1473 } 1474 1475 virtual void getGCCRegNames(const char * const *&Names, 1476 unsigned &numNames) const { 1477 Names = NULL; 1478 numNames = 0; 1479 } 1480 1481 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 1482 unsigned &NumAliases) const { 1483 Aliases = NULL; 1484 NumAliases = 0; 1485 } 1486 1487 virtual bool validateAsmConstraint(const char *&Name, 1488 TargetInfo::ConstraintInfo &info) const { 1489 return true; 1490 } 1491 1492 virtual void getTargetBuiltins(const Builtin::Info *&Records, 1493 unsigned &NumRecords) const { 1494 Records = NULL; 1495 NumRecords = 0; 1496 } 1497 1498 1499 virtual void getTargetDefines(const LangOptions &Opts, 1500 MacroBuilder &Builder) const { 1501 Builder.defineMacro("__R600__"); 1502 } 1503 1504 virtual BuiltinVaListKind getBuiltinVaListKind() const { 1505 return TargetInfo::CharPtrBuiltinVaList; 1506 } 1507 1508 virtual bool setCPU(const std::string &Name) { 1509 GPU = llvm::StringSwitch<GPUKind>(Name) 1510 .Case("r600" , GK_R600) 1511 .Case("rv610", GK_R600) 1512 .Case("rv620", GK_R600) 1513 .Case("rv630", GK_R600) 1514 .Case("rv635", GK_R600) 1515 .Case("rs780", GK_R600) 1516 .Case("rs880", GK_R600) 1517 .Case("rv670", GK_R600_DOUBLE_OPS) 1518 .Case("rv710", GK_R700) 1519 .Case("rv730", GK_R700) 1520 .Case("rv740", GK_R700_DOUBLE_OPS) 1521 .Case("rv770", GK_R700_DOUBLE_OPS) 1522 .Case("palm", GK_EVERGREEN) 1523 .Case("cedar", GK_EVERGREEN) 1524 .Case("sumo", GK_EVERGREEN) 1525 .Case("sumo2", GK_EVERGREEN) 1526 .Case("redwood", GK_EVERGREEN) 1527 .Case("juniper", GK_EVERGREEN) 1528 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS) 1529 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS) 1530 .Case("barts", GK_NORTHERN_ISLANDS) 1531 .Case("turks", GK_NORTHERN_ISLANDS) 1532 .Case("caicos", GK_NORTHERN_ISLANDS) 1533 .Case("cayman", GK_CAYMAN) 1534 .Case("aruba", GK_CAYMAN) 1535 .Case("tahiti", GK_SOUTHERN_ISLANDS) 1536 .Case("pitcairn", GK_SOUTHERN_ISLANDS) 1537 .Case("verde", GK_SOUTHERN_ISLANDS) 1538 .Case("oland", GK_SOUTHERN_ISLANDS) 1539 .Case("bonaire", GK_SEA_ISLANDS) 1540 .Case("kabini", GK_SEA_ISLANDS) 1541 .Case("kaveri", GK_SEA_ISLANDS) 1542 .Default(GK_NONE); 1543 1544 if (GPU == GK_NONE) { 1545 return false; 1546 } 1547 1548 // Set the correct data layout 1549 switch (GPU) { 1550 case GK_NONE: 1551 case GK_R600: 1552 case GK_R700: 1553 case GK_EVERGREEN: 1554 case GK_NORTHERN_ISLANDS: 1555 DescriptionString = DescriptionStringR600; 1556 break; 1557 case GK_R600_DOUBLE_OPS: 1558 case GK_R700_DOUBLE_OPS: 1559 case GK_EVERGREEN_DOUBLE_OPS: 1560 case GK_CAYMAN: 1561 DescriptionString = DescriptionStringR600DoubleOps; 1562 break; 1563 case GK_SOUTHERN_ISLANDS: 1564 case GK_SEA_ISLANDS: 1565 DescriptionString = DescriptionStringSI; 1566 break; 1567 } 1568 1569 return true; 1570 } 1571}; 1572 1573} // end anonymous namespace 1574 1575namespace { 1576// Namespace for x86 abstract base class 1577const Builtin::Info BuiltinInfo[] = { 1578#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, 1579#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ 1580 ALL_LANGUAGES }, 1581#include "clang/Basic/BuiltinsX86.def" 1582}; 1583 1584static const char* const GCCRegNames[] = { 1585 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp", 1586 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)", 1587 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame", 1588 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", 1589 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7", 1590 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 1591 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15", 1592 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7", 1593 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15", 1594}; 1595 1596const TargetInfo::AddlRegName AddlRegNames[] = { 1597 { { "al", "ah", "eax", "rax" }, 0 }, 1598 { { "bl", "bh", "ebx", "rbx" }, 3 }, 1599 { { "cl", "ch", "ecx", "rcx" }, 2 }, 1600 { { "dl", "dh", "edx", "rdx" }, 1 }, 1601 { { "esi", "rsi" }, 4 }, 1602 { { "edi", "rdi" }, 5 }, 1603 { { "esp", "rsp" }, 7 }, 1604 { { "ebp", "rbp" }, 6 }, 1605}; 1606 1607// X86 target abstract base class; x86-32 and x86-64 are very close, so 1608// most of the implementation can be shared. 1609class X86TargetInfo : public TargetInfo { 1610 enum X86SSEEnum { 1611 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F 1612 } SSELevel; 1613 enum MMX3DNowEnum { 1614 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon 1615 } MMX3DNowLevel; 1616 enum XOPEnum { 1617 NoXOP, 1618 SSE4A, 1619 FMA4, 1620 XOP 1621 } XOPLevel; 1622 1623 bool HasAES; 1624 bool HasPCLMUL; 1625 bool HasLZCNT; 1626 bool HasRDRND; 1627 bool HasBMI; 1628 bool HasBMI2; 1629 bool HasPOPCNT; 1630 bool HasRTM; 1631 bool HasPRFCHW; 1632 bool HasRDSEED; 1633 bool HasTBM; 1634 bool HasFMA; 1635 bool HasF16C; 1636 bool HasAVX512CD, HasAVX512ER, HasAVX512PF; 1637 bool HasSHA; 1638 bool HasCX16; 1639 1640 /// \brief Enumeration of all of the X86 CPUs supported by Clang. 1641 /// 1642 /// Each enumeration represents a particular CPU supported by Clang. These 1643 /// loosely correspond to the options passed to '-march' or '-mtune' flags. 1644 enum CPUKind { 1645 CK_Generic, 1646 1647 /// \name i386 1648 /// i386-generation processors. 1649 //@{ 1650 CK_i386, 1651 //@} 1652 1653 /// \name i486 1654 /// i486-generation processors. 1655 //@{ 1656 CK_i486, 1657 CK_WinChipC6, 1658 CK_WinChip2, 1659 CK_C3, 1660 //@} 1661 1662 /// \name i586 1663 /// i586-generation processors, P5 microarchitecture based. 1664 //@{ 1665 CK_i586, 1666 CK_Pentium, 1667 CK_PentiumMMX, 1668 //@} 1669 1670 /// \name i686 1671 /// i686-generation processors, P6 / Pentium M microarchitecture based. 1672 //@{ 1673 CK_i686, 1674 CK_PentiumPro, 1675 CK_Pentium2, 1676 CK_Pentium3, 1677 CK_Pentium3M, 1678 CK_PentiumM, 1679 CK_C3_2, 1680 1681 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah. 1682 /// Clang however has some logic to suport this. 1683 // FIXME: Warn, deprecate, and potentially remove this. 1684 CK_Yonah, 1685 //@} 1686 1687 /// \name Netburst 1688 /// Netburst microarchitecture based processors. 1689 //@{ 1690 CK_Pentium4, 1691 CK_Pentium4M, 1692 CK_Prescott, 1693 CK_Nocona, 1694 //@} 1695 1696 /// \name Core 1697 /// Core microarchitecture based processors. 1698 //@{ 1699 CK_Core2, 1700 1701 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another 1702 /// codename which GCC no longer accepts as an option to -march, but Clang 1703 /// has some logic for recognizing it. 1704 // FIXME: Warn, deprecate, and potentially remove this. 1705 CK_Penryn, 1706 //@} 1707 1708 /// \name Atom 1709 /// Atom processors 1710 //@{ 1711 CK_Atom, 1712 CK_Silvermont, 1713 //@} 1714 1715 /// \name Nehalem 1716 /// Nehalem microarchitecture based processors. 1717 //@{ 1718 CK_Corei7, 1719 CK_Corei7AVX, 1720 CK_CoreAVXi, 1721 CK_CoreAVX2, 1722 //@} 1723 1724 /// \name Knights Landing 1725 /// Knights Landing processor. 1726 CK_KNL, 1727 1728 /// \name K6 1729 /// K6 architecture processors. 1730 //@{ 1731 CK_K6, 1732 CK_K6_2, 1733 CK_K6_3, 1734 //@} 1735 1736 /// \name K7 1737 /// K7 architecture processors. 1738 //@{ 1739 CK_Athlon, 1740 CK_AthlonThunderbird, 1741 CK_Athlon4, 1742 CK_AthlonXP, 1743 CK_AthlonMP, 1744 //@} 1745 1746 /// \name K8 1747 /// K8 architecture processors. 1748 //@{ 1749 CK_Athlon64, 1750 CK_Athlon64SSE3, 1751 CK_AthlonFX, 1752 CK_K8, 1753 CK_K8SSE3, 1754 CK_Opteron, 1755 CK_OpteronSSE3, 1756 CK_AMDFAM10, 1757 //@} 1758 1759 /// \name Bobcat 1760 /// Bobcat architecture processors. 1761 //@{ 1762 CK_BTVER1, 1763 CK_BTVER2, 1764 //@} 1765 1766 /// \name Bulldozer 1767 /// Bulldozer architecture processors. 1768 //@{ 1769 CK_BDVER1, 1770 CK_BDVER2, 1771 CK_BDVER3, 1772 //@} 1773 1774 /// This specification is deprecated and will be removed in the future. 1775 /// Users should prefer \see CK_K8. 1776 // FIXME: Warn on this when the CPU is set to it. 1777 CK_x86_64, 1778 //@} 1779 1780 /// \name Geode 1781 /// Geode processors. 1782 //@{ 1783 CK_Geode 1784 //@} 1785 } CPU; 1786 1787 enum FPMathKind { 1788 FP_Default, 1789 FP_SSE, 1790 FP_387 1791 } FPMath; 1792 1793public: 1794 X86TargetInfo(const llvm::Triple &Triple) 1795 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow), 1796 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false), 1797 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false), 1798 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false), 1799 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false), 1800 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic), 1801 FPMath(FP_Default) { 1802 BigEndian = false; 1803 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended; 1804 } 1805 virtual unsigned getFloatEvalMethod() const { 1806 // X87 evaluates with 80 bits "long double" precision. 1807 return SSELevel == NoSSE ? 2 : 0; 1808 } 1809 virtual void getTargetBuiltins(const Builtin::Info *&Records, 1810 unsigned &NumRecords) const { 1811 Records = BuiltinInfo; 1812 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin; 1813 } 1814 virtual void getGCCRegNames(const char * const *&Names, 1815 unsigned &NumNames) const { 1816 Names = GCCRegNames; 1817 NumNames = llvm::array_lengthof(GCCRegNames); 1818 } 1819 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 1820 unsigned &NumAliases) const { 1821 Aliases = 0; 1822 NumAliases = 0; 1823 } 1824 virtual void getGCCAddlRegNames(const AddlRegName *&Names, 1825 unsigned &NumNames) const { 1826 Names = AddlRegNames; 1827 NumNames = llvm::array_lengthof(AddlRegNames); 1828 } 1829 virtual bool validateAsmConstraint(const char *&Name, 1830 TargetInfo::ConstraintInfo &info) const; 1831 virtual std::string convertConstraint(const char *&Constraint) const; 1832 virtual const char *getClobbers() const { 1833 return "~{dirflag},~{fpsr},~{flags}"; 1834 } 1835 virtual void getTargetDefines(const LangOptions &Opts, 1836 MacroBuilder &Builder) const; 1837 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level, 1838 bool Enabled); 1839 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level, 1840 bool Enabled); 1841 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level, 1842 bool Enabled); 1843 virtual void setFeatureEnabled(llvm::StringMap<bool> &Features, 1844 StringRef Name, bool Enabled) const { 1845 setFeatureEnabledImpl(Features, Name, Enabled); 1846 } 1847 // This exists purely to cut down on the number of virtual calls in 1848 // getDefaultFeatures which calls this repeatedly. 1849 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features, 1850 StringRef Name, bool Enabled); 1851 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const; 1852 virtual bool hasFeature(StringRef Feature) const; 1853 virtual bool handleTargetFeatures(std::vector<std::string> &Features, 1854 DiagnosticsEngine &Diags); 1855 virtual const char* getABI() const { 1856 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX) 1857 return "avx"; 1858 else if (getTriple().getArch() == llvm::Triple::x86 && 1859 MMX3DNowLevel == NoMMX3DNow) 1860 return "no-mmx"; 1861 return ""; 1862 } 1863 virtual bool setCPU(const std::string &Name) { 1864 CPU = llvm::StringSwitch<CPUKind>(Name) 1865 .Case("i386", CK_i386) 1866 .Case("i486", CK_i486) 1867 .Case("winchip-c6", CK_WinChipC6) 1868 .Case("winchip2", CK_WinChip2) 1869 .Case("c3", CK_C3) 1870 .Case("i586", CK_i586) 1871 .Case("pentium", CK_Pentium) 1872 .Case("pentium-mmx", CK_PentiumMMX) 1873 .Case("i686", CK_i686) 1874 .Case("pentiumpro", CK_PentiumPro) 1875 .Case("pentium2", CK_Pentium2) 1876 .Case("pentium3", CK_Pentium3) 1877 .Case("pentium3m", CK_Pentium3M) 1878 .Case("pentium-m", CK_PentiumM) 1879 .Case("c3-2", CK_C3_2) 1880 .Case("yonah", CK_Yonah) 1881 .Case("pentium4", CK_Pentium4) 1882 .Case("pentium4m", CK_Pentium4M) 1883 .Case("prescott", CK_Prescott) 1884 .Case("nocona", CK_Nocona) 1885 .Case("core2", CK_Core2) 1886 .Case("penryn", CK_Penryn) 1887 .Case("atom", CK_Atom) 1888 .Case("slm", CK_Silvermont) 1889 .Case("corei7", CK_Corei7) 1890 .Case("corei7-avx", CK_Corei7AVX) 1891 .Case("core-avx-i", CK_CoreAVXi) 1892 .Case("core-avx2", CK_CoreAVX2) 1893 .Case("knl", CK_KNL) 1894 .Case("k6", CK_K6) 1895 .Case("k6-2", CK_K6_2) 1896 .Case("k6-3", CK_K6_3) 1897 .Case("athlon", CK_Athlon) 1898 .Case("athlon-tbird", CK_AthlonThunderbird) 1899 .Case("athlon-4", CK_Athlon4) 1900 .Case("athlon-xp", CK_AthlonXP) 1901 .Case("athlon-mp", CK_AthlonMP) 1902 .Case("athlon64", CK_Athlon64) 1903 .Case("athlon64-sse3", CK_Athlon64SSE3) 1904 .Case("athlon-fx", CK_AthlonFX) 1905 .Case("k8", CK_K8) 1906 .Case("k8-sse3", CK_K8SSE3) 1907 .Case("opteron", CK_Opteron) 1908 .Case("opteron-sse3", CK_OpteronSSE3) 1909 .Case("amdfam10", CK_AMDFAM10) 1910 .Case("btver1", CK_BTVER1) 1911 .Case("btver2", CK_BTVER2) 1912 .Case("bdver1", CK_BDVER1) 1913 .Case("bdver2", CK_BDVER2) 1914 .Case("bdver3", CK_BDVER3) 1915 .Case("x86-64", CK_x86_64) 1916 .Case("geode", CK_Geode) 1917 .Default(CK_Generic); 1918 1919 // Perform any per-CPU checks necessary to determine if this CPU is 1920 // acceptable. 1921 // FIXME: This results in terrible diagnostics. Clang just says the CPU is 1922 // invalid without explaining *why*. 1923 switch (CPU) { 1924 case CK_Generic: 1925 // No processor selected! 1926 return false; 1927 1928 case CK_i386: 1929 case CK_i486: 1930 case CK_WinChipC6: 1931 case CK_WinChip2: 1932 case CK_C3: 1933 case CK_i586: 1934 case CK_Pentium: 1935 case CK_PentiumMMX: 1936 case CK_i686: 1937 case CK_PentiumPro: 1938 case CK_Pentium2: 1939 case CK_Pentium3: 1940 case CK_Pentium3M: 1941 case CK_PentiumM: 1942 case CK_Yonah: 1943 case CK_C3_2: 1944 case CK_Pentium4: 1945 case CK_Pentium4M: 1946 case CK_Prescott: 1947 case CK_K6: 1948 case CK_K6_2: 1949 case CK_K6_3: 1950 case CK_Athlon: 1951 case CK_AthlonThunderbird: 1952 case CK_Athlon4: 1953 case CK_AthlonXP: 1954 case CK_AthlonMP: 1955 case CK_Geode: 1956 // Only accept certain architectures when compiling in 32-bit mode. 1957 if (getTriple().getArch() != llvm::Triple::x86) 1958 return false; 1959 1960 // Fallthrough 1961 case CK_Nocona: 1962 case CK_Core2: 1963 case CK_Penryn: 1964 case CK_Atom: 1965 case CK_Silvermont: 1966 case CK_Corei7: 1967 case CK_Corei7AVX: 1968 case CK_CoreAVXi: 1969 case CK_CoreAVX2: 1970 case CK_KNL: 1971 case CK_Athlon64: 1972 case CK_Athlon64SSE3: 1973 case CK_AthlonFX: 1974 case CK_K8: 1975 case CK_K8SSE3: 1976 case CK_Opteron: 1977 case CK_OpteronSSE3: 1978 case CK_AMDFAM10: 1979 case CK_BTVER1: 1980 case CK_BTVER2: 1981 case CK_BDVER1: 1982 case CK_BDVER2: 1983 case CK_BDVER3: 1984 case CK_x86_64: 1985 return true; 1986 } 1987 llvm_unreachable("Unhandled CPU kind"); 1988 } 1989 1990 virtual bool setFPMath(StringRef Name); 1991 1992 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const { 1993 // We accept all non-ARM calling conventions 1994 return (CC == CC_X86ThisCall || 1995 CC == CC_X86FastCall || 1996 CC == CC_X86StdCall || 1997 CC == CC_C || 1998 CC == CC_X86Pascal || 1999 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning; 2000 } 2001 2002 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const { 2003 return MT == CCMT_Member ? CC_X86ThisCall : CC_C; 2004 } 2005}; 2006 2007bool X86TargetInfo::setFPMath(StringRef Name) { 2008 if (Name == "387") { 2009 FPMath = FP_387; 2010 return true; 2011 } 2012 if (Name == "sse") { 2013 FPMath = FP_SSE; 2014 return true; 2015 } 2016 return false; 2017} 2018 2019void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const { 2020 // FIXME: This *really* should not be here. 2021 2022 // X86_64 always has SSE2. 2023 if (getTriple().getArch() == llvm::Triple::x86_64) 2024 setFeatureEnabledImpl(Features, "sse2", true); 2025 2026 switch (CPU) { 2027 case CK_Generic: 2028 case CK_i386: 2029 case CK_i486: 2030 case CK_i586: 2031 case CK_Pentium: 2032 case CK_i686: 2033 case CK_PentiumPro: 2034 break; 2035 case CK_PentiumMMX: 2036 case CK_Pentium2: 2037 setFeatureEnabledImpl(Features, "mmx", true); 2038 break; 2039 case CK_Pentium3: 2040 case CK_Pentium3M: 2041 setFeatureEnabledImpl(Features, "sse", true); 2042 break; 2043 case CK_PentiumM: 2044 case CK_Pentium4: 2045 case CK_Pentium4M: 2046 case CK_x86_64: 2047 setFeatureEnabledImpl(Features, "sse2", true); 2048 break; 2049 case CK_Yonah: 2050 case CK_Prescott: 2051 case CK_Nocona: 2052 setFeatureEnabledImpl(Features, "sse3", true); 2053 setFeatureEnabledImpl(Features, "cx16", true); 2054 break; 2055 case CK_Core2: 2056 setFeatureEnabledImpl(Features, "ssse3", true); 2057 setFeatureEnabledImpl(Features, "cx16", true); 2058 break; 2059 case CK_Penryn: 2060 setFeatureEnabledImpl(Features, "sse4.1", true); 2061 setFeatureEnabledImpl(Features, "cx16", true); 2062 break; 2063 case CK_Atom: 2064 setFeatureEnabledImpl(Features, "ssse3", true); 2065 setFeatureEnabledImpl(Features, "cx16", true); 2066 break; 2067 case CK_Silvermont: 2068 setFeatureEnabledImpl(Features, "sse4.2", true); 2069 setFeatureEnabledImpl(Features, "aes", true); 2070 setFeatureEnabledImpl(Features, "cx16", true); 2071 setFeatureEnabledImpl(Features, "pclmul", true); 2072 break; 2073 case CK_Corei7: 2074 setFeatureEnabledImpl(Features, "sse4.2", true); 2075 setFeatureEnabledImpl(Features, "cx16", true); 2076 break; 2077 case CK_Corei7AVX: 2078 setFeatureEnabledImpl(Features, "avx", true); 2079 setFeatureEnabledImpl(Features, "aes", true); 2080 setFeatureEnabledImpl(Features, "cx16", true); 2081 setFeatureEnabledImpl(Features, "pclmul", true); 2082 break; 2083 case CK_CoreAVXi: 2084 setFeatureEnabledImpl(Features, "avx", true); 2085 setFeatureEnabledImpl(Features, "aes", true); 2086 setFeatureEnabledImpl(Features, "pclmul", true); 2087 setFeatureEnabledImpl(Features, "rdrnd", true); 2088 setFeatureEnabledImpl(Features, "f16c", true); 2089 break; 2090 case CK_CoreAVX2: 2091 setFeatureEnabledImpl(Features, "avx2", true); 2092 setFeatureEnabledImpl(Features, "aes", true); 2093 setFeatureEnabledImpl(Features, "pclmul", true); 2094 setFeatureEnabledImpl(Features, "lzcnt", true); 2095 setFeatureEnabledImpl(Features, "rdrnd", true); 2096 setFeatureEnabledImpl(Features, "f16c", true); 2097 setFeatureEnabledImpl(Features, "bmi", true); 2098 setFeatureEnabledImpl(Features, "bmi2", true); 2099 setFeatureEnabledImpl(Features, "rtm", true); 2100 setFeatureEnabledImpl(Features, "fma", true); 2101 setFeatureEnabledImpl(Features, "cx16", true); 2102 break; 2103 case CK_KNL: 2104 setFeatureEnabledImpl(Features, "avx512f", true); 2105 setFeatureEnabledImpl(Features, "avx512cd", true); 2106 setFeatureEnabledImpl(Features, "avx512er", true); 2107 setFeatureEnabledImpl(Features, "avx512pf", true); 2108 setFeatureEnabledImpl(Features, "aes", true); 2109 setFeatureEnabledImpl(Features, "pclmul", true); 2110 setFeatureEnabledImpl(Features, "lzcnt", true); 2111 setFeatureEnabledImpl(Features, "rdrnd", true); 2112 setFeatureEnabledImpl(Features, "f16c", true); 2113 setFeatureEnabledImpl(Features, "bmi", true); 2114 setFeatureEnabledImpl(Features, "bmi2", true); 2115 setFeatureEnabledImpl(Features, "rtm", true); 2116 setFeatureEnabledImpl(Features, "fma", true); 2117 break; 2118 case CK_K6: 2119 case CK_WinChipC6: 2120 setFeatureEnabledImpl(Features, "mmx", true); 2121 break; 2122 case CK_K6_2: 2123 case CK_K6_3: 2124 case CK_WinChip2: 2125 case CK_C3: 2126 setFeatureEnabledImpl(Features, "3dnow", true); 2127 break; 2128 case CK_Athlon: 2129 case CK_AthlonThunderbird: 2130 case CK_Geode: 2131 setFeatureEnabledImpl(Features, "3dnowa", true); 2132 break; 2133 case CK_Athlon4: 2134 case CK_AthlonXP: 2135 case CK_AthlonMP: 2136 setFeatureEnabledImpl(Features, "sse", true); 2137 setFeatureEnabledImpl(Features, "3dnowa", true); 2138 break; 2139 case CK_K8: 2140 case CK_Opteron: 2141 case CK_Athlon64: 2142 case CK_AthlonFX: 2143 setFeatureEnabledImpl(Features, "sse2", true); 2144 setFeatureEnabledImpl(Features, "3dnowa", true); 2145 break; 2146 case CK_K8SSE3: 2147 case CK_OpteronSSE3: 2148 case CK_Athlon64SSE3: 2149 setFeatureEnabledImpl(Features, "sse3", true); 2150 setFeatureEnabledImpl(Features, "3dnowa", true); 2151 break; 2152 case CK_AMDFAM10: 2153 setFeatureEnabledImpl(Features, "sse3", true); 2154 setFeatureEnabledImpl(Features, "sse4a", true); 2155 setFeatureEnabledImpl(Features, "3dnowa", true); 2156 setFeatureEnabledImpl(Features, "lzcnt", true); 2157 setFeatureEnabledImpl(Features, "popcnt", true); 2158 break; 2159 case CK_BTVER1: 2160 setFeatureEnabledImpl(Features, "ssse3", true); 2161 setFeatureEnabledImpl(Features, "sse4a", true); 2162 setFeatureEnabledImpl(Features, "cx16", true); 2163 setFeatureEnabledImpl(Features, "lzcnt", true); 2164 setFeatureEnabledImpl(Features, "popcnt", true); 2165 setFeatureEnabledImpl(Features, "prfchw", true); 2166 break; 2167 case CK_BTVER2: 2168 setFeatureEnabledImpl(Features, "avx", true); 2169 setFeatureEnabledImpl(Features, "sse4a", true); 2170 setFeatureEnabledImpl(Features, "lzcnt", true); 2171 setFeatureEnabledImpl(Features, "aes", true); 2172 setFeatureEnabledImpl(Features, "pclmul", true); 2173 setFeatureEnabledImpl(Features, "prfchw", true); 2174 setFeatureEnabledImpl(Features, "bmi", true); 2175 setFeatureEnabledImpl(Features, "f16c", true); 2176 setFeatureEnabledImpl(Features, "cx16", true); 2177 break; 2178 case CK_BDVER1: 2179 setFeatureEnabledImpl(Features, "xop", true); 2180 setFeatureEnabledImpl(Features, "lzcnt", true); 2181 setFeatureEnabledImpl(Features, "aes", true); 2182 setFeatureEnabledImpl(Features, "pclmul", true); 2183 setFeatureEnabledImpl(Features, "prfchw", true); 2184 setFeatureEnabledImpl(Features, "cx16", true); 2185 break; 2186 case CK_BDVER2: 2187 case CK_BDVER3: 2188 setFeatureEnabledImpl(Features, "xop", true); 2189 setFeatureEnabledImpl(Features, "lzcnt", true); 2190 setFeatureEnabledImpl(Features, "aes", true); 2191 setFeatureEnabledImpl(Features, "pclmul", true); 2192 setFeatureEnabledImpl(Features, "prfchw", true); 2193 setFeatureEnabledImpl(Features, "bmi", true); 2194 setFeatureEnabledImpl(Features, "fma", true); 2195 setFeatureEnabledImpl(Features, "f16c", true); 2196 setFeatureEnabledImpl(Features, "tbm", true); 2197 setFeatureEnabledImpl(Features, "cx16", true); 2198 break; 2199 case CK_C3_2: 2200 setFeatureEnabledImpl(Features, "sse", true); 2201 break; 2202 } 2203} 2204 2205void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features, 2206 X86SSEEnum Level, bool Enabled) { 2207 if (Enabled) { 2208 switch (Level) { 2209 case AVX512F: 2210 Features["avx512f"] = true; 2211 case AVX2: 2212 Features["avx2"] = true; 2213 case AVX: 2214 Features["avx"] = true; 2215 case SSE42: 2216 Features["sse4.2"] = true; 2217 case SSE41: 2218 Features["sse4.1"] = true; 2219 case SSSE3: 2220 Features["ssse3"] = true; 2221 case SSE3: 2222 Features["sse3"] = true; 2223 case SSE2: 2224 Features["sse2"] = true; 2225 case SSE1: 2226 Features["sse"] = true; 2227 case NoSSE: 2228 break; 2229 } 2230 return; 2231 } 2232 2233 switch (Level) { 2234 case NoSSE: 2235 case SSE1: 2236 Features["sse"] = false; 2237 case SSE2: 2238 Features["sse2"] = Features["pclmul"] = Features["aes"] = 2239 Features["sha"] = false; 2240 case SSE3: 2241 Features["sse3"] = false; 2242 setXOPLevel(Features, NoXOP, false); 2243 case SSSE3: 2244 Features["ssse3"] = false; 2245 case SSE41: 2246 Features["sse4.1"] = false; 2247 case SSE42: 2248 Features["sse4.2"] = false; 2249 case AVX: 2250 Features["fma"] = Features["avx"] = Features["f16c"] = false; 2251 setXOPLevel(Features, FMA4, false); 2252 case AVX2: 2253 Features["avx2"] = false; 2254 case AVX512F: 2255 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] = 2256 Features["avx512pf"] = false; 2257 } 2258} 2259 2260void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features, 2261 MMX3DNowEnum Level, bool Enabled) { 2262 if (Enabled) { 2263 switch (Level) { 2264 case AMD3DNowAthlon: 2265 Features["3dnowa"] = true; 2266 case AMD3DNow: 2267 Features["3dnow"] = true; 2268 case MMX: 2269 Features["mmx"] = true; 2270 case NoMMX3DNow: 2271 break; 2272 } 2273 return; 2274 } 2275 2276 switch (Level) { 2277 case NoMMX3DNow: 2278 case MMX: 2279 Features["mmx"] = false; 2280 case AMD3DNow: 2281 Features["3dnow"] = false; 2282 case AMD3DNowAthlon: 2283 Features["3dnowa"] = false; 2284 } 2285} 2286 2287void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level, 2288 bool Enabled) { 2289 if (Enabled) { 2290 switch (Level) { 2291 case XOP: 2292 Features["xop"] = true; 2293 case FMA4: 2294 Features["fma4"] = true; 2295 setSSELevel(Features, AVX, true); 2296 case SSE4A: 2297 Features["sse4a"] = true; 2298 setSSELevel(Features, SSE3, true); 2299 case NoXOP: 2300 break; 2301 } 2302 return; 2303 } 2304 2305 switch (Level) { 2306 case NoXOP: 2307 case SSE4A: 2308 Features["sse4a"] = false; 2309 case FMA4: 2310 Features["fma4"] = false; 2311 case XOP: 2312 Features["xop"] = false; 2313 } 2314} 2315 2316void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features, 2317 StringRef Name, bool Enabled) { 2318 // FIXME: This *really* should not be here. We need some way of translating 2319 // options into llvm subtarget features. 2320 if (Name == "sse4") 2321 Name = "sse4.2"; 2322 2323 Features[Name] = Enabled; 2324 2325 if (Name == "mmx") { 2326 setMMXLevel(Features, MMX, Enabled); 2327 } else if (Name == "sse") { 2328 setSSELevel(Features, SSE1, Enabled); 2329 } else if (Name == "sse2") { 2330 setSSELevel(Features, SSE2, Enabled); 2331 } else if (Name == "sse3") { 2332 setSSELevel(Features, SSE3, Enabled); 2333 } else if (Name == "ssse3") { 2334 setSSELevel(Features, SSSE3, Enabled); 2335 } else if (Name == "sse4.2") { 2336 setSSELevel(Features, SSE42, Enabled); 2337 } else if (Name == "sse4.1") { 2338 setSSELevel(Features, SSE41, Enabled); 2339 } else if (Name == "3dnow") { 2340 setMMXLevel(Features, AMD3DNow, Enabled); 2341 } else if (Name == "3dnowa") { 2342 setMMXLevel(Features, AMD3DNowAthlon, Enabled); 2343 } else if (Name == "aes") { 2344 if (Enabled) 2345 setSSELevel(Features, SSE2, Enabled); 2346 } else if (Name == "pclmul") { 2347 if (Enabled) 2348 setSSELevel(Features, SSE2, Enabled); 2349 } else if (Name == "avx") { 2350 setSSELevel(Features, AVX, Enabled); 2351 } else if (Name == "avx2") { 2352 setSSELevel(Features, AVX2, Enabled); 2353 } else if (Name == "avx512f") { 2354 setSSELevel(Features, AVX512F, Enabled); 2355 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") { 2356 if (Enabled) 2357 setSSELevel(Features, AVX512F, Enabled); 2358 } else if (Name == "fma") { 2359 if (Enabled) 2360 setSSELevel(Features, AVX, Enabled); 2361 } else if (Name == "fma4") { 2362 setXOPLevel(Features, FMA4, Enabled); 2363 } else if (Name == "xop") { 2364 setXOPLevel(Features, XOP, Enabled); 2365 } else if (Name == "sse4a") { 2366 setXOPLevel(Features, SSE4A, Enabled); 2367 } else if (Name == "f16c") { 2368 if (Enabled) 2369 setSSELevel(Features, AVX, Enabled); 2370 } else if (Name == "sha") { 2371 if (Enabled) 2372 setSSELevel(Features, SSE2, Enabled); 2373 } 2374} 2375 2376/// handleTargetFeatures - Perform initialization based on the user 2377/// configured set of features. 2378bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features, 2379 DiagnosticsEngine &Diags) { 2380 // Remember the maximum enabled sselevel. 2381 for (unsigned i = 0, e = Features.size(); i !=e; ++i) { 2382 // Ignore disabled features. 2383 if (Features[i][0] == '-') 2384 continue; 2385 2386 StringRef Feature = StringRef(Features[i]).substr(1); 2387 2388 if (Feature == "aes") { 2389 HasAES = true; 2390 continue; 2391 } 2392 2393 if (Feature == "pclmul") { 2394 HasPCLMUL = true; 2395 continue; 2396 } 2397 2398 if (Feature == "lzcnt") { 2399 HasLZCNT = true; 2400 continue; 2401 } 2402 2403 if (Feature == "rdrnd") { 2404 HasRDRND = true; 2405 continue; 2406 } 2407 2408 if (Feature == "bmi") { 2409 HasBMI = true; 2410 continue; 2411 } 2412 2413 if (Feature == "bmi2") { 2414 HasBMI2 = true; 2415 continue; 2416 } 2417 2418 if (Feature == "popcnt") { 2419 HasPOPCNT = true; 2420 continue; 2421 } 2422 2423 if (Feature == "rtm") { 2424 HasRTM = true; 2425 continue; 2426 } 2427 2428 if (Feature == "prfchw") { 2429 HasPRFCHW = true; 2430 continue; 2431 } 2432 2433 if (Feature == "rdseed") { 2434 HasRDSEED = true; 2435 continue; 2436 } 2437 2438 if (Feature == "tbm") { 2439 HasTBM = true; 2440 continue; 2441 } 2442 2443 if (Feature == "fma") { 2444 HasFMA = true; 2445 continue; 2446 } 2447 2448 if (Feature == "f16c") { 2449 HasF16C = true; 2450 continue; 2451 } 2452 2453 if (Feature == "avx512cd") { 2454 HasAVX512CD = true; 2455 continue; 2456 } 2457 2458 if (Feature == "avx512er") { 2459 HasAVX512ER = true; 2460 continue; 2461 } 2462 2463 if (Feature == "avx512pf") { 2464 HasAVX512PF = true; 2465 continue; 2466 } 2467 2468 if (Feature == "sha") { 2469 HasSHA = true; 2470 continue; 2471 } 2472 2473 if (Feature == "cx16") { 2474 HasCX16 = true; 2475 continue; 2476 } 2477 2478 assert(Features[i][0] == '+' && "Invalid target feature!"); 2479 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature) 2480 .Case("avx512f", AVX512F) 2481 .Case("avx2", AVX2) 2482 .Case("avx", AVX) 2483 .Case("sse4.2", SSE42) 2484 .Case("sse4.1", SSE41) 2485 .Case("ssse3", SSSE3) 2486 .Case("sse3", SSE3) 2487 .Case("sse2", SSE2) 2488 .Case("sse", SSE1) 2489 .Default(NoSSE); 2490 SSELevel = std::max(SSELevel, Level); 2491 2492 MMX3DNowEnum ThreeDNowLevel = 2493 llvm::StringSwitch<MMX3DNowEnum>(Feature) 2494 .Case("3dnowa", AMD3DNowAthlon) 2495 .Case("3dnow", AMD3DNow) 2496 .Case("mmx", MMX) 2497 .Default(NoMMX3DNow); 2498 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel); 2499 2500 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature) 2501 .Case("xop", XOP) 2502 .Case("fma4", FMA4) 2503 .Case("sse4a", SSE4A) 2504 .Default(NoXOP); 2505 XOPLevel = std::max(XOPLevel, XLevel); 2506 } 2507 2508 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled. 2509 // Can't do this earlier because we need to be able to explicitly enable 2510 // popcnt and still disable sse4.2. 2511 if (!HasPOPCNT && SSELevel >= SSE42 && 2512 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){ 2513 HasPOPCNT = true; 2514 Features.push_back("+popcnt"); 2515 } 2516 2517 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled. 2518 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow && 2519 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){ 2520 HasPRFCHW = true; 2521 Features.push_back("+prfchw"); 2522 } 2523 2524 // LLVM doesn't have a separate switch for fpmath, so only accept it if it 2525 // matches the selected sse level. 2526 if (FPMath == FP_SSE && SSELevel < SSE1) { 2527 Diags.Report(diag::err_target_unsupported_fpmath) << "sse"; 2528 return false; 2529 } else if (FPMath == FP_387 && SSELevel >= SSE1) { 2530 Diags.Report(diag::err_target_unsupported_fpmath) << "387"; 2531 return false; 2532 } 2533 2534 // Don't tell the backend if we're turning off mmx; it will end up disabling 2535 // SSE, which we don't want. 2536 // Additionally, if SSE is enabled and mmx is not explicitly disabled, 2537 // then enable MMX. 2538 std::vector<std::string>::iterator it; 2539 it = std::find(Features.begin(), Features.end(), "-mmx"); 2540 if (it != Features.end()) 2541 Features.erase(it); 2542 else if (SSELevel > NoSSE) 2543 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX); 2544 return true; 2545} 2546 2547/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro 2548/// definitions for this particular subtarget. 2549void X86TargetInfo::getTargetDefines(const LangOptions &Opts, 2550 MacroBuilder &Builder) const { 2551 // Target identification. 2552 if (getTriple().getArch() == llvm::Triple::x86_64) { 2553 Builder.defineMacro("__amd64__"); 2554 Builder.defineMacro("__amd64"); 2555 Builder.defineMacro("__x86_64"); 2556 Builder.defineMacro("__x86_64__"); 2557 } else { 2558 DefineStd(Builder, "i386", Opts); 2559 } 2560 2561 // Subtarget options. 2562 // FIXME: We are hard-coding the tune parameters based on the CPU, but they 2563 // truly should be based on -mtune options. 2564 switch (CPU) { 2565 case CK_Generic: 2566 break; 2567 case CK_i386: 2568 // The rest are coming from the i386 define above. 2569 Builder.defineMacro("__tune_i386__"); 2570 break; 2571 case CK_i486: 2572 case CK_WinChipC6: 2573 case CK_WinChip2: 2574 case CK_C3: 2575 defineCPUMacros(Builder, "i486"); 2576 break; 2577 case CK_PentiumMMX: 2578 Builder.defineMacro("__pentium_mmx__"); 2579 Builder.defineMacro("__tune_pentium_mmx__"); 2580 // Fallthrough 2581 case CK_i586: 2582 case CK_Pentium: 2583 defineCPUMacros(Builder, "i586"); 2584 defineCPUMacros(Builder, "pentium"); 2585 break; 2586 case CK_Pentium3: 2587 case CK_Pentium3M: 2588 case CK_PentiumM: 2589 Builder.defineMacro("__tune_pentium3__"); 2590 // Fallthrough 2591 case CK_Pentium2: 2592 case CK_C3_2: 2593 Builder.defineMacro("__tune_pentium2__"); 2594 // Fallthrough 2595 case CK_PentiumPro: 2596 Builder.defineMacro("__tune_i686__"); 2597 Builder.defineMacro("__tune_pentiumpro__"); 2598 // Fallthrough 2599 case CK_i686: 2600 Builder.defineMacro("__i686"); 2601 Builder.defineMacro("__i686__"); 2602 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686. 2603 Builder.defineMacro("__pentiumpro"); 2604 Builder.defineMacro("__pentiumpro__"); 2605 break; 2606 case CK_Pentium4: 2607 case CK_Pentium4M: 2608 defineCPUMacros(Builder, "pentium4"); 2609 break; 2610 case CK_Yonah: 2611 case CK_Prescott: 2612 case CK_Nocona: 2613 defineCPUMacros(Builder, "nocona"); 2614 break; 2615 case CK_Core2: 2616 case CK_Penryn: 2617 defineCPUMacros(Builder, "core2"); 2618 break; 2619 case CK_Atom: 2620 defineCPUMacros(Builder, "atom"); 2621 break; 2622 case CK_Silvermont: 2623 defineCPUMacros(Builder, "slm"); 2624 break; 2625 case CK_Corei7: 2626 case CK_Corei7AVX: 2627 case CK_CoreAVXi: 2628 case CK_CoreAVX2: 2629 defineCPUMacros(Builder, "corei7"); 2630 break; 2631 case CK_KNL: 2632 defineCPUMacros(Builder, "knl"); 2633 break; 2634 case CK_K6_2: 2635 Builder.defineMacro("__k6_2__"); 2636 Builder.defineMacro("__tune_k6_2__"); 2637 // Fallthrough 2638 case CK_K6_3: 2639 if (CPU != CK_K6_2) { // In case of fallthrough 2640 // FIXME: GCC may be enabling these in cases where some other k6 2641 // architecture is specified but -m3dnow is explicitly provided. The 2642 // exact semantics need to be determined and emulated here. 2643 Builder.defineMacro("__k6_3__"); 2644 Builder.defineMacro("__tune_k6_3__"); 2645 } 2646 // Fallthrough 2647 case CK_K6: 2648 defineCPUMacros(Builder, "k6"); 2649 break; 2650 case CK_Athlon: 2651 case CK_AthlonThunderbird: 2652 case CK_Athlon4: 2653 case CK_AthlonXP: 2654 case CK_AthlonMP: 2655 defineCPUMacros(Builder, "athlon"); 2656 if (SSELevel != NoSSE) { 2657 Builder.defineMacro("__athlon_sse__"); 2658 Builder.defineMacro("__tune_athlon_sse__"); 2659 } 2660 break; 2661 case CK_K8: 2662 case CK_K8SSE3: 2663 case CK_x86_64: 2664 case CK_Opteron: 2665 case CK_OpteronSSE3: 2666 case CK_Athlon64: 2667 case CK_Athlon64SSE3: 2668 case CK_AthlonFX: 2669 defineCPUMacros(Builder, "k8"); 2670 break; 2671 case CK_AMDFAM10: 2672 defineCPUMacros(Builder, "amdfam10"); 2673 break; 2674 case CK_BTVER1: 2675 defineCPUMacros(Builder, "btver1"); 2676 break; 2677 case CK_BTVER2: 2678 defineCPUMacros(Builder, "btver2"); 2679 break; 2680 case CK_BDVER1: 2681 defineCPUMacros(Builder, "bdver1"); 2682 break; 2683 case CK_BDVER2: 2684 defineCPUMacros(Builder, "bdver2"); 2685 break; 2686 case CK_BDVER3: 2687 defineCPUMacros(Builder, "bdver3"); 2688 break; 2689 case CK_Geode: 2690 defineCPUMacros(Builder, "geode"); 2691 break; 2692 } 2693 2694 // Target properties. 2695 Builder.defineMacro("__LITTLE_ENDIAN__"); 2696 Builder.defineMacro("__REGISTER_PREFIX__", ""); 2697 2698 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline 2699 // functions in glibc header files that use FP Stack inline asm which the 2700 // backend can't deal with (PR879). 2701 Builder.defineMacro("__NO_MATH_INLINES"); 2702 2703 if (HasAES) 2704 Builder.defineMacro("__AES__"); 2705 2706 if (HasPCLMUL) 2707 Builder.defineMacro("__PCLMUL__"); 2708 2709 if (HasLZCNT) 2710 Builder.defineMacro("__LZCNT__"); 2711 2712 if (HasRDRND) 2713 Builder.defineMacro("__RDRND__"); 2714 2715 if (HasBMI) 2716 Builder.defineMacro("__BMI__"); 2717 2718 if (HasBMI2) 2719 Builder.defineMacro("__BMI2__"); 2720 2721 if (HasPOPCNT) 2722 Builder.defineMacro("__POPCNT__"); 2723 2724 if (HasRTM) 2725 Builder.defineMacro("__RTM__"); 2726 2727 if (HasPRFCHW) 2728 Builder.defineMacro("__PRFCHW__"); 2729 2730 if (HasRDSEED) 2731 Builder.defineMacro("__RDSEED__"); 2732 2733 if (HasTBM) 2734 Builder.defineMacro("__TBM__"); 2735 2736 switch (XOPLevel) { 2737 case XOP: 2738 Builder.defineMacro("__XOP__"); 2739 case FMA4: 2740 Builder.defineMacro("__FMA4__"); 2741 case SSE4A: 2742 Builder.defineMacro("__SSE4A__"); 2743 case NoXOP: 2744 break; 2745 } 2746 2747 if (HasFMA) 2748 Builder.defineMacro("__FMA__"); 2749 2750 if (HasF16C) 2751 Builder.defineMacro("__F16C__"); 2752 2753 if (HasAVX512CD) 2754 Builder.defineMacro("__AVX512CD__"); 2755 if (HasAVX512ER) 2756 Builder.defineMacro("__AVX512ER__"); 2757 if (HasAVX512PF) 2758 Builder.defineMacro("__AVX512PF__"); 2759 2760 if (HasSHA) 2761 Builder.defineMacro("__SHA__"); 2762 2763 if (HasCX16) 2764 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16"); 2765 2766 // Each case falls through to the previous one here. 2767 switch (SSELevel) { 2768 case AVX512F: 2769 Builder.defineMacro("__AVX512F__"); 2770 case AVX2: 2771 Builder.defineMacro("__AVX2__"); 2772 case AVX: 2773 Builder.defineMacro("__AVX__"); 2774 case SSE42: 2775 Builder.defineMacro("__SSE4_2__"); 2776 case SSE41: 2777 Builder.defineMacro("__SSE4_1__"); 2778 case SSSE3: 2779 Builder.defineMacro("__SSSE3__"); 2780 case SSE3: 2781 Builder.defineMacro("__SSE3__"); 2782 case SSE2: 2783 Builder.defineMacro("__SSE2__"); 2784 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied. 2785 case SSE1: 2786 Builder.defineMacro("__SSE__"); 2787 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied. 2788 case NoSSE: 2789 break; 2790 } 2791 2792 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) { 2793 switch (SSELevel) { 2794 case AVX512F: 2795 case AVX2: 2796 case AVX: 2797 case SSE42: 2798 case SSE41: 2799 case SSSE3: 2800 case SSE3: 2801 case SSE2: 2802 Builder.defineMacro("_M_IX86_FP", Twine(2)); 2803 break; 2804 case SSE1: 2805 Builder.defineMacro("_M_IX86_FP", Twine(1)); 2806 break; 2807 default: 2808 Builder.defineMacro("_M_IX86_FP", Twine(0)); 2809 } 2810 } 2811 2812 // Each case falls through to the previous one here. 2813 switch (MMX3DNowLevel) { 2814 case AMD3DNowAthlon: 2815 Builder.defineMacro("__3dNOW_A__"); 2816 case AMD3DNow: 2817 Builder.defineMacro("__3dNOW__"); 2818 case MMX: 2819 Builder.defineMacro("__MMX__"); 2820 case NoMMX3DNow: 2821 break; 2822 } 2823 2824 if (CPU >= CK_i486) { 2825 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1"); 2826 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); 2827 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4"); 2828 } 2829 if (CPU >= CK_i586) 2830 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8"); 2831} 2832 2833bool X86TargetInfo::hasFeature(StringRef Feature) const { 2834 return llvm::StringSwitch<bool>(Feature) 2835 .Case("aes", HasAES) 2836 .Case("avx", SSELevel >= AVX) 2837 .Case("avx2", SSELevel >= AVX2) 2838 .Case("avx512f", SSELevel >= AVX512F) 2839 .Case("avx512cd", HasAVX512CD) 2840 .Case("avx512er", HasAVX512ER) 2841 .Case("avx512pf", HasAVX512PF) 2842 .Case("bmi", HasBMI) 2843 .Case("bmi2", HasBMI2) 2844 .Case("cx16", HasCX16) 2845 .Case("f16c", HasF16C) 2846 .Case("fma", HasFMA) 2847 .Case("fma4", XOPLevel >= FMA4) 2848 .Case("tbm", HasTBM) 2849 .Case("lzcnt", HasLZCNT) 2850 .Case("rdrnd", HasRDRND) 2851 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow) 2852 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon) 2853 .Case("mmx", MMX3DNowLevel >= MMX) 2854 .Case("pclmul", HasPCLMUL) 2855 .Case("popcnt", HasPOPCNT) 2856 .Case("rtm", HasRTM) 2857 .Case("prfchw", HasPRFCHW) 2858 .Case("rdseed", HasRDSEED) 2859 .Case("sha", HasSHA) 2860 .Case("sse", SSELevel >= SSE1) 2861 .Case("sse2", SSELevel >= SSE2) 2862 .Case("sse3", SSELevel >= SSE3) 2863 .Case("ssse3", SSELevel >= SSSE3) 2864 .Case("sse4.1", SSELevel >= SSE41) 2865 .Case("sse4.2", SSELevel >= SSE42) 2866 .Case("sse4a", XOPLevel >= SSE4A) 2867 .Case("x86", true) 2868 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86) 2869 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64) 2870 .Case("xop", XOPLevel >= XOP) 2871 .Default(false); 2872} 2873 2874bool 2875X86TargetInfo::validateAsmConstraint(const char *&Name, 2876 TargetInfo::ConstraintInfo &Info) const { 2877 switch (*Name) { 2878 default: return false; 2879 case 'Y': // first letter of a pair: 2880 switch (*(Name+1)) { 2881 default: return false; 2882 case '0': // First SSE register. 2883 case 't': // Any SSE register, when SSE2 is enabled. 2884 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled. 2885 case 'm': // any MMX register, when inter-unit moves enabled. 2886 break; // falls through to setAllowsRegister. 2887 } 2888 case 'a': // eax. 2889 case 'b': // ebx. 2890 case 'c': // ecx. 2891 case 'd': // edx. 2892 case 'S': // esi. 2893 case 'D': // edi. 2894 case 'A': // edx:eax. 2895 case 'f': // any x87 floating point stack register. 2896 case 't': // top of floating point stack. 2897 case 'u': // second from top of floating point stack. 2898 case 'q': // Any register accessible as [r]l: a, b, c, and d. 2899 case 'y': // Any MMX register. 2900 case 'x': // Any SSE register. 2901 case 'Q': // Any register accessible as [r]h: a, b, c, and d. 2902 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp. 2903 case 'l': // "Index" registers: any general register that can be used as an 2904 // index in a base+index memory access. 2905 Info.setAllowsRegister(); 2906 return true; 2907 case 'C': // SSE floating point constant. 2908 case 'G': // x87 floating point constant. 2909 case 'e': // 32-bit signed integer constant for use with zero-extending 2910 // x86_64 instructions. 2911 case 'Z': // 32-bit unsigned integer constant for use with zero-extending 2912 // x86_64 instructions. 2913 return true; 2914 } 2915} 2916 2917 2918std::string 2919X86TargetInfo::convertConstraint(const char *&Constraint) const { 2920 switch (*Constraint) { 2921 case 'a': return std::string("{ax}"); 2922 case 'b': return std::string("{bx}"); 2923 case 'c': return std::string("{cx}"); 2924 case 'd': return std::string("{dx}"); 2925 case 'S': return std::string("{si}"); 2926 case 'D': return std::string("{di}"); 2927 case 'p': // address 2928 return std::string("im"); 2929 case 't': // top of floating point stack. 2930 return std::string("{st}"); 2931 case 'u': // second from top of floating point stack. 2932 return std::string("{st(1)}"); // second from top of floating point stack. 2933 default: 2934 return std::string(1, *Constraint); 2935 } 2936} 2937} // end anonymous namespace 2938 2939namespace { 2940// X86-32 generic target 2941class X86_32TargetInfo : public X86TargetInfo { 2942public: 2943 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) { 2944 DoubleAlign = LongLongAlign = 32; 2945 LongDoubleWidth = 96; 2946 LongDoubleAlign = 32; 2947 SuitableAlign = 128; 2948 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 2949 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-" 2950 "a0:0:64-f80:32:32-n8:16:32-S128"; 2951 SizeType = UnsignedInt; 2952 PtrDiffType = SignedInt; 2953 IntPtrType = SignedInt; 2954 RegParmMax = 3; 2955 2956 // Use fpret for all types. 2957 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) | 2958 (1 << TargetInfo::Double) | 2959 (1 << TargetInfo::LongDouble)); 2960 2961 // x86-32 has atomics up to 8 bytes 2962 // FIXME: Check that we actually have cmpxchg8b before setting 2963 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.) 2964 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 2965 } 2966 virtual BuiltinVaListKind getBuiltinVaListKind() const { 2967 return TargetInfo::CharPtrBuiltinVaList; 2968 } 2969 2970 int getEHDataRegisterNumber(unsigned RegNo) const { 2971 if (RegNo == 0) return 0; 2972 if (RegNo == 1) return 2; 2973 return -1; 2974 } 2975 virtual bool validateInputSize(StringRef Constraint, 2976 unsigned Size) const { 2977 switch (Constraint[0]) { 2978 default: break; 2979 case 'a': 2980 case 'b': 2981 case 'c': 2982 case 'd': 2983 return Size <= 32; 2984 } 2985 2986 return true; 2987 } 2988}; 2989} // end anonymous namespace 2990 2991namespace { 2992class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> { 2993public: 2994 NetBSDI386TargetInfo(const llvm::Triple &Triple) 2995 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {} 2996 2997 virtual unsigned getFloatEvalMethod() const { 2998 unsigned Major, Minor, Micro; 2999 getTriple().getOSVersion(Major, Minor, Micro); 3000 // New NetBSD uses the default rounding mode. 3001 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0) 3002 return X86_32TargetInfo::getFloatEvalMethod(); 3003 // NetBSD before 6.99.26 defaults to "double" rounding. 3004 return 1; 3005 } 3006}; 3007} // end anonymous namespace 3008 3009namespace { 3010class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> { 3011public: 3012 OpenBSDI386TargetInfo(const llvm::Triple &Triple) 3013 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) { 3014 SizeType = UnsignedLong; 3015 IntPtrType = SignedLong; 3016 PtrDiffType = SignedLong; 3017 } 3018}; 3019} // end anonymous namespace 3020 3021namespace { 3022class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> { 3023public: 3024 BitrigI386TargetInfo(const llvm::Triple &Triple) 3025 : BitrigTargetInfo<X86_32TargetInfo>(Triple) { 3026 SizeType = UnsignedLong; 3027 IntPtrType = SignedLong; 3028 PtrDiffType = SignedLong; 3029 } 3030}; 3031} // end anonymous namespace 3032 3033namespace { 3034class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> { 3035public: 3036 DarwinI386TargetInfo(const llvm::Triple &Triple) 3037 : DarwinTargetInfo<X86_32TargetInfo>(Triple) { 3038 LongDoubleWidth = 128; 3039 LongDoubleAlign = 128; 3040 SuitableAlign = 128; 3041 MaxVectorAlign = 256; 3042 SizeType = UnsignedLong; 3043 IntPtrType = SignedLong; 3044 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 3045 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-" 3046 "a0:0:64-f80:128:128-n8:16:32-S128"; 3047 HasAlignMac68kSupport = true; 3048 } 3049 3050}; 3051} // end anonymous namespace 3052 3053namespace { 3054// x86-32 Windows target 3055class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> { 3056public: 3057 WindowsX86_32TargetInfo(const llvm::Triple &Triple) 3058 : WindowsTargetInfo<X86_32TargetInfo>(Triple) { 3059 TLSSupported = false; 3060 WCharType = UnsignedShort; 3061 DoubleAlign = LongLongAlign = 64; 3062 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 3063 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-" 3064 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32"; 3065 } 3066 virtual void getTargetDefines(const LangOptions &Opts, 3067 MacroBuilder &Builder) const { 3068 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder); 3069 } 3070}; 3071} // end anonymous namespace 3072 3073namespace { 3074 3075// x86-32 Windows Visual Studio target 3076class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo { 3077public: 3078 VisualStudioWindowsX86_32TargetInfo(const llvm::Triple &Triple) 3079 : WindowsX86_32TargetInfo(Triple) { 3080 LongDoubleWidth = LongDoubleAlign = 64; 3081 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 3082 } 3083 virtual void getTargetDefines(const LangOptions &Opts, 3084 MacroBuilder &Builder) const { 3085 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder); 3086 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder); 3087 // The value of the following reflects processor type. 3088 // 300=386, 400=486, 500=Pentium, 600=Blend (default) 3089 // We lost the original triple, so we use the default. 3090 Builder.defineMacro("_M_IX86", "600"); 3091 } 3092}; 3093} // end anonymous namespace 3094 3095namespace { 3096// x86-32 MinGW target 3097class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo { 3098public: 3099 MinGWX86_32TargetInfo(const llvm::Triple &Triple) 3100 : WindowsX86_32TargetInfo(Triple) {} 3101 virtual void getTargetDefines(const LangOptions &Opts, 3102 MacroBuilder &Builder) const { 3103 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder); 3104 DefineStd(Builder, "WIN32", Opts); 3105 DefineStd(Builder, "WINNT", Opts); 3106 Builder.defineMacro("_X86_"); 3107 Builder.defineMacro("__MSVCRT__"); 3108 Builder.defineMacro("__MINGW32__"); 3109 3110 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)). 3111 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions. 3112 if (Opts.MicrosoftExt) 3113 // Provide "as-is" __declspec. 3114 Builder.defineMacro("__declspec", "__declspec"); 3115 else 3116 // Provide alias of __attribute__ like mingw32-gcc. 3117 Builder.defineMacro("__declspec(a)", "__attribute__((a))"); 3118 } 3119}; 3120} // end anonymous namespace 3121 3122namespace { 3123// x86-32 Cygwin target 3124class CygwinX86_32TargetInfo : public X86_32TargetInfo { 3125public: 3126 CygwinX86_32TargetInfo(const llvm::Triple &Triple) 3127 : X86_32TargetInfo(Triple) { 3128 TLSSupported = false; 3129 WCharType = UnsignedShort; 3130 DoubleAlign = LongLongAlign = 64; 3131 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 3132 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-" 3133 "a0:0:64-f80:32:32-n8:16:32-S32"; 3134 } 3135 virtual void getTargetDefines(const LangOptions &Opts, 3136 MacroBuilder &Builder) const { 3137 X86_32TargetInfo::getTargetDefines(Opts, Builder); 3138 Builder.defineMacro("_X86_"); 3139 Builder.defineMacro("__CYGWIN__"); 3140 Builder.defineMacro("__CYGWIN32__"); 3141 DefineStd(Builder, "unix", Opts); 3142 if (Opts.CPlusPlus) 3143 Builder.defineMacro("_GNU_SOURCE"); 3144 } 3145}; 3146} // end anonymous namespace 3147 3148namespace { 3149// x86-32 Haiku target 3150class HaikuX86_32TargetInfo : public X86_32TargetInfo { 3151public: 3152 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) { 3153 SizeType = UnsignedLong; 3154 IntPtrType = SignedLong; 3155 PtrDiffType = SignedLong; 3156 ProcessIDType = SignedLong; 3157 this->UserLabelPrefix = ""; 3158 this->TLSSupported = false; 3159 } 3160 virtual void getTargetDefines(const LangOptions &Opts, 3161 MacroBuilder &Builder) const { 3162 X86_32TargetInfo::getTargetDefines(Opts, Builder); 3163 Builder.defineMacro("__INTEL__"); 3164 Builder.defineMacro("__HAIKU__"); 3165 } 3166}; 3167} // end anonymous namespace 3168 3169// RTEMS Target 3170template<typename Target> 3171class RTEMSTargetInfo : public OSTargetInfo<Target> { 3172protected: 3173 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 3174 MacroBuilder &Builder) const { 3175 // RTEMS defines; list based off of gcc output 3176 3177 Builder.defineMacro("__rtems__"); 3178 Builder.defineMacro("__ELF__"); 3179 } 3180 3181public: 3182 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 3183 this->UserLabelPrefix = ""; 3184 3185 switch (Triple.getArch()) { 3186 default: 3187 case llvm::Triple::x86: 3188 // this->MCountName = ".mcount"; 3189 break; 3190 case llvm::Triple::mips: 3191 case llvm::Triple::mipsel: 3192 case llvm::Triple::ppc: 3193 case llvm::Triple::ppc64: 3194 case llvm::Triple::ppc64le: 3195 // this->MCountName = "_mcount"; 3196 break; 3197 case llvm::Triple::arm: 3198 // this->MCountName = "__mcount"; 3199 break; 3200 } 3201 } 3202}; 3203 3204namespace { 3205// x86-32 RTEMS target 3206class RTEMSX86_32TargetInfo : public X86_32TargetInfo { 3207public: 3208 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) { 3209 SizeType = UnsignedLong; 3210 IntPtrType = SignedLong; 3211 PtrDiffType = SignedLong; 3212 this->UserLabelPrefix = ""; 3213 } 3214 virtual void getTargetDefines(const LangOptions &Opts, 3215 MacroBuilder &Builder) const { 3216 X86_32TargetInfo::getTargetDefines(Opts, Builder); 3217 Builder.defineMacro("__INTEL__"); 3218 Builder.defineMacro("__rtems__"); 3219 } 3220}; 3221} // end anonymous namespace 3222 3223namespace { 3224// x86-64 generic target 3225class X86_64TargetInfo : public X86TargetInfo { 3226public: 3227 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) { 3228 LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 3229 LongDoubleWidth = 128; 3230 LongDoubleAlign = 128; 3231 LargeArrayMinWidth = 128; 3232 LargeArrayAlign = 128; 3233 SuitableAlign = 128; 3234 IntMaxType = SignedLong; 3235 UIntMaxType = UnsignedLong; 3236 Int64Type = SignedLong; 3237 RegParmMax = 6; 3238 3239 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 3240 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-" 3241 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"; 3242 3243 // Use fpret only for long double. 3244 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble); 3245 3246 // Use fp2ret for _Complex long double. 3247 ComplexLongDoubleUsesFP2Ret = true; 3248 3249 // x86-64 has atomics up to 16 bytes. 3250 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128 3251 // on CPUs with cmpxchg16b 3252 MaxAtomicPromoteWidth = 128; 3253 MaxAtomicInlineWidth = 64; 3254 } 3255 virtual BuiltinVaListKind getBuiltinVaListKind() const { 3256 return TargetInfo::X86_64ABIBuiltinVaList; 3257 } 3258 3259 int getEHDataRegisterNumber(unsigned RegNo) const { 3260 if (RegNo == 0) return 0; 3261 if (RegNo == 1) return 1; 3262 return -1; 3263 } 3264 3265 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const { 3266 return (CC == CC_C || 3267 CC == CC_IntelOclBicc || 3268 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning; 3269 } 3270 3271 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const { 3272 return CC_C; 3273 } 3274 3275}; 3276} // end anonymous namespace 3277 3278namespace { 3279// x86-64 Windows target 3280class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> { 3281public: 3282 WindowsX86_64TargetInfo(const llvm::Triple &Triple) 3283 : WindowsTargetInfo<X86_64TargetInfo>(Triple) { 3284 TLSSupported = false; 3285 WCharType = UnsignedShort; 3286 LongWidth = LongAlign = 32; 3287 DoubleAlign = LongLongAlign = 64; 3288 IntMaxType = SignedLongLong; 3289 UIntMaxType = UnsignedLongLong; 3290 Int64Type = SignedLongLong; 3291 SizeType = UnsignedLongLong; 3292 PtrDiffType = SignedLongLong; 3293 IntPtrType = SignedLongLong; 3294 this->UserLabelPrefix = ""; 3295 } 3296 virtual void getTargetDefines(const LangOptions &Opts, 3297 MacroBuilder &Builder) const { 3298 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder); 3299 Builder.defineMacro("_WIN64"); 3300 } 3301 virtual BuiltinVaListKind getBuiltinVaListKind() const { 3302 return TargetInfo::CharPtrBuiltinVaList; 3303 } 3304 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const { 3305 return (CC == CC_C || 3306 CC == CC_IntelOclBicc || 3307 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning; 3308 } 3309}; 3310} // end anonymous namespace 3311 3312namespace { 3313// x86-64 Windows Visual Studio target 3314class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo { 3315public: 3316 VisualStudioWindowsX86_64TargetInfo(const llvm::Triple &Triple) 3317 : WindowsX86_64TargetInfo(Triple) { 3318 LongDoubleWidth = LongDoubleAlign = 64; 3319 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 3320 } 3321 virtual void getTargetDefines(const LangOptions &Opts, 3322 MacroBuilder &Builder) const { 3323 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder); 3324 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder); 3325 Builder.defineMacro("_M_X64"); 3326 Builder.defineMacro("_M_AMD64"); 3327 } 3328}; 3329} // end anonymous namespace 3330 3331namespace { 3332// x86-64 MinGW target 3333class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo { 3334public: 3335 MinGWX86_64TargetInfo(const llvm::Triple &Triple) 3336 : WindowsX86_64TargetInfo(Triple) {} 3337 virtual void getTargetDefines(const LangOptions &Opts, 3338 MacroBuilder &Builder) const { 3339 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder); 3340 DefineStd(Builder, "WIN64", Opts); 3341 Builder.defineMacro("__MSVCRT__"); 3342 Builder.defineMacro("__MINGW32__"); 3343 Builder.defineMacro("__MINGW64__"); 3344 3345 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)). 3346 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions. 3347 if (Opts.MicrosoftExt) 3348 // Provide "as-is" __declspec. 3349 Builder.defineMacro("__declspec", "__declspec"); 3350 else 3351 // Provide alias of __attribute__ like mingw32-gcc. 3352 Builder.defineMacro("__declspec(a)", "__attribute__((a))"); 3353 } 3354}; 3355} // end anonymous namespace 3356 3357namespace { 3358class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> { 3359public: 3360 DarwinX86_64TargetInfo(const llvm::Triple &Triple) 3361 : DarwinTargetInfo<X86_64TargetInfo>(Triple) { 3362 Int64Type = SignedLongLong; 3363 MaxVectorAlign = 256; 3364 } 3365}; 3366} // end anonymous namespace 3367 3368namespace { 3369class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> { 3370public: 3371 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple) 3372 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) { 3373 IntMaxType = SignedLongLong; 3374 UIntMaxType = UnsignedLongLong; 3375 Int64Type = SignedLongLong; 3376 } 3377}; 3378} // end anonymous namespace 3379 3380namespace { 3381class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> { 3382public: 3383 BitrigX86_64TargetInfo(const llvm::Triple &Triple) 3384 : BitrigTargetInfo<X86_64TargetInfo>(Triple) { 3385 IntMaxType = SignedLongLong; 3386 UIntMaxType = UnsignedLongLong; 3387 Int64Type = SignedLongLong; 3388 } 3389}; 3390} 3391 3392namespace { 3393class AArch64TargetInfo : public TargetInfo { 3394 static const char * const GCCRegNames[]; 3395 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 3396 3397 enum FPUModeEnum { 3398 FPUMode, 3399 NeonMode 3400 }; 3401 3402 unsigned FPU; 3403 static const Builtin::Info BuiltinInfo[]; 3404 3405public: 3406 AArch64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 3407 BigEndian = false; 3408 LongWidth = LongAlign = 64; 3409 LongDoubleWidth = LongDoubleAlign = 128; 3410 PointerWidth = PointerAlign = 64; 3411 SuitableAlign = 128; 3412 DescriptionString = "e-p:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 3413 "i64:64:64-i128:128:128-f32:32:32-f64:64:64-" 3414 "f128:128:128-n32:64-S128"; 3415 3416 WCharType = UnsignedInt; 3417 LongDoubleFormat = &llvm::APFloat::IEEEquad; 3418 3419 // AArch64 backend supports 64-bit operations at the moment. In principle 3420 // 128-bit is possible if register-pairs are used. 3421 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 3422 3423 TheCXXABI.set(TargetCXXABI::GenericAArch64); 3424 } 3425 virtual void getTargetDefines(const LangOptions &Opts, 3426 MacroBuilder &Builder) const { 3427 // GCC defines theses currently 3428 Builder.defineMacro("__aarch64__"); 3429 Builder.defineMacro("__AARCH64EL__"); 3430 3431 // ACLE predefines. Many can only have one possible value on v8 AArch64. 3432 3433 // FIXME: these were written based on an unreleased version of a 32-bit ACLE 3434 // which was intended to be compatible with a 64-bit implementation. They 3435 // will need updating when a real 64-bit ACLE exists. Particularly pressing 3436 // instances are: __ARM_ARCH_ISA_ARM, __ARM_ARCH_ISA_THUMB, __ARM_PCS. 3437 Builder.defineMacro("__ARM_ACLE", "101"); 3438 Builder.defineMacro("__ARM_ARCH", "8"); 3439 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'"); 3440 3441 Builder.defineMacro("__ARM_FEATURE_UNALIGNED"); 3442 Builder.defineMacro("__ARM_FEATURE_CLZ"); 3443 Builder.defineMacro("__ARM_FEATURE_FMA"); 3444 3445 // FIXME: ACLE 1.1 reserves bit 4. Will almost certainly come to mean 3446 // 128-bit LDXP present, at which point this becomes 0x1f. 3447 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xf"); 3448 3449 // 0xe implies support for half, single and double precision operations. 3450 Builder.defineMacro("__ARM_FP", "0xe"); 3451 3452 // PCS specifies this for SysV variants, which is all we support. Other ABIs 3453 // may choose __ARM_FP16_FORMAT_ALTERNATIVE. 3454 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE"); 3455 3456 if (Opts.FastMath || Opts.FiniteMathOnly) 3457 Builder.defineMacro("__ARM_FP_FAST"); 3458 3459 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding) 3460 Builder.defineMacro("__ARM_FP_FENV_ROUNDING"); 3461 3462 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", 3463 Opts.ShortWChar ? "2" : "4"); 3464 3465 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM", 3466 Opts.ShortEnums ? "1" : "4"); 3467 3468 if (BigEndian) 3469 Builder.defineMacro("__AARCH_BIG_ENDIAN"); 3470 3471 if (FPU == NeonMode) { 3472 Builder.defineMacro("__AARCH_FEATURE_ADVSIMD"); 3473 3474 // 64-bit NEON supports half, single and double precision operations. 3475 Builder.defineMacro("__AARCH_ADVSIMD_FP", "0xe"); 3476 } 3477 } 3478 virtual void getTargetBuiltins(const Builtin::Info *&Records, 3479 unsigned &NumRecords) const { 3480 Records = BuiltinInfo; 3481 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin; 3482 } 3483 virtual bool hasFeature(StringRef Feature) const { 3484 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode); 3485 } 3486 3487 virtual bool setCPU(const std::string &Name) { 3488 return llvm::StringSwitch<bool>(Name) 3489 .Case("generic", true) 3490 .Cases("cortex-a53", "cortex-a57", true) 3491 .Default(false); 3492 } 3493 3494 virtual bool handleTargetFeatures(std::vector<std::string> &Features, 3495 DiagnosticsEngine &Diags) { 3496 FPU = FPUMode; 3497 for (unsigned i = 0, e = Features.size(); i != e; ++i) { 3498 if (Features[i] == "+neon") 3499 FPU = NeonMode; 3500 } 3501 return true; 3502 } 3503 3504 virtual void getGCCRegNames(const char *const *&Names, 3505 unsigned &NumNames) const; 3506 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 3507 unsigned &NumAliases) const; 3508 3509 virtual bool isCLZForZeroUndef() const { return false; } 3510 3511 virtual bool validateAsmConstraint(const char *&Name, 3512 TargetInfo::ConstraintInfo &Info) const { 3513 switch (*Name) { 3514 default: return false; 3515 case 'w': // An FP/SIMD vector register 3516 Info.setAllowsRegister(); 3517 return true; 3518 case 'I': // Constant that can be used with an ADD instruction 3519 case 'J': // Constant that can be used with a SUB instruction 3520 case 'K': // Constant that can be used with a 32-bit logical instruction 3521 case 'L': // Constant that can be used with a 64-bit logical instruction 3522 case 'M': // Constant that can be used as a 32-bit MOV immediate 3523 case 'N': // Constant that can be used as a 64-bit MOV immediate 3524 case 'Y': // Floating point constant zero 3525 case 'Z': // Integer constant zero 3526 return true; 3527 case 'Q': // A memory reference with base register and no offset 3528 Info.setAllowsMemory(); 3529 return true; 3530 case 'S': // A symbolic address 3531 Info.setAllowsRegister(); 3532 return true; 3533 case 'U': 3534 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be 3535 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be 3536 // Usa: An absolute symbolic address 3537 // Ush: The high part (bits 32:12) of a pc-relative symbolic address 3538 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints"); 3539 } 3540 } 3541 3542 virtual const char *getClobbers() const { 3543 // There are no AArch64 clobbers shared by all asm statements. 3544 return ""; 3545 } 3546 3547 virtual BuiltinVaListKind getBuiltinVaListKind() const { 3548 return TargetInfo::AArch64ABIBuiltinVaList; 3549 } 3550}; 3551 3552const char * const AArch64TargetInfo::GCCRegNames[] = { 3553 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", 3554 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15", 3555 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23", 3556 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr", 3557 3558 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", 3559 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", 3560 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", 3561 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr", 3562 3563 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7", 3564 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15", 3565 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23", 3566 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31", 3567 3568 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7", 3569 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15", 3570 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23", 3571 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31", 3572 3573 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", 3574 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", 3575 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", 3576 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31", 3577 3578 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", 3579 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15", 3580 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", 3581 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", 3582 3583 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", 3584 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15", 3585 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23", 3586 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31" 3587}; 3588 3589void AArch64TargetInfo::getGCCRegNames(const char * const *&Names, 3590 unsigned &NumNames) const { 3591 Names = GCCRegNames; 3592 NumNames = llvm::array_lengthof(GCCRegNames); 3593} 3594 3595const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = { 3596 { { "x16" }, "ip0"}, 3597 { { "x17" }, "ip1"}, 3598 { { "x29" }, "fp" }, 3599 { { "x30" }, "lr" } 3600}; 3601 3602void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 3603 unsigned &NumAliases) const { 3604 Aliases = GCCRegAliases; 3605 NumAliases = llvm::array_lengthof(GCCRegAliases); 3606 3607} 3608 3609const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = { 3610#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, 3611#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ 3612 ALL_LANGUAGES }, 3613#include "clang/Basic/BuiltinsAArch64.def" 3614}; 3615 3616} // end anonymous namespace 3617 3618namespace { 3619class ARMTargetInfo : public TargetInfo { 3620 // Possible FPU choices. 3621 enum FPUMode { 3622 VFP2FPU = (1 << 0), 3623 VFP3FPU = (1 << 1), 3624 VFP4FPU = (1 << 2), 3625 NeonFPU = (1 << 3), 3626 FPARMV8 = (1 << 4) 3627 }; 3628 3629 // Possible HWDiv features. 3630 enum HWDivMode { 3631 HWDivThumb = (1 << 0), 3632 HWDivARM = (1 << 1) 3633 }; 3634 3635 static bool FPUModeIsVFP(FPUMode Mode) { 3636 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8); 3637 } 3638 3639 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 3640 static const char * const GCCRegNames[]; 3641 3642 std::string ABI, CPU; 3643 3644 enum { 3645 FP_Default, 3646 FP_VFP, 3647 FP_Neon 3648 } FPMath; 3649 3650 unsigned FPU : 5; 3651 3652 unsigned IsAAPCS : 1; 3653 unsigned IsThumb : 1; 3654 unsigned HWDiv : 2; 3655 3656 // Initialized via features. 3657 unsigned SoftFloat : 1; 3658 unsigned SoftFloatABI : 1; 3659 3660 unsigned CRC : 1; 3661 3662 static const Builtin::Info BuiltinInfo[]; 3663 3664 static bool shouldUseInlineAtomic(const llvm::Triple &T) { 3665 // On linux, binaries targeting old cpus call functions in libgcc to 3666 // perform atomic operations. The implementation in libgcc then calls into 3667 // the kernel which on armv6 and newer uses ldrex and strex. The net result 3668 // is that if we assume the kernel is at least as recent as the hardware, 3669 // it is safe to use atomic instructions on armv6 and newer. 3670 if (!T.isOSLinux() && 3671 T.getOS() != llvm::Triple::FreeBSD && 3672 T.getOS() != llvm::Triple::Bitrig) 3673 return false; 3674 StringRef ArchName = T.getArchName(); 3675 if (T.getArch() == llvm::Triple::arm) { 3676 if (!ArchName.startswith("armv")) 3677 return false; 3678 StringRef VersionStr = ArchName.substr(4); 3679 unsigned Version; 3680 if (VersionStr.getAsInteger(10, Version)) 3681 return false; 3682 return Version >= 6; 3683 } 3684 assert(T.getArch() == llvm::Triple::thumb); 3685 if (!ArchName.startswith("thumbv")) 3686 return false; 3687 StringRef VersionStr = ArchName.substr(6); 3688 unsigned Version; 3689 if (VersionStr.getAsInteger(10, Version)) 3690 return false; 3691 return Version >= 7; 3692 } 3693 3694public: 3695 ARMTargetInfo(const llvm::Triple &Triple) 3696 : TargetInfo(Triple), ABI("aapcs-linux"), CPU("arm1136j-s"), 3697 FPMath(FP_Default), IsAAPCS(true) { 3698 BigEndian = false; 3699 SizeType = UnsignedInt; 3700 PtrDiffType = SignedInt; 3701 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int. 3702 WCharType = UnsignedInt; 3703 3704 // {} in inline assembly are neon specifiers, not assembly variant 3705 // specifiers. 3706 NoAsmVariants = true; 3707 3708 // FIXME: Should we just treat this as a feature? 3709 IsThumb = getTriple().getArchName().startswith("thumb"); 3710 if (IsThumb) { 3711 // Thumb1 add sp, #imm requires the immediate value be multiple of 4, 3712 // so set preferred for small types to 32. 3713 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-" 3714 "i64:64:64-f32:32:32-f64:64:64-" 3715 "v64:64:64-v128:64:128-a0:0:32-n32-S64"); 3716 } else { 3717 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 3718 "i64:64:64-f32:32:32-f64:64:64-" 3719 "v64:64:64-v128:64:128-a0:0:64-n32-S64"); 3720 } 3721 3722 // ARM targets default to using the ARM C++ ABI. 3723 TheCXXABI.set(TargetCXXABI::GenericARM); 3724 3725 // ARM has atomics up to 8 bytes 3726 MaxAtomicPromoteWidth = 64; 3727 if (shouldUseInlineAtomic(getTriple())) 3728 MaxAtomicInlineWidth = 64; 3729 3730 // Do force alignment of members that follow zero length bitfields. If 3731 // the alignment of the zero-length bitfield is greater than the member 3732 // that follows it, `bar', `bar' will be aligned as the type of the 3733 // zero length bitfield. 3734 UseZeroLengthBitfieldAlignment = true; 3735 } 3736 virtual const char *getABI() const { return ABI.c_str(); } 3737 virtual bool setABI(const std::string &Name) { 3738 ABI = Name; 3739 3740 // The defaults (above) are for AAPCS, check if we need to change them. 3741 // 3742 // FIXME: We need support for -meabi... we could just mangle it into the 3743 // name. 3744 if (Name == "apcs-gnu") { 3745 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32; 3746 // size_t is unsigned int on FreeBSD. 3747 if (getTriple().getOS() != llvm::Triple::FreeBSD) 3748 SizeType = UnsignedLong; 3749 3750 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour. 3751 WCharType = SignedInt; 3752 3753 // Do not respect the alignment of bit-field types when laying out 3754 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc. 3755 UseBitFieldTypeAlignment = false; 3756 3757 /// gcc forces the alignment to 4 bytes, regardless of the type of the 3758 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in 3759 /// gcc. 3760 ZeroLengthBitfieldBoundary = 32; 3761 3762 IsAAPCS = false; 3763 3764 if (IsThumb) { 3765 // Thumb1 add sp, #imm requires the immediate value be multiple of 4, 3766 // so set preferred for small types to 32. 3767 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-" 3768 "i64:32:64-f32:32:32-f64:32:64-" 3769 "v64:32:64-v128:32:128-a0:0:32-n32-S32"); 3770 } else { 3771 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 3772 "i64:32:64-f32:32:32-f64:32:64-" 3773 "v64:32:64-v128:32:128-a0:0:32-n32-S32"); 3774 } 3775 3776 // FIXME: Override "preferred align" for double and long long. 3777 } else if (Name == "aapcs" || Name == "aapcs-vfp") { 3778 // size_t is unsigned long on Darwin. 3779 if (getTriple().isOSDarwin()) 3780 SizeType = UnsignedLong; 3781 IsAAPCS = true; 3782 // FIXME: Enumerated types are variable width in straight AAPCS. 3783 } else if (Name == "aapcs-linux") { 3784 IsAAPCS = true; 3785 } else 3786 return false; 3787 3788 return true; 3789 } 3790 3791 void getDefaultFeatures(llvm::StringMap<bool> &Features) const { 3792 StringRef ArchName = getTriple().getArchName(); 3793 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore") 3794 Features["vfp2"] = true; 3795 else if (CPU == "cortex-a8" || CPU == "cortex-a9" || 3796 CPU == "cortex-a9-mp") { 3797 Features["vfp3"] = true; 3798 Features["neon"] = true; 3799 } 3800 else if (CPU == "cortex-a5") { 3801 Features["vfp4"] = true; 3802 Features["neon"] = true; 3803 } else if (CPU == "swift" || CPU == "cortex-a7" || CPU == "cortex-a15") { 3804 Features["vfp4"] = true; 3805 Features["neon"] = true; 3806 Features["hwdiv"] = true; 3807 Features["hwdiv-arm"] = true; 3808 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") { 3809 Features["fp-armv8"] = true; 3810 Features["neon"] = true; 3811 Features["hwdiv"] = true; 3812 Features["hwdiv-arm"] = true; 3813 Features["crc"] = true; 3814 } else if (CPU == "cortex-r5" || CPU == "cortex-m3" || 3815 CPU == "cortex-m4" || 3816 // Enable the hwdiv extension for all v8a AArch32 cores by 3817 // default. 3818 ArchName == "armv8a" || ArchName == "armv8" || 3819 ArchName == "thumbv8a" || ArchName == "thumbv8") { 3820 Features["hwdiv"] = true; 3821 Features["hwdiv-arm"] = true; 3822 } 3823 } 3824 3825 virtual bool handleTargetFeatures(std::vector<std::string> &Features, 3826 DiagnosticsEngine &Diags) { 3827 FPU = 0; 3828 CRC = 0; 3829 SoftFloat = SoftFloatABI = false; 3830 HWDiv = 0; 3831 for (unsigned i = 0, e = Features.size(); i != e; ++i) { 3832 if (Features[i] == "+soft-float") 3833 SoftFloat = true; 3834 else if (Features[i] == "+soft-float-abi") 3835 SoftFloatABI = true; 3836 else if (Features[i] == "+vfp2") 3837 FPU |= VFP2FPU; 3838 else if (Features[i] == "+vfp3") 3839 FPU |= VFP3FPU; 3840 else if (Features[i] == "+vfp4") 3841 FPU |= VFP4FPU; 3842 else if (Features[i] == "+fp-armv8") 3843 FPU |= FPARMV8; 3844 else if (Features[i] == "+neon") 3845 FPU |= NeonFPU; 3846 else if (Features[i] == "+hwdiv") 3847 HWDiv |= HWDivThumb; 3848 else if (Features[i] == "+hwdiv-arm") 3849 HWDiv |= HWDivARM; 3850 else if (Features[i] == "+crc") 3851 CRC = 1; 3852 } 3853 3854 if (!(FPU & NeonFPU) && FPMath == FP_Neon) { 3855 Diags.Report(diag::err_target_unsupported_fpmath) << "neon"; 3856 return false; 3857 } 3858 3859 if (FPMath == FP_Neon) 3860 Features.push_back("+neonfp"); 3861 else if (FPMath == FP_VFP) 3862 Features.push_back("-neonfp"); 3863 3864 // Remove front-end specific options which the backend handles differently. 3865 std::vector<std::string>::iterator it; 3866 it = std::find(Features.begin(), Features.end(), "+soft-float"); 3867 if (it != Features.end()) 3868 Features.erase(it); 3869 it = std::find(Features.begin(), Features.end(), "+soft-float-abi"); 3870 if (it != Features.end()) 3871 Features.erase(it); 3872 return true; 3873 } 3874 3875 virtual bool hasFeature(StringRef Feature) const { 3876 return llvm::StringSwitch<bool>(Feature) 3877 .Case("arm", true) 3878 .Case("softfloat", SoftFloat) 3879 .Case("thumb", IsThumb) 3880 .Case("neon", (FPU & NeonFPU) && !SoftFloat) 3881 .Case("hwdiv", HWDiv & HWDivThumb) 3882 .Case("hwdiv-arm", HWDiv & HWDivARM) 3883 .Default(false); 3884 } 3885 // FIXME: Should we actually have some table instead of these switches? 3886 static const char *getCPUDefineSuffix(StringRef Name) { 3887 return llvm::StringSwitch<const char*>(Name) 3888 .Cases("arm8", "arm810", "4") 3889 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4") 3890 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T") 3891 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T") 3892 .Case("ep9312", "4T") 3893 .Cases("arm10tdmi", "arm1020t", "5T") 3894 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE") 3895 .Case("arm926ej-s", "5TEJ") 3896 .Cases("arm10e", "arm1020e", "arm1022e", "5TE") 3897 .Cases("xscale", "iwmmxt", "5TE") 3898 .Case("arm1136j-s", "6J") 3899 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK") 3900 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K") 3901 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2") 3902 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A") 3903 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "7A") 3904 .Cases("cortex-r4", "cortex-r5", "7R") 3905 .Case("cortex-a9-mp", "7F") 3906 .Case("swift", "7S") 3907 .Cases("cortex-m3", "cortex-m4", "7M") 3908 .Case("cortex-m0", "6M") 3909 .Cases("cortex-a53", "cortex-a57", "8A") 3910 .Default(0); 3911 } 3912 static const char *getCPUProfile(StringRef Name) { 3913 return llvm::StringSwitch<const char*>(Name) 3914 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A") 3915 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "A") 3916 .Cases("cortex-a53", "cortex-a57", "A") 3917 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M") 3918 .Cases("cortex-r4", "cortex-r5", "R") 3919 .Default(""); 3920 } 3921 virtual bool setCPU(const std::string &Name) { 3922 if (!getCPUDefineSuffix(Name)) 3923 return false; 3924 3925 CPU = Name; 3926 return true; 3927 } 3928 virtual bool setFPMath(StringRef Name); 3929 virtual void getTargetDefines(const LangOptions &Opts, 3930 MacroBuilder &Builder) const { 3931 // Target identification. 3932 Builder.defineMacro("__arm"); 3933 Builder.defineMacro("__arm__"); 3934 3935 // Target properties. 3936 Builder.defineMacro("__ARMEL__"); 3937 Builder.defineMacro("__LITTLE_ENDIAN__"); 3938 Builder.defineMacro("__REGISTER_PREFIX__", ""); 3939 3940 StringRef CPUArch = getCPUDefineSuffix(CPU); 3941 unsigned int CPUArchVer; 3942 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) { 3943 llvm_unreachable("Invalid char for architecture version number"); 3944 } 3945 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__"); 3946 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1)); 3947 StringRef CPUProfile = getCPUProfile(CPU); 3948 if (!CPUProfile.empty()) 3949 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile); 3950 3951 // Subtarget options. 3952 3953 // FIXME: It's more complicated than this and we don't really support 3954 // interworking. 3955 if (5 <= CPUArchVer && CPUArchVer <= 7) 3956 Builder.defineMacro("__THUMB_INTERWORK__"); 3957 3958 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") { 3959 // Embedded targets on Darwin follow AAPCS, but not EABI. 3960 if (!getTriple().isOSDarwin()) 3961 Builder.defineMacro("__ARM_EABI__"); 3962 Builder.defineMacro("__ARM_PCS", "1"); 3963 3964 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp") 3965 Builder.defineMacro("__ARM_PCS_VFP", "1"); 3966 } 3967 3968 if (SoftFloat) 3969 Builder.defineMacro("__SOFTFP__"); 3970 3971 if (CPU == "xscale") 3972 Builder.defineMacro("__XSCALE__"); 3973 3974 if (IsThumb) { 3975 Builder.defineMacro("__THUMBEL__"); 3976 Builder.defineMacro("__thumb__"); 3977 if (CPUArch == "6T2" || CPUArchVer == 7) 3978 Builder.defineMacro("__thumb2__"); 3979 } 3980 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb)) 3981 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1"); 3982 3983 // Note, this is always on in gcc, even though it doesn't make sense. 3984 Builder.defineMacro("__APCS_32__"); 3985 3986 if (FPUModeIsVFP((FPUMode) FPU)) { 3987 Builder.defineMacro("__VFP_FP__"); 3988 if (FPU & VFP2FPU) 3989 Builder.defineMacro("__ARM_VFPV2__"); 3990 if (FPU & VFP3FPU) 3991 Builder.defineMacro("__ARM_VFPV3__"); 3992 if (FPU & VFP4FPU) 3993 Builder.defineMacro("__ARM_VFPV4__"); 3994 } 3995 3996 // This only gets set when Neon instructions are actually available, unlike 3997 // the VFP define, hence the soft float and arch check. This is subtly 3998 // different from gcc, we follow the intent which was that it should be set 3999 // when Neon instructions are actually available. 4000 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) 4001 Builder.defineMacro("__ARM_NEON__"); 4002 4003 if (CRC) 4004 Builder.defineMacro("__ARM_FEATURE_CRC32"); 4005 4006 if (CPUArchVer >= 6 && CPUArch != "6M") { 4007 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1"); 4008 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); 4009 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4"); 4010 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8"); 4011 } 4012 } 4013 virtual void getTargetBuiltins(const Builtin::Info *&Records, 4014 unsigned &NumRecords) const { 4015 Records = BuiltinInfo; 4016 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin; 4017 } 4018 virtual bool isCLZForZeroUndef() const { return false; } 4019 virtual BuiltinVaListKind getBuiltinVaListKind() const { 4020 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList; 4021 } 4022 virtual void getGCCRegNames(const char * const *&Names, 4023 unsigned &NumNames) const; 4024 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 4025 unsigned &NumAliases) const; 4026 virtual bool validateAsmConstraint(const char *&Name, 4027 TargetInfo::ConstraintInfo &Info) const { 4028 switch (*Name) { 4029 default: break; 4030 case 'l': // r0-r7 4031 case 'h': // r8-r15 4032 case 'w': // VFP Floating point register single precision 4033 case 'P': // VFP Floating point register double precision 4034 Info.setAllowsRegister(); 4035 return true; 4036 case 'Q': // A memory address that is a single base register. 4037 Info.setAllowsMemory(); 4038 return true; 4039 case 'U': // a memory reference... 4040 switch (Name[1]) { 4041 case 'q': // ...ARMV4 ldrsb 4042 case 'v': // ...VFP load/store (reg+constant offset) 4043 case 'y': // ...iWMMXt load/store 4044 case 't': // address valid for load/store opaque types wider 4045 // than 128-bits 4046 case 'n': // valid address for Neon doubleword vector load/store 4047 case 'm': // valid address for Neon element and structure load/store 4048 case 's': // valid address for non-offset loads/stores of quad-word 4049 // values in four ARM registers 4050 Info.setAllowsMemory(); 4051 Name++; 4052 return true; 4053 } 4054 } 4055 return false; 4056 } 4057 virtual std::string convertConstraint(const char *&Constraint) const { 4058 std::string R; 4059 switch (*Constraint) { 4060 case 'U': // Two-character constraint; add "^" hint for later parsing. 4061 R = std::string("^") + std::string(Constraint, 2); 4062 Constraint++; 4063 break; 4064 case 'p': // 'p' should be translated to 'r' by default. 4065 R = std::string("r"); 4066 break; 4067 default: 4068 return std::string(1, *Constraint); 4069 } 4070 return R; 4071 } 4072 virtual bool validateConstraintModifier(StringRef Constraint, 4073 const char Modifier, 4074 unsigned Size) const { 4075 bool isOutput = (Constraint[0] == '='); 4076 bool isInOut = (Constraint[0] == '+'); 4077 4078 // Strip off constraint modifiers. 4079 while (Constraint[0] == '=' || 4080 Constraint[0] == '+' || 4081 Constraint[0] == '&') 4082 Constraint = Constraint.substr(1); 4083 4084 switch (Constraint[0]) { 4085 default: break; 4086 case 'r': { 4087 switch (Modifier) { 4088 default: 4089 return (isInOut || isOutput || Size <= 32); 4090 case 'q': 4091 // A register of size 32 cannot fit a vector type. 4092 return false; 4093 } 4094 } 4095 } 4096 4097 return true; 4098 } 4099 virtual const char *getClobbers() const { 4100 // FIXME: Is this really right? 4101 return ""; 4102 } 4103 4104 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const { 4105 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning; 4106 } 4107 4108 virtual int getEHDataRegisterNumber(unsigned RegNo) const { 4109 if (RegNo == 0) return 0; 4110 if (RegNo == 1) return 1; 4111 return -1; 4112 } 4113}; 4114 4115bool ARMTargetInfo::setFPMath(StringRef Name) { 4116 if (Name == "neon") { 4117 FPMath = FP_Neon; 4118 return true; 4119 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" || 4120 Name == "vfp4") { 4121 FPMath = FP_VFP; 4122 return true; 4123 } 4124 return false; 4125} 4126 4127const char * const ARMTargetInfo::GCCRegNames[] = { 4128 // Integer registers 4129 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 4130 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc", 4131 4132 // Float registers 4133 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", 4134 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", 4135 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", 4136 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31", 4137 4138 // Double registers 4139 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", 4140 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15", 4141 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", 4142 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", 4143 4144 // Quad registers 4145 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", 4146 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 4147}; 4148 4149void ARMTargetInfo::getGCCRegNames(const char * const *&Names, 4150 unsigned &NumNames) const { 4151 Names = GCCRegNames; 4152 NumNames = llvm::array_lengthof(GCCRegNames); 4153} 4154 4155const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = { 4156 { { "a1" }, "r0" }, 4157 { { "a2" }, "r1" }, 4158 { { "a3" }, "r2" }, 4159 { { "a4" }, "r3" }, 4160 { { "v1" }, "r4" }, 4161 { { "v2" }, "r5" }, 4162 { { "v3" }, "r6" }, 4163 { { "v4" }, "r7" }, 4164 { { "v5" }, "r8" }, 4165 { { "v6", "rfp" }, "r9" }, 4166 { { "sl" }, "r10" }, 4167 { { "fp" }, "r11" }, 4168 { { "ip" }, "r12" }, 4169 { { "r13" }, "sp" }, 4170 { { "r14" }, "lr" }, 4171 { { "r15" }, "pc" }, 4172 // The S, D and Q registers overlap, but aren't really aliases; we 4173 // don't want to substitute one of these for a different-sized one. 4174}; 4175 4176void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 4177 unsigned &NumAliases) const { 4178 Aliases = GCCRegAliases; 4179 NumAliases = llvm::array_lengthof(GCCRegAliases); 4180} 4181 4182const Builtin::Info ARMTargetInfo::BuiltinInfo[] = { 4183#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, 4184#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ 4185 ALL_LANGUAGES }, 4186#include "clang/Basic/BuiltinsARM.def" 4187}; 4188} // end anonymous namespace. 4189 4190namespace { 4191class DarwinARMTargetInfo : 4192 public DarwinTargetInfo<ARMTargetInfo> { 4193protected: 4194 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 4195 MacroBuilder &Builder) const { 4196 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion); 4197 } 4198 4199public: 4200 DarwinARMTargetInfo(const llvm::Triple &Triple) 4201 : DarwinTargetInfo<ARMTargetInfo>(Triple) { 4202 HasAlignMac68kSupport = true; 4203 // iOS always has 64-bit atomic instructions. 4204 // FIXME: This should be based off of the target features in ARMTargetInfo. 4205 MaxAtomicInlineWidth = 64; 4206 4207 // Darwin on iOS uses a variant of the ARM C++ ABI. 4208 TheCXXABI.set(TargetCXXABI::iOS); 4209 } 4210}; 4211} // end anonymous namespace. 4212 4213 4214namespace { 4215// Hexagon abstract base class 4216class HexagonTargetInfo : public TargetInfo { 4217 static const Builtin::Info BuiltinInfo[]; 4218 static const char * const GCCRegNames[]; 4219 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 4220 std::string CPU; 4221public: 4222 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 4223 BigEndian = false; 4224 DescriptionString = ("e-p:32:32:32-" 4225 "i64:64:64-i32:32:32-i16:16:16-i1:32:32-" 4226 "f64:64:64-f32:32:32-a0:0-n32"); 4227 4228 // {} in inline assembly are packet specifiers, not assembly variant 4229 // specifiers. 4230 NoAsmVariants = true; 4231 } 4232 4233 virtual void getTargetBuiltins(const Builtin::Info *&Records, 4234 unsigned &NumRecords) const { 4235 Records = BuiltinInfo; 4236 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin; 4237 } 4238 4239 virtual bool validateAsmConstraint(const char *&Name, 4240 TargetInfo::ConstraintInfo &Info) const { 4241 return true; 4242 } 4243 4244 virtual void getTargetDefines(const LangOptions &Opts, 4245 MacroBuilder &Builder) const; 4246 4247 virtual bool hasFeature(StringRef Feature) const { 4248 return Feature == "hexagon"; 4249 } 4250 4251 virtual BuiltinVaListKind getBuiltinVaListKind() const { 4252 return TargetInfo::CharPtrBuiltinVaList; 4253 } 4254 virtual void getGCCRegNames(const char * const *&Names, 4255 unsigned &NumNames) const; 4256 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 4257 unsigned &NumAliases) const; 4258 virtual const char *getClobbers() const { 4259 return ""; 4260 } 4261 4262 static const char *getHexagonCPUSuffix(StringRef Name) { 4263 return llvm::StringSwitch<const char*>(Name) 4264 .Case("hexagonv4", "4") 4265 .Case("hexagonv5", "5") 4266 .Default(0); 4267 } 4268 4269 virtual bool setCPU(const std::string &Name) { 4270 if (!getHexagonCPUSuffix(Name)) 4271 return false; 4272 4273 CPU = Name; 4274 return true; 4275 } 4276}; 4277 4278void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts, 4279 MacroBuilder &Builder) const { 4280 Builder.defineMacro("qdsp6"); 4281 Builder.defineMacro("__qdsp6", "1"); 4282 Builder.defineMacro("__qdsp6__", "1"); 4283 4284 Builder.defineMacro("hexagon"); 4285 Builder.defineMacro("__hexagon", "1"); 4286 Builder.defineMacro("__hexagon__", "1"); 4287 4288 if(CPU == "hexagonv1") { 4289 Builder.defineMacro("__HEXAGON_V1__"); 4290 Builder.defineMacro("__HEXAGON_ARCH__", "1"); 4291 if(Opts.HexagonQdsp6Compat) { 4292 Builder.defineMacro("__QDSP6_V1__"); 4293 Builder.defineMacro("__QDSP6_ARCH__", "1"); 4294 } 4295 } 4296 else if(CPU == "hexagonv2") { 4297 Builder.defineMacro("__HEXAGON_V2__"); 4298 Builder.defineMacro("__HEXAGON_ARCH__", "2"); 4299 if(Opts.HexagonQdsp6Compat) { 4300 Builder.defineMacro("__QDSP6_V2__"); 4301 Builder.defineMacro("__QDSP6_ARCH__", "2"); 4302 } 4303 } 4304 else if(CPU == "hexagonv3") { 4305 Builder.defineMacro("__HEXAGON_V3__"); 4306 Builder.defineMacro("__HEXAGON_ARCH__", "3"); 4307 if(Opts.HexagonQdsp6Compat) { 4308 Builder.defineMacro("__QDSP6_V3__"); 4309 Builder.defineMacro("__QDSP6_ARCH__", "3"); 4310 } 4311 } 4312 else if(CPU == "hexagonv4") { 4313 Builder.defineMacro("__HEXAGON_V4__"); 4314 Builder.defineMacro("__HEXAGON_ARCH__", "4"); 4315 if(Opts.HexagonQdsp6Compat) { 4316 Builder.defineMacro("__QDSP6_V4__"); 4317 Builder.defineMacro("__QDSP6_ARCH__", "4"); 4318 } 4319 } 4320 else if(CPU == "hexagonv5") { 4321 Builder.defineMacro("__HEXAGON_V5__"); 4322 Builder.defineMacro("__HEXAGON_ARCH__", "5"); 4323 if(Opts.HexagonQdsp6Compat) { 4324 Builder.defineMacro("__QDSP6_V5__"); 4325 Builder.defineMacro("__QDSP6_ARCH__", "5"); 4326 } 4327 } 4328} 4329 4330const char * const HexagonTargetInfo::GCCRegNames[] = { 4331 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 4332 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 4333 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 4334 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", 4335 "p0", "p1", "p2", "p3", 4336 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp" 4337}; 4338 4339void HexagonTargetInfo::getGCCRegNames(const char * const *&Names, 4340 unsigned &NumNames) const { 4341 Names = GCCRegNames; 4342 NumNames = llvm::array_lengthof(GCCRegNames); 4343} 4344 4345 4346const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = { 4347 { { "sp" }, "r29" }, 4348 { { "fp" }, "r30" }, 4349 { { "lr" }, "r31" }, 4350 }; 4351 4352void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 4353 unsigned &NumAliases) const { 4354 Aliases = GCCRegAliases; 4355 NumAliases = llvm::array_lengthof(GCCRegAliases); 4356} 4357 4358 4359const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = { 4360#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, 4361#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ 4362 ALL_LANGUAGES }, 4363#include "clang/Basic/BuiltinsHexagon.def" 4364}; 4365} 4366 4367 4368namespace { 4369// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit). 4370class SparcTargetInfo : public TargetInfo { 4371 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 4372 static const char * const GCCRegNames[]; 4373 bool SoftFloat; 4374public: 4375 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {} 4376 4377 virtual bool handleTargetFeatures(std::vector<std::string> &Features, 4378 DiagnosticsEngine &Diags) { 4379 SoftFloat = false; 4380 for (unsigned i = 0, e = Features.size(); i != e; ++i) 4381 if (Features[i] == "+soft-float") 4382 SoftFloat = true; 4383 return true; 4384 } 4385 virtual void getTargetDefines(const LangOptions &Opts, 4386 MacroBuilder &Builder) const { 4387 DefineStd(Builder, "sparc", Opts); 4388 Builder.defineMacro("__REGISTER_PREFIX__", ""); 4389 4390 if (SoftFloat) 4391 Builder.defineMacro("SOFT_FLOAT", "1"); 4392 } 4393 4394 virtual bool hasFeature(StringRef Feature) const { 4395 return llvm::StringSwitch<bool>(Feature) 4396 .Case("softfloat", SoftFloat) 4397 .Case("sparc", true) 4398 .Default(false); 4399 } 4400 4401 virtual void getTargetBuiltins(const Builtin::Info *&Records, 4402 unsigned &NumRecords) const { 4403 // FIXME: Implement! 4404 } 4405 virtual BuiltinVaListKind getBuiltinVaListKind() const { 4406 return TargetInfo::VoidPtrBuiltinVaList; 4407 } 4408 virtual void getGCCRegNames(const char * const *&Names, 4409 unsigned &NumNames) const; 4410 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 4411 unsigned &NumAliases) const; 4412 virtual bool validateAsmConstraint(const char *&Name, 4413 TargetInfo::ConstraintInfo &info) const { 4414 // FIXME: Implement! 4415 return false; 4416 } 4417 virtual const char *getClobbers() const { 4418 // FIXME: Implement! 4419 return ""; 4420 } 4421}; 4422 4423const char * const SparcTargetInfo::GCCRegNames[] = { 4424 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 4425 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 4426 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 4427 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31" 4428}; 4429 4430void SparcTargetInfo::getGCCRegNames(const char * const *&Names, 4431 unsigned &NumNames) const { 4432 Names = GCCRegNames; 4433 NumNames = llvm::array_lengthof(GCCRegNames); 4434} 4435 4436const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = { 4437 { { "g0" }, "r0" }, 4438 { { "g1" }, "r1" }, 4439 { { "g2" }, "r2" }, 4440 { { "g3" }, "r3" }, 4441 { { "g4" }, "r4" }, 4442 { { "g5" }, "r5" }, 4443 { { "g6" }, "r6" }, 4444 { { "g7" }, "r7" }, 4445 { { "o0" }, "r8" }, 4446 { { "o1" }, "r9" }, 4447 { { "o2" }, "r10" }, 4448 { { "o3" }, "r11" }, 4449 { { "o4" }, "r12" }, 4450 { { "o5" }, "r13" }, 4451 { { "o6", "sp" }, "r14" }, 4452 { { "o7" }, "r15" }, 4453 { { "l0" }, "r16" }, 4454 { { "l1" }, "r17" }, 4455 { { "l2" }, "r18" }, 4456 { { "l3" }, "r19" }, 4457 { { "l4" }, "r20" }, 4458 { { "l5" }, "r21" }, 4459 { { "l6" }, "r22" }, 4460 { { "l7" }, "r23" }, 4461 { { "i0" }, "r24" }, 4462 { { "i1" }, "r25" }, 4463 { { "i2" }, "r26" }, 4464 { { "i3" }, "r27" }, 4465 { { "i4" }, "r28" }, 4466 { { "i5" }, "r29" }, 4467 { { "i6", "fp" }, "r30" }, 4468 { { "i7" }, "r31" }, 4469}; 4470 4471void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 4472 unsigned &NumAliases) const { 4473 Aliases = GCCRegAliases; 4474 NumAliases = llvm::array_lengthof(GCCRegAliases); 4475} 4476 4477// SPARC v8 is the 32-bit mode selected by Triple::sparc. 4478class SparcV8TargetInfo : public SparcTargetInfo { 4479public: 4480 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) { 4481 // FIXME: Support Sparc quad-precision long double? 4482 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 4483 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64"; 4484 } 4485 4486 virtual void getTargetDefines(const LangOptions &Opts, 4487 MacroBuilder &Builder) const { 4488 SparcTargetInfo::getTargetDefines(Opts, Builder); 4489 Builder.defineMacro("__sparcv8"); 4490 } 4491}; 4492 4493// SPARC v9 is the 64-bit mode selected by Triple::sparcv9. 4494class SparcV9TargetInfo : public SparcTargetInfo { 4495public: 4496 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) { 4497 // FIXME: Support Sparc quad-precision long double? 4498 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 4499 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32:64-S128"; 4500 // This is an LP64 platform. 4501 LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 4502 4503 // OpenBSD uses long long for int64_t and intmax_t. 4504 if (getTriple().getOS() == llvm::Triple::OpenBSD) { 4505 IntMaxType = SignedLongLong; 4506 UIntMaxType = UnsignedLongLong; 4507 } else { 4508 IntMaxType = SignedLong; 4509 UIntMaxType = UnsignedLong; 4510 } 4511 Int64Type = IntMaxType; 4512 } 4513 4514 virtual void getTargetDefines(const LangOptions &Opts, 4515 MacroBuilder &Builder) const { 4516 SparcTargetInfo::getTargetDefines(Opts, Builder); 4517 Builder.defineMacro("__sparcv9"); 4518 Builder.defineMacro("__arch64__"); 4519 // Solaris and its derivative AuroraUX don't need these variants, but the 4520 // BSDs do. 4521 if (getTriple().getOS() != llvm::Triple::Solaris && 4522 getTriple().getOS() != llvm::Triple::AuroraUX) { 4523 Builder.defineMacro("__sparc64__"); 4524 Builder.defineMacro("__sparc_v9__"); 4525 Builder.defineMacro("__sparcv9__"); 4526 } 4527 } 4528}; 4529 4530} // end anonymous namespace. 4531 4532namespace { 4533class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> { 4534public: 4535 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple) 4536 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) { 4537 SizeType = UnsignedInt; 4538 PtrDiffType = SignedInt; 4539 } 4540}; 4541class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> { 4542public: 4543 SolarisSparcV8TargetInfo(const llvm::Triple &Triple) 4544 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) { 4545 SizeType = UnsignedInt; 4546 PtrDiffType = SignedInt; 4547 } 4548}; 4549} // end anonymous namespace. 4550 4551namespace { 4552 class SystemZTargetInfo : public TargetInfo { 4553 static const char *const GCCRegNames[]; 4554 4555 public: 4556 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 4557 TLSSupported = true; 4558 IntWidth = IntAlign = 32; 4559 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64; 4560 PointerWidth = PointerAlign = 64; 4561 LongDoubleWidth = 128; 4562 LongDoubleAlign = 64; 4563 LongDoubleFormat = &llvm::APFloat::IEEEquad; 4564 MinGlobalAlign = 16; 4565 DescriptionString = "E-p:64:64:64-i1:8:16-i8:8:16-i16:16-i32:32-i64:64" 4566 "-f32:32-f64:64-f128:64-a0:8:16-n32:64"; 4567 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 4568 } 4569 virtual void getTargetDefines(const LangOptions &Opts, 4570 MacroBuilder &Builder) const { 4571 Builder.defineMacro("__s390__"); 4572 Builder.defineMacro("__s390x__"); 4573 Builder.defineMacro("__zarch__"); 4574 Builder.defineMacro("__LONG_DOUBLE_128__"); 4575 } 4576 virtual void getTargetBuiltins(const Builtin::Info *&Records, 4577 unsigned &NumRecords) const { 4578 // FIXME: Implement. 4579 Records = 0; 4580 NumRecords = 0; 4581 } 4582 4583 virtual void getGCCRegNames(const char *const *&Names, 4584 unsigned &NumNames) const; 4585 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 4586 unsigned &NumAliases) const { 4587 // No aliases. 4588 Aliases = 0; 4589 NumAliases = 0; 4590 } 4591 virtual bool validateAsmConstraint(const char *&Name, 4592 TargetInfo::ConstraintInfo &info) const; 4593 virtual const char *getClobbers() const { 4594 // FIXME: Is this really right? 4595 return ""; 4596 } 4597 virtual BuiltinVaListKind getBuiltinVaListKind() const { 4598 return TargetInfo::SystemZBuiltinVaList; 4599 } 4600 virtual bool setCPU(const std::string &Name) { 4601 bool CPUKnown = llvm::StringSwitch<bool>(Name) 4602 .Case("z10", true) 4603 .Case("z196", true) 4604 .Case("zEC12", true) 4605 .Default(false); 4606 4607 // No need to store the CPU yet. There aren't any CPU-specific 4608 // macros to define. 4609 return CPUKnown; 4610 } 4611 }; 4612 4613 const char *const SystemZTargetInfo::GCCRegNames[] = { 4614 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 4615 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 4616 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7", 4617 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15" 4618 }; 4619 4620 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names, 4621 unsigned &NumNames) const { 4622 Names = GCCRegNames; 4623 NumNames = llvm::array_lengthof(GCCRegNames); 4624 } 4625 4626 bool SystemZTargetInfo:: 4627 validateAsmConstraint(const char *&Name, 4628 TargetInfo::ConstraintInfo &Info) const { 4629 switch (*Name) { 4630 default: 4631 return false; 4632 4633 case 'a': // Address register 4634 case 'd': // Data register (equivalent to 'r') 4635 case 'f': // Floating-point register 4636 Info.setAllowsRegister(); 4637 return true; 4638 4639 case 'I': // Unsigned 8-bit constant 4640 case 'J': // Unsigned 12-bit constant 4641 case 'K': // Signed 16-bit constant 4642 case 'L': // Signed 20-bit displacement (on all targets we support) 4643 case 'M': // 0x7fffffff 4644 return true; 4645 4646 case 'Q': // Memory with base and unsigned 12-bit displacement 4647 case 'R': // Likewise, plus an index 4648 case 'S': // Memory with base and signed 20-bit displacement 4649 case 'T': // Likewise, plus an index 4650 Info.setAllowsMemory(); 4651 return true; 4652 } 4653 } 4654} 4655 4656namespace { 4657 class MSP430TargetInfo : public TargetInfo { 4658 static const char * const GCCRegNames[]; 4659 public: 4660 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 4661 BigEndian = false; 4662 TLSSupported = false; 4663 IntWidth = 16; IntAlign = 16; 4664 LongWidth = 32; LongLongWidth = 64; 4665 LongAlign = LongLongAlign = 16; 4666 PointerWidth = 16; PointerAlign = 16; 4667 SuitableAlign = 16; 4668 SizeType = UnsignedInt; 4669 IntMaxType = SignedLongLong; 4670 UIntMaxType = UnsignedLongLong; 4671 IntPtrType = SignedInt; 4672 PtrDiffType = SignedInt; 4673 SigAtomicType = SignedLong; 4674 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16"; 4675 } 4676 virtual void getTargetDefines(const LangOptions &Opts, 4677 MacroBuilder &Builder) const { 4678 Builder.defineMacro("MSP430"); 4679 Builder.defineMacro("__MSP430__"); 4680 // FIXME: defines for different 'flavours' of MCU 4681 } 4682 virtual void getTargetBuiltins(const Builtin::Info *&Records, 4683 unsigned &NumRecords) const { 4684 // FIXME: Implement. 4685 Records = 0; 4686 NumRecords = 0; 4687 } 4688 virtual bool hasFeature(StringRef Feature) const { 4689 return Feature == "msp430"; 4690 } 4691 virtual void getGCCRegNames(const char * const *&Names, 4692 unsigned &NumNames) const; 4693 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 4694 unsigned &NumAliases) const { 4695 // No aliases. 4696 Aliases = 0; 4697 NumAliases = 0; 4698 } 4699 virtual bool validateAsmConstraint(const char *&Name, 4700 TargetInfo::ConstraintInfo &info) const { 4701 // No target constraints for now. 4702 return false; 4703 } 4704 virtual const char *getClobbers() const { 4705 // FIXME: Is this really right? 4706 return ""; 4707 } 4708 virtual BuiltinVaListKind getBuiltinVaListKind() const { 4709 // FIXME: implement 4710 return TargetInfo::CharPtrBuiltinVaList; 4711 } 4712 }; 4713 4714 const char * const MSP430TargetInfo::GCCRegNames[] = { 4715 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 4716 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" 4717 }; 4718 4719 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names, 4720 unsigned &NumNames) const { 4721 Names = GCCRegNames; 4722 NumNames = llvm::array_lengthof(GCCRegNames); 4723 } 4724} 4725 4726namespace { 4727 4728 // LLVM and Clang cannot be used directly to output native binaries for 4729 // target, but is used to compile C code to llvm bitcode with correct 4730 // type and alignment information. 4731 // 4732 // TCE uses the llvm bitcode as input and uses it for generating customized 4733 // target processor and program binary. TCE co-design environment is 4734 // publicly available in http://tce.cs.tut.fi 4735 4736 static const unsigned TCEOpenCLAddrSpaceMap[] = { 4737 3, // opencl_global 4738 4, // opencl_local 4739 5, // opencl_constant 4740 0, // cuda_device 4741 0, // cuda_constant 4742 0 // cuda_shared 4743 }; 4744 4745 class TCETargetInfo : public TargetInfo{ 4746 public: 4747 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 4748 TLSSupported = false; 4749 IntWidth = 32; 4750 LongWidth = LongLongWidth = 32; 4751 PointerWidth = 32; 4752 IntAlign = 32; 4753 LongAlign = LongLongAlign = 32; 4754 PointerAlign = 32; 4755 SuitableAlign = 32; 4756 SizeType = UnsignedInt; 4757 IntMaxType = SignedLong; 4758 UIntMaxType = UnsignedLong; 4759 IntPtrType = SignedInt; 4760 PtrDiffType = SignedInt; 4761 FloatWidth = 32; 4762 FloatAlign = 32; 4763 DoubleWidth = 32; 4764 DoubleAlign = 32; 4765 LongDoubleWidth = 32; 4766 LongDoubleAlign = 32; 4767 FloatFormat = &llvm::APFloat::IEEEsingle; 4768 DoubleFormat = &llvm::APFloat::IEEEsingle; 4769 LongDoubleFormat = &llvm::APFloat::IEEEsingle; 4770 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-" 4771 "i16:16:32-i32:32:32-i64:32:32-" 4772 "f32:32:32-f64:32:32-v64:32:32-" 4773 "v128:32:32-a0:0:32-n32"; 4774 AddrSpaceMap = &TCEOpenCLAddrSpaceMap; 4775 UseAddrSpaceMapMangling = true; 4776 } 4777 4778 virtual void getTargetDefines(const LangOptions &Opts, 4779 MacroBuilder &Builder) const { 4780 DefineStd(Builder, "tce", Opts); 4781 Builder.defineMacro("__TCE__"); 4782 Builder.defineMacro("__TCE_V1__"); 4783 } 4784 virtual bool hasFeature(StringRef Feature) const { 4785 return Feature == "tce"; 4786 } 4787 4788 virtual void getTargetBuiltins(const Builtin::Info *&Records, 4789 unsigned &NumRecords) const {} 4790 virtual const char *getClobbers() const { 4791 return ""; 4792 } 4793 virtual BuiltinVaListKind getBuiltinVaListKind() const { 4794 return TargetInfo::VoidPtrBuiltinVaList; 4795 } 4796 virtual void getGCCRegNames(const char * const *&Names, 4797 unsigned &NumNames) const {} 4798 virtual bool validateAsmConstraint(const char *&Name, 4799 TargetInfo::ConstraintInfo &info) const { 4800 return true; 4801 } 4802 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 4803 unsigned &NumAliases) const {} 4804 }; 4805} 4806 4807namespace { 4808class MipsTargetInfoBase : public TargetInfo { 4809 virtual void setDescriptionString() = 0; 4810 4811 static const Builtin::Info BuiltinInfo[]; 4812 std::string CPU; 4813 bool IsMips16; 4814 bool IsMicromips; 4815 bool IsNan2008; 4816 bool IsSingleFloat; 4817 enum MipsFloatABI { 4818 HardFloat, SoftFloat 4819 } FloatABI; 4820 enum DspRevEnum { 4821 NoDSP, DSP1, DSP2 4822 } DspRev; 4823 bool HasMSA; 4824 4825protected: 4826 bool HasFP64; 4827 std::string ABI; 4828 4829public: 4830 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr, 4831 const std::string &CPUStr) 4832 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false), 4833 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat), 4834 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {} 4835 4836 virtual const char *getABI() const { return ABI.c_str(); } 4837 virtual bool setABI(const std::string &Name) = 0; 4838 virtual bool setCPU(const std::string &Name) { 4839 CPU = Name; 4840 return true; 4841 } 4842 void getDefaultFeatures(llvm::StringMap<bool> &Features) const { 4843 Features[ABI] = true; 4844 Features[CPU] = true; 4845 } 4846 4847 virtual void getTargetDefines(const LangOptions &Opts, 4848 MacroBuilder &Builder) const { 4849 DefineStd(Builder, "mips", Opts); 4850 Builder.defineMacro("_mips"); 4851 Builder.defineMacro("__REGISTER_PREFIX__", ""); 4852 4853 switch (FloatABI) { 4854 case HardFloat: 4855 Builder.defineMacro("__mips_hard_float", Twine(1)); 4856 break; 4857 case SoftFloat: 4858 Builder.defineMacro("__mips_soft_float", Twine(1)); 4859 break; 4860 } 4861 4862 if (IsSingleFloat) 4863 Builder.defineMacro("__mips_single_float", Twine(1)); 4864 4865 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32)); 4866 Builder.defineMacro("_MIPS_FPSET", 4867 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2))); 4868 4869 if (IsMips16) 4870 Builder.defineMacro("__mips16", Twine(1)); 4871 4872 if (IsMicromips) 4873 Builder.defineMacro("__mips_micromips", Twine(1)); 4874 4875 if (IsNan2008) 4876 Builder.defineMacro("__mips_nan2008", Twine(1)); 4877 4878 switch (DspRev) { 4879 default: 4880 break; 4881 case DSP1: 4882 Builder.defineMacro("__mips_dsp_rev", Twine(1)); 4883 Builder.defineMacro("__mips_dsp", Twine(1)); 4884 break; 4885 case DSP2: 4886 Builder.defineMacro("__mips_dsp_rev", Twine(2)); 4887 Builder.defineMacro("__mips_dspr2", Twine(1)); 4888 Builder.defineMacro("__mips_dsp", Twine(1)); 4889 break; 4890 } 4891 4892 if (HasMSA) 4893 Builder.defineMacro("__mips_msa", Twine(1)); 4894 4895 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0))); 4896 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth())); 4897 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth())); 4898 4899 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\""); 4900 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper()); 4901 } 4902 4903 virtual void getTargetBuiltins(const Builtin::Info *&Records, 4904 unsigned &NumRecords) const { 4905 Records = BuiltinInfo; 4906 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin; 4907 } 4908 virtual bool hasFeature(StringRef Feature) const { 4909 return llvm::StringSwitch<bool>(Feature) 4910 .Case("mips", true) 4911 .Case("fp64", HasFP64) 4912 .Default(false); 4913 } 4914 virtual BuiltinVaListKind getBuiltinVaListKind() const { 4915 return TargetInfo::VoidPtrBuiltinVaList; 4916 } 4917 virtual void getGCCRegNames(const char * const *&Names, 4918 unsigned &NumNames) const { 4919 static const char * const GCCRegNames[] = { 4920 // CPU register names 4921 // Must match second column of GCCRegAliases 4922 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7", 4923 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", 4924 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23", 4925 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31", 4926 // Floating point register names 4927 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7", 4928 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15", 4929 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23", 4930 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31", 4931 // Hi/lo and condition register names 4932 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4", 4933 "$fcc5","$fcc6","$fcc7" 4934 }; 4935 Names = GCCRegNames; 4936 NumNames = llvm::array_lengthof(GCCRegNames); 4937 } 4938 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 4939 unsigned &NumAliases) const = 0; 4940 virtual bool validateAsmConstraint(const char *&Name, 4941 TargetInfo::ConstraintInfo &Info) const { 4942 switch (*Name) { 4943 default: 4944 return false; 4945 4946 case 'r': // CPU registers. 4947 case 'd': // Equivalent to "r" unless generating MIPS16 code. 4948 case 'y': // Equivalent to "r", backwards compatibility only. 4949 case 'f': // floating-point registers. 4950 case 'c': // $25 for indirect jumps 4951 case 'l': // lo register 4952 case 'x': // hilo register pair 4953 Info.setAllowsRegister(); 4954 return true; 4955 case 'R': // An address that can be used in a non-macro load or store 4956 Info.setAllowsMemory(); 4957 return true; 4958 } 4959 } 4960 4961 virtual const char *getClobbers() const { 4962 // FIXME: Implement! 4963 return ""; 4964 } 4965 4966 virtual bool handleTargetFeatures(std::vector<std::string> &Features, 4967 DiagnosticsEngine &Diags) { 4968 IsMips16 = false; 4969 IsMicromips = false; 4970 IsNan2008 = false; 4971 IsSingleFloat = false; 4972 FloatABI = HardFloat; 4973 DspRev = NoDSP; 4974 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64"; 4975 4976 for (std::vector<std::string>::iterator it = Features.begin(), 4977 ie = Features.end(); it != ie; ++it) { 4978 if (*it == "+single-float") 4979 IsSingleFloat = true; 4980 else if (*it == "+soft-float") 4981 FloatABI = SoftFloat; 4982 else if (*it == "+mips16") 4983 IsMips16 = true; 4984 else if (*it == "+micromips") 4985 IsMicromips = true; 4986 else if (*it == "+dsp") 4987 DspRev = std::max(DspRev, DSP1); 4988 else if (*it == "+dspr2") 4989 DspRev = std::max(DspRev, DSP2); 4990 else if (*it == "+msa") 4991 HasMSA = true; 4992 else if (*it == "+fp64") 4993 HasFP64 = true; 4994 else if (*it == "-fp64") 4995 HasFP64 = false; 4996 else if (*it == "+nan2008") 4997 IsNan2008 = true; 4998 } 4999 5000 // Remove front-end specific options. 5001 std::vector<std::string>::iterator it = 5002 std::find(Features.begin(), Features.end(), "+soft-float"); 5003 if (it != Features.end()) 5004 Features.erase(it); 5005 it = std::find(Features.begin(), Features.end(), "+nan2008"); 5006 if (it != Features.end()) 5007 Features.erase(it); 5008 5009 setDescriptionString(); 5010 5011 return true; 5012 } 5013 5014 virtual int getEHDataRegisterNumber(unsigned RegNo) const { 5015 if (RegNo == 0) return 4; 5016 if (RegNo == 1) return 5; 5017 return -1; 5018 } 5019}; 5020 5021const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = { 5022#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, 5023#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ 5024 ALL_LANGUAGES }, 5025#include "clang/Basic/BuiltinsMips.def" 5026}; 5027 5028class Mips32TargetInfoBase : public MipsTargetInfoBase { 5029public: 5030 Mips32TargetInfoBase(const llvm::Triple &Triple) 5031 : MipsTargetInfoBase(Triple, "o32", "mips32") { 5032 SizeType = UnsignedInt; 5033 PtrDiffType = SignedInt; 5034 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32; 5035 } 5036 virtual bool setABI(const std::string &Name) { 5037 if ((Name == "o32") || (Name == "eabi")) { 5038 ABI = Name; 5039 return true; 5040 } else if (Name == "32") { 5041 ABI = "o32"; 5042 return true; 5043 } else 5044 return false; 5045 } 5046 virtual void getTargetDefines(const LangOptions &Opts, 5047 MacroBuilder &Builder) const { 5048 MipsTargetInfoBase::getTargetDefines(Opts, Builder); 5049 5050 if (ABI == "o32") { 5051 Builder.defineMacro("__mips_o32"); 5052 Builder.defineMacro("_ABIO32", "1"); 5053 Builder.defineMacro("_MIPS_SIM", "_ABIO32"); 5054 } 5055 else if (ABI == "eabi") 5056 Builder.defineMacro("__mips_eabi"); 5057 else 5058 llvm_unreachable("Invalid ABI for Mips32."); 5059 } 5060 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 5061 unsigned &NumAliases) const { 5062 static const TargetInfo::GCCRegAlias GCCRegAliases[] = { 5063 { { "at" }, "$1" }, 5064 { { "v0" }, "$2" }, 5065 { { "v1" }, "$3" }, 5066 { { "a0" }, "$4" }, 5067 { { "a1" }, "$5" }, 5068 { { "a2" }, "$6" }, 5069 { { "a3" }, "$7" }, 5070 { { "t0" }, "$8" }, 5071 { { "t1" }, "$9" }, 5072 { { "t2" }, "$10" }, 5073 { { "t3" }, "$11" }, 5074 { { "t4" }, "$12" }, 5075 { { "t5" }, "$13" }, 5076 { { "t6" }, "$14" }, 5077 { { "t7" }, "$15" }, 5078 { { "s0" }, "$16" }, 5079 { { "s1" }, "$17" }, 5080 { { "s2" }, "$18" }, 5081 { { "s3" }, "$19" }, 5082 { { "s4" }, "$20" }, 5083 { { "s5" }, "$21" }, 5084 { { "s6" }, "$22" }, 5085 { { "s7" }, "$23" }, 5086 { { "t8" }, "$24" }, 5087 { { "t9" }, "$25" }, 5088 { { "k0" }, "$26" }, 5089 { { "k1" }, "$27" }, 5090 { { "gp" }, "$28" }, 5091 { { "sp","$sp" }, "$29" }, 5092 { { "fp","$fp" }, "$30" }, 5093 { { "ra" }, "$31" } 5094 }; 5095 Aliases = GCCRegAliases; 5096 NumAliases = llvm::array_lengthof(GCCRegAliases); 5097 } 5098}; 5099 5100class Mips32EBTargetInfo : public Mips32TargetInfoBase { 5101 virtual void setDescriptionString() { 5102 if (HasFP64) 5103 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 5104 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S128"; 5105 else 5106 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 5107 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64"; 5108 } 5109 5110public: 5111 Mips32EBTargetInfo(const llvm::Triple &Triple) 5112 : Mips32TargetInfoBase(Triple) { 5113 } 5114 virtual void getTargetDefines(const LangOptions &Opts, 5115 MacroBuilder &Builder) const { 5116 DefineStd(Builder, "MIPSEB", Opts); 5117 Builder.defineMacro("_MIPSEB"); 5118 Mips32TargetInfoBase::getTargetDefines(Opts, Builder); 5119 } 5120}; 5121 5122class Mips32ELTargetInfo : public Mips32TargetInfoBase { 5123 virtual void setDescriptionString() { 5124 if (HasFP64) 5125 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 5126 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S128"; 5127 else 5128 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 5129 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64"; 5130 } 5131 5132public: 5133 Mips32ELTargetInfo(const llvm::Triple &Triple) 5134 : Mips32TargetInfoBase(Triple) { 5135 BigEndian = false; 5136 } 5137 virtual void getTargetDefines(const LangOptions &Opts, 5138 MacroBuilder &Builder) const { 5139 DefineStd(Builder, "MIPSEL", Opts); 5140 Builder.defineMacro("_MIPSEL"); 5141 Mips32TargetInfoBase::getTargetDefines(Opts, Builder); 5142 } 5143}; 5144 5145class Mips64TargetInfoBase : public MipsTargetInfoBase { 5146public: 5147 Mips64TargetInfoBase(const llvm::Triple &Triple) 5148 : MipsTargetInfoBase(Triple, "n64", "mips64") { 5149 LongWidth = LongAlign = 64; 5150 PointerWidth = PointerAlign = 64; 5151 LongDoubleWidth = LongDoubleAlign = 128; 5152 LongDoubleFormat = &llvm::APFloat::IEEEquad; 5153 if (getTriple().getOS() == llvm::Triple::FreeBSD) { 5154 LongDoubleWidth = LongDoubleAlign = 64; 5155 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 5156 } 5157 SuitableAlign = 128; 5158 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 5159 } 5160 virtual bool setABI(const std::string &Name) { 5161 if (Name == "n32") { 5162 LongWidth = LongAlign = 32; 5163 PointerWidth = PointerAlign = 32; 5164 ABI = Name; 5165 return true; 5166 } else if (Name == "n64") { 5167 ABI = Name; 5168 return true; 5169 } else if (Name == "64") { 5170 ABI = "n64"; 5171 return true; 5172 } else 5173 return false; 5174 } 5175 virtual void getTargetDefines(const LangOptions &Opts, 5176 MacroBuilder &Builder) const { 5177 MipsTargetInfoBase::getTargetDefines(Opts, Builder); 5178 5179 Builder.defineMacro("__mips64"); 5180 Builder.defineMacro("__mips64__"); 5181 5182 if (ABI == "n32") { 5183 Builder.defineMacro("__mips_n32"); 5184 Builder.defineMacro("_ABIN32", "2"); 5185 Builder.defineMacro("_MIPS_SIM", "_ABIN32"); 5186 } 5187 else if (ABI == "n64") { 5188 Builder.defineMacro("__mips_n64"); 5189 Builder.defineMacro("_ABI64", "3"); 5190 Builder.defineMacro("_MIPS_SIM", "_ABI64"); 5191 } 5192 else 5193 llvm_unreachable("Invalid ABI for Mips64."); 5194 } 5195 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 5196 unsigned &NumAliases) const { 5197 static const TargetInfo::GCCRegAlias GCCRegAliases[] = { 5198 { { "at" }, "$1" }, 5199 { { "v0" }, "$2" }, 5200 { { "v1" }, "$3" }, 5201 { { "a0" }, "$4" }, 5202 { { "a1" }, "$5" }, 5203 { { "a2" }, "$6" }, 5204 { { "a3" }, "$7" }, 5205 { { "a4" }, "$8" }, 5206 { { "a5" }, "$9" }, 5207 { { "a6" }, "$10" }, 5208 { { "a7" }, "$11" }, 5209 { { "t0" }, "$12" }, 5210 { { "t1" }, "$13" }, 5211 { { "t2" }, "$14" }, 5212 { { "t3" }, "$15" }, 5213 { { "s0" }, "$16" }, 5214 { { "s1" }, "$17" }, 5215 { { "s2" }, "$18" }, 5216 { { "s3" }, "$19" }, 5217 { { "s4" }, "$20" }, 5218 { { "s5" }, "$21" }, 5219 { { "s6" }, "$22" }, 5220 { { "s7" }, "$23" }, 5221 { { "t8" }, "$24" }, 5222 { { "t9" }, "$25" }, 5223 { { "k0" }, "$26" }, 5224 { { "k1" }, "$27" }, 5225 { { "gp" }, "$28" }, 5226 { { "sp","$sp" }, "$29" }, 5227 { { "fp","$fp" }, "$30" }, 5228 { { "ra" }, "$31" } 5229 }; 5230 Aliases = GCCRegAliases; 5231 NumAliases = llvm::array_lengthof(GCCRegAliases); 5232 } 5233}; 5234 5235class Mips64EBTargetInfo : public Mips64TargetInfoBase { 5236 virtual void setDescriptionString() { 5237 if (ABI == "n32") 5238 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 5239 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-" 5240 "v64:64:64-n32:64-S128"; 5241 else 5242 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 5243 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-" 5244 "v64:64:64-n32:64-S128"; 5245 5246 } 5247 5248public: 5249 Mips64EBTargetInfo(const llvm::Triple &Triple) 5250 : Mips64TargetInfoBase(Triple) {} 5251 virtual void getTargetDefines(const LangOptions &Opts, 5252 MacroBuilder &Builder) const { 5253 DefineStd(Builder, "MIPSEB", Opts); 5254 Builder.defineMacro("_MIPSEB"); 5255 Mips64TargetInfoBase::getTargetDefines(Opts, Builder); 5256 } 5257}; 5258 5259class Mips64ELTargetInfo : public Mips64TargetInfoBase { 5260 virtual void setDescriptionString() { 5261 if (ABI == "n32") 5262 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 5263 "i64:64:64-f32:32:32-f64:64:64-f128:128:128" 5264 "-v64:64:64-n32:64-S128"; 5265 else 5266 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 5267 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-" 5268 "v64:64:64-n32:64-S128"; 5269 } 5270public: 5271 Mips64ELTargetInfo(const llvm::Triple &Triple) 5272 : Mips64TargetInfoBase(Triple) { 5273 // Default ABI is n64. 5274 BigEndian = false; 5275 } 5276 virtual void getTargetDefines(const LangOptions &Opts, 5277 MacroBuilder &Builder) const { 5278 DefineStd(Builder, "MIPSEL", Opts); 5279 Builder.defineMacro("_MIPSEL"); 5280 Mips64TargetInfoBase::getTargetDefines(Opts, Builder); 5281 } 5282}; 5283} // end anonymous namespace. 5284 5285namespace { 5286class PNaClTargetInfo : public TargetInfo { 5287public: 5288 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 5289 BigEndian = false; 5290 this->UserLabelPrefix = ""; 5291 this->LongAlign = 32; 5292 this->LongWidth = 32; 5293 this->PointerAlign = 32; 5294 this->PointerWidth = 32; 5295 this->IntMaxType = TargetInfo::SignedLongLong; 5296 this->UIntMaxType = TargetInfo::UnsignedLongLong; 5297 this->Int64Type = TargetInfo::SignedLongLong; 5298 this->DoubleAlign = 64; 5299 this->LongDoubleWidth = 64; 5300 this->LongDoubleAlign = 64; 5301 this->SizeType = TargetInfo::UnsignedInt; 5302 this->PtrDiffType = TargetInfo::SignedInt; 5303 this->IntPtrType = TargetInfo::SignedInt; 5304 this->RegParmMax = 0; // Disallow regparm 5305 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-" 5306 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32"; 5307 } 5308 5309 void getDefaultFeatures(llvm::StringMap<bool> &Features) const { 5310 } 5311 virtual void getArchDefines(const LangOptions &Opts, 5312 MacroBuilder &Builder) const { 5313 Builder.defineMacro("__le32__"); 5314 Builder.defineMacro("__pnacl__"); 5315 } 5316 virtual void getTargetDefines(const LangOptions &Opts, 5317 MacroBuilder &Builder) const { 5318 Builder.defineMacro("__LITTLE_ENDIAN__"); 5319 getArchDefines(Opts, Builder); 5320 } 5321 virtual bool hasFeature(StringRef Feature) const { 5322 return Feature == "pnacl"; 5323 } 5324 virtual void getTargetBuiltins(const Builtin::Info *&Records, 5325 unsigned &NumRecords) const { 5326 } 5327 virtual BuiltinVaListKind getBuiltinVaListKind() const { 5328 return TargetInfo::PNaClABIBuiltinVaList; 5329 } 5330 virtual void getGCCRegNames(const char * const *&Names, 5331 unsigned &NumNames) const; 5332 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 5333 unsigned &NumAliases) const; 5334 virtual bool validateAsmConstraint(const char *&Name, 5335 TargetInfo::ConstraintInfo &Info) const { 5336 return false; 5337 } 5338 5339 virtual const char *getClobbers() const { 5340 return ""; 5341 } 5342}; 5343 5344void PNaClTargetInfo::getGCCRegNames(const char * const *&Names, 5345 unsigned &NumNames) const { 5346 Names = NULL; 5347 NumNames = 0; 5348} 5349 5350void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 5351 unsigned &NumAliases) const { 5352 Aliases = NULL; 5353 NumAliases = 0; 5354} 5355} // end anonymous namespace. 5356 5357namespace { 5358 static const unsigned SPIRAddrSpaceMap[] = { 5359 1, // opencl_global 5360 3, // opencl_local 5361 2, // opencl_constant 5362 0, // cuda_device 5363 0, // cuda_constant 5364 0 // cuda_shared 5365 }; 5366 class SPIRTargetInfo : public TargetInfo { 5367 public: 5368 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 5369 assert(getTriple().getOS() == llvm::Triple::UnknownOS && 5370 "SPIR target must use unknown OS"); 5371 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment && 5372 "SPIR target must use unknown environment type"); 5373 BigEndian = false; 5374 TLSSupported = false; 5375 LongWidth = LongAlign = 64; 5376 AddrSpaceMap = &SPIRAddrSpaceMap; 5377 UseAddrSpaceMapMangling = true; 5378 // Define available target features 5379 // These must be defined in sorted order! 5380 NoAsmVariants = true; 5381 } 5382 virtual void getTargetDefines(const LangOptions &Opts, 5383 MacroBuilder &Builder) const { 5384 DefineStd(Builder, "SPIR", Opts); 5385 } 5386 virtual bool hasFeature(StringRef Feature) const { 5387 return Feature == "spir"; 5388 } 5389 5390 virtual void getTargetBuiltins(const Builtin::Info *&Records, 5391 unsigned &NumRecords) const {} 5392 virtual const char *getClobbers() const { 5393 return ""; 5394 } 5395 virtual void getGCCRegNames(const char * const *&Names, 5396 unsigned &NumNames) const {} 5397 virtual bool validateAsmConstraint(const char *&Name, 5398 TargetInfo::ConstraintInfo &info) const { 5399 return true; 5400 } 5401 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 5402 unsigned &NumAliases) const {} 5403 virtual BuiltinVaListKind getBuiltinVaListKind() const { 5404 return TargetInfo::VoidPtrBuiltinVaList; 5405 } 5406 }; 5407 5408 5409 class SPIR32TargetInfo : public SPIRTargetInfo { 5410 public: 5411 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) { 5412 PointerWidth = PointerAlign = 32; 5413 SizeType = TargetInfo::UnsignedInt; 5414 PtrDiffType = IntPtrType = TargetInfo::SignedInt; 5415 DescriptionString 5416 = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-" 5417 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-" 5418 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-" 5419 "v512:512:512-v1024:1024:1024"; 5420 } 5421 virtual void getTargetDefines(const LangOptions &Opts, 5422 MacroBuilder &Builder) const { 5423 DefineStd(Builder, "SPIR32", Opts); 5424 } 5425 }; 5426 5427 class SPIR64TargetInfo : public SPIRTargetInfo { 5428 public: 5429 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) { 5430 PointerWidth = PointerAlign = 64; 5431 SizeType = TargetInfo::UnsignedLong; 5432 PtrDiffType = IntPtrType = TargetInfo::SignedLong; 5433 DescriptionString 5434 = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-" 5435 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-" 5436 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-" 5437 "v512:512:512-v1024:1024:1024"; 5438 } 5439 virtual void getTargetDefines(const LangOptions &Opts, 5440 MacroBuilder &Builder) const { 5441 DefineStd(Builder, "SPIR64", Opts); 5442 } 5443 }; 5444} 5445 5446namespace { 5447class XCoreTargetInfo : public TargetInfo { 5448 static const Builtin::Info BuiltinInfo[]; 5449public: 5450 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 5451 BigEndian = false; 5452 NoAsmVariants = true; 5453 LongLongAlign = 32; 5454 SuitableAlign = 32; 5455 DoubleAlign = LongDoubleAlign = 32; 5456 UseZeroLengthBitfieldAlignment = true; 5457 DescriptionString = "e-p:32:32:32-a0:0:32-n32" 5458 "-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32" 5459 "-f16:16:32-f32:32:32-f64:32:32"; 5460 } 5461 virtual void getTargetDefines(const LangOptions &Opts, 5462 MacroBuilder &Builder) const { 5463 Builder.defineMacro("__XS1B__"); 5464 } 5465 virtual void getTargetBuiltins(const Builtin::Info *&Records, 5466 unsigned &NumRecords) const { 5467 Records = BuiltinInfo; 5468 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin; 5469 } 5470 virtual BuiltinVaListKind getBuiltinVaListKind() const { 5471 return TargetInfo::VoidPtrBuiltinVaList; 5472 } 5473 virtual const char *getClobbers() const { 5474 return ""; 5475 } 5476 virtual void getGCCRegNames(const char * const *&Names, 5477 unsigned &NumNames) const { 5478 static const char * const GCCRegNames[] = { 5479 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 5480 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr" 5481 }; 5482 Names = GCCRegNames; 5483 NumNames = llvm::array_lengthof(GCCRegNames); 5484 } 5485 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 5486 unsigned &NumAliases) const { 5487 Aliases = NULL; 5488 NumAliases = 0; 5489 } 5490 virtual bool validateAsmConstraint(const char *&Name, 5491 TargetInfo::ConstraintInfo &Info) const { 5492 return false; 5493 } 5494}; 5495 5496const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = { 5497#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, 5498#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ 5499 ALL_LANGUAGES }, 5500#include "clang/Basic/BuiltinsXCore.def" 5501}; 5502} // end anonymous namespace. 5503 5504 5505//===----------------------------------------------------------------------===// 5506// Driver code 5507//===----------------------------------------------------------------------===// 5508 5509static TargetInfo *AllocateTarget(const llvm::Triple &Triple) { 5510 llvm::Triple::OSType os = Triple.getOS(); 5511 5512 switch (Triple.getArch()) { 5513 default: 5514 return NULL; 5515 5516 case llvm::Triple::xcore: 5517 return new XCoreTargetInfo(Triple); 5518 5519 case llvm::Triple::hexagon: 5520 return new HexagonTargetInfo(Triple); 5521 5522 case llvm::Triple::aarch64: 5523 switch (os) { 5524 case llvm::Triple::Linux: 5525 return new LinuxTargetInfo<AArch64TargetInfo>(Triple); 5526 default: 5527 return new AArch64TargetInfo(Triple); 5528 } 5529 5530 case llvm::Triple::arm: 5531 case llvm::Triple::thumb: 5532 if (Triple.isOSDarwin()) 5533 return new DarwinARMTargetInfo(Triple); 5534 5535 switch (os) { 5536 case llvm::Triple::Linux: 5537 return new LinuxTargetInfo<ARMTargetInfo>(Triple); 5538 case llvm::Triple::FreeBSD: 5539 return new FreeBSDTargetInfo<ARMTargetInfo>(Triple); 5540 case llvm::Triple::NetBSD: 5541 return new NetBSDTargetInfo<ARMTargetInfo>(Triple); 5542 case llvm::Triple::OpenBSD: 5543 return new OpenBSDTargetInfo<ARMTargetInfo>(Triple); 5544 case llvm::Triple::Bitrig: 5545 return new BitrigTargetInfo<ARMTargetInfo>(Triple); 5546 case llvm::Triple::RTEMS: 5547 return new RTEMSTargetInfo<ARMTargetInfo>(Triple); 5548 case llvm::Triple::NaCl: 5549 return new NaClTargetInfo<ARMTargetInfo>(Triple); 5550 default: 5551 return new ARMTargetInfo(Triple); 5552 } 5553 5554 case llvm::Triple::msp430: 5555 return new MSP430TargetInfo(Triple); 5556 5557 case llvm::Triple::mips: 5558 switch (os) { 5559 case llvm::Triple::Linux: 5560 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple); 5561 case llvm::Triple::RTEMS: 5562 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple); 5563 case llvm::Triple::FreeBSD: 5564 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple); 5565 case llvm::Triple::NetBSD: 5566 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple); 5567 default: 5568 return new Mips32EBTargetInfo(Triple); 5569 } 5570 5571 case llvm::Triple::mipsel: 5572 switch (os) { 5573 case llvm::Triple::Linux: 5574 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple); 5575 case llvm::Triple::RTEMS: 5576 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple); 5577 case llvm::Triple::FreeBSD: 5578 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple); 5579 case llvm::Triple::NetBSD: 5580 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple); 5581 case llvm::Triple::NaCl: 5582 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple); 5583 default: 5584 return new Mips32ELTargetInfo(Triple); 5585 } 5586 5587 case llvm::Triple::mips64: 5588 switch (os) { 5589 case llvm::Triple::Linux: 5590 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple); 5591 case llvm::Triple::RTEMS: 5592 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple); 5593 case llvm::Triple::FreeBSD: 5594 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple); 5595 case llvm::Triple::NetBSD: 5596 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple); 5597 case llvm::Triple::OpenBSD: 5598 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple); 5599 default: 5600 return new Mips64EBTargetInfo(Triple); 5601 } 5602 5603 case llvm::Triple::mips64el: 5604 switch (os) { 5605 case llvm::Triple::Linux: 5606 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple); 5607 case llvm::Triple::RTEMS: 5608 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple); 5609 case llvm::Triple::FreeBSD: 5610 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple); 5611 case llvm::Triple::NetBSD: 5612 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple); 5613 case llvm::Triple::OpenBSD: 5614 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple); 5615 default: 5616 return new Mips64ELTargetInfo(Triple); 5617 } 5618 5619 case llvm::Triple::le32: 5620 switch (os) { 5621 case llvm::Triple::NaCl: 5622 return new NaClTargetInfo<PNaClTargetInfo>(Triple); 5623 default: 5624 return NULL; 5625 } 5626 5627 case llvm::Triple::ppc: 5628 if (Triple.isOSDarwin()) 5629 return new DarwinPPC32TargetInfo(Triple); 5630 switch (os) { 5631 case llvm::Triple::Linux: 5632 return new LinuxTargetInfo<PPC32TargetInfo>(Triple); 5633 case llvm::Triple::FreeBSD: 5634 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple); 5635 case llvm::Triple::NetBSD: 5636 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple); 5637 case llvm::Triple::OpenBSD: 5638 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple); 5639 case llvm::Triple::RTEMS: 5640 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple); 5641 default: 5642 return new PPC32TargetInfo(Triple); 5643 } 5644 5645 case llvm::Triple::ppc64: 5646 if (Triple.isOSDarwin()) 5647 return new DarwinPPC64TargetInfo(Triple); 5648 switch (os) { 5649 case llvm::Triple::Linux: 5650 return new LinuxTargetInfo<PPC64TargetInfo>(Triple); 5651 case llvm::Triple::Lv2: 5652 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple); 5653 case llvm::Triple::FreeBSD: 5654 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple); 5655 case llvm::Triple::NetBSD: 5656 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple); 5657 default: 5658 return new PPC64TargetInfo(Triple); 5659 } 5660 5661 case llvm::Triple::ppc64le: 5662 switch (os) { 5663 case llvm::Triple::Linux: 5664 return new LinuxTargetInfo<PPC64TargetInfo>(Triple); 5665 default: 5666 return new PPC64TargetInfo(Triple); 5667 } 5668 5669 case llvm::Triple::nvptx: 5670 return new NVPTX32TargetInfo(Triple); 5671 case llvm::Triple::nvptx64: 5672 return new NVPTX64TargetInfo(Triple); 5673 5674 case llvm::Triple::r600: 5675 return new R600TargetInfo(Triple); 5676 5677 case llvm::Triple::sparc: 5678 switch (os) { 5679 case llvm::Triple::Linux: 5680 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple); 5681 case llvm::Triple::AuroraUX: 5682 return new AuroraUXSparcV8TargetInfo(Triple); 5683 case llvm::Triple::Solaris: 5684 return new SolarisSparcV8TargetInfo(Triple); 5685 case llvm::Triple::NetBSD: 5686 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple); 5687 case llvm::Triple::OpenBSD: 5688 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple); 5689 case llvm::Triple::RTEMS: 5690 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple); 5691 default: 5692 return new SparcV8TargetInfo(Triple); 5693 } 5694 5695 case llvm::Triple::sparcv9: 5696 switch (os) { 5697 case llvm::Triple::Linux: 5698 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple); 5699 case llvm::Triple::AuroraUX: 5700 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple); 5701 case llvm::Triple::Solaris: 5702 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple); 5703 case llvm::Triple::NetBSD: 5704 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple); 5705 case llvm::Triple::OpenBSD: 5706 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple); 5707 case llvm::Triple::FreeBSD: 5708 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple); 5709 default: 5710 return new SparcV9TargetInfo(Triple); 5711 } 5712 5713 case llvm::Triple::systemz: 5714 switch (os) { 5715 case llvm::Triple::Linux: 5716 return new LinuxTargetInfo<SystemZTargetInfo>(Triple); 5717 default: 5718 return new SystemZTargetInfo(Triple); 5719 } 5720 5721 case llvm::Triple::tce: 5722 return new TCETargetInfo(Triple); 5723 5724 case llvm::Triple::x86: 5725 if (Triple.isOSDarwin()) 5726 return new DarwinI386TargetInfo(Triple); 5727 5728 switch (os) { 5729 case llvm::Triple::AuroraUX: 5730 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple); 5731 case llvm::Triple::Linux: 5732 return new LinuxTargetInfo<X86_32TargetInfo>(Triple); 5733 case llvm::Triple::DragonFly: 5734 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple); 5735 case llvm::Triple::NetBSD: 5736 return new NetBSDI386TargetInfo(Triple); 5737 case llvm::Triple::OpenBSD: 5738 return new OpenBSDI386TargetInfo(Triple); 5739 case llvm::Triple::Bitrig: 5740 return new BitrigI386TargetInfo(Triple); 5741 case llvm::Triple::FreeBSD: 5742 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple); 5743 case llvm::Triple::KFreeBSD: 5744 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple); 5745 case llvm::Triple::Minix: 5746 return new MinixTargetInfo<X86_32TargetInfo>(Triple); 5747 case llvm::Triple::Solaris: 5748 return new SolarisTargetInfo<X86_32TargetInfo>(Triple); 5749 case llvm::Triple::Cygwin: 5750 return new CygwinX86_32TargetInfo(Triple); 5751 case llvm::Triple::MinGW32: 5752 return new MinGWX86_32TargetInfo(Triple); 5753 case llvm::Triple::Win32: 5754 return new VisualStudioWindowsX86_32TargetInfo(Triple); 5755 case llvm::Triple::Haiku: 5756 return new HaikuX86_32TargetInfo(Triple); 5757 case llvm::Triple::RTEMS: 5758 return new RTEMSX86_32TargetInfo(Triple); 5759 case llvm::Triple::NaCl: 5760 return new NaClTargetInfo<X86_32TargetInfo>(Triple); 5761 default: 5762 return new X86_32TargetInfo(Triple); 5763 } 5764 5765 case llvm::Triple::x86_64: 5766 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO) 5767 return new DarwinX86_64TargetInfo(Triple); 5768 5769 switch (os) { 5770 case llvm::Triple::AuroraUX: 5771 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple); 5772 case llvm::Triple::Linux: 5773 return new LinuxTargetInfo<X86_64TargetInfo>(Triple); 5774 case llvm::Triple::DragonFly: 5775 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple); 5776 case llvm::Triple::NetBSD: 5777 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple); 5778 case llvm::Triple::OpenBSD: 5779 return new OpenBSDX86_64TargetInfo(Triple); 5780 case llvm::Triple::Bitrig: 5781 return new BitrigX86_64TargetInfo(Triple); 5782 case llvm::Triple::FreeBSD: 5783 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple); 5784 case llvm::Triple::KFreeBSD: 5785 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple); 5786 case llvm::Triple::Solaris: 5787 return new SolarisTargetInfo<X86_64TargetInfo>(Triple); 5788 case llvm::Triple::MinGW32: 5789 return new MinGWX86_64TargetInfo(Triple); 5790 case llvm::Triple::Win32: // This is what Triple.h supports now. 5791 return new VisualStudioWindowsX86_64TargetInfo(Triple); 5792 case llvm::Triple::NaCl: 5793 return new NaClTargetInfo<X86_64TargetInfo>(Triple); 5794 default: 5795 return new X86_64TargetInfo(Triple); 5796 } 5797 5798 case llvm::Triple::spir: { 5799 if (Triple.getOS() != llvm::Triple::UnknownOS || 5800 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment) 5801 return NULL; 5802 return new SPIR32TargetInfo(Triple); 5803 } 5804 case llvm::Triple::spir64: { 5805 if (Triple.getOS() != llvm::Triple::UnknownOS || 5806 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment) 5807 return NULL; 5808 return new SPIR64TargetInfo(Triple); 5809 } 5810 } 5811} 5812 5813/// CreateTargetInfo - Return the target info object for the specified target 5814/// triple. 5815TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, 5816 TargetOptions *Opts) { 5817 llvm::Triple Triple(Opts->Triple); 5818 5819 // Construct the target 5820 OwningPtr<TargetInfo> Target(AllocateTarget(Triple)); 5821 if (!Target) { 5822 Diags.Report(diag::err_target_unknown_triple) << Triple.str(); 5823 return 0; 5824 } 5825 Target->setTargetOpts(Opts); 5826 5827 // Set the target CPU if specified. 5828 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) { 5829 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU; 5830 return 0; 5831 } 5832 5833 // Set the target ABI if specified. 5834 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) { 5835 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI; 5836 return 0; 5837 } 5838 5839 // Set the target C++ ABI. 5840 if (!Opts->CXXABI.empty() && !Target->setCXXABI(Opts->CXXABI)) { 5841 Diags.Report(diag::err_target_unknown_cxxabi) << Opts->CXXABI; 5842 return 0; 5843 } 5844 5845 // Set the fp math unit. 5846 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) { 5847 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath; 5848 return 0; 5849 } 5850 5851 // Compute the default target features, we need the target to handle this 5852 // because features may have dependencies on one another. 5853 llvm::StringMap<bool> Features; 5854 Target->getDefaultFeatures(Features); 5855 5856 // Apply the user specified deltas. 5857 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size(); 5858 I < N; ++I) { 5859 const char *Name = Opts->FeaturesAsWritten[I].c_str(); 5860 // Apply the feature via the target. 5861 bool Enabled = Name[0] == '+'; 5862 Target->setFeatureEnabled(Features, Name + 1, Enabled); 5863 } 5864 5865 // Add the features to the compile options. 5866 // 5867 // FIXME: If we are completely confident that we have the right set, we only 5868 // need to pass the minuses. 5869 Opts->Features.clear(); 5870 for (llvm::StringMap<bool>::const_iterator it = Features.begin(), 5871 ie = Features.end(); it != ie; ++it) 5872 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str()); 5873 if (!Target->handleTargetFeatures(Opts->Features, Diags)) 5874 return 0; 5875 5876 return Target.take(); 5877} 5878