Home | History | Annotate | Download | only in ADT
      1 //===----------- Triple.cpp - Triple unit tests ---------------------------===//
      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 "gtest/gtest.h"
     11 #include "llvm/ADT/Triple.h"
     12 
     13 using namespace llvm;
     14 
     15 namespace {
     16 
     17 TEST(TripleTest, BasicParsing) {
     18   Triple T;
     19 
     20   T = Triple("");
     21   EXPECT_EQ("", T.getArchName().str());
     22   EXPECT_EQ("", T.getVendorName().str());
     23   EXPECT_EQ("", T.getOSName().str());
     24   EXPECT_EQ("", T.getEnvironmentName().str());
     25 
     26   T = Triple("-");
     27   EXPECT_EQ("", T.getArchName().str());
     28   EXPECT_EQ("", T.getVendorName().str());
     29   EXPECT_EQ("", T.getOSName().str());
     30   EXPECT_EQ("", T.getEnvironmentName().str());
     31 
     32   T = Triple("--");
     33   EXPECT_EQ("", T.getArchName().str());
     34   EXPECT_EQ("", T.getVendorName().str());
     35   EXPECT_EQ("", T.getOSName().str());
     36   EXPECT_EQ("", T.getEnvironmentName().str());
     37 
     38   T = Triple("---");
     39   EXPECT_EQ("", T.getArchName().str());
     40   EXPECT_EQ("", T.getVendorName().str());
     41   EXPECT_EQ("", T.getOSName().str());
     42   EXPECT_EQ("", T.getEnvironmentName().str());
     43 
     44   T = Triple("----");
     45   EXPECT_EQ("", T.getArchName().str());
     46   EXPECT_EQ("", T.getVendorName().str());
     47   EXPECT_EQ("", T.getOSName().str());
     48   EXPECT_EQ("-", T.getEnvironmentName().str());
     49 
     50   T = Triple("a");
     51   EXPECT_EQ("a", T.getArchName().str());
     52   EXPECT_EQ("", T.getVendorName().str());
     53   EXPECT_EQ("", T.getOSName().str());
     54   EXPECT_EQ("", T.getEnvironmentName().str());
     55 
     56   T = Triple("a-b");
     57   EXPECT_EQ("a", T.getArchName().str());
     58   EXPECT_EQ("b", T.getVendorName().str());
     59   EXPECT_EQ("", T.getOSName().str());
     60   EXPECT_EQ("", T.getEnvironmentName().str());
     61 
     62   T = Triple("a-b-c");
     63   EXPECT_EQ("a", T.getArchName().str());
     64   EXPECT_EQ("b", T.getVendorName().str());
     65   EXPECT_EQ("c", T.getOSName().str());
     66   EXPECT_EQ("", T.getEnvironmentName().str());
     67 
     68   T = Triple("a-b-c-d");
     69   EXPECT_EQ("a", T.getArchName().str());
     70   EXPECT_EQ("b", T.getVendorName().str());
     71   EXPECT_EQ("c", T.getOSName().str());
     72   EXPECT_EQ("d", T.getEnvironmentName().str());
     73 }
     74 
     75 TEST(TripleTest, ParsedIDs) {
     76   Triple T;
     77 
     78   T = Triple("i386-apple-darwin");
     79   EXPECT_EQ(Triple::x86, T.getArch());
     80   EXPECT_EQ(Triple::Apple, T.getVendor());
     81   EXPECT_EQ(Triple::Darwin, T.getOS());
     82   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
     83 
     84   T = Triple("x86_64-pc-linux-gnu");
     85   EXPECT_EQ(Triple::x86_64, T.getArch());
     86   EXPECT_EQ(Triple::PC, T.getVendor());
     87   EXPECT_EQ(Triple::Linux, T.getOS());
     88   EXPECT_EQ(Triple::GNU, T.getEnvironment());
     89 
     90   T = Triple("powerpc-bgp-linux");
     91   EXPECT_EQ(Triple::ppc, T.getArch());
     92   EXPECT_EQ(Triple::BGP, T.getVendor());
     93   EXPECT_EQ(Triple::Linux, T.getOS());
     94   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
     95 
     96   T = Triple("powerpc-bgp-cnk");
     97   EXPECT_EQ(Triple::ppc, T.getArch());
     98   EXPECT_EQ(Triple::BGP, T.getVendor());
     99   EXPECT_EQ(Triple::CNK, T.getOS());
    100   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
    101 
    102   T = Triple("powerpc64-bgq-linux");
    103   EXPECT_EQ(Triple::ppc64, T.getArch());
    104   EXPECT_EQ(Triple::BGQ, T.getVendor());
    105   EXPECT_EQ(Triple::Linux, T.getOS());
    106   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
    107 
    108   T = Triple("powerpc-ibm-aix");
    109   EXPECT_EQ(Triple::ppc, T.getArch());
    110   EXPECT_EQ(Triple::IBM, T.getVendor());
    111   EXPECT_EQ(Triple::AIX, T.getOS());
    112   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
    113 
    114   T = Triple("powerpc64-ibm-aix");
    115   EXPECT_EQ(Triple::ppc64, T.getArch());
    116   EXPECT_EQ(Triple::IBM, T.getVendor());
    117   EXPECT_EQ(Triple::AIX, T.getOS());
    118   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
    119 
    120   T = Triple("powerpc-dunno-notsure");
    121   EXPECT_EQ(Triple::ppc, T.getArch());
    122   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
    123   EXPECT_EQ(Triple::UnknownOS, T.getOS());
    124   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
    125 
    126   T = Triple("arm-none-none-eabi");
    127   EXPECT_EQ(Triple::arm, T.getArch());
    128   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
    129   EXPECT_EQ(Triple::UnknownOS, T.getOS());
    130   EXPECT_EQ(Triple::EABI, T.getEnvironment());
    131 
    132   T = Triple("amdil-unknown-unknown");
    133   EXPECT_EQ(Triple::amdil, T.getArch());
    134   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
    135   EXPECT_EQ(Triple::UnknownOS, T.getOS());
    136 
    137   T = Triple("amdil64-unknown-unknown");
    138   EXPECT_EQ(Triple::amdil64, T.getArch());
    139   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
    140   EXPECT_EQ(Triple::UnknownOS, T.getOS());
    141 
    142   T = Triple("hsail-unknown-unknown");
    143   EXPECT_EQ(Triple::hsail, T.getArch());
    144   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
    145   EXPECT_EQ(Triple::UnknownOS, T.getOS());
    146 
    147   T = Triple("hsail64-unknown-unknown");
    148   EXPECT_EQ(Triple::hsail64, T.getArch());
    149   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
    150   EXPECT_EQ(Triple::UnknownOS, T.getOS());
    151 
    152   T = Triple("spir-unknown-unknown");
    153   EXPECT_EQ(Triple::spir, T.getArch());
    154   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
    155   EXPECT_EQ(Triple::UnknownOS, T.getOS());
    156 
    157   T = Triple("spir64-unknown-unknown");
    158   EXPECT_EQ(Triple::spir64, T.getArch());
    159   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
    160   EXPECT_EQ(Triple::UnknownOS, T.getOS());
    161 
    162   T = Triple("x86_64-unknown-cloudabi");
    163   EXPECT_EQ(Triple::x86_64, T.getArch());
    164   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
    165   EXPECT_EQ(Triple::CloudABI, T.getOS());
    166   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
    167 
    168   T = Triple("huh");
    169   EXPECT_EQ(Triple::UnknownArch, T.getArch());
    170 }
    171 
    172 static std::string Join(StringRef A, StringRef B, StringRef C) {
    173   std::string Str = A; Str += '-'; Str += B; Str += '-'; Str += C;
    174   return Str;
    175 }
    176 
    177 static std::string Join(StringRef A, StringRef B, StringRef C, StringRef D) {
    178   std::string Str = A; Str += '-'; Str += B; Str += '-'; Str += C; Str += '-';
    179   Str += D; return Str;
    180 }
    181 
    182 TEST(TripleTest, Normalization) {
    183 
    184   EXPECT_EQ("", Triple::normalize(""));
    185   EXPECT_EQ("-", Triple::normalize("-"));
    186   EXPECT_EQ("--", Triple::normalize("--"));
    187   EXPECT_EQ("---", Triple::normalize("---"));
    188   EXPECT_EQ("----", Triple::normalize("----"));
    189 
    190   EXPECT_EQ("a", Triple::normalize("a"));
    191   EXPECT_EQ("a-b", Triple::normalize("a-b"));
    192   EXPECT_EQ("a-b-c", Triple::normalize("a-b-c"));
    193   EXPECT_EQ("a-b-c-d", Triple::normalize("a-b-c-d"));
    194 
    195   EXPECT_EQ("i386-b-c", Triple::normalize("i386-b-c"));
    196   EXPECT_EQ("i386-a-c", Triple::normalize("a-i386-c"));
    197   EXPECT_EQ("i386-a-b", Triple::normalize("a-b-i386"));
    198   EXPECT_EQ("i386-a-b-c", Triple::normalize("a-b-c-i386"));
    199 
    200   EXPECT_EQ("a-pc-c", Triple::normalize("a-pc-c"));
    201   EXPECT_EQ("-pc-b-c", Triple::normalize("pc-b-c"));
    202   EXPECT_EQ("a-pc-b", Triple::normalize("a-b-pc"));
    203   EXPECT_EQ("a-pc-b-c", Triple::normalize("a-b-c-pc"));
    204 
    205   EXPECT_EQ("a-b-linux", Triple::normalize("a-b-linux"));
    206   EXPECT_EQ("--linux-b-c", Triple::normalize("linux-b-c"));
    207   EXPECT_EQ("a--linux-c", Triple::normalize("a-linux-c"));
    208 
    209   EXPECT_EQ("i386-pc-a", Triple::normalize("a-pc-i386"));
    210   EXPECT_EQ("i386-pc-", Triple::normalize("-pc-i386"));
    211   EXPECT_EQ("-pc-linux-c", Triple::normalize("linux-pc-c"));
    212   EXPECT_EQ("-pc-linux", Triple::normalize("linux-pc-"));
    213 
    214   EXPECT_EQ("i386", Triple::normalize("i386"));
    215   EXPECT_EQ("-pc", Triple::normalize("pc"));
    216   EXPECT_EQ("--linux", Triple::normalize("linux"));
    217 
    218   EXPECT_EQ("x86_64--linux-gnu", Triple::normalize("x86_64-gnu-linux"));
    219 
    220   // Check that normalizing a permutated set of valid components returns a
    221   // triple with the unpermuted components.
    222   StringRef C[4];
    223   for (int Arch = 1+Triple::UnknownArch; Arch <= Triple::amdil; ++Arch) {
    224     C[0] = Triple::getArchTypeName(Triple::ArchType(Arch));
    225     for (int Vendor = 1+Triple::UnknownVendor; Vendor <= Triple::PC;
    226          ++Vendor) {
    227       C[1] = Triple::getVendorTypeName(Triple::VendorType(Vendor));
    228       for (int OS = 1+Triple::UnknownOS; OS <= Triple::Minix; ++OS) {
    229         if (OS == Triple::Win32)
    230           continue;
    231 
    232         C[2] = Triple::getOSTypeName(Triple::OSType(OS));
    233 
    234         std::string E = Join(C[0], C[1], C[2]);
    235         EXPECT_EQ(E, Triple::normalize(Join(C[0], C[1], C[2])));
    236 
    237         EXPECT_EQ(E, Triple::normalize(Join(C[0], C[2], C[1])));
    238         EXPECT_EQ(E, Triple::normalize(Join(C[1], C[2], C[0])));
    239         EXPECT_EQ(E, Triple::normalize(Join(C[1], C[0], C[2])));
    240         EXPECT_EQ(E, Triple::normalize(Join(C[2], C[0], C[1])));
    241         EXPECT_EQ(E, Triple::normalize(Join(C[2], C[1], C[0])));
    242 
    243         for (int Env = 1 + Triple::UnknownEnvironment; Env <= Triple::Android;
    244              ++Env) {
    245           C[3] = Triple::getEnvironmentTypeName(Triple::EnvironmentType(Env));
    246 
    247           std::string F = Join(C[0], C[1], C[2], C[3]);
    248           EXPECT_EQ(F, Triple::normalize(Join(C[0], C[1], C[2], C[3])));
    249 
    250           EXPECT_EQ(F, Triple::normalize(Join(C[0], C[1], C[3], C[2])));
    251           EXPECT_EQ(F, Triple::normalize(Join(C[0], C[2], C[3], C[1])));
    252           EXPECT_EQ(F, Triple::normalize(Join(C[0], C[2], C[1], C[3])));
    253           EXPECT_EQ(F, Triple::normalize(Join(C[0], C[3], C[1], C[2])));
    254           EXPECT_EQ(F, Triple::normalize(Join(C[0], C[3], C[2], C[1])));
    255           EXPECT_EQ(F, Triple::normalize(Join(C[1], C[2], C[3], C[0])));
    256           EXPECT_EQ(F, Triple::normalize(Join(C[1], C[2], C[0], C[3])));
    257           EXPECT_EQ(F, Triple::normalize(Join(C[1], C[3], C[0], C[2])));
    258           EXPECT_EQ(F, Triple::normalize(Join(C[1], C[3], C[2], C[0])));
    259           EXPECT_EQ(F, Triple::normalize(Join(C[1], C[0], C[2], C[3])));
    260           EXPECT_EQ(F, Triple::normalize(Join(C[1], C[0], C[3], C[2])));
    261           EXPECT_EQ(F, Triple::normalize(Join(C[2], C[3], C[0], C[1])));
    262           EXPECT_EQ(F, Triple::normalize(Join(C[2], C[3], C[1], C[0])));
    263           EXPECT_EQ(F, Triple::normalize(Join(C[2], C[0], C[1], C[3])));
    264           EXPECT_EQ(F, Triple::normalize(Join(C[2], C[0], C[3], C[1])));
    265           EXPECT_EQ(F, Triple::normalize(Join(C[2], C[1], C[3], C[0])));
    266           EXPECT_EQ(F, Triple::normalize(Join(C[2], C[1], C[0], C[3])));
    267           EXPECT_EQ(F, Triple::normalize(Join(C[3], C[0], C[1], C[2])));
    268           EXPECT_EQ(F, Triple::normalize(Join(C[3], C[0], C[2], C[1])));
    269           EXPECT_EQ(F, Triple::normalize(Join(C[3], C[1], C[2], C[0])));
    270           EXPECT_EQ(F, Triple::normalize(Join(C[3], C[1], C[0], C[2])));
    271           EXPECT_EQ(F, Triple::normalize(Join(C[3], C[2], C[0], C[1])));
    272           EXPECT_EQ(F, Triple::normalize(Join(C[3], C[2], C[1], C[0])));
    273         }
    274       }
    275     }
    276   }
    277 
    278   // Various real-world funky triples.  The value returned by GCC's config.sub
    279   // is given in the comment.
    280   EXPECT_EQ("i386--windows-gnu", Triple::normalize("i386-mingw32")); // i386-pc-mingw32
    281   EXPECT_EQ("x86_64--linux-gnu", Triple::normalize("x86_64-linux-gnu")); // x86_64-pc-linux-gnu
    282   EXPECT_EQ("i486--linux-gnu", Triple::normalize("i486-linux-gnu")); // i486-pc-linux-gnu
    283   EXPECT_EQ("i386-redhat-linux", Triple::normalize("i386-redhat-linux")); // i386-redhat-linux-gnu
    284   EXPECT_EQ("i686--linux", Triple::normalize("i686-linux")); // i686-pc-linux-gnu
    285   EXPECT_EQ("arm-none--eabi", Triple::normalize("arm-none-eabi")); // arm-none-eabi
    286 }
    287 
    288 TEST(TripleTest, MutateName) {
    289   Triple T;
    290   EXPECT_EQ(Triple::UnknownArch, T.getArch());
    291   EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
    292   EXPECT_EQ(Triple::UnknownOS, T.getOS());
    293   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
    294 
    295   T.setArchName("i386");
    296   EXPECT_EQ(Triple::x86, T.getArch());
    297   EXPECT_EQ("i386--", T.getTriple());
    298 
    299   T.setVendorName("pc");
    300   EXPECT_EQ(Triple::x86, T.getArch());
    301   EXPECT_EQ(Triple::PC, T.getVendor());
    302   EXPECT_EQ("i386-pc-", T.getTriple());
    303 
    304   T.setOSName("linux");
    305   EXPECT_EQ(Triple::x86, T.getArch());
    306   EXPECT_EQ(Triple::PC, T.getVendor());
    307   EXPECT_EQ(Triple::Linux, T.getOS());
    308   EXPECT_EQ("i386-pc-linux", T.getTriple());
    309 
    310   T.setEnvironmentName("gnu");
    311   EXPECT_EQ(Triple::x86, T.getArch());
    312   EXPECT_EQ(Triple::PC, T.getVendor());
    313   EXPECT_EQ(Triple::Linux, T.getOS());
    314   EXPECT_EQ("i386-pc-linux-gnu", T.getTriple());
    315 
    316   T.setOSName("freebsd");
    317   EXPECT_EQ(Triple::x86, T.getArch());
    318   EXPECT_EQ(Triple::PC, T.getVendor());
    319   EXPECT_EQ(Triple::FreeBSD, T.getOS());
    320   EXPECT_EQ("i386-pc-freebsd-gnu", T.getTriple());
    321 
    322   T.setOSAndEnvironmentName("darwin");
    323   EXPECT_EQ(Triple::x86, T.getArch());
    324   EXPECT_EQ(Triple::PC, T.getVendor());
    325   EXPECT_EQ(Triple::Darwin, T.getOS());
    326   EXPECT_EQ("i386-pc-darwin", T.getTriple());
    327 
    328 }
    329 
    330 TEST(TripleTest, BitWidthPredicates) {
    331   Triple T;
    332   EXPECT_FALSE(T.isArch16Bit());
    333   EXPECT_FALSE(T.isArch32Bit());
    334   EXPECT_FALSE(T.isArch64Bit());
    335 
    336   T.setArch(Triple::arm);
    337   EXPECT_FALSE(T.isArch16Bit());
    338   EXPECT_TRUE(T.isArch32Bit());
    339   EXPECT_FALSE(T.isArch64Bit());
    340 
    341   T.setArch(Triple::hexagon);
    342   EXPECT_FALSE(T.isArch16Bit());
    343   EXPECT_TRUE(T.isArch32Bit());
    344   EXPECT_FALSE(T.isArch64Bit());
    345 
    346   T.setArch(Triple::mips);
    347   EXPECT_FALSE(T.isArch16Bit());
    348   EXPECT_TRUE(T.isArch32Bit());
    349   EXPECT_FALSE(T.isArch64Bit());
    350 
    351   T.setArch(Triple::mips64);
    352   EXPECT_FALSE(T.isArch16Bit());
    353   EXPECT_FALSE(T.isArch32Bit());
    354   EXPECT_TRUE(T.isArch64Bit());
    355 
    356   T.setArch(Triple::msp430);
    357   EXPECT_TRUE(T.isArch16Bit());
    358   EXPECT_FALSE(T.isArch32Bit());
    359   EXPECT_FALSE(T.isArch64Bit());
    360 
    361   T.setArch(Triple::ppc);
    362   EXPECT_FALSE(T.isArch16Bit());
    363   EXPECT_TRUE(T.isArch32Bit());
    364   EXPECT_FALSE(T.isArch64Bit());
    365 
    366   T.setArch(Triple::ppc64);
    367   EXPECT_FALSE(T.isArch16Bit());
    368   EXPECT_FALSE(T.isArch32Bit());
    369   EXPECT_TRUE(T.isArch64Bit());
    370 
    371   T.setArch(Triple::x86);
    372   EXPECT_FALSE(T.isArch16Bit());
    373   EXPECT_TRUE(T.isArch32Bit());
    374   EXPECT_FALSE(T.isArch64Bit());
    375 
    376   T.setArch(Triple::x86_64);
    377   EXPECT_FALSE(T.isArch16Bit());
    378   EXPECT_FALSE(T.isArch32Bit());
    379   EXPECT_TRUE(T.isArch64Bit());
    380 
    381   T.setArch(Triple::amdil);
    382   EXPECT_FALSE(T.isArch16Bit());
    383   EXPECT_TRUE(T.isArch32Bit());
    384   EXPECT_FALSE(T.isArch64Bit());
    385 
    386   T.setArch(Triple::amdil64);
    387   EXPECT_FALSE(T.isArch16Bit());
    388   EXPECT_FALSE(T.isArch32Bit());
    389   EXPECT_TRUE(T.isArch64Bit());
    390 
    391   T.setArch(Triple::hsail);
    392   EXPECT_FALSE(T.isArch16Bit());
    393   EXPECT_TRUE(T.isArch32Bit());
    394   EXPECT_FALSE(T.isArch64Bit());
    395 
    396   T.setArch(Triple::hsail64);
    397   EXPECT_FALSE(T.isArch16Bit());
    398   EXPECT_FALSE(T.isArch32Bit());
    399   EXPECT_TRUE(T.isArch64Bit());
    400 
    401   T.setArch(Triple::spir);
    402   EXPECT_FALSE(T.isArch16Bit());
    403   EXPECT_TRUE(T.isArch32Bit());
    404   EXPECT_FALSE(T.isArch64Bit());
    405 
    406   T.setArch(Triple::spir64);
    407   EXPECT_FALSE(T.isArch16Bit());
    408   EXPECT_FALSE(T.isArch32Bit());
    409   EXPECT_TRUE(T.isArch64Bit());
    410 }
    411 
    412 TEST(TripleTest, BitWidthArchVariants) {
    413   Triple T;
    414   EXPECT_EQ(Triple::UnknownArch, T.get32BitArchVariant().getArch());
    415   EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
    416 
    417   T.setArch(Triple::UnknownArch);
    418   EXPECT_EQ(Triple::UnknownArch, T.get32BitArchVariant().getArch());
    419   EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
    420 
    421   T.setArch(Triple::mips);
    422   EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch());
    423   EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch());
    424 
    425   T.setArch(Triple::mipsel);
    426   EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch());
    427   EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch());
    428 
    429   T.setArch(Triple::ppc);
    430   EXPECT_EQ(Triple::ppc, T.get32BitArchVariant().getArch());
    431   EXPECT_EQ(Triple::ppc64, T.get64BitArchVariant().getArch());
    432 
    433   T.setArch(Triple::nvptx);
    434   EXPECT_EQ(Triple::nvptx, T.get32BitArchVariant().getArch());
    435   EXPECT_EQ(Triple::nvptx64, T.get64BitArchVariant().getArch());
    436 
    437   T.setArch(Triple::sparc);
    438   EXPECT_EQ(Triple::sparc, T.get32BitArchVariant().getArch());
    439   EXPECT_EQ(Triple::sparcv9, T.get64BitArchVariant().getArch());
    440 
    441   T.setArch(Triple::x86);
    442   EXPECT_EQ(Triple::x86, T.get32BitArchVariant().getArch());
    443   EXPECT_EQ(Triple::x86_64, T.get64BitArchVariant().getArch());
    444 
    445   T.setArch(Triple::mips64);
    446   EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch());
    447   EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch());
    448 
    449   T.setArch(Triple::mips64el);
    450   EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch());
    451   EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch());
    452 
    453   T.setArch(Triple::ppc64);
    454   EXPECT_EQ(Triple::ppc, T.get32BitArchVariant().getArch());
    455   EXPECT_EQ(Triple::ppc64, T.get64BitArchVariant().getArch());
    456 
    457   T.setArch(Triple::nvptx64);
    458   EXPECT_EQ(Triple::nvptx, T.get32BitArchVariant().getArch());
    459   EXPECT_EQ(Triple::nvptx64, T.get64BitArchVariant().getArch());
    460 
    461   T.setArch(Triple::sparcv9);
    462   EXPECT_EQ(Triple::sparc, T.get32BitArchVariant().getArch());
    463   EXPECT_EQ(Triple::sparcv9, T.get64BitArchVariant().getArch());
    464 
    465   T.setArch(Triple::x86_64);
    466   EXPECT_EQ(Triple::x86, T.get32BitArchVariant().getArch());
    467   EXPECT_EQ(Triple::x86_64, T.get64BitArchVariant().getArch());
    468 
    469   T.setArch(Triple::amdil);
    470   EXPECT_EQ(Triple::amdil, T.get32BitArchVariant().getArch());
    471   EXPECT_EQ(Triple::amdil64, T.get64BitArchVariant().getArch());
    472 
    473   T.setArch(Triple::amdil64);
    474   EXPECT_EQ(Triple::amdil, T.get32BitArchVariant().getArch());
    475   EXPECT_EQ(Triple::amdil64, T.get64BitArchVariant().getArch());
    476 
    477   T.setArch(Triple::hsail);
    478   EXPECT_EQ(Triple::hsail, T.get32BitArchVariant().getArch());
    479   EXPECT_EQ(Triple::hsail64, T.get64BitArchVariant().getArch());
    480 
    481   T.setArch(Triple::hsail64);
    482   EXPECT_EQ(Triple::hsail, T.get32BitArchVariant().getArch());
    483   EXPECT_EQ(Triple::hsail64, T.get64BitArchVariant().getArch());
    484 
    485   T.setArch(Triple::spir);
    486   EXPECT_EQ(Triple::spir, T.get32BitArchVariant().getArch());
    487   EXPECT_EQ(Triple::spir64, T.get64BitArchVariant().getArch());
    488 
    489   T.setArch(Triple::spir64);
    490   EXPECT_EQ(Triple::spir, T.get32BitArchVariant().getArch());
    491   EXPECT_EQ(Triple::spir64, T.get64BitArchVariant().getArch());
    492 }
    493 
    494 TEST(TripleTest, getOSVersion) {
    495   Triple T;
    496   unsigned Major, Minor, Micro;
    497 
    498   T = Triple("i386-apple-darwin9");
    499   EXPECT_TRUE(T.isMacOSX());
    500   EXPECT_FALSE(T.isiOS());
    501   EXPECT_FALSE(T.isArch16Bit());
    502   EXPECT_TRUE(T.isArch32Bit());
    503   EXPECT_FALSE(T.isArch64Bit());
    504   T.getMacOSXVersion(Major, Minor, Micro);
    505   EXPECT_EQ((unsigned)10, Major);
    506   EXPECT_EQ((unsigned)5, Minor);
    507   EXPECT_EQ((unsigned)0, Micro);
    508   T.getiOSVersion(Major, Minor, Micro);
    509   EXPECT_EQ((unsigned)5, Major);
    510   EXPECT_EQ((unsigned)0, Minor);
    511   EXPECT_EQ((unsigned)0, Micro);
    512 
    513   T = Triple("x86_64-apple-darwin9");
    514   EXPECT_TRUE(T.isMacOSX());
    515   EXPECT_FALSE(T.isiOS());
    516   EXPECT_FALSE(T.isArch16Bit());
    517   EXPECT_FALSE(T.isArch32Bit());
    518   EXPECT_TRUE(T.isArch64Bit());
    519   T.getMacOSXVersion(Major, Minor, Micro);
    520   EXPECT_EQ((unsigned)10, Major);
    521   EXPECT_EQ((unsigned)5, Minor);
    522   EXPECT_EQ((unsigned)0, Micro);
    523   T.getiOSVersion(Major, Minor, Micro);
    524   EXPECT_EQ((unsigned)5, Major);
    525   EXPECT_EQ((unsigned)0, Minor);
    526   EXPECT_EQ((unsigned)0, Micro);
    527 
    528   T = Triple("x86_64-apple-macosx");
    529   EXPECT_TRUE(T.isMacOSX());
    530   EXPECT_FALSE(T.isiOS());
    531   EXPECT_FALSE(T.isArch16Bit());
    532   EXPECT_FALSE(T.isArch32Bit());
    533   EXPECT_TRUE(T.isArch64Bit());
    534   T.getMacOSXVersion(Major, Minor, Micro);
    535   EXPECT_EQ((unsigned)10, Major);
    536   EXPECT_EQ((unsigned)4, Minor);
    537   EXPECT_EQ((unsigned)0, Micro);
    538   T.getiOSVersion(Major, Minor, Micro);
    539   EXPECT_EQ((unsigned)5, Major);
    540   EXPECT_EQ((unsigned)0, Minor);
    541   EXPECT_EQ((unsigned)0, Micro);
    542 
    543   T = Triple("x86_64-apple-macosx10.7");
    544   EXPECT_TRUE(T.isMacOSX());
    545   EXPECT_FALSE(T.isiOS());
    546   EXPECT_FALSE(T.isArch16Bit());
    547   EXPECT_FALSE(T.isArch32Bit());
    548   EXPECT_TRUE(T.isArch64Bit());
    549   T.getMacOSXVersion(Major, Minor, Micro);
    550   EXPECT_EQ((unsigned)10, Major);
    551   EXPECT_EQ((unsigned)7, Minor);
    552   EXPECT_EQ((unsigned)0, Micro);
    553   T.getiOSVersion(Major, Minor, Micro);
    554   EXPECT_EQ((unsigned)5, Major);
    555   EXPECT_EQ((unsigned)0, Minor);
    556   EXPECT_EQ((unsigned)0, Micro);
    557 
    558   T = Triple("armv7-apple-ios");
    559   EXPECT_FALSE(T.isMacOSX());
    560   EXPECT_TRUE(T.isiOS());
    561   EXPECT_FALSE(T.isArch16Bit());
    562   EXPECT_TRUE(T.isArch32Bit());
    563   EXPECT_FALSE(T.isArch64Bit());
    564   T.getMacOSXVersion(Major, Minor, Micro);
    565   EXPECT_EQ((unsigned)10, Major);
    566   EXPECT_EQ((unsigned)4, Minor);
    567   EXPECT_EQ((unsigned)0, Micro);
    568   T.getiOSVersion(Major, Minor, Micro);
    569   EXPECT_EQ((unsigned)5, Major);
    570   EXPECT_EQ((unsigned)0, Minor);
    571   EXPECT_EQ((unsigned)0, Micro);
    572 
    573   T = Triple("armv7-apple-ios7.0");
    574   EXPECT_FALSE(T.isMacOSX());
    575   EXPECT_TRUE(T.isiOS());
    576   EXPECT_FALSE(T.isArch16Bit());
    577   EXPECT_TRUE(T.isArch32Bit());
    578   EXPECT_FALSE(T.isArch64Bit());
    579   T.getMacOSXVersion(Major, Minor, Micro);
    580   EXPECT_EQ((unsigned)10, Major);
    581   EXPECT_EQ((unsigned)4, Minor);
    582   EXPECT_EQ((unsigned)0, Micro);
    583   T.getiOSVersion(Major, Minor, Micro);
    584   EXPECT_EQ((unsigned)7, Major);
    585   EXPECT_EQ((unsigned)0, Minor);
    586   EXPECT_EQ((unsigned)0, Micro);
    587 }
    588 
    589 TEST(TripleTest, FileFormat) {
    590   EXPECT_EQ(Triple::ELF, Triple("i686-unknown-linux-gnu").getObjectFormat());
    591   EXPECT_EQ(Triple::ELF, Triple("i686-unknown-freebsd").getObjectFormat());
    592   EXPECT_EQ(Triple::ELF, Triple("i686-unknown-netbsd").getObjectFormat());
    593   EXPECT_EQ(Triple::ELF, Triple("i686--win32-elf").getObjectFormat());
    594   EXPECT_EQ(Triple::ELF, Triple("i686---elf").getObjectFormat());
    595 
    596   EXPECT_EQ(Triple::MachO, Triple("i686-apple-macosx").getObjectFormat());
    597   EXPECT_EQ(Triple::MachO, Triple("i686-apple-ios").getObjectFormat());
    598   EXPECT_EQ(Triple::MachO, Triple("i686---macho").getObjectFormat());
    599 
    600   EXPECT_EQ(Triple::COFF, Triple("i686--win32").getObjectFormat());
    601 
    602   EXPECT_EQ(Triple::ELF, Triple("i686-pc-windows-msvc-elf").getObjectFormat());
    603   EXPECT_EQ(Triple::ELF, Triple("i686-pc-cygwin-elf").getObjectFormat());
    604 
    605   Triple MSVCNormalized(Triple::normalize("i686-pc-windows-msvc-elf"));
    606   EXPECT_EQ(Triple::ELF, MSVCNormalized.getObjectFormat());
    607 
    608   Triple GNUWindowsNormalized(Triple::normalize("i686-pc-windows-gnu-elf"));
    609   EXPECT_EQ(Triple::ELF, GNUWindowsNormalized.getObjectFormat());
    610 
    611   Triple CygnusNormalised(Triple::normalize("i686-pc-windows-cygnus-elf"));
    612   EXPECT_EQ(Triple::ELF, CygnusNormalised.getObjectFormat());
    613 
    614   Triple CygwinNormalized(Triple::normalize("i686-pc-cygwin-elf"));
    615   EXPECT_EQ(Triple::ELF, CygwinNormalized.getObjectFormat());
    616 
    617   Triple T = Triple("");
    618   T.setObjectFormat(Triple::ELF);
    619   EXPECT_EQ(Triple::ELF, T.getObjectFormat());
    620 }
    621 
    622 TEST(TripleTest, NormalizeWindows) {
    623   EXPECT_EQ("i686-pc-windows-msvc", Triple::normalize("i686-pc-win32"));
    624   EXPECT_EQ("i686--windows-msvc", Triple::normalize("i686-win32"));
    625   EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-mingw32"));
    626   EXPECT_EQ("i686--windows-gnu", Triple::normalize("i686-mingw32"));
    627   EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-mingw32-w64"));
    628   EXPECT_EQ("i686--windows-gnu", Triple::normalize("i686-mingw32-w64"));
    629   EXPECT_EQ("i686-pc-windows-cygnus", Triple::normalize("i686-pc-cygwin"));
    630   EXPECT_EQ("i686--windows-cygnus", Triple::normalize("i686-cygwin"));
    631 
    632   EXPECT_EQ("x86_64-pc-windows-msvc", Triple::normalize("x86_64-pc-win32"));
    633   EXPECT_EQ("x86_64--windows-msvc", Triple::normalize("x86_64-win32"));
    634   EXPECT_EQ("x86_64-pc-windows-gnu", Triple::normalize("x86_64-pc-mingw32"));
    635   EXPECT_EQ("x86_64--windows-gnu", Triple::normalize("x86_64-mingw32"));
    636   EXPECT_EQ("x86_64-pc-windows-gnu", Triple::normalize("x86_64-pc-mingw32-w64"));
    637   EXPECT_EQ("x86_64--windows-gnu", Triple::normalize("x86_64-mingw32-w64"));
    638 
    639   EXPECT_EQ("i686-pc-windows-elf", Triple::normalize("i686-pc-win32-elf"));
    640   EXPECT_EQ("i686--windows-elf", Triple::normalize("i686-win32-elf"));
    641   EXPECT_EQ("i686-pc-windows-macho", Triple::normalize("i686-pc-win32-macho"));
    642   EXPECT_EQ("i686--windows-macho", Triple::normalize("i686-win32-macho"));
    643 
    644   EXPECT_EQ("x86_64-pc-windows-elf", Triple::normalize("x86_64-pc-win32-elf"));
    645   EXPECT_EQ("x86_64--windows-elf", Triple::normalize("x86_64-win32-elf"));
    646   EXPECT_EQ("x86_64-pc-windows-macho", Triple::normalize("x86_64-pc-win32-macho"));
    647   EXPECT_EQ("x86_64--windows-macho", Triple::normalize("x86_64-win32-macho"));
    648 
    649   EXPECT_EQ("i686-pc-windows-cygnus",
    650             Triple::normalize("i686-pc-windows-cygnus"));
    651   EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-windows-gnu"));
    652   EXPECT_EQ("i686-pc-windows-itanium", Triple::normalize("i686-pc-windows-itanium"));
    653   EXPECT_EQ("i686-pc-windows-msvc", Triple::normalize("i686-pc-windows-msvc"));
    654 
    655   EXPECT_EQ("i686-pc-windows-elf", Triple::normalize("i686-pc-windows-elf-elf"));
    656 }
    657 
    658 TEST(TripleTest, getARMCPUForArch) {
    659   {
    660     llvm::Triple Triple("armv6-unknown-freebsd");
    661     EXPECT_STREQ("arm1176jzf-s", Triple.getARMCPUForArch());
    662   }
    663   {
    664     llvm::Triple Triple("armv7s-apple-ios7");
    665     EXPECT_STREQ("swift", Triple.getARMCPUForArch());
    666   }
    667   {
    668     llvm::Triple Triple("armv7-apple-ios7");
    669     EXPECT_STREQ("cortex-a8", Triple.getARMCPUForArch());
    670     EXPECT_STREQ("swift", Triple.getARMCPUForArch("armv7s"));
    671   }
    672   {
    673     llvm::Triple Triple("arm--nacl");
    674     EXPECT_STREQ("cortex-a8", Triple.getARMCPUForArch("arm"));
    675   }
    676 }
    677 }
    678 
    679 TEST(TripleTest, NormalizeARM) {
    680   EXPECT_EQ("armv6--netbsd-eabi", Triple::normalize("armv6-netbsd-eabi"));
    681   EXPECT_EQ("armv7--netbsd-eabi", Triple::normalize("armv7-netbsd-eabi"));
    682   EXPECT_EQ("armv6eb--netbsd-eabi", Triple::normalize("armv6eb-netbsd-eabi"));
    683   EXPECT_EQ("armv7eb--netbsd-eabi", Triple::normalize("armv7eb-netbsd-eabi"));
    684   EXPECT_EQ("armv6--netbsd-eabihf", Triple::normalize("armv6-netbsd-eabihf"));
    685   EXPECT_EQ("armv7--netbsd-eabihf", Triple::normalize("armv7-netbsd-eabihf"));
    686   EXPECT_EQ("armv6eb--netbsd-eabihf", Triple::normalize("armv6eb-netbsd-eabihf"));
    687   EXPECT_EQ("armv7eb--netbsd-eabihf", Triple::normalize("armv7eb-netbsd-eabihf"));
    688 
    689   Triple T;
    690   T = Triple("armv6--netbsd-eabi");
    691   EXPECT_EQ(Triple::arm, T.getArch());
    692   T = Triple("armv6eb--netbsd-eabi");
    693   EXPECT_EQ(Triple::armeb, T.getArch());
    694 }
    695