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: return "amdgcn"; 98 case r600: return "r600"; 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 .Cases("powerpc", "ppc32", Triple::ppc) 342 .Cases("powerpc64", "ppu", "ppc64", Triple::ppc64) 343 .Cases("powerpc64le", "ppc64le", 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 .Cases("s390x", "systemz", 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_ARMV5T: 491 return Triple::ARMSubArch_v5; 492 case ARM::AK_ARMV5TE: 493 case ARM::AK_IWMMXT: 494 case ARM::AK_IWMMXT2: 495 case ARM::AK_XSCALE: 496 case ARM::AK_ARMV5TEJ: 497 return Triple::ARMSubArch_v5te; 498 case ARM::AK_ARMV6: 499 return Triple::ARMSubArch_v6; 500 case ARM::AK_ARMV6K: 501 case ARM::AK_ARMV6KZ: 502 return Triple::ARMSubArch_v6k; 503 case ARM::AK_ARMV6T2: 504 return Triple::ARMSubArch_v6t2; 505 case ARM::AK_ARMV6M: 506 return Triple::ARMSubArch_v6m; 507 case ARM::AK_ARMV7A: 508 case ARM::AK_ARMV7R: 509 return Triple::ARMSubArch_v7; 510 case ARM::AK_ARMV7K: 511 return Triple::ARMSubArch_v7k; 512 case ARM::AK_ARMV7M: 513 return Triple::ARMSubArch_v7m; 514 case ARM::AK_ARMV7S: 515 return Triple::ARMSubArch_v7s; 516 case ARM::AK_ARMV7EM: 517 return Triple::ARMSubArch_v7em; 518 case ARM::AK_ARMV8A: 519 return Triple::ARMSubArch_v8; 520 case ARM::AK_ARMV8_1A: 521 return Triple::ARMSubArch_v8_1a; 522 case ARM::AK_ARMV8_2A: 523 return Triple::ARMSubArch_v8_2a; 524 case ARM::AK_ARMV8MBaseline: 525 return Triple::ARMSubArch_v8m_baseline; 526 case ARM::AK_ARMV8MMainline: 527 return Triple::ARMSubArch_v8m_mainline; 528 default: 529 return Triple::NoSubArch; 530 } 531 } 532 533 static const char *getObjectFormatTypeName(Triple::ObjectFormatType Kind) { 534 switch (Kind) { 535 case Triple::UnknownObjectFormat: return ""; 536 case Triple::COFF: return "coff"; 537 case Triple::ELF: return "elf"; 538 case Triple::MachO: return "macho"; 539 } 540 llvm_unreachable("unknown object format type"); 541 } 542 543 static Triple::ObjectFormatType getDefaultFormat(const Triple &T) { 544 switch (T.getArch()) { 545 case Triple::UnknownArch: 546 case Triple::aarch64: 547 case Triple::arm: 548 case Triple::thumb: 549 case Triple::x86: 550 case Triple::x86_64: 551 if (T.isOSDarwin()) 552 return Triple::MachO; 553 else if (T.isOSWindows()) 554 return Triple::COFF; 555 return Triple::ELF; 556 557 case Triple::aarch64_be: 558 case Triple::amdgcn: 559 case Triple::amdil: 560 case Triple::amdil64: 561 case Triple::armeb: 562 case Triple::avr: 563 case Triple::bpfeb: 564 case Triple::bpfel: 565 case Triple::hexagon: 566 case Triple::hsail: 567 case Triple::hsail64: 568 case Triple::kalimba: 569 case Triple::le32: 570 case Triple::le64: 571 case Triple::mips: 572 case Triple::mips64: 573 case Triple::mips64el: 574 case Triple::mipsel: 575 case Triple::msp430: 576 case Triple::nvptx: 577 case Triple::nvptx64: 578 case Triple::ppc64le: 579 case Triple::r600: 580 case Triple::shave: 581 case Triple::sparc: 582 case Triple::sparcel: 583 case Triple::sparcv9: 584 case Triple::spir: 585 case Triple::spir64: 586 case Triple::systemz: 587 case Triple::tce: 588 case Triple::thumbeb: 589 case Triple::wasm32: 590 case Triple::wasm64: 591 case Triple::xcore: 592 return Triple::ELF; 593 594 case Triple::ppc: 595 case Triple::ppc64: 596 if (T.isOSDarwin()) 597 return Triple::MachO; 598 return Triple::ELF; 599 } 600 llvm_unreachable("unknown architecture"); 601 } 602 603 /// \brief Construct a triple from the string representation provided. 604 /// 605 /// This stores the string representation and parses the various pieces into 606 /// enum members. 607 Triple::Triple(const Twine &Str) 608 : Data(Str.str()), Arch(UnknownArch), SubArch(NoSubArch), 609 Vendor(UnknownVendor), OS(UnknownOS), Environment(UnknownEnvironment), 610 ObjectFormat(UnknownObjectFormat) { 611 // Do minimal parsing by hand here. 612 SmallVector<StringRef, 4> Components; 613 StringRef(Data).split(Components, '-', /*MaxSplit*/ 3); 614 if (Components.size() > 0) { 615 Arch = parseArch(Components[0]); 616 SubArch = parseSubArch(Components[0]); 617 if (Components.size() > 1) { 618 Vendor = parseVendor(Components[1]); 619 if (Components.size() > 2) { 620 OS = parseOS(Components[2]); 621 if (Components.size() > 3) { 622 Environment = parseEnvironment(Components[3]); 623 ObjectFormat = parseFormat(Components[3]); 624 } 625 } 626 } 627 } 628 if (ObjectFormat == UnknownObjectFormat) 629 ObjectFormat = getDefaultFormat(*this); 630 } 631 632 /// \brief Construct a triple from string representations of the architecture, 633 /// vendor, and OS. 634 /// 635 /// This joins each argument into a canonical string representation and parses 636 /// them into enum members. It leaves the environment unknown and omits it from 637 /// the string representation. 638 Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr) 639 : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr).str()), 640 Arch(parseArch(ArchStr.str())), 641 SubArch(parseSubArch(ArchStr.str())), 642 Vendor(parseVendor(VendorStr.str())), 643 OS(parseOS(OSStr.str())), 644 Environment(), ObjectFormat(Triple::UnknownObjectFormat) { 645 ObjectFormat = getDefaultFormat(*this); 646 } 647 648 /// \brief Construct a triple from string representations of the architecture, 649 /// vendor, OS, and environment. 650 /// 651 /// This joins each argument into a canonical string representation and parses 652 /// them into enum members. 653 Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr, 654 const Twine &EnvironmentStr) 655 : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr + Twine('-') + 656 EnvironmentStr).str()), 657 Arch(parseArch(ArchStr.str())), 658 SubArch(parseSubArch(ArchStr.str())), 659 Vendor(parseVendor(VendorStr.str())), 660 OS(parseOS(OSStr.str())), 661 Environment(parseEnvironment(EnvironmentStr.str())), 662 ObjectFormat(parseFormat(EnvironmentStr.str())) { 663 if (ObjectFormat == Triple::UnknownObjectFormat) 664 ObjectFormat = getDefaultFormat(*this); 665 } 666 667 std::string Triple::normalize(StringRef Str) { 668 bool IsMinGW32 = false; 669 bool IsCygwin = false; 670 671 // Parse into components. 672 SmallVector<StringRef, 4> Components; 673 Str.split(Components, '-'); 674 675 // If the first component corresponds to a known architecture, preferentially 676 // use it for the architecture. If the second component corresponds to a 677 // known vendor, preferentially use it for the vendor, etc. This avoids silly 678 // component movement when a component parses as (eg) both a valid arch and a 679 // valid os. 680 ArchType Arch = UnknownArch; 681 if (Components.size() > 0) 682 Arch = parseArch(Components[0]); 683 VendorType Vendor = UnknownVendor; 684 if (Components.size() > 1) 685 Vendor = parseVendor(Components[1]); 686 OSType OS = UnknownOS; 687 if (Components.size() > 2) { 688 OS = parseOS(Components[2]); 689 IsCygwin = Components[2].startswith("cygwin"); 690 IsMinGW32 = Components[2].startswith("mingw"); 691 } 692 EnvironmentType Environment = UnknownEnvironment; 693 if (Components.size() > 3) 694 Environment = parseEnvironment(Components[3]); 695 ObjectFormatType ObjectFormat = UnknownObjectFormat; 696 if (Components.size() > 4) 697 ObjectFormat = parseFormat(Components[4]); 698 699 // Note which components are already in their final position. These will not 700 // be moved. 701 bool Found[4]; 702 Found[0] = Arch != UnknownArch; 703 Found[1] = Vendor != UnknownVendor; 704 Found[2] = OS != UnknownOS; 705 Found[3] = Environment != UnknownEnvironment; 706 707 // If they are not there already, permute the components into their canonical 708 // positions by seeing if they parse as a valid architecture, and if so moving 709 // the component to the architecture position etc. 710 for (unsigned Pos = 0; Pos != array_lengthof(Found); ++Pos) { 711 if (Found[Pos]) 712 continue; // Already in the canonical position. 713 714 for (unsigned Idx = 0; Idx != Components.size(); ++Idx) { 715 // Do not reparse any components that already matched. 716 if (Idx < array_lengthof(Found) && Found[Idx]) 717 continue; 718 719 // Does this component parse as valid for the target position? 720 bool Valid = false; 721 StringRef Comp = Components[Idx]; 722 switch (Pos) { 723 default: llvm_unreachable("unexpected component type!"); 724 case 0: 725 Arch = parseArch(Comp); 726 Valid = Arch != UnknownArch; 727 break; 728 case 1: 729 Vendor = parseVendor(Comp); 730 Valid = Vendor != UnknownVendor; 731 break; 732 case 2: 733 OS = parseOS(Comp); 734 IsCygwin = Comp.startswith("cygwin"); 735 IsMinGW32 = Comp.startswith("mingw"); 736 Valid = OS != UnknownOS || IsCygwin || IsMinGW32; 737 break; 738 case 3: 739 Environment = parseEnvironment(Comp); 740 Valid = Environment != UnknownEnvironment; 741 if (!Valid) { 742 ObjectFormat = parseFormat(Comp); 743 Valid = ObjectFormat != UnknownObjectFormat; 744 } 745 break; 746 } 747 if (!Valid) 748 continue; // Nope, try the next component. 749 750 // Move the component to the target position, pushing any non-fixed 751 // components that are in the way to the right. This tends to give 752 // good results in the common cases of a forgotten vendor component 753 // or a wrongly positioned environment. 754 if (Pos < Idx) { 755 // Insert left, pushing the existing components to the right. For 756 // example, a-b-i386 -> i386-a-b when moving i386 to the front. 757 StringRef CurrentComponent(""); // The empty component. 758 // Replace the component we are moving with an empty component. 759 std::swap(CurrentComponent, Components[Idx]); 760 // Insert the component being moved at Pos, displacing any existing 761 // components to the right. 762 for (unsigned i = Pos; !CurrentComponent.empty(); ++i) { 763 // Skip over any fixed components. 764 while (i < array_lengthof(Found) && Found[i]) 765 ++i; 766 // Place the component at the new position, getting the component 767 // that was at this position - it will be moved right. 768 std::swap(CurrentComponent, Components[i]); 769 } 770 } else if (Pos > Idx) { 771 // Push right by inserting empty components until the component at Idx 772 // reaches the target position Pos. For example, pc-a -> -pc-a when 773 // moving pc to the second position. 774 do { 775 // Insert one empty component at Idx. 776 StringRef CurrentComponent(""); // The empty component. 777 for (unsigned i = Idx; i < Components.size();) { 778 // Place the component at the new position, getting the component 779 // that was at this position - it will be moved right. 780 std::swap(CurrentComponent, Components[i]); 781 // If it was placed on top of an empty component then we are done. 782 if (CurrentComponent.empty()) 783 break; 784 // Advance to the next component, skipping any fixed components. 785 while (++i < array_lengthof(Found) && Found[i]) 786 ; 787 } 788 // The last component was pushed off the end - append it. 789 if (!CurrentComponent.empty()) 790 Components.push_back(CurrentComponent); 791 792 // Advance Idx to the component's new position. 793 while (++Idx < array_lengthof(Found) && Found[Idx]) 794 ; 795 } while (Idx < Pos); // Add more until the final position is reached. 796 } 797 assert(Pos < Components.size() && Components[Pos] == Comp && 798 "Component moved wrong!"); 799 Found[Pos] = true; 800 break; 801 } 802 } 803 804 // Special case logic goes here. At this point Arch, Vendor and OS have the 805 // correct values for the computed components. 806 std::string NormalizedEnvironment; 807 if (Environment == Triple::Android && Components[3].startswith("androideabi")) { 808 StringRef AndroidVersion = Components[3].drop_front(strlen("androideabi")); 809 if (AndroidVersion.empty()) { 810 Components[3] = "android"; 811 } else { 812 NormalizedEnvironment = Twine("android", AndroidVersion).str(); 813 Components[3] = NormalizedEnvironment; 814 } 815 } 816 817 if (OS == Triple::Win32) { 818 Components.resize(4); 819 Components[2] = "windows"; 820 if (Environment == UnknownEnvironment) { 821 if (ObjectFormat == UnknownObjectFormat || ObjectFormat == Triple::COFF) 822 Components[3] = "msvc"; 823 else 824 Components[3] = getObjectFormatTypeName(ObjectFormat); 825 } 826 } else if (IsMinGW32) { 827 Components.resize(4); 828 Components[2] = "windows"; 829 Components[3] = "gnu"; 830 } else if (IsCygwin) { 831 Components.resize(4); 832 Components[2] = "windows"; 833 Components[3] = "cygnus"; 834 } 835 if (IsMinGW32 || IsCygwin || 836 (OS == Triple::Win32 && Environment != UnknownEnvironment)) { 837 if (ObjectFormat != UnknownObjectFormat && ObjectFormat != Triple::COFF) { 838 Components.resize(5); 839 Components[4] = getObjectFormatTypeName(ObjectFormat); 840 } 841 } 842 843 // Stick the corrected components back together to form the normalized string. 844 std::string Normalized; 845 for (unsigned i = 0, e = Components.size(); i != e; ++i) { 846 if (i) Normalized += '-'; 847 Normalized += Components[i]; 848 } 849 return Normalized; 850 } 851 852 StringRef Triple::getArchName() const { 853 return StringRef(Data).split('-').first; // Isolate first component 854 } 855 856 StringRef Triple::getVendorName() const { 857 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 858 return Tmp.split('-').first; // Isolate second component 859 } 860 861 StringRef Triple::getOSName() const { 862 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 863 Tmp = Tmp.split('-').second; // Strip second component 864 return Tmp.split('-').first; // Isolate third component 865 } 866 867 StringRef Triple::getEnvironmentName() const { 868 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 869 Tmp = Tmp.split('-').second; // Strip second component 870 return Tmp.split('-').second; // Strip third component 871 } 872 873 StringRef Triple::getOSAndEnvironmentName() const { 874 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 875 return Tmp.split('-').second; // Strip second component 876 } 877 878 static unsigned EatNumber(StringRef &Str) { 879 assert(!Str.empty() && Str[0] >= '0' && Str[0] <= '9' && "Not a number"); 880 unsigned Result = 0; 881 882 do { 883 // Consume the leading digit. 884 Result = Result*10 + (Str[0] - '0'); 885 886 // Eat the digit. 887 Str = Str.substr(1); 888 } while (!Str.empty() && Str[0] >= '0' && Str[0] <= '9'); 889 890 return Result; 891 } 892 893 static void parseVersionFromName(StringRef Name, unsigned &Major, 894 unsigned &Minor, unsigned &Micro) { 895 // Any unset version defaults to 0. 896 Major = Minor = Micro = 0; 897 898 // Parse up to three components. 899 unsigned *Components[3] = {&Major, &Minor, &Micro}; 900 for (unsigned i = 0; i != 3; ++i) { 901 if (Name.empty() || Name[0] < '0' || Name[0] > '9') 902 break; 903 904 // Consume the leading number. 905 *Components[i] = EatNumber(Name); 906 907 // Consume the separator, if present. 908 if (Name.startswith(".")) 909 Name = Name.substr(1); 910 } 911 } 912 913 void Triple::getEnvironmentVersion(unsigned &Major, unsigned &Minor, 914 unsigned &Micro) const { 915 StringRef EnvironmentName = getEnvironmentName(); 916 StringRef EnvironmentTypeName = getEnvironmentTypeName(getEnvironment()); 917 if (EnvironmentName.startswith(EnvironmentTypeName)) 918 EnvironmentName = EnvironmentName.substr(EnvironmentTypeName.size()); 919 920 parseVersionFromName(EnvironmentName, Major, Minor, Micro); 921 } 922 923 void Triple::getOSVersion(unsigned &Major, unsigned &Minor, 924 unsigned &Micro) const { 925 StringRef OSName = getOSName(); 926 // Assume that the OS portion of the triple starts with the canonical name. 927 StringRef OSTypeName = getOSTypeName(getOS()); 928 if (OSName.startswith(OSTypeName)) 929 OSName = OSName.substr(OSTypeName.size()); 930 931 parseVersionFromName(OSName, Major, Minor, Micro); 932 } 933 934 bool Triple::getMacOSXVersion(unsigned &Major, unsigned &Minor, 935 unsigned &Micro) const { 936 getOSVersion(Major, Minor, Micro); 937 938 switch (getOS()) { 939 default: llvm_unreachable("unexpected OS for Darwin triple"); 940 case Darwin: 941 // Default to darwin8, i.e., MacOSX 10.4. 942 if (Major == 0) 943 Major = 8; 944 // Darwin version numbers are skewed from OS X versions. 945 if (Major < 4) 946 return false; 947 Micro = 0; 948 Minor = Major - 4; 949 Major = 10; 950 break; 951 case MacOSX: 952 // Default to 10.4. 953 if (Major == 0) { 954 Major = 10; 955 Minor = 4; 956 } 957 if (Major != 10) 958 return false; 959 break; 960 case IOS: 961 case TvOS: 962 case WatchOS: 963 // Ignore the version from the triple. This is only handled because the 964 // the clang driver combines OS X and IOS support into a common Darwin 965 // toolchain that wants to know the OS X version number even when targeting 966 // IOS. 967 Major = 10; 968 Minor = 4; 969 Micro = 0; 970 break; 971 } 972 return true; 973 } 974 975 void Triple::getiOSVersion(unsigned &Major, unsigned &Minor, 976 unsigned &Micro) const { 977 switch (getOS()) { 978 default: llvm_unreachable("unexpected OS for Darwin triple"); 979 case Darwin: 980 case MacOSX: 981 // Ignore the version from the triple. This is only handled because the 982 // the clang driver combines OS X and IOS support into a common Darwin 983 // toolchain that wants to know the iOS version number even when targeting 984 // OS X. 985 Major = 5; 986 Minor = 0; 987 Micro = 0; 988 break; 989 case IOS: 990 case TvOS: 991 getOSVersion(Major, Minor, Micro); 992 // Default to 5.0 (or 7.0 for arm64). 993 if (Major == 0) 994 Major = (getArch() == aarch64) ? 7 : 5; 995 break; 996 case WatchOS: 997 llvm_unreachable("conflicting triple info"); 998 } 999 } 1000 1001 void Triple::getWatchOSVersion(unsigned &Major, unsigned &Minor, 1002 unsigned &Micro) const { 1003 switch (getOS()) { 1004 default: llvm_unreachable("unexpected OS for Darwin triple"); 1005 case Darwin: 1006 case MacOSX: 1007 // Ignore the version from the triple. This is only handled because the 1008 // the clang driver combines OS X and IOS support into a common Darwin 1009 // toolchain that wants to know the iOS version number even when targeting 1010 // OS X. 1011 Major = 2; 1012 Minor = 0; 1013 Micro = 0; 1014 break; 1015 case WatchOS: 1016 getOSVersion(Major, Minor, Micro); 1017 if (Major == 0) 1018 Major = 2; 1019 break; 1020 case IOS: 1021 llvm_unreachable("conflicting triple info"); 1022 } 1023 } 1024 1025 void Triple::setTriple(const Twine &Str) { 1026 *this = Triple(Str); 1027 } 1028 1029 void Triple::setArch(ArchType Kind) { 1030 setArchName(getArchTypeName(Kind)); 1031 } 1032 1033 void Triple::setVendor(VendorType Kind) { 1034 setVendorName(getVendorTypeName(Kind)); 1035 } 1036 1037 void Triple::setOS(OSType Kind) { 1038 setOSName(getOSTypeName(Kind)); 1039 } 1040 1041 void Triple::setEnvironment(EnvironmentType Kind) { 1042 if (ObjectFormat == getDefaultFormat(*this)) 1043 return setEnvironmentName(getEnvironmentTypeName(Kind)); 1044 1045 setEnvironmentName((getEnvironmentTypeName(Kind) + Twine("-") + 1046 getObjectFormatTypeName(ObjectFormat)).str()); 1047 } 1048 1049 void Triple::setObjectFormat(ObjectFormatType Kind) { 1050 if (Environment == UnknownEnvironment) 1051 return setEnvironmentName(getObjectFormatTypeName(Kind)); 1052 1053 setEnvironmentName((getEnvironmentTypeName(Environment) + Twine("-") + 1054 getObjectFormatTypeName(Kind)).str()); 1055 } 1056 1057 void Triple::setArchName(StringRef Str) { 1058 // Work around a miscompilation bug for Twines in gcc 4.0.3. 1059 SmallString<64> Triple; 1060 Triple += Str; 1061 Triple += "-"; 1062 Triple += getVendorName(); 1063 Triple += "-"; 1064 Triple += getOSAndEnvironmentName(); 1065 setTriple(Triple); 1066 } 1067 1068 void Triple::setVendorName(StringRef Str) { 1069 setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName()); 1070 } 1071 1072 void Triple::setOSName(StringRef Str) { 1073 if (hasEnvironment()) 1074 setTriple(getArchName() + "-" + getVendorName() + "-" + Str + 1075 "-" + getEnvironmentName()); 1076 else 1077 setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 1078 } 1079 1080 void Triple::setEnvironmentName(StringRef Str) { 1081 setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() + 1082 "-" + Str); 1083 } 1084 1085 void Triple::setOSAndEnvironmentName(StringRef Str) { 1086 setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 1087 } 1088 1089 static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) { 1090 switch (Arch) { 1091 case llvm::Triple::UnknownArch: 1092 return 0; 1093 1094 case llvm::Triple::avr: 1095 case llvm::Triple::msp430: 1096 return 16; 1097 1098 case llvm::Triple::arm: 1099 case llvm::Triple::armeb: 1100 case llvm::Triple::hexagon: 1101 case llvm::Triple::le32: 1102 case llvm::Triple::mips: 1103 case llvm::Triple::mipsel: 1104 case llvm::Triple::nvptx: 1105 case llvm::Triple::ppc: 1106 case llvm::Triple::r600: 1107 case llvm::Triple::sparc: 1108 case llvm::Triple::sparcel: 1109 case llvm::Triple::tce: 1110 case llvm::Triple::thumb: 1111 case llvm::Triple::thumbeb: 1112 case llvm::Triple::x86: 1113 case llvm::Triple::xcore: 1114 case llvm::Triple::amdil: 1115 case llvm::Triple::hsail: 1116 case llvm::Triple::spir: 1117 case llvm::Triple::kalimba: 1118 case llvm::Triple::shave: 1119 case llvm::Triple::wasm32: 1120 return 32; 1121 1122 case llvm::Triple::aarch64: 1123 case llvm::Triple::aarch64_be: 1124 case llvm::Triple::amdgcn: 1125 case llvm::Triple::bpfel: 1126 case llvm::Triple::bpfeb: 1127 case llvm::Triple::le64: 1128 case llvm::Triple::mips64: 1129 case llvm::Triple::mips64el: 1130 case llvm::Triple::nvptx64: 1131 case llvm::Triple::ppc64: 1132 case llvm::Triple::ppc64le: 1133 case llvm::Triple::sparcv9: 1134 case llvm::Triple::systemz: 1135 case llvm::Triple::x86_64: 1136 case llvm::Triple::amdil64: 1137 case llvm::Triple::hsail64: 1138 case llvm::Triple::spir64: 1139 case llvm::Triple::wasm64: 1140 return 64; 1141 } 1142 llvm_unreachable("Invalid architecture value"); 1143 } 1144 1145 bool Triple::isArch64Bit() const { 1146 return getArchPointerBitWidth(getArch()) == 64; 1147 } 1148 1149 bool Triple::isArch32Bit() const { 1150 return getArchPointerBitWidth(getArch()) == 32; 1151 } 1152 1153 bool Triple::isArch16Bit() const { 1154 return getArchPointerBitWidth(getArch()) == 16; 1155 } 1156 1157 Triple Triple::get32BitArchVariant() const { 1158 Triple T(*this); 1159 switch (getArch()) { 1160 case Triple::UnknownArch: 1161 case Triple::amdgcn: 1162 case Triple::avr: 1163 case Triple::bpfel: 1164 case Triple::bpfeb: 1165 case Triple::msp430: 1166 case Triple::systemz: 1167 case Triple::ppc64le: 1168 T.setArch(UnknownArch); 1169 break; 1170 1171 case Triple::amdil: 1172 case Triple::hsail: 1173 case Triple::spir: 1174 case Triple::arm: 1175 case Triple::armeb: 1176 case Triple::hexagon: 1177 case Triple::kalimba: 1178 case Triple::le32: 1179 case Triple::mips: 1180 case Triple::mipsel: 1181 case Triple::nvptx: 1182 case Triple::ppc: 1183 case Triple::r600: 1184 case Triple::sparc: 1185 case Triple::sparcel: 1186 case Triple::tce: 1187 case Triple::thumb: 1188 case Triple::thumbeb: 1189 case Triple::x86: 1190 case Triple::xcore: 1191 case Triple::shave: 1192 case Triple::wasm32: 1193 // Already 32-bit. 1194 break; 1195 1196 case Triple::aarch64: T.setArch(Triple::arm); break; 1197 case Triple::aarch64_be: T.setArch(Triple::armeb); break; 1198 case Triple::le64: T.setArch(Triple::le32); break; 1199 case Triple::mips64: T.setArch(Triple::mips); break; 1200 case Triple::mips64el: T.setArch(Triple::mipsel); break; 1201 case Triple::nvptx64: T.setArch(Triple::nvptx); break; 1202 case Triple::ppc64: T.setArch(Triple::ppc); break; 1203 case Triple::sparcv9: T.setArch(Triple::sparc); break; 1204 case Triple::x86_64: T.setArch(Triple::x86); break; 1205 case Triple::amdil64: T.setArch(Triple::amdil); break; 1206 case Triple::hsail64: T.setArch(Triple::hsail); break; 1207 case Triple::spir64: T.setArch(Triple::spir); break; 1208 case Triple::wasm64: T.setArch(Triple::wasm32); break; 1209 } 1210 return T; 1211 } 1212 1213 Triple Triple::get64BitArchVariant() const { 1214 Triple T(*this); 1215 switch (getArch()) { 1216 case Triple::UnknownArch: 1217 case Triple::avr: 1218 case Triple::hexagon: 1219 case Triple::kalimba: 1220 case Triple::msp430: 1221 case Triple::r600: 1222 case Triple::tce: 1223 case Triple::xcore: 1224 case Triple::sparcel: 1225 case Triple::shave: 1226 T.setArch(UnknownArch); 1227 break; 1228 1229 case Triple::aarch64: 1230 case Triple::aarch64_be: 1231 case Triple::bpfel: 1232 case Triple::bpfeb: 1233 case Triple::le64: 1234 case Triple::amdil64: 1235 case Triple::amdgcn: 1236 case Triple::hsail64: 1237 case Triple::spir64: 1238 case Triple::mips64: 1239 case Triple::mips64el: 1240 case Triple::nvptx64: 1241 case Triple::ppc64: 1242 case Triple::ppc64le: 1243 case Triple::sparcv9: 1244 case Triple::systemz: 1245 case Triple::x86_64: 1246 case Triple::wasm64: 1247 // Already 64-bit. 1248 break; 1249 1250 case Triple::arm: T.setArch(Triple::aarch64); break; 1251 case Triple::armeb: T.setArch(Triple::aarch64_be); break; 1252 case Triple::le32: T.setArch(Triple::le64); break; 1253 case Triple::mips: T.setArch(Triple::mips64); break; 1254 case Triple::mipsel: T.setArch(Triple::mips64el); break; 1255 case Triple::nvptx: T.setArch(Triple::nvptx64); break; 1256 case Triple::ppc: T.setArch(Triple::ppc64); break; 1257 case Triple::sparc: T.setArch(Triple::sparcv9); break; 1258 case Triple::x86: T.setArch(Triple::x86_64); break; 1259 case Triple::amdil: T.setArch(Triple::amdil64); break; 1260 case Triple::hsail: T.setArch(Triple::hsail64); break; 1261 case Triple::spir: T.setArch(Triple::spir64); break; 1262 case Triple::thumb: T.setArch(Triple::aarch64); break; 1263 case Triple::thumbeb: T.setArch(Triple::aarch64_be); break; 1264 case Triple::wasm32: T.setArch(Triple::wasm64); break; 1265 } 1266 return T; 1267 } 1268 1269 Triple Triple::getBigEndianArchVariant() const { 1270 Triple T(*this); 1271 switch (getArch()) { 1272 case Triple::UnknownArch: 1273 case Triple::amdgcn: 1274 case Triple::amdil64: 1275 case Triple::amdil: 1276 case Triple::avr: 1277 case Triple::hexagon: 1278 case Triple::hsail64: 1279 case Triple::hsail: 1280 case Triple::kalimba: 1281 case Triple::le32: 1282 case Triple::le64: 1283 case Triple::msp430: 1284 case Triple::nvptx64: 1285 case Triple::nvptx: 1286 case Triple::r600: 1287 case Triple::shave: 1288 case Triple::spir64: 1289 case Triple::spir: 1290 case Triple::wasm32: 1291 case Triple::wasm64: 1292 case Triple::x86: 1293 case Triple::x86_64: 1294 case Triple::xcore: 1295 1296 // ARM is intentionally unsupported here, changing the architecture would 1297 // drop any arch suffixes. 1298 case Triple::arm: 1299 case Triple::thumb: 1300 T.setArch(UnknownArch); 1301 break; 1302 1303 case Triple::aarch64_be: 1304 case Triple::armeb: 1305 case Triple::bpfeb: 1306 case Triple::mips64: 1307 case Triple::mips: 1308 case Triple::ppc64: 1309 case Triple::ppc: 1310 case Triple::sparc: 1311 case Triple::sparcv9: 1312 case Triple::systemz: 1313 case Triple::tce: 1314 case Triple::thumbeb: 1315 // Already big endian. 1316 break; 1317 1318 case Triple::aarch64: T.setArch(Triple::aarch64_be); break; 1319 case Triple::bpfel: T.setArch(Triple::bpfeb); break; 1320 case Triple::mips64el:T.setArch(Triple::mips64); break; 1321 case Triple::mipsel: T.setArch(Triple::mips); break; 1322 case Triple::ppc64le: T.setArch(Triple::ppc64); break; 1323 case Triple::sparcel: T.setArch(Triple::sparc); break; 1324 } 1325 return T; 1326 } 1327 1328 Triple Triple::getLittleEndianArchVariant() const { 1329 Triple T(*this); 1330 switch (getArch()) { 1331 case Triple::UnknownArch: 1332 case Triple::ppc: 1333 case Triple::sparcv9: 1334 case Triple::systemz: 1335 case Triple::tce: 1336 1337 // ARM is intentionally unsupported here, changing the architecture would 1338 // drop any arch suffixes. 1339 case Triple::armeb: 1340 case Triple::thumbeb: 1341 T.setArch(UnknownArch); 1342 break; 1343 1344 case Triple::aarch64: 1345 case Triple::amdgcn: 1346 case Triple::amdil64: 1347 case Triple::amdil: 1348 case Triple::arm: 1349 case Triple::avr: 1350 case Triple::bpfel: 1351 case Triple::hexagon: 1352 case Triple::hsail64: 1353 case Triple::hsail: 1354 case Triple::kalimba: 1355 case Triple::le32: 1356 case Triple::le64: 1357 case Triple::mips64el: 1358 case Triple::mipsel: 1359 case Triple::msp430: 1360 case Triple::nvptx64: 1361 case Triple::nvptx: 1362 case Triple::ppc64le: 1363 case Triple::r600: 1364 case Triple::shave: 1365 case Triple::sparcel: 1366 case Triple::spir64: 1367 case Triple::spir: 1368 case Triple::thumb: 1369 case Triple::wasm32: 1370 case Triple::wasm64: 1371 case Triple::x86: 1372 case Triple::x86_64: 1373 case Triple::xcore: 1374 // Already little endian. 1375 break; 1376 1377 case Triple::aarch64_be: T.setArch(Triple::aarch64); break; 1378 case Triple::bpfeb: T.setArch(Triple::bpfel); break; 1379 case Triple::mips64: T.setArch(Triple::mips64el); break; 1380 case Triple::mips: T.setArch(Triple::mipsel); break; 1381 case Triple::ppc64: T.setArch(Triple::ppc64le); break; 1382 case Triple::sparc: T.setArch(Triple::sparcel); break; 1383 } 1384 return T; 1385 } 1386 1387 StringRef Triple::getARMCPUForArch(StringRef MArch) const { 1388 if (MArch.empty()) 1389 MArch = getArchName(); 1390 MArch = ARM::getCanonicalArchName(MArch); 1391 1392 // Some defaults are forced. 1393 switch (getOS()) { 1394 case llvm::Triple::FreeBSD: 1395 case llvm::Triple::NetBSD: 1396 if (!MArch.empty() && MArch == "v6") 1397 return "arm1176jzf-s"; 1398 break; 1399 case llvm::Triple::Win32: 1400 // FIXME: this is invalid for WindowsCE 1401 return "cortex-a9"; 1402 case llvm::Triple::MacOSX: 1403 case llvm::Triple::IOS: 1404 case llvm::Triple::WatchOS: 1405 if (MArch == "v7k") 1406 return "cortex-a7"; 1407 break; 1408 default: 1409 break; 1410 } 1411 1412 if (MArch.empty()) 1413 return StringRef(); 1414 1415 StringRef CPU = ARM::getDefaultCPU(MArch); 1416 if (!CPU.empty()) 1417 return CPU; 1418 1419 // If no specific architecture version is requested, return the minimum CPU 1420 // required by the OS and environment. 1421 switch (getOS()) { 1422 case llvm::Triple::NetBSD: 1423 switch (getEnvironment()) { 1424 case llvm::Triple::GNUEABIHF: 1425 case llvm::Triple::GNUEABI: 1426 case llvm::Triple::EABIHF: 1427 case llvm::Triple::EABI: 1428 return "arm926ej-s"; 1429 default: 1430 return "strongarm"; 1431 } 1432 case llvm::Triple::NaCl: 1433 return "cortex-a8"; 1434 default: 1435 switch (getEnvironment()) { 1436 case llvm::Triple::EABIHF: 1437 case llvm::Triple::GNUEABIHF: 1438 return "arm1176jzf-s"; 1439 default: 1440 return "arm7tdmi"; 1441 } 1442 } 1443 1444 llvm_unreachable("invalid arch name"); 1445 } 1446