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