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