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