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