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