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