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