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