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