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