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