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