1 //===--- Triple.cpp - Target triple helper class --------------------------===// 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 #include "llvm/ADT/Triple.h" 11 #include "llvm/ADT/SmallString.h" 12 #include "llvm/ADT/STLExtras.h" 13 #include "llvm/Support/ErrorHandling.h" 14 #include <cstring> 15 using namespace llvm; 16 17 const char *Triple::getArchTypeName(ArchType Kind) { 18 switch (Kind) { 19 case InvalidArch: return "<invalid>"; 20 case UnknownArch: return "unknown"; 21 22 case arm: return "arm"; 23 case cellspu: return "cellspu"; 24 case hexagon: return "hexagon"; 25 case mips: return "mips"; 26 case mipsel: return "mipsel"; 27 case mips64: return "mips64"; 28 case mips64el:return "mips64el"; 29 case msp430: return "msp430"; 30 case ppc64: return "powerpc64"; 31 case ppc: return "powerpc"; 32 case sparc: return "sparc"; 33 case sparcv9: return "sparcv9"; 34 case tce: return "tce"; 35 case thumb: return "thumb"; 36 case x86: return "i386"; 37 case x86_64: return "x86_64"; 38 case xcore: return "xcore"; 39 case mblaze: return "mblaze"; 40 case ptx32: return "ptx32"; 41 case ptx64: return "ptx64"; 42 case le32: return "le32"; 43 case amdil: return "amdil"; 44 } 45 46 llvm_unreachable("Invalid ArchType!"); 47 } 48 49 const char *Triple::getArchTypePrefix(ArchType Kind) { 50 switch (Kind) { 51 default: 52 return 0; 53 54 case arm: 55 case thumb: return "arm"; 56 57 case cellspu: return "spu"; 58 59 case ppc64: 60 case ppc: return "ppc"; 61 62 case mblaze: return "mblaze"; 63 64 case hexagon: return "hexagon"; 65 66 case sparcv9: 67 case sparc: return "sparc"; 68 69 case x86: 70 case x86_64: return "x86"; 71 72 case xcore: return "xcore"; 73 74 case ptx32: return "ptx"; 75 case ptx64: return "ptx"; 76 case le32: return "le32"; 77 case amdil: return "amdil"; 78 } 79 } 80 81 const char *Triple::getVendorTypeName(VendorType Kind) { 82 switch (Kind) { 83 case UnknownVendor: return "unknown"; 84 85 case Apple: return "apple"; 86 case PC: return "pc"; 87 case SCEI: return "scei"; 88 } 89 90 llvm_unreachable("Invalid VendorType!"); 91 } 92 93 const char *Triple::getOSTypeName(OSType Kind) { 94 switch (Kind) { 95 case UnknownOS: return "unknown"; 96 97 case AuroraUX: return "auroraux"; 98 case Cygwin: return "cygwin"; 99 case Darwin: return "darwin"; 100 case DragonFly: return "dragonfly"; 101 case FreeBSD: return "freebsd"; 102 case IOS: return "ios"; 103 case KFreeBSD: return "kfreebsd"; 104 case Linux: return "linux"; 105 case Lv2: return "lv2"; 106 case MacOSX: return "macosx"; 107 case MinGW32: return "mingw32"; 108 case NetBSD: return "netbsd"; 109 case OpenBSD: return "openbsd"; 110 case Psp: return "psp"; 111 case Solaris: return "solaris"; 112 case Win32: return "win32"; 113 case Haiku: return "haiku"; 114 case Minix: return "minix"; 115 case RTEMS: return "rtems"; 116 case NativeClient: return "nacl"; 117 } 118 119 llvm_unreachable("Invalid OSType"); 120 } 121 122 const char *Triple::getEnvironmentTypeName(EnvironmentType Kind) { 123 switch (Kind) { 124 case UnknownEnvironment: return "unknown"; 125 case GNU: return "gnu"; 126 case GNUEABIHF: return "gnueabihf"; 127 case GNUEABI: return "gnueabi"; 128 case EABI: return "eabi"; 129 case MachO: return "macho"; 130 case ANDROIDEABI: return "androideabi"; 131 } 132 133 llvm_unreachable("Invalid EnvironmentType!"); 134 } 135 136 Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) { 137 if (Name == "arm") 138 return arm; 139 if (Name == "cellspu") 140 return cellspu; 141 if (Name == "mips") 142 return mips; 143 if (Name == "mipsel") 144 return mipsel; 145 if (Name == "mips64") 146 return mips64; 147 if (Name == "mips64el") 148 return mips64el; 149 if (Name == "msp430") 150 return msp430; 151 if (Name == "ppc64") 152 return ppc64; 153 if (Name == "ppc32") 154 return ppc; 155 if (Name == "ppc") 156 return ppc; 157 if (Name == "mblaze") 158 return mblaze; 159 if (Name == "hexagon") 160 return hexagon; 161 if (Name == "sparc") 162 return sparc; 163 if (Name == "sparcv9") 164 return sparcv9; 165 if (Name == "tce") 166 return tce; 167 if (Name == "thumb") 168 return thumb; 169 if (Name == "x86") 170 return x86; 171 if (Name == "x86-64") 172 return x86_64; 173 if (Name == "xcore") 174 return xcore; 175 if (Name == "ptx32") 176 return ptx32; 177 if (Name == "ptx64") 178 return ptx64; 179 if (Name == "le32") 180 return le32; 181 if (Name == "amdil") 182 return amdil; 183 184 return UnknownArch; 185 } 186 187 Triple::ArchType Triple::getArchTypeForDarwinArchName(StringRef Str) { 188 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for 189 // archs which Darwin doesn't use. 190 191 // The matching this routine does is fairly pointless, since it is neither the 192 // complete architecture list, nor a reasonable subset. The problem is that 193 // historically the driver driver accepts this and also ties its -march= 194 // handling to the architecture name, so we need to be careful before removing 195 // support for it. 196 197 // This code must be kept in sync with Clang's Darwin specific argument 198 // translation. 199 200 if (Str == "ppc" || Str == "ppc601" || Str == "ppc603" || Str == "ppc604" || 201 Str == "ppc604e" || Str == "ppc750" || Str == "ppc7400" || 202 Str == "ppc7450" || Str == "ppc970") 203 return Triple::ppc; 204 205 if (Str == "ppc64") 206 return Triple::ppc64; 207 208 if (Str == "i386" || Str == "i486" || Str == "i486SX" || Str == "pentium" || 209 Str == "i586" || Str == "pentpro" || Str == "i686" || Str == "pentIIm3" || 210 Str == "pentIIm5" || Str == "pentium4") 211 return Triple::x86; 212 213 if (Str == "x86_64") 214 return Triple::x86_64; 215 216 // This is derived from the driver driver. 217 if (Str == "arm" || Str == "armv4t" || Str == "armv5" || Str == "xscale" || 218 Str == "armv6" || Str == "armv7" || Str == "armv7f" || Str == "armv7k" || 219 Str == "armv7s") 220 return Triple::arm; 221 222 if (Str == "ptx32") 223 return Triple::ptx32; 224 if (Str == "ptx64") 225 return Triple::ptx64; 226 if (Str == "amdil") 227 return Triple::amdil; 228 229 return Triple::UnknownArch; 230 } 231 232 // Returns architecture name that is understood by the target assembler. 233 const char *Triple::getArchNameForAssembler() { 234 if (!isOSDarwin() && getVendor() != Triple::Apple) 235 return NULL; 236 237 StringRef Str = getArchName(); 238 if (Str == "i386") 239 return "i386"; 240 if (Str == "x86_64") 241 return "x86_64"; 242 if (Str == "powerpc") 243 return "ppc"; 244 if (Str == "powerpc64") 245 return "ppc64"; 246 if (Str == "mblaze" || Str == "microblaze") 247 return "mblaze"; 248 if (Str == "arm") 249 return "arm"; 250 if (Str == "armv4t" || Str == "thumbv4t") 251 return "armv4t"; 252 if (Str == "armv5" || Str == "armv5e" || Str == "thumbv5" 253 || Str == "thumbv5e") 254 return "armv5"; 255 if (Str == "armv6" || Str == "thumbv6") 256 return "armv6"; 257 if (Str == "armv7" || Str == "thumbv7") 258 return "armv7"; 259 if (Str == "ptx32") 260 return "ptx32"; 261 if (Str == "ptx64") 262 return "ptx64"; 263 if (Str == "le32") 264 return "le32"; 265 if (Str == "amdil") 266 return "amdil"; 267 return NULL; 268 } 269 270 // 271 272 Triple::ArchType Triple::ParseArch(StringRef ArchName) { 273 if (ArchName.size() == 4 && ArchName[0] == 'i' && 274 ArchName[2] == '8' && ArchName[3] == '6' && 275 ArchName[1] - '3' < 6) // i[3-9]86 276 return x86; 277 else if (ArchName == "amd64" || ArchName == "x86_64") 278 return x86_64; 279 else if (ArchName == "powerpc") 280 return ppc; 281 else if ((ArchName == "powerpc64") || (ArchName == "ppu")) 282 return ppc64; 283 else if (ArchName == "mblaze") 284 return mblaze; 285 else if (ArchName == "arm" || 286 ArchName.startswith("armv") || 287 ArchName == "xscale") 288 return arm; 289 else if (ArchName == "thumb" || 290 ArchName.startswith("thumbv")) 291 return thumb; 292 else if (ArchName == "spu" || ArchName == "cellspu") 293 return cellspu; 294 else if (ArchName == "msp430") 295 return msp430; 296 else if (ArchName == "mips" || ArchName == "mipseb" || 297 ArchName == "mipsallegrex") 298 return mips; 299 else if (ArchName == "mipsel" || ArchName == "mipsallegrexel" || 300 ArchName == "psp") 301 return mipsel; 302 else if (ArchName == "mips64" || ArchName == "mips64eb") 303 return mips64; 304 else if (ArchName == "mips64el") 305 return mips64el; 306 else if (ArchName == "hexagon") 307 return hexagon; 308 else if (ArchName == "sparc") 309 return sparc; 310 else if (ArchName == "sparcv9") 311 return sparcv9; 312 else if (ArchName == "tce") 313 return tce; 314 else if (ArchName == "xcore") 315 return xcore; 316 else if (ArchName == "ptx32") 317 return ptx32; 318 else if (ArchName == "ptx64") 319 return ptx64; 320 else if (ArchName == "le32") 321 return le32; 322 else if (ArchName == "amdil") 323 return amdil; 324 else 325 return UnknownArch; 326 } 327 328 Triple::VendorType Triple::ParseVendor(StringRef VendorName) { 329 if (VendorName == "apple") 330 return Apple; 331 else if (VendorName == "pc") 332 return PC; 333 else if (VendorName == "scei") 334 return SCEI; 335 else 336 return UnknownVendor; 337 } 338 339 Triple::OSType Triple::ParseOS(StringRef OSName) { 340 if (OSName.startswith("auroraux")) 341 return AuroraUX; 342 else if (OSName.startswith("cygwin")) 343 return Cygwin; 344 else if (OSName.startswith("darwin")) 345 return Darwin; 346 else if (OSName.startswith("dragonfly")) 347 return DragonFly; 348 else if (OSName.startswith("freebsd")) 349 return FreeBSD; 350 else if (OSName.startswith("ios")) 351 return IOS; 352 else if (OSName.startswith("kfreebsd")) 353 return KFreeBSD; 354 else if (OSName.startswith("linux")) 355 return Linux; 356 else if (OSName.startswith("lv2")) 357 return Lv2; 358 else if (OSName.startswith("macosx")) 359 return MacOSX; 360 else if (OSName.startswith("mingw32")) 361 return MinGW32; 362 else if (OSName.startswith("netbsd")) 363 return NetBSD; 364 else if (OSName.startswith("openbsd")) 365 return OpenBSD; 366 else if (OSName.startswith("psp")) 367 return Psp; 368 else if (OSName.startswith("solaris")) 369 return Solaris; 370 else if (OSName.startswith("win32")) 371 return Win32; 372 else if (OSName.startswith("haiku")) 373 return Haiku; 374 else if (OSName.startswith("minix")) 375 return Minix; 376 else if (OSName.startswith("rtems")) 377 return RTEMS; 378 else if (OSName.startswith("nacl")) 379 return NativeClient; 380 else 381 return UnknownOS; 382 } 383 384 Triple::EnvironmentType Triple::ParseEnvironment(StringRef EnvironmentName) { 385 if (EnvironmentName.startswith("eabi")) 386 return EABI; 387 else if (EnvironmentName.startswith("gnueabihf")) 388 return GNUEABIHF; 389 else if (EnvironmentName.startswith("gnueabi")) 390 return GNUEABI; 391 else if (EnvironmentName.startswith("gnu")) 392 return GNU; 393 else if (EnvironmentName.startswith("macho")) 394 return MachO; 395 else if (EnvironmentName.startswith("androideabi")) 396 return ANDROIDEABI; 397 else 398 return UnknownEnvironment; 399 } 400 401 void Triple::Parse() const { 402 assert(!isInitialized() && "Invalid parse call."); 403 404 Arch = ParseArch(getArchName()); 405 Vendor = ParseVendor(getVendorName()); 406 OS = ParseOS(getOSName()); 407 Environment = ParseEnvironment(getEnvironmentName()); 408 409 assert(isInitialized() && "Failed to initialize!"); 410 } 411 412 std::string Triple::normalize(StringRef Str) { 413 // Parse into components. 414 SmallVector<StringRef, 4> Components; 415 for (size_t First = 0, Last = 0; Last != StringRef::npos; First = Last + 1) { 416 Last = Str.find('-', First); 417 Components.push_back(Str.slice(First, Last)); 418 } 419 420 // If the first component corresponds to a known architecture, preferentially 421 // use it for the architecture. If the second component corresponds to a 422 // known vendor, preferentially use it for the vendor, etc. This avoids silly 423 // component movement when a component parses as (eg) both a valid arch and a 424 // valid os. 425 ArchType Arch = UnknownArch; 426 if (Components.size() > 0) 427 Arch = ParseArch(Components[0]); 428 VendorType Vendor = UnknownVendor; 429 if (Components.size() > 1) 430 Vendor = ParseVendor(Components[1]); 431 OSType OS = UnknownOS; 432 if (Components.size() > 2) 433 OS = ParseOS(Components[2]); 434 EnvironmentType Environment = UnknownEnvironment; 435 if (Components.size() > 3) 436 Environment = ParseEnvironment(Components[3]); 437 438 // Note which components are already in their final position. These will not 439 // be moved. 440 bool Found[4]; 441 Found[0] = Arch != UnknownArch; 442 Found[1] = Vendor != UnknownVendor; 443 Found[2] = OS != UnknownOS; 444 Found[3] = Environment != UnknownEnvironment; 445 446 // If they are not there already, permute the components into their canonical 447 // positions by seeing if they parse as a valid architecture, and if so moving 448 // the component to the architecture position etc. 449 for (unsigned Pos = 0; Pos != array_lengthof(Found); ++Pos) { 450 if (Found[Pos]) 451 continue; // Already in the canonical position. 452 453 for (unsigned Idx = 0; Idx != Components.size(); ++Idx) { 454 // Do not reparse any components that already matched. 455 if (Idx < array_lengthof(Found) && Found[Idx]) 456 continue; 457 458 // Does this component parse as valid for the target position? 459 bool Valid = false; 460 StringRef Comp = Components[Idx]; 461 switch (Pos) { 462 default: 463 assert(false && "unexpected component type!"); 464 case 0: 465 Arch = ParseArch(Comp); 466 Valid = Arch != UnknownArch; 467 break; 468 case 1: 469 Vendor = ParseVendor(Comp); 470 Valid = Vendor != UnknownVendor; 471 break; 472 case 2: 473 OS = ParseOS(Comp); 474 Valid = OS != UnknownOS; 475 break; 476 case 3: 477 Environment = ParseEnvironment(Comp); 478 Valid = Environment != UnknownEnvironment; 479 break; 480 } 481 if (!Valid) 482 continue; // Nope, try the next component. 483 484 // Move the component to the target position, pushing any non-fixed 485 // components that are in the way to the right. This tends to give 486 // good results in the common cases of a forgotten vendor component 487 // or a wrongly positioned environment. 488 if (Pos < Idx) { 489 // Insert left, pushing the existing components to the right. For 490 // example, a-b-i386 -> i386-a-b when moving i386 to the front. 491 StringRef CurrentComponent(""); // The empty component. 492 // Replace the component we are moving with an empty component. 493 std::swap(CurrentComponent, Components[Idx]); 494 // Insert the component being moved at Pos, displacing any existing 495 // components to the right. 496 for (unsigned i = Pos; !CurrentComponent.empty(); ++i) { 497 // Skip over any fixed components. 498 while (i < array_lengthof(Found) && Found[i]) ++i; 499 // Place the component at the new position, getting the component 500 // that was at this position - it will be moved right. 501 std::swap(CurrentComponent, Components[i]); 502 } 503 } else if (Pos > Idx) { 504 // Push right by inserting empty components until the component at Idx 505 // reaches the target position Pos. For example, pc-a -> -pc-a when 506 // moving pc to the second position. 507 do { 508 // Insert one empty component at Idx. 509 StringRef CurrentComponent(""); // The empty component. 510 for (unsigned i = Idx; i < Components.size();) { 511 // Place the component at the new position, getting the component 512 // that was at this position - it will be moved right. 513 std::swap(CurrentComponent, Components[i]); 514 // If it was placed on top of an empty component then we are done. 515 if (CurrentComponent.empty()) 516 break; 517 // Advance to the next component, skipping any fixed components. 518 while (++i < array_lengthof(Found) && Found[i]) 519 ; 520 } 521 // The last component was pushed off the end - append it. 522 if (!CurrentComponent.empty()) 523 Components.push_back(CurrentComponent); 524 525 // Advance Idx to the component's new position. 526 while (++Idx < array_lengthof(Found) && Found[Idx]) {} 527 } while (Idx < Pos); // Add more until the final position is reached. 528 } 529 assert(Pos < Components.size() && Components[Pos] == Comp && 530 "Component moved wrong!"); 531 Found[Pos] = true; 532 break; 533 } 534 } 535 536 // Special case logic goes here. At this point Arch, Vendor and OS have the 537 // correct values for the computed components. 538 539 // Stick the corrected components back together to form the normalized string. 540 std::string Normalized; 541 for (unsigned i = 0, e = Components.size(); i != e; ++i) { 542 if (i) Normalized += '-'; 543 Normalized += Components[i]; 544 } 545 return Normalized; 546 } 547 548 StringRef Triple::getArchName() const { 549 return StringRef(Data).split('-').first; // Isolate first component 550 } 551 552 StringRef Triple::getVendorName() const { 553 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 554 return Tmp.split('-').first; // Isolate second component 555 } 556 557 StringRef Triple::getOSName() const { 558 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 559 Tmp = Tmp.split('-').second; // Strip second component 560 return Tmp.split('-').first; // Isolate third component 561 } 562 563 StringRef Triple::getEnvironmentName() const { 564 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 565 Tmp = Tmp.split('-').second; // Strip second component 566 return Tmp.split('-').second; // Strip third component 567 } 568 569 StringRef Triple::getOSAndEnvironmentName() const { 570 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 571 return Tmp.split('-').second; // Strip second component 572 } 573 574 static unsigned EatNumber(StringRef &Str) { 575 assert(!Str.empty() && Str[0] >= '0' && Str[0] <= '9' && "Not a number"); 576 unsigned Result = 0; 577 578 do { 579 // Consume the leading digit. 580 Result = Result*10 + (Str[0] - '0'); 581 582 // Eat the digit. 583 Str = Str.substr(1); 584 } while (!Str.empty() && Str[0] >= '0' && Str[0] <= '9'); 585 586 return Result; 587 } 588 589 void Triple::getOSVersion(unsigned &Major, unsigned &Minor, 590 unsigned &Micro) const { 591 StringRef OSName = getOSName(); 592 593 // Assume that the OS portion of the triple starts with the canonical name. 594 StringRef OSTypeName = getOSTypeName(getOS()); 595 if (OSName.startswith(OSTypeName)) 596 OSName = OSName.substr(OSTypeName.size()); 597 598 // Any unset version defaults to 0. 599 Major = Minor = Micro = 0; 600 601 // Parse up to three components. 602 unsigned *Components[3] = { &Major, &Minor, &Micro }; 603 for (unsigned i = 0; i != 3; ++i) { 604 if (OSName.empty() || OSName[0] < '0' || OSName[0] > '9') 605 break; 606 607 // Consume the leading number. 608 *Components[i] = EatNumber(OSName); 609 610 // Consume the separator, if present. 611 if (OSName.startswith(".")) 612 OSName = OSName.substr(1); 613 } 614 } 615 616 bool Triple::getMacOSXVersion(unsigned &Major, unsigned &Minor, 617 unsigned &Micro) const { 618 getOSVersion(Major, Minor, Micro); 619 620 switch (getOS()) { 621 default: assert(0 && "unexpected OS for Darwin triple"); 622 case Darwin: 623 // Default to darwin8, i.e., MacOSX 10.4. 624 if (Major == 0) 625 Major = 8; 626 // Darwin version numbers are skewed from OS X versions. 627 if (Major < 4) 628 return false; 629 Micro = 0; 630 Minor = Major - 4; 631 Major = 10; 632 break; 633 case MacOSX: 634 // Default to 10.4. 635 if (Major == 0) { 636 Major = 10; 637 Minor = 4; 638 } 639 if (Major != 10) 640 return false; 641 break; 642 case IOS: 643 // Ignore the version from the triple. This is only handled because the 644 // the clang driver combines OS X and IOS support into a common Darwin 645 // toolchain that wants to know the OS X version number even when targeting 646 // IOS. 647 Major = 10; 648 Minor = 4; 649 Micro = 0; 650 break; 651 } 652 return true; 653 } 654 655 void Triple::setTriple(const Twine &Str) { 656 Data = Str.str(); 657 Arch = InvalidArch; 658 } 659 660 void Triple::setArch(ArchType Kind) { 661 setArchName(getArchTypeName(Kind)); 662 } 663 664 void Triple::setVendor(VendorType Kind) { 665 setVendorName(getVendorTypeName(Kind)); 666 } 667 668 void Triple::setOS(OSType Kind) { 669 setOSName(getOSTypeName(Kind)); 670 } 671 672 void Triple::setEnvironment(EnvironmentType Kind) { 673 setEnvironmentName(getEnvironmentTypeName(Kind)); 674 } 675 676 void Triple::setArchName(StringRef Str) { 677 // Work around a miscompilation bug for Twines in gcc 4.0.3. 678 SmallString<64> Triple; 679 Triple += Str; 680 Triple += "-"; 681 Triple += getVendorName(); 682 Triple += "-"; 683 Triple += getOSAndEnvironmentName(); 684 setTriple(Triple.str()); 685 } 686 687 void Triple::setVendorName(StringRef Str) { 688 setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName()); 689 } 690 691 void Triple::setOSName(StringRef Str) { 692 if (hasEnvironment()) 693 setTriple(getArchName() + "-" + getVendorName() + "-" + Str + 694 "-" + getEnvironmentName()); 695 else 696 setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 697 } 698 699 void Triple::setEnvironmentName(StringRef Str) { 700 setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() + 701 "-" + Str); 702 } 703 704 void Triple::setOSAndEnvironmentName(StringRef Str) { 705 setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 706 } 707 708 static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) { 709 switch (Arch) { 710 case llvm::Triple::UnknownArch: 711 case llvm::Triple::InvalidArch: 712 return 0; 713 714 case llvm::Triple::msp430: 715 return 16; 716 717 case llvm::Triple::amdil: 718 case llvm::Triple::arm: 719 case llvm::Triple::cellspu: 720 case llvm::Triple::hexagon: 721 case llvm::Triple::le32: 722 case llvm::Triple::mblaze: 723 case llvm::Triple::mips: 724 case llvm::Triple::mipsel: 725 case llvm::Triple::ppc: 726 case llvm::Triple::ptx32: 727 case llvm::Triple::sparc: 728 case llvm::Triple::tce: 729 case llvm::Triple::thumb: 730 case llvm::Triple::x86: 731 case llvm::Triple::xcore: 732 return 32; 733 734 case llvm::Triple::mips64: 735 case llvm::Triple::mips64el: 736 case llvm::Triple::ppc64: 737 case llvm::Triple::ptx64: 738 case llvm::Triple::sparcv9: 739 case llvm::Triple::x86_64: 740 return 64; 741 } 742 llvm_unreachable("Invalid architecture value"); 743 } 744 745 bool Triple::isArch64Bit() const { 746 return getArchPointerBitWidth(getArch()) == 64; 747 } 748 749 bool Triple::isArch32Bit() const { 750 return getArchPointerBitWidth(getArch()) == 32; 751 } 752 753 bool Triple::isArch16Bit() const { 754 return getArchPointerBitWidth(getArch()) == 16; 755 } 756