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/STLExtras.h" 12 #include "llvm/ADT/SmallString.h" 13 #include "llvm/ADT/StringSwitch.h" 14 #include "llvm/Support/ErrorHandling.h" 15 #include "llvm/Support/TargetParser.h" 16 #include "llvm/Support/Host.h" 17 #include <cstring> 18 using namespace llvm; 19 20 const char *Triple::getArchTypeName(ArchType Kind) { 21 switch (Kind) { 22 case UnknownArch: return "unknown"; 23 24 case aarch64: return "aarch64"; 25 case aarch64_be: return "aarch64_be"; 26 case arm: return "arm"; 27 case armeb: return "armeb"; 28 case avr: return "avr"; 29 case bpfel: return "bpfel"; 30 case bpfeb: return "bpfeb"; 31 case hexagon: return "hexagon"; 32 case mips: return "mips"; 33 case mipsel: return "mipsel"; 34 case mips64: return "mips64"; 35 case mips64el: return "mips64el"; 36 case msp430: return "msp430"; 37 case ppc64: return "powerpc64"; 38 case ppc64le: return "powerpc64le"; 39 case ppc: return "powerpc"; 40 case r600: return "r600"; 41 case amdgcn: return "amdgcn"; 42 case sparc: return "sparc"; 43 case sparcv9: return "sparcv9"; 44 case sparcel: return "sparcel"; 45 case systemz: return "s390x"; 46 case tce: return "tce"; 47 case thumb: return "thumb"; 48 case thumbeb: return "thumbeb"; 49 case x86: return "i386"; 50 case x86_64: return "x86_64"; 51 case xcore: return "xcore"; 52 case nvptx: return "nvptx"; 53 case nvptx64: return "nvptx64"; 54 case le32: return "le32"; 55 case le64: return "le64"; 56 case amdil: return "amdil"; 57 case amdil64: return "amdil64"; 58 case hsail: return "hsail"; 59 case hsail64: return "hsail64"; 60 case spir: return "spir"; 61 case spir64: return "spir64"; 62 case kalimba: return "kalimba"; 63 case lanai: return "lanai"; 64 case shave: return "shave"; 65 case wasm32: return "wasm32"; 66 case wasm64: return "wasm64"; 67 } 68 69 llvm_unreachable("Invalid ArchType!"); 70 } 71 72 const char *Triple::getArchTypePrefix(ArchType Kind) { 73 switch (Kind) { 74 default: 75 return nullptr; 76 77 case aarch64: 78 case aarch64_be: return "aarch64"; 79 80 case arm: 81 case armeb: 82 case thumb: 83 case thumbeb: return "arm"; 84 85 case avr: return "avr"; 86 87 case ppc64: 88 case ppc64le: 89 case ppc: return "ppc"; 90 91 case mips: 92 case mipsel: 93 case mips64: 94 case mips64el: return "mips"; 95 96 case hexagon: return "hexagon"; 97 98 case amdgcn: return "amdgcn"; 99 case r600: return "r600"; 100 101 case bpfel: 102 case bpfeb: return "bpf"; 103 104 case sparcv9: 105 case sparcel: 106 case sparc: return "sparc"; 107 108 case systemz: return "s390"; 109 110 case x86: 111 case x86_64: return "x86"; 112 113 case xcore: return "xcore"; 114 115 case nvptx: return "nvptx"; 116 case nvptx64: return "nvptx"; 117 118 case le32: return "le32"; 119 case le64: return "le64"; 120 121 case amdil: 122 case amdil64: return "amdil"; 123 124 case hsail: 125 case hsail64: return "hsail"; 126 127 case spir: 128 case spir64: return "spir"; 129 case kalimba: return "kalimba"; 130 case lanai: return "lanai"; 131 case shave: return "shave"; 132 case wasm32: 133 case wasm64: return "wasm"; 134 } 135 } 136 137 const char *Triple::getVendorTypeName(VendorType Kind) { 138 switch (Kind) { 139 case UnknownVendor: return "unknown"; 140 141 case Apple: return "apple"; 142 case PC: return "pc"; 143 case SCEI: return "scei"; 144 case BGP: return "bgp"; 145 case BGQ: return "bgq"; 146 case Freescale: return "fsl"; 147 case IBM: return "ibm"; 148 case ImaginationTechnologies: return "img"; 149 case MipsTechnologies: return "mti"; 150 case NVIDIA: return "nvidia"; 151 case CSR: return "csr"; 152 case Myriad: return "myriad"; 153 case AMD: return "amd"; 154 case Mesa: return "mesa"; 155 } 156 157 llvm_unreachable("Invalid VendorType!"); 158 } 159 160 const char *Triple::getOSTypeName(OSType Kind) { 161 switch (Kind) { 162 case UnknownOS: return "unknown"; 163 164 case CloudABI: return "cloudabi"; 165 case Darwin: return "darwin"; 166 case DragonFly: return "dragonfly"; 167 case FreeBSD: return "freebsd"; 168 case IOS: return "ios"; 169 case KFreeBSD: return "kfreebsd"; 170 case Linux: return "linux"; 171 case Lv2: return "lv2"; 172 case MacOSX: return "macosx"; 173 case NetBSD: return "netbsd"; 174 case OpenBSD: return "openbsd"; 175 case Solaris: return "solaris"; 176 case Win32: return "windows"; 177 case Haiku: return "haiku"; 178 case Minix: return "minix"; 179 case RTEMS: return "rtems"; 180 case NaCl: return "nacl"; 181 case CNK: return "cnk"; 182 case Bitrig: return "bitrig"; 183 case AIX: return "aix"; 184 case CUDA: return "cuda"; 185 case NVCL: return "nvcl"; 186 case AMDHSA: return "amdhsa"; 187 case PS4: return "ps4"; 188 case ELFIAMCU: return "elfiamcu"; 189 case TvOS: return "tvos"; 190 case WatchOS: return "watchos"; 191 case Mesa3D: return "mesa3d"; 192 } 193 194 llvm_unreachable("Invalid OSType"); 195 } 196 197 const char *Triple::getEnvironmentTypeName(EnvironmentType Kind) { 198 switch (Kind) { 199 case UnknownEnvironment: return "unknown"; 200 case GNU: return "gnu"; 201 case GNUEABIHF: return "gnueabihf"; 202 case GNUEABI: return "gnueabi"; 203 case GNUX32: return "gnux32"; 204 case CODE16: return "code16"; 205 case EABI: return "eabi"; 206 case EABIHF: return "eabihf"; 207 case Android: return "android"; 208 case Musl: return "musl"; 209 case MuslEABI: return "musleabi"; 210 case MuslEABIHF: return "musleabihf"; 211 case MSVC: return "msvc"; 212 case Itanium: return "itanium"; 213 case Cygnus: return "cygnus"; 214 case AMDOpenCL: return "amdopencl"; 215 case CoreCLR: return "coreclr"; 216 } 217 218 llvm_unreachable("Invalid EnvironmentType!"); 219 } 220 221 static Triple::ArchType parseBPFArch(StringRef ArchName) { 222 if (ArchName.equals("bpf")) { 223 if (sys::IsLittleEndianHost) 224 return Triple::bpfel; 225 else 226 return Triple::bpfeb; 227 } else if (ArchName.equals("bpf_be") || ArchName.equals("bpfeb")) { 228 return Triple::bpfeb; 229 } else if (ArchName.equals("bpf_le") || ArchName.equals("bpfel")) { 230 return Triple::bpfel; 231 } else { 232 return Triple::UnknownArch; 233 } 234 } 235 236 Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) { 237 Triple::ArchType BPFArch(parseBPFArch(Name)); 238 return StringSwitch<Triple::ArchType>(Name) 239 .Case("aarch64", aarch64) 240 .Case("aarch64_be", aarch64_be) 241 .Case("arm64", aarch64) // "arm64" is an alias for "aarch64" 242 .Case("arm", arm) 243 .Case("armeb", armeb) 244 .Case("avr", avr) 245 .StartsWith("bpf", BPFArch) 246 .Case("mips", mips) 247 .Case("mipsel", mipsel) 248 .Case("mips64", mips64) 249 .Case("mips64el", mips64el) 250 .Case("msp430", msp430) 251 .Case("ppc64", ppc64) 252 .Case("ppc32", ppc) 253 .Case("ppc", ppc) 254 .Case("ppc64le", ppc64le) 255 .Case("r600", r600) 256 .Case("amdgcn", amdgcn) 257 .Case("hexagon", hexagon) 258 .Case("sparc", sparc) 259 .Case("sparcel", sparcel) 260 .Case("sparcv9", sparcv9) 261 .Case("systemz", systemz) 262 .Case("tce", tce) 263 .Case("thumb", thumb) 264 .Case("thumbeb", thumbeb) 265 .Case("x86", x86) 266 .Case("x86-64", x86_64) 267 .Case("xcore", xcore) 268 .Case("nvptx", nvptx) 269 .Case("nvptx64", nvptx64) 270 .Case("le32", le32) 271 .Case("le64", le64) 272 .Case("amdil", amdil) 273 .Case("amdil64", amdil64) 274 .Case("hsail", hsail) 275 .Case("hsail64", hsail64) 276 .Case("spir", spir) 277 .Case("spir64", spir64) 278 .Case("kalimba", kalimba) 279 .Case("lanai", lanai) 280 .Case("shave", shave) 281 .Case("wasm32", wasm32) 282 .Case("wasm64", wasm64) 283 .Default(UnknownArch); 284 } 285 286 static Triple::ArchType parseARMArch(StringRef ArchName) { 287 unsigned ISA = ARM::parseArchISA(ArchName); 288 unsigned ENDIAN = ARM::parseArchEndian(ArchName); 289 290 Triple::ArchType arch = Triple::UnknownArch; 291 switch (ENDIAN) { 292 case ARM::EK_LITTLE: { 293 switch (ISA) { 294 case ARM::IK_ARM: 295 arch = Triple::arm; 296 break; 297 case ARM::IK_THUMB: 298 arch = Triple::thumb; 299 break; 300 case ARM::IK_AARCH64: 301 arch = Triple::aarch64; 302 break; 303 } 304 break; 305 } 306 case ARM::EK_BIG: { 307 switch (ISA) { 308 case ARM::IK_ARM: 309 arch = Triple::armeb; 310 break; 311 case ARM::IK_THUMB: 312 arch = Triple::thumbeb; 313 break; 314 case ARM::IK_AARCH64: 315 arch = Triple::aarch64_be; 316 break; 317 } 318 break; 319 } 320 } 321 322 ArchName = ARM::getCanonicalArchName(ArchName); 323 if (ArchName.empty()) 324 return Triple::UnknownArch; 325 326 // Thumb only exists in v4+ 327 if (ISA == ARM::IK_THUMB && 328 (ArchName.startswith("v2") || ArchName.startswith("v3"))) 329 return Triple::UnknownArch; 330 331 // Thumb only for v6m 332 unsigned Profile = ARM::parseArchProfile(ArchName); 333 unsigned Version = ARM::parseArchVersion(ArchName); 334 if (Profile == ARM::PK_M && Version == 6) { 335 if (ENDIAN == ARM::EK_BIG) 336 return Triple::thumbeb; 337 else 338 return Triple::thumb; 339 } 340 341 return arch; 342 } 343 344 static Triple::ArchType parseArch(StringRef ArchName) { 345 auto AT = StringSwitch<Triple::ArchType>(ArchName) 346 .Cases("i386", "i486", "i586", "i686", Triple::x86) 347 // FIXME: Do we need to support these? 348 .Cases("i786", "i886", "i986", Triple::x86) 349 .Cases("amd64", "x86_64", "x86_64h", Triple::x86_64) 350 .Cases("powerpc", "ppc32", Triple::ppc) 351 .Cases("powerpc64", "ppu", "ppc64", Triple::ppc64) 352 .Cases("powerpc64le", "ppc64le", Triple::ppc64le) 353 .Case("xscale", Triple::arm) 354 .Case("xscaleeb", Triple::armeb) 355 .Case("aarch64", Triple::aarch64) 356 .Case("aarch64_be", Triple::aarch64_be) 357 .Case("arm64", Triple::aarch64) 358 .Case("arm", Triple::arm) 359 .Case("armeb", Triple::armeb) 360 .Case("thumb", Triple::thumb) 361 .Case("thumbeb", Triple::thumbeb) 362 .Case("avr", Triple::avr) 363 .Case("msp430", Triple::msp430) 364 .Cases("mips", "mipseb", "mipsallegrex", Triple::mips) 365 .Cases("mipsel", "mipsallegrexel", Triple::mipsel) 366 .Cases("mips64", "mips64eb", Triple::mips64) 367 .Case("mips64el", Triple::mips64el) 368 .Case("r600", Triple::r600) 369 .Case("amdgcn", Triple::amdgcn) 370 .Case("hexagon", Triple::hexagon) 371 .Cases("s390x", "systemz", Triple::systemz) 372 .Case("sparc", Triple::sparc) 373 .Case("sparcel", Triple::sparcel) 374 .Cases("sparcv9", "sparc64", Triple::sparcv9) 375 .Case("tce", Triple::tce) 376 .Case("xcore", Triple::xcore) 377 .Case("nvptx", Triple::nvptx) 378 .Case("nvptx64", Triple::nvptx64) 379 .Case("le32", Triple::le32) 380 .Case("le64", Triple::le64) 381 .Case("amdil", Triple::amdil) 382 .Case("amdil64", Triple::amdil64) 383 .Case("hsail", Triple::hsail) 384 .Case("hsail64", Triple::hsail64) 385 .Case("spir", Triple::spir) 386 .Case("spir64", Triple::spir64) 387 .StartsWith("kalimba", Triple::kalimba) 388 .Case("lanai", Triple::lanai) 389 .Case("shave", Triple::shave) 390 .Case("wasm32", Triple::wasm32) 391 .Case("wasm64", Triple::wasm64) 392 .Default(Triple::UnknownArch); 393 394 // Some architectures require special parsing logic just to compute the 395 // ArchType result. 396 if (AT == Triple::UnknownArch) { 397 if (ArchName.startswith("arm") || ArchName.startswith("thumb") || 398 ArchName.startswith("aarch64")) 399 return parseARMArch(ArchName); 400 if (ArchName.startswith("bpf")) 401 return parseBPFArch(ArchName); 402 } 403 404 return AT; 405 } 406 407 static Triple::VendorType parseVendor(StringRef VendorName) { 408 return StringSwitch<Triple::VendorType>(VendorName) 409 .Case("apple", Triple::Apple) 410 .Case("pc", Triple::PC) 411 .Case("scei", Triple::SCEI) 412 .Case("bgp", Triple::BGP) 413 .Case("bgq", Triple::BGQ) 414 .Case("fsl", Triple::Freescale) 415 .Case("ibm", Triple::IBM) 416 .Case("img", Triple::ImaginationTechnologies) 417 .Case("mti", Triple::MipsTechnologies) 418 .Case("nvidia", Triple::NVIDIA) 419 .Case("csr", Triple::CSR) 420 .Case("myriad", Triple::Myriad) 421 .Case("amd", Triple::AMD) 422 .Case("mesa", Triple::Mesa) 423 .Default(Triple::UnknownVendor); 424 } 425 426 static Triple::OSType parseOS(StringRef OSName) { 427 return StringSwitch<Triple::OSType>(OSName) 428 .StartsWith("cloudabi", Triple::CloudABI) 429 .StartsWith("darwin", Triple::Darwin) 430 .StartsWith("dragonfly", Triple::DragonFly) 431 .StartsWith("freebsd", Triple::FreeBSD) 432 .StartsWith("ios", Triple::IOS) 433 .StartsWith("kfreebsd", Triple::KFreeBSD) 434 .StartsWith("linux", Triple::Linux) 435 .StartsWith("lv2", Triple::Lv2) 436 .StartsWith("macosx", Triple::MacOSX) 437 .StartsWith("netbsd", Triple::NetBSD) 438 .StartsWith("openbsd", Triple::OpenBSD) 439 .StartsWith("solaris", Triple::Solaris) 440 .StartsWith("win32", Triple::Win32) 441 .StartsWith("windows", Triple::Win32) 442 .StartsWith("haiku", Triple::Haiku) 443 .StartsWith("minix", Triple::Minix) 444 .StartsWith("rtems", Triple::RTEMS) 445 .StartsWith("nacl", Triple::NaCl) 446 .StartsWith("cnk", Triple::CNK) 447 .StartsWith("bitrig", Triple::Bitrig) 448 .StartsWith("aix", Triple::AIX) 449 .StartsWith("cuda", Triple::CUDA) 450 .StartsWith("nvcl", Triple::NVCL) 451 .StartsWith("amdhsa", Triple::AMDHSA) 452 .StartsWith("ps4", Triple::PS4) 453 .StartsWith("elfiamcu", Triple::ELFIAMCU) 454 .StartsWith("tvos", Triple::TvOS) 455 .StartsWith("watchos", Triple::WatchOS) 456 .StartsWith("mesa3d", Triple::Mesa3D) 457 .Default(Triple::UnknownOS); 458 } 459 460 static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) { 461 return StringSwitch<Triple::EnvironmentType>(EnvironmentName) 462 .StartsWith("eabihf", Triple::EABIHF) 463 .StartsWith("eabi", Triple::EABI) 464 .StartsWith("gnueabihf", Triple::GNUEABIHF) 465 .StartsWith("gnueabi", Triple::GNUEABI) 466 .StartsWith("gnux32", Triple::GNUX32) 467 .StartsWith("code16", Triple::CODE16) 468 .StartsWith("gnu", Triple::GNU) 469 .StartsWith("android", Triple::Android) 470 .StartsWith("musleabihf", Triple::MuslEABIHF) 471 .StartsWith("musleabi", Triple::MuslEABI) 472 .StartsWith("musl", Triple::Musl) 473 .StartsWith("msvc", Triple::MSVC) 474 .StartsWith("itanium", Triple::Itanium) 475 .StartsWith("cygnus", Triple::Cygnus) 476 .StartsWith("amdopencl", Triple::AMDOpenCL) 477 .StartsWith("coreclr", Triple::CoreCLR) 478 .Default(Triple::UnknownEnvironment); 479 } 480 481 static Triple::ObjectFormatType parseFormat(StringRef EnvironmentName) { 482 return StringSwitch<Triple::ObjectFormatType>(EnvironmentName) 483 .EndsWith("coff", Triple::COFF) 484 .EndsWith("elf", Triple::ELF) 485 .EndsWith("macho", Triple::MachO) 486 .Default(Triple::UnknownObjectFormat); 487 } 488 489 static Triple::SubArchType parseSubArch(StringRef SubArchName) { 490 StringRef ARMSubArch = ARM::getCanonicalArchName(SubArchName); 491 492 // For now, this is the small part. Early return. 493 if (ARMSubArch.empty()) 494 return StringSwitch<Triple::SubArchType>(SubArchName) 495 .EndsWith("kalimba3", Triple::KalimbaSubArch_v3) 496 .EndsWith("kalimba4", Triple::KalimbaSubArch_v4) 497 .EndsWith("kalimba5", Triple::KalimbaSubArch_v5) 498 .Default(Triple::NoSubArch); 499 500 // ARM sub arch. 501 switch(ARM::parseArch(ARMSubArch)) { 502 case ARM::AK_ARMV4: 503 return Triple::NoSubArch; 504 case ARM::AK_ARMV4T: 505 return Triple::ARMSubArch_v4t; 506 case ARM::AK_ARMV5T: 507 return Triple::ARMSubArch_v5; 508 case ARM::AK_ARMV5TE: 509 case ARM::AK_IWMMXT: 510 case ARM::AK_IWMMXT2: 511 case ARM::AK_XSCALE: 512 case ARM::AK_ARMV5TEJ: 513 return Triple::ARMSubArch_v5te; 514 case ARM::AK_ARMV6: 515 return Triple::ARMSubArch_v6; 516 case ARM::AK_ARMV6K: 517 case ARM::AK_ARMV6KZ: 518 return Triple::ARMSubArch_v6k; 519 case ARM::AK_ARMV6T2: 520 return Triple::ARMSubArch_v6t2; 521 case ARM::AK_ARMV6M: 522 return Triple::ARMSubArch_v6m; 523 case ARM::AK_ARMV7A: 524 case ARM::AK_ARMV7R: 525 return Triple::ARMSubArch_v7; 526 case ARM::AK_ARMV7K: 527 return Triple::ARMSubArch_v7k; 528 case ARM::AK_ARMV7M: 529 return Triple::ARMSubArch_v7m; 530 case ARM::AK_ARMV7S: 531 return Triple::ARMSubArch_v7s; 532 case ARM::AK_ARMV7EM: 533 return Triple::ARMSubArch_v7em; 534 case ARM::AK_ARMV8A: 535 return Triple::ARMSubArch_v8; 536 case ARM::AK_ARMV8_1A: 537 return Triple::ARMSubArch_v8_1a; 538 case ARM::AK_ARMV8_2A: 539 return Triple::ARMSubArch_v8_2a; 540 case ARM::AK_ARMV8MBaseline: 541 return Triple::ARMSubArch_v8m_baseline; 542 case ARM::AK_ARMV8MMainline: 543 return Triple::ARMSubArch_v8m_mainline; 544 default: 545 return Triple::NoSubArch; 546 } 547 } 548 549 static const char *getObjectFormatTypeName(Triple::ObjectFormatType Kind) { 550 switch (Kind) { 551 case Triple::UnknownObjectFormat: return ""; 552 case Triple::COFF: return "coff"; 553 case Triple::ELF: return "elf"; 554 case Triple::MachO: return "macho"; 555 } 556 llvm_unreachable("unknown object format type"); 557 } 558 559 static Triple::ObjectFormatType getDefaultFormat(const Triple &T) { 560 switch (T.getArch()) { 561 case Triple::UnknownArch: 562 case Triple::aarch64: 563 case Triple::arm: 564 case Triple::thumb: 565 case Triple::x86: 566 case Triple::x86_64: 567 if (T.isOSDarwin()) 568 return Triple::MachO; 569 else if (T.isOSWindows()) 570 return Triple::COFF; 571 return Triple::ELF; 572 573 case Triple::aarch64_be: 574 case Triple::amdgcn: 575 case Triple::amdil: 576 case Triple::amdil64: 577 case Triple::armeb: 578 case Triple::avr: 579 case Triple::bpfeb: 580 case Triple::bpfel: 581 case Triple::hexagon: 582 case Triple::lanai: 583 case Triple::hsail: 584 case Triple::hsail64: 585 case Triple::kalimba: 586 case Triple::le32: 587 case Triple::le64: 588 case Triple::mips: 589 case Triple::mips64: 590 case Triple::mips64el: 591 case Triple::mipsel: 592 case Triple::msp430: 593 case Triple::nvptx: 594 case Triple::nvptx64: 595 case Triple::ppc64le: 596 case Triple::r600: 597 case Triple::shave: 598 case Triple::sparc: 599 case Triple::sparcel: 600 case Triple::sparcv9: 601 case Triple::spir: 602 case Triple::spir64: 603 case Triple::systemz: 604 case Triple::tce: 605 case Triple::thumbeb: 606 case Triple::wasm32: 607 case Triple::wasm64: 608 case Triple::xcore: 609 return Triple::ELF; 610 611 case Triple::ppc: 612 case Triple::ppc64: 613 if (T.isOSDarwin()) 614 return Triple::MachO; 615 return Triple::ELF; 616 } 617 llvm_unreachable("unknown architecture"); 618 } 619 620 /// \brief Construct a triple from the string representation provided. 621 /// 622 /// This stores the string representation and parses the various pieces into 623 /// enum members. 624 Triple::Triple(const Twine &Str) 625 : Data(Str.str()), Arch(UnknownArch), SubArch(NoSubArch), 626 Vendor(UnknownVendor), OS(UnknownOS), Environment(UnknownEnvironment), 627 ObjectFormat(UnknownObjectFormat) { 628 // Do minimal parsing by hand here. 629 SmallVector<StringRef, 4> Components; 630 StringRef(Data).split(Components, '-', /*MaxSplit*/ 3); 631 if (Components.size() > 0) { 632 Arch = parseArch(Components[0]); 633 SubArch = parseSubArch(Components[0]); 634 if (Components.size() > 1) { 635 Vendor = parseVendor(Components[1]); 636 if (Components.size() > 2) { 637 OS = parseOS(Components[2]); 638 if (Components.size() > 3) { 639 Environment = parseEnvironment(Components[3]); 640 ObjectFormat = parseFormat(Components[3]); 641 } 642 } 643 } 644 } 645 if (ObjectFormat == UnknownObjectFormat) 646 ObjectFormat = getDefaultFormat(*this); 647 } 648 649 /// \brief Construct a triple from string representations of the architecture, 650 /// vendor, and OS. 651 /// 652 /// This joins each argument into a canonical string representation and parses 653 /// them into enum members. It leaves the environment unknown and omits it from 654 /// the string representation. 655 Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr) 656 : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr).str()), 657 Arch(parseArch(ArchStr.str())), 658 SubArch(parseSubArch(ArchStr.str())), 659 Vendor(parseVendor(VendorStr.str())), 660 OS(parseOS(OSStr.str())), 661 Environment(), ObjectFormat(Triple::UnknownObjectFormat) { 662 ObjectFormat = getDefaultFormat(*this); 663 } 664 665 /// \brief Construct a triple from string representations of the architecture, 666 /// vendor, OS, and environment. 667 /// 668 /// This joins each argument into a canonical string representation and parses 669 /// them into enum members. 670 Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr, 671 const Twine &EnvironmentStr) 672 : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr + Twine('-') + 673 EnvironmentStr).str()), 674 Arch(parseArch(ArchStr.str())), 675 SubArch(parseSubArch(ArchStr.str())), 676 Vendor(parseVendor(VendorStr.str())), 677 OS(parseOS(OSStr.str())), 678 Environment(parseEnvironment(EnvironmentStr.str())), 679 ObjectFormat(parseFormat(EnvironmentStr.str())) { 680 if (ObjectFormat == Triple::UnknownObjectFormat) 681 ObjectFormat = getDefaultFormat(*this); 682 } 683 684 std::string Triple::normalize(StringRef Str) { 685 bool IsMinGW32 = false; 686 bool IsCygwin = false; 687 688 // Parse into components. 689 SmallVector<StringRef, 4> Components; 690 Str.split(Components, '-'); 691 692 // If the first component corresponds to a known architecture, preferentially 693 // use it for the architecture. If the second component corresponds to a 694 // known vendor, preferentially use it for the vendor, etc. This avoids silly 695 // component movement when a component parses as (eg) both a valid arch and a 696 // valid os. 697 ArchType Arch = UnknownArch; 698 if (Components.size() > 0) 699 Arch = parseArch(Components[0]); 700 VendorType Vendor = UnknownVendor; 701 if (Components.size() > 1) 702 Vendor = parseVendor(Components[1]); 703 OSType OS = UnknownOS; 704 if (Components.size() > 2) { 705 OS = parseOS(Components[2]); 706 IsCygwin = Components[2].startswith("cygwin"); 707 IsMinGW32 = Components[2].startswith("mingw"); 708 } 709 EnvironmentType Environment = UnknownEnvironment; 710 if (Components.size() > 3) 711 Environment = parseEnvironment(Components[3]); 712 ObjectFormatType ObjectFormat = UnknownObjectFormat; 713 if (Components.size() > 4) 714 ObjectFormat = parseFormat(Components[4]); 715 716 // Note which components are already in their final position. These will not 717 // be moved. 718 bool Found[4]; 719 Found[0] = Arch != UnknownArch; 720 Found[1] = Vendor != UnknownVendor; 721 Found[2] = OS != UnknownOS; 722 Found[3] = Environment != UnknownEnvironment; 723 724 // If they are not there already, permute the components into their canonical 725 // positions by seeing if they parse as a valid architecture, and if so moving 726 // the component to the architecture position etc. 727 for (unsigned Pos = 0; Pos != array_lengthof(Found); ++Pos) { 728 if (Found[Pos]) 729 continue; // Already in the canonical position. 730 731 for (unsigned Idx = 0; Idx != Components.size(); ++Idx) { 732 // Do not reparse any components that already matched. 733 if (Idx < array_lengthof(Found) && Found[Idx]) 734 continue; 735 736 // Does this component parse as valid for the target position? 737 bool Valid = false; 738 StringRef Comp = Components[Idx]; 739 switch (Pos) { 740 default: llvm_unreachable("unexpected component type!"); 741 case 0: 742 Arch = parseArch(Comp); 743 Valid = Arch != UnknownArch; 744 break; 745 case 1: 746 Vendor = parseVendor(Comp); 747 Valid = Vendor != UnknownVendor; 748 break; 749 case 2: 750 OS = parseOS(Comp); 751 IsCygwin = Comp.startswith("cygwin"); 752 IsMinGW32 = Comp.startswith("mingw"); 753 Valid = OS != UnknownOS || IsCygwin || IsMinGW32; 754 break; 755 case 3: 756 Environment = parseEnvironment(Comp); 757 Valid = Environment != UnknownEnvironment; 758 if (!Valid) { 759 ObjectFormat = parseFormat(Comp); 760 Valid = ObjectFormat != UnknownObjectFormat; 761 } 762 break; 763 } 764 if (!Valid) 765 continue; // Nope, try the next component. 766 767 // Move the component to the target position, pushing any non-fixed 768 // components that are in the way to the right. This tends to give 769 // good results in the common cases of a forgotten vendor component 770 // or a wrongly positioned environment. 771 if (Pos < Idx) { 772 // Insert left, pushing the existing components to the right. For 773 // example, a-b-i386 -> i386-a-b when moving i386 to the front. 774 StringRef CurrentComponent(""); // The empty component. 775 // Replace the component we are moving with an empty component. 776 std::swap(CurrentComponent, Components[Idx]); 777 // Insert the component being moved at Pos, displacing any existing 778 // components to the right. 779 for (unsigned i = Pos; !CurrentComponent.empty(); ++i) { 780 // Skip over any fixed components. 781 while (i < array_lengthof(Found) && Found[i]) 782 ++i; 783 // Place the component at the new position, getting the component 784 // that was at this position - it will be moved right. 785 std::swap(CurrentComponent, Components[i]); 786 } 787 } else if (Pos > Idx) { 788 // Push right by inserting empty components until the component at Idx 789 // reaches the target position Pos. For example, pc-a -> -pc-a when 790 // moving pc to the second position. 791 do { 792 // Insert one empty component at Idx. 793 StringRef CurrentComponent(""); // The empty component. 794 for (unsigned i = Idx; i < Components.size();) { 795 // Place the component at the new position, getting the component 796 // that was at this position - it will be moved right. 797 std::swap(CurrentComponent, Components[i]); 798 // If it was placed on top of an empty component then we are done. 799 if (CurrentComponent.empty()) 800 break; 801 // Advance to the next component, skipping any fixed components. 802 while (++i < array_lengthof(Found) && Found[i]) 803 ; 804 } 805 // The last component was pushed off the end - append it. 806 if (!CurrentComponent.empty()) 807 Components.push_back(CurrentComponent); 808 809 // Advance Idx to the component's new position. 810 while (++Idx < array_lengthof(Found) && Found[Idx]) 811 ; 812 } while (Idx < Pos); // Add more until the final position is reached. 813 } 814 assert(Pos < Components.size() && Components[Pos] == Comp && 815 "Component moved wrong!"); 816 Found[Pos] = true; 817 break; 818 } 819 } 820 821 // Special case logic goes here. At this point Arch, Vendor and OS have the 822 // correct values for the computed components. 823 std::string NormalizedEnvironment; 824 if (Environment == Triple::Android && Components[3].startswith("androideabi")) { 825 StringRef AndroidVersion = Components[3].drop_front(strlen("androideabi")); 826 if (AndroidVersion.empty()) { 827 Components[3] = "android"; 828 } else { 829 NormalizedEnvironment = Twine("android", AndroidVersion).str(); 830 Components[3] = NormalizedEnvironment; 831 } 832 } 833 834 if (OS == Triple::Win32) { 835 Components.resize(4); 836 Components[2] = "windows"; 837 if (Environment == UnknownEnvironment) { 838 if (ObjectFormat == UnknownObjectFormat || ObjectFormat == Triple::COFF) 839 Components[3] = "msvc"; 840 else 841 Components[3] = getObjectFormatTypeName(ObjectFormat); 842 } 843 } else if (IsMinGW32) { 844 Components.resize(4); 845 Components[2] = "windows"; 846 Components[3] = "gnu"; 847 } else if (IsCygwin) { 848 Components.resize(4); 849 Components[2] = "windows"; 850 Components[3] = "cygnus"; 851 } 852 if (IsMinGW32 || IsCygwin || 853 (OS == Triple::Win32 && Environment != UnknownEnvironment)) { 854 if (ObjectFormat != UnknownObjectFormat && ObjectFormat != Triple::COFF) { 855 Components.resize(5); 856 Components[4] = getObjectFormatTypeName(ObjectFormat); 857 } 858 } 859 860 // Stick the corrected components back together to form the normalized string. 861 std::string Normalized; 862 for (unsigned i = 0, e = Components.size(); i != e; ++i) { 863 if (i) Normalized += '-'; 864 Normalized += Components[i]; 865 } 866 return Normalized; 867 } 868 869 StringRef Triple::getArchName() const { 870 return StringRef(Data).split('-').first; // Isolate first component 871 } 872 873 StringRef Triple::getVendorName() const { 874 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 875 return Tmp.split('-').first; // Isolate second component 876 } 877 878 StringRef Triple::getOSName() const { 879 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 880 Tmp = Tmp.split('-').second; // Strip second component 881 return Tmp.split('-').first; // Isolate third component 882 } 883 884 StringRef Triple::getEnvironmentName() const { 885 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 886 Tmp = Tmp.split('-').second; // Strip second component 887 return Tmp.split('-').second; // Strip third component 888 } 889 890 StringRef Triple::getOSAndEnvironmentName() const { 891 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 892 return Tmp.split('-').second; // Strip second component 893 } 894 895 static unsigned EatNumber(StringRef &Str) { 896 assert(!Str.empty() && Str[0] >= '0' && Str[0] <= '9' && "Not a number"); 897 unsigned Result = 0; 898 899 do { 900 // Consume the leading digit. 901 Result = Result*10 + (Str[0] - '0'); 902 903 // Eat the digit. 904 Str = Str.substr(1); 905 } while (!Str.empty() && Str[0] >= '0' && Str[0] <= '9'); 906 907 return Result; 908 } 909 910 static void parseVersionFromName(StringRef Name, unsigned &Major, 911 unsigned &Minor, unsigned &Micro) { 912 // Any unset version defaults to 0. 913 Major = Minor = Micro = 0; 914 915 // Parse up to three components. 916 unsigned *Components[3] = {&Major, &Minor, &Micro}; 917 for (unsigned i = 0; i != 3; ++i) { 918 if (Name.empty() || Name[0] < '0' || Name[0] > '9') 919 break; 920 921 // Consume the leading number. 922 *Components[i] = EatNumber(Name); 923 924 // Consume the separator, if present. 925 if (Name.startswith(".")) 926 Name = Name.substr(1); 927 } 928 } 929 930 void Triple::getEnvironmentVersion(unsigned &Major, unsigned &Minor, 931 unsigned &Micro) const { 932 StringRef EnvironmentName = getEnvironmentName(); 933 StringRef EnvironmentTypeName = getEnvironmentTypeName(getEnvironment()); 934 if (EnvironmentName.startswith(EnvironmentTypeName)) 935 EnvironmentName = EnvironmentName.substr(EnvironmentTypeName.size()); 936 937 parseVersionFromName(EnvironmentName, Major, Minor, Micro); 938 } 939 940 void Triple::getOSVersion(unsigned &Major, unsigned &Minor, 941 unsigned &Micro) const { 942 StringRef OSName = getOSName(); 943 // Assume that the OS portion of the triple starts with the canonical name. 944 StringRef OSTypeName = getOSTypeName(getOS()); 945 if (OSName.startswith(OSTypeName)) 946 OSName = OSName.substr(OSTypeName.size()); 947 948 parseVersionFromName(OSName, Major, Minor, Micro); 949 } 950 951 bool Triple::getMacOSXVersion(unsigned &Major, unsigned &Minor, 952 unsigned &Micro) const { 953 getOSVersion(Major, Minor, Micro); 954 955 switch (getOS()) { 956 default: llvm_unreachable("unexpected OS for Darwin triple"); 957 case Darwin: 958 // Default to darwin8, i.e., MacOSX 10.4. 959 if (Major == 0) 960 Major = 8; 961 // Darwin version numbers are skewed from OS X versions. 962 if (Major < 4) 963 return false; 964 Micro = 0; 965 Minor = Major - 4; 966 Major = 10; 967 break; 968 case MacOSX: 969 // Default to 10.4. 970 if (Major == 0) { 971 Major = 10; 972 Minor = 4; 973 } 974 if (Major != 10) 975 return false; 976 break; 977 case IOS: 978 case TvOS: 979 case WatchOS: 980 // Ignore the version from the triple. This is only handled because the 981 // the clang driver combines OS X and IOS support into a common Darwin 982 // toolchain that wants to know the OS X version number even when targeting 983 // IOS. 984 Major = 10; 985 Minor = 4; 986 Micro = 0; 987 break; 988 } 989 return true; 990 } 991 992 void Triple::getiOSVersion(unsigned &Major, unsigned &Minor, 993 unsigned &Micro) const { 994 switch (getOS()) { 995 default: llvm_unreachable("unexpected OS for Darwin triple"); 996 case Darwin: 997 case MacOSX: 998 // Ignore the version from the triple. This is only handled because the 999 // the clang driver combines OS X and IOS support into a common Darwin 1000 // toolchain that wants to know the iOS version number even when targeting 1001 // OS X. 1002 Major = 5; 1003 Minor = 0; 1004 Micro = 0; 1005 break; 1006 case IOS: 1007 case TvOS: 1008 getOSVersion(Major, Minor, Micro); 1009 // Default to 5.0 (or 7.0 for arm64). 1010 if (Major == 0) 1011 Major = (getArch() == aarch64) ? 7 : 5; 1012 break; 1013 case WatchOS: 1014 llvm_unreachable("conflicting triple info"); 1015 } 1016 } 1017 1018 void Triple::getWatchOSVersion(unsigned &Major, unsigned &Minor, 1019 unsigned &Micro) const { 1020 switch (getOS()) { 1021 default: llvm_unreachable("unexpected OS for Darwin triple"); 1022 case Darwin: 1023 case MacOSX: 1024 // Ignore the version from the triple. This is only handled because the 1025 // the clang driver combines OS X and IOS support into a common Darwin 1026 // toolchain that wants to know the iOS version number even when targeting 1027 // OS X. 1028 Major = 2; 1029 Minor = 0; 1030 Micro = 0; 1031 break; 1032 case WatchOS: 1033 getOSVersion(Major, Minor, Micro); 1034 if (Major == 0) 1035 Major = 2; 1036 break; 1037 case IOS: 1038 llvm_unreachable("conflicting triple info"); 1039 } 1040 } 1041 1042 void Triple::setTriple(const Twine &Str) { 1043 *this = Triple(Str); 1044 } 1045 1046 void Triple::setArch(ArchType Kind) { 1047 setArchName(getArchTypeName(Kind)); 1048 } 1049 1050 void Triple::setVendor(VendorType Kind) { 1051 setVendorName(getVendorTypeName(Kind)); 1052 } 1053 1054 void Triple::setOS(OSType Kind) { 1055 setOSName(getOSTypeName(Kind)); 1056 } 1057 1058 void Triple::setEnvironment(EnvironmentType Kind) { 1059 if (ObjectFormat == getDefaultFormat(*this)) 1060 return setEnvironmentName(getEnvironmentTypeName(Kind)); 1061 1062 setEnvironmentName((getEnvironmentTypeName(Kind) + Twine("-") + 1063 getObjectFormatTypeName(ObjectFormat)).str()); 1064 } 1065 1066 void Triple::setObjectFormat(ObjectFormatType Kind) { 1067 if (Environment == UnknownEnvironment) 1068 return setEnvironmentName(getObjectFormatTypeName(Kind)); 1069 1070 setEnvironmentName((getEnvironmentTypeName(Environment) + Twine("-") + 1071 getObjectFormatTypeName(Kind)).str()); 1072 } 1073 1074 void Triple::setArchName(StringRef Str) { 1075 // Work around a miscompilation bug for Twines in gcc 4.0.3. 1076 SmallString<64> Triple; 1077 Triple += Str; 1078 Triple += "-"; 1079 Triple += getVendorName(); 1080 Triple += "-"; 1081 Triple += getOSAndEnvironmentName(); 1082 setTriple(Triple); 1083 } 1084 1085 void Triple::setVendorName(StringRef Str) { 1086 setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName()); 1087 } 1088 1089 void Triple::setOSName(StringRef Str) { 1090 if (hasEnvironment()) 1091 setTriple(getArchName() + "-" + getVendorName() + "-" + Str + 1092 "-" + getEnvironmentName()); 1093 else 1094 setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 1095 } 1096 1097 void Triple::setEnvironmentName(StringRef Str) { 1098 setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() + 1099 "-" + Str); 1100 } 1101 1102 void Triple::setOSAndEnvironmentName(StringRef Str) { 1103 setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 1104 } 1105 1106 static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) { 1107 switch (Arch) { 1108 case llvm::Triple::UnknownArch: 1109 return 0; 1110 1111 case llvm::Triple::avr: 1112 case llvm::Triple::msp430: 1113 return 16; 1114 1115 case llvm::Triple::arm: 1116 case llvm::Triple::armeb: 1117 case llvm::Triple::hexagon: 1118 case llvm::Triple::le32: 1119 case llvm::Triple::mips: 1120 case llvm::Triple::mipsel: 1121 case llvm::Triple::nvptx: 1122 case llvm::Triple::ppc: 1123 case llvm::Triple::r600: 1124 case llvm::Triple::sparc: 1125 case llvm::Triple::sparcel: 1126 case llvm::Triple::tce: 1127 case llvm::Triple::thumb: 1128 case llvm::Triple::thumbeb: 1129 case llvm::Triple::x86: 1130 case llvm::Triple::xcore: 1131 case llvm::Triple::amdil: 1132 case llvm::Triple::hsail: 1133 case llvm::Triple::spir: 1134 case llvm::Triple::kalimba: 1135 case llvm::Triple::lanai: 1136 case llvm::Triple::shave: 1137 case llvm::Triple::wasm32: 1138 return 32; 1139 1140 case llvm::Triple::aarch64: 1141 case llvm::Triple::aarch64_be: 1142 case llvm::Triple::amdgcn: 1143 case llvm::Triple::bpfel: 1144 case llvm::Triple::bpfeb: 1145 case llvm::Triple::le64: 1146 case llvm::Triple::mips64: 1147 case llvm::Triple::mips64el: 1148 case llvm::Triple::nvptx64: 1149 case llvm::Triple::ppc64: 1150 case llvm::Triple::ppc64le: 1151 case llvm::Triple::sparcv9: 1152 case llvm::Triple::systemz: 1153 case llvm::Triple::x86_64: 1154 case llvm::Triple::amdil64: 1155 case llvm::Triple::hsail64: 1156 case llvm::Triple::spir64: 1157 case llvm::Triple::wasm64: 1158 return 64; 1159 } 1160 llvm_unreachable("Invalid architecture value"); 1161 } 1162 1163 bool Triple::isArch64Bit() const { 1164 return getArchPointerBitWidth(getArch()) == 64; 1165 } 1166 1167 bool Triple::isArch32Bit() const { 1168 return getArchPointerBitWidth(getArch()) == 32; 1169 } 1170 1171 bool Triple::isArch16Bit() const { 1172 return getArchPointerBitWidth(getArch()) == 16; 1173 } 1174 1175 Triple Triple::get32BitArchVariant() const { 1176 Triple T(*this); 1177 switch (getArch()) { 1178 case Triple::UnknownArch: 1179 case Triple::amdgcn: 1180 case Triple::avr: 1181 case Triple::bpfel: 1182 case Triple::bpfeb: 1183 case Triple::msp430: 1184 case Triple::systemz: 1185 case Triple::ppc64le: 1186 T.setArch(UnknownArch); 1187 break; 1188 1189 case Triple::amdil: 1190 case Triple::hsail: 1191 case Triple::spir: 1192 case Triple::arm: 1193 case Triple::armeb: 1194 case Triple::hexagon: 1195 case Triple::kalimba: 1196 case Triple::le32: 1197 case Triple::mips: 1198 case Triple::mipsel: 1199 case Triple::nvptx: 1200 case Triple::ppc: 1201 case Triple::r600: 1202 case Triple::sparc: 1203 case Triple::sparcel: 1204 case Triple::tce: 1205 case Triple::thumb: 1206 case Triple::thumbeb: 1207 case Triple::x86: 1208 case Triple::xcore: 1209 case Triple::lanai: 1210 case Triple::shave: 1211 case Triple::wasm32: 1212 // Already 32-bit. 1213 break; 1214 1215 case Triple::aarch64: T.setArch(Triple::arm); break; 1216 case Triple::aarch64_be: T.setArch(Triple::armeb); break; 1217 case Triple::le64: T.setArch(Triple::le32); break; 1218 case Triple::mips64: T.setArch(Triple::mips); break; 1219 case Triple::mips64el: T.setArch(Triple::mipsel); break; 1220 case Triple::nvptx64: T.setArch(Triple::nvptx); break; 1221 case Triple::ppc64: T.setArch(Triple::ppc); break; 1222 case Triple::sparcv9: T.setArch(Triple::sparc); break; 1223 case Triple::x86_64: T.setArch(Triple::x86); break; 1224 case Triple::amdil64: T.setArch(Triple::amdil); break; 1225 case Triple::hsail64: T.setArch(Triple::hsail); break; 1226 case Triple::spir64: T.setArch(Triple::spir); break; 1227 case Triple::wasm64: T.setArch(Triple::wasm32); break; 1228 } 1229 return T; 1230 } 1231 1232 Triple Triple::get64BitArchVariant() const { 1233 Triple T(*this); 1234 switch (getArch()) { 1235 case Triple::UnknownArch: 1236 case Triple::avr: 1237 case Triple::hexagon: 1238 case Triple::kalimba: 1239 case Triple::lanai: 1240 case Triple::msp430: 1241 case Triple::r600: 1242 case Triple::tce: 1243 case Triple::xcore: 1244 case Triple::sparcel: 1245 case Triple::shave: 1246 T.setArch(UnknownArch); 1247 break; 1248 1249 case Triple::aarch64: 1250 case Triple::aarch64_be: 1251 case Triple::bpfel: 1252 case Triple::bpfeb: 1253 case Triple::le64: 1254 case Triple::amdil64: 1255 case Triple::amdgcn: 1256 case Triple::hsail64: 1257 case Triple::spir64: 1258 case Triple::mips64: 1259 case Triple::mips64el: 1260 case Triple::nvptx64: 1261 case Triple::ppc64: 1262 case Triple::ppc64le: 1263 case Triple::sparcv9: 1264 case Triple::systemz: 1265 case Triple::x86_64: 1266 case Triple::wasm64: 1267 // Already 64-bit. 1268 break; 1269 1270 case Triple::arm: T.setArch(Triple::aarch64); break; 1271 case Triple::armeb: T.setArch(Triple::aarch64_be); break; 1272 case Triple::le32: T.setArch(Triple::le64); break; 1273 case Triple::mips: T.setArch(Triple::mips64); break; 1274 case Triple::mipsel: T.setArch(Triple::mips64el); break; 1275 case Triple::nvptx: T.setArch(Triple::nvptx64); break; 1276 case Triple::ppc: T.setArch(Triple::ppc64); break; 1277 case Triple::sparc: T.setArch(Triple::sparcv9); break; 1278 case Triple::x86: T.setArch(Triple::x86_64); break; 1279 case Triple::amdil: T.setArch(Triple::amdil64); break; 1280 case Triple::hsail: T.setArch(Triple::hsail64); break; 1281 case Triple::spir: T.setArch(Triple::spir64); break; 1282 case Triple::thumb: T.setArch(Triple::aarch64); break; 1283 case Triple::thumbeb: T.setArch(Triple::aarch64_be); break; 1284 case Triple::wasm32: T.setArch(Triple::wasm64); break; 1285 } 1286 return T; 1287 } 1288 1289 Triple Triple::getBigEndianArchVariant() const { 1290 Triple T(*this); 1291 // Already big endian. 1292 if (!isLittleEndian()) 1293 return T; 1294 switch (getArch()) { 1295 case Triple::UnknownArch: 1296 case Triple::amdgcn: 1297 case Triple::amdil64: 1298 case Triple::amdil: 1299 case Triple::avr: 1300 case Triple::hexagon: 1301 case Triple::hsail64: 1302 case Triple::hsail: 1303 case Triple::kalimba: 1304 case Triple::le32: 1305 case Triple::le64: 1306 case Triple::msp430: 1307 case Triple::nvptx64: 1308 case Triple::nvptx: 1309 case Triple::r600: 1310 case Triple::shave: 1311 case Triple::spir64: 1312 case Triple::spir: 1313 case Triple::wasm32: 1314 case Triple::wasm64: 1315 case Triple::x86: 1316 case Triple::x86_64: 1317 case Triple::xcore: 1318 1319 // ARM is intentionally unsupported here, changing the architecture would 1320 // drop any arch suffixes. 1321 case Triple::arm: 1322 case Triple::thumb: 1323 T.setArch(UnknownArch); 1324 break; 1325 1326 case Triple::aarch64: T.setArch(Triple::aarch64_be); break; 1327 case Triple::bpfel: T.setArch(Triple::bpfeb); break; 1328 case Triple::mips64el:T.setArch(Triple::mips64); break; 1329 case Triple::mipsel: T.setArch(Triple::mips); break; 1330 case Triple::ppc64le: T.setArch(Triple::ppc64); break; 1331 case Triple::sparcel: T.setArch(Triple::sparc); break; 1332 default: 1333 llvm_unreachable("getBigEndianArchVariant: unknown triple."); 1334 } 1335 return T; 1336 } 1337 1338 Triple Triple::getLittleEndianArchVariant() const { 1339 Triple T(*this); 1340 if (isLittleEndian()) 1341 return T; 1342 1343 switch (getArch()) { 1344 case Triple::UnknownArch: 1345 case Triple::lanai: 1346 case Triple::ppc: 1347 case Triple::sparcv9: 1348 case Triple::systemz: 1349 case Triple::tce: 1350 1351 // ARM is intentionally unsupported here, changing the architecture would 1352 // drop any arch suffixes. 1353 case Triple::armeb: 1354 case Triple::thumbeb: 1355 T.setArch(UnknownArch); 1356 break; 1357 1358 case Triple::aarch64_be: T.setArch(Triple::aarch64); break; 1359 case Triple::bpfeb: T.setArch(Triple::bpfel); break; 1360 case Triple::mips64: T.setArch(Triple::mips64el); break; 1361 case Triple::mips: T.setArch(Triple::mipsel); break; 1362 case Triple::ppc64: T.setArch(Triple::ppc64le); break; 1363 case Triple::sparc: T.setArch(Triple::sparcel); break; 1364 default: 1365 llvm_unreachable("getLittleEndianArchVariant: unknown triple."); 1366 } 1367 return T; 1368 } 1369 1370 bool Triple::isLittleEndian() const { 1371 switch (getArch()) { 1372 case Triple::aarch64: 1373 case Triple::amdgcn: 1374 case Triple::amdil64: 1375 case Triple::amdil: 1376 case Triple::arm: 1377 case Triple::avr: 1378 case Triple::bpfel: 1379 case Triple::hexagon: 1380 case Triple::hsail64: 1381 case Triple::hsail: 1382 case Triple::kalimba: 1383 case Triple::le32: 1384 case Triple::le64: 1385 case Triple::mips64el: 1386 case Triple::mipsel: 1387 case Triple::msp430: 1388 case Triple::nvptx64: 1389 case Triple::nvptx: 1390 case Triple::ppc64le: 1391 case Triple::r600: 1392 case Triple::shave: 1393 case Triple::sparcel: 1394 case Triple::spir64: 1395 case Triple::spir: 1396 case Triple::thumb: 1397 case Triple::wasm32: 1398 case Triple::wasm64: 1399 case Triple::x86: 1400 case Triple::x86_64: 1401 case Triple::xcore: 1402 return true; 1403 default: 1404 return false; 1405 } 1406 } 1407 1408 StringRef Triple::getARMCPUForArch(StringRef MArch) const { 1409 if (MArch.empty()) 1410 MArch = getArchName(); 1411 MArch = ARM::getCanonicalArchName(MArch); 1412 1413 // Some defaults are forced. 1414 switch (getOS()) { 1415 case llvm::Triple::FreeBSD: 1416 case llvm::Triple::NetBSD: 1417 if (!MArch.empty() && MArch == "v6") 1418 return "arm1176jzf-s"; 1419 break; 1420 case llvm::Triple::Win32: 1421 // FIXME: this is invalid for WindowsCE 1422 return "cortex-a9"; 1423 case llvm::Triple::MacOSX: 1424 case llvm::Triple::IOS: 1425 case llvm::Triple::WatchOS: 1426 case llvm::Triple::TvOS: 1427 if (MArch == "v7k") 1428 return "cortex-a7"; 1429 break; 1430 default: 1431 break; 1432 } 1433 1434 if (MArch.empty()) 1435 return StringRef(); 1436 1437 StringRef CPU = ARM::getDefaultCPU(MArch); 1438 if (!CPU.empty()) 1439 return CPU; 1440 1441 // If no specific architecture version is requested, return the minimum CPU 1442 // required by the OS and environment. 1443 switch (getOS()) { 1444 case llvm::Triple::NetBSD: 1445 switch (getEnvironment()) { 1446 case llvm::Triple::GNUEABIHF: 1447 case llvm::Triple::GNUEABI: 1448 case llvm::Triple::EABIHF: 1449 case llvm::Triple::EABI: 1450 return "arm926ej-s"; 1451 default: 1452 return "strongarm"; 1453 } 1454 case llvm::Triple::NaCl: 1455 return "cortex-a8"; 1456 default: 1457 switch (getEnvironment()) { 1458 case llvm::Triple::EABIHF: 1459 case llvm::Triple::GNUEABIHF: 1460 case llvm::Triple::MuslEABIHF: 1461 return "arm1176jzf-s"; 1462 default: 1463 return "arm7tdmi"; 1464 } 1465 } 1466 1467 llvm_unreachable("invalid arch name"); 1468 } 1469