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