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