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