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