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("i386-pc-elfiamcu"); 85 EXPECT_EQ(Triple::x86, T.getArch()); 86 EXPECT_EQ(Triple::PC, T.getVendor()); 87 EXPECT_EQ(Triple::ELFIAMCU, T.getOS()); 88 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); 89 90 T = Triple("x86_64-pc-linux-gnu"); 91 EXPECT_EQ(Triple::x86_64, T.getArch()); 92 EXPECT_EQ(Triple::PC, T.getVendor()); 93 EXPECT_EQ(Triple::Linux, T.getOS()); 94 EXPECT_EQ(Triple::GNU, T.getEnvironment()); 95 96 T = Triple("x86_64-pc-linux-musl"); 97 EXPECT_EQ(Triple::x86_64, T.getArch()); 98 EXPECT_EQ(Triple::PC, T.getVendor()); 99 EXPECT_EQ(Triple::Linux, T.getOS()); 100 EXPECT_EQ(Triple::Musl, T.getEnvironment()); 101 102 T = Triple("powerpc-bgp-linux"); 103 EXPECT_EQ(Triple::ppc, T.getArch()); 104 EXPECT_EQ(Triple::BGP, T.getVendor()); 105 EXPECT_EQ(Triple::Linux, T.getOS()); 106 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); 107 108 T = Triple("powerpc-bgp-cnk"); 109 EXPECT_EQ(Triple::ppc, T.getArch()); 110 EXPECT_EQ(Triple::BGP, T.getVendor()); 111 EXPECT_EQ(Triple::CNK, T.getOS()); 112 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); 113 114 T = Triple("powerpc64-bgq-linux"); 115 EXPECT_EQ(Triple::ppc64, T.getArch()); 116 EXPECT_EQ(Triple::BGQ, T.getVendor()); 117 EXPECT_EQ(Triple::Linux, T.getOS()); 118 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); 119 120 T = Triple("powerpc-ibm-aix"); 121 EXPECT_EQ(Triple::ppc, T.getArch()); 122 EXPECT_EQ(Triple::IBM, T.getVendor()); 123 EXPECT_EQ(Triple::AIX, T.getOS()); 124 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); 125 126 T = Triple("powerpc64-ibm-aix"); 127 EXPECT_EQ(Triple::ppc64, T.getArch()); 128 EXPECT_EQ(Triple::IBM, T.getVendor()); 129 EXPECT_EQ(Triple::AIX, T.getOS()); 130 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); 131 132 T = Triple("powerpc-dunno-notsure"); 133 EXPECT_EQ(Triple::ppc, T.getArch()); 134 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 135 EXPECT_EQ(Triple::UnknownOS, T.getOS()); 136 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); 137 138 T = Triple("arm-none-none-eabi"); 139 EXPECT_EQ(Triple::arm, T.getArch()); 140 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 141 EXPECT_EQ(Triple::UnknownOS, T.getOS()); 142 EXPECT_EQ(Triple::EABI, T.getEnvironment()); 143 144 T = Triple("arm-none-linux-musleabi"); 145 EXPECT_EQ(Triple::arm, T.getArch()); 146 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 147 EXPECT_EQ(Triple::Linux, T.getOS()); 148 EXPECT_EQ(Triple::MuslEABI, T.getEnvironment()); 149 150 T = Triple("armv6hl-none-linux-gnueabi"); 151 EXPECT_EQ(Triple::arm, T.getArch()); 152 EXPECT_EQ(Triple::Linux, T.getOS()); 153 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 154 EXPECT_EQ(Triple::GNUEABI, T.getEnvironment()); 155 156 T = Triple("armv7hl-none-linux-gnueabi"); 157 EXPECT_EQ(Triple::arm, T.getArch()); 158 EXPECT_EQ(Triple::Linux, T.getOS()); 159 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 160 EXPECT_EQ(Triple::GNUEABI, T.getEnvironment()); 161 162 T = Triple("amdil-unknown-unknown"); 163 EXPECT_EQ(Triple::amdil, T.getArch()); 164 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 165 EXPECT_EQ(Triple::UnknownOS, T.getOS()); 166 167 T = Triple("amdil64-unknown-unknown"); 168 EXPECT_EQ(Triple::amdil64, T.getArch()); 169 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 170 EXPECT_EQ(Triple::UnknownOS, T.getOS()); 171 172 T = Triple("hsail-unknown-unknown"); 173 EXPECT_EQ(Triple::hsail, T.getArch()); 174 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 175 EXPECT_EQ(Triple::UnknownOS, T.getOS()); 176 177 T = Triple("hsail64-unknown-unknown"); 178 EXPECT_EQ(Triple::hsail64, T.getArch()); 179 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 180 EXPECT_EQ(Triple::UnknownOS, T.getOS()); 181 182 T = Triple("sparcel-unknown-unknown"); 183 EXPECT_EQ(Triple::sparcel, T.getArch()); 184 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 185 EXPECT_EQ(Triple::UnknownOS, T.getOS()); 186 187 T = Triple("spir-unknown-unknown"); 188 EXPECT_EQ(Triple::spir, T.getArch()); 189 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 190 EXPECT_EQ(Triple::UnknownOS, T.getOS()); 191 192 T = Triple("spir64-unknown-unknown"); 193 EXPECT_EQ(Triple::spir64, T.getArch()); 194 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 195 EXPECT_EQ(Triple::UnknownOS, T.getOS()); 196 197 T = Triple("x86_64-unknown-cloudabi"); 198 EXPECT_EQ(Triple::x86_64, T.getArch()); 199 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 200 EXPECT_EQ(Triple::CloudABI, T.getOS()); 201 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); 202 203 T = Triple("wasm32-unknown-unknown"); 204 EXPECT_EQ(Triple::wasm32, T.getArch()); 205 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 206 EXPECT_EQ(Triple::UnknownOS, T.getOS()); 207 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); 208 209 T = Triple("wasm64-unknown-unknown"); 210 EXPECT_EQ(Triple::wasm64, T.getArch()); 211 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 212 EXPECT_EQ(Triple::UnknownOS, T.getOS()); 213 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); 214 215 T = Triple("avr-unknown-unknown"); 216 EXPECT_EQ(Triple::avr, T.getArch()); 217 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 218 EXPECT_EQ(Triple::UnknownOS, T.getOS()); 219 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); 220 221 T = Triple("avr"); 222 EXPECT_EQ(Triple::avr, T.getArch()); 223 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 224 EXPECT_EQ(Triple::UnknownOS, T.getOS()); 225 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); 226 227 T = Triple("lanai-unknown-unknown"); 228 EXPECT_EQ(Triple::lanai, T.getArch()); 229 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 230 EXPECT_EQ(Triple::UnknownOS, T.getOS()); 231 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); 232 233 T = Triple("lanai"); 234 EXPECT_EQ(Triple::lanai, T.getArch()); 235 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 236 EXPECT_EQ(Triple::UnknownOS, T.getOS()); 237 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); 238 239 T = Triple("amdgcn-mesa-mesa3d"); 240 EXPECT_EQ(Triple::amdgcn, T.getArch()); 241 EXPECT_EQ(Triple::Mesa, T.getVendor()); 242 EXPECT_EQ(Triple::Mesa3D, T.getOS()); 243 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); 244 245 T = Triple("amdgcn-amd-amdhsa"); 246 EXPECT_EQ(Triple::amdgcn, T.getArch()); 247 EXPECT_EQ(Triple::AMD, T.getVendor()); 248 EXPECT_EQ(Triple::AMDHSA, T.getOS()); 249 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); 250 251 T = Triple("huh"); 252 EXPECT_EQ(Triple::UnknownArch, T.getArch()); 253 } 254 255 static std::string Join(StringRef A, StringRef B, StringRef C) { 256 std::string Str = A; Str += '-'; Str += B; Str += '-'; Str += C; 257 return Str; 258 } 259 260 static std::string Join(StringRef A, StringRef B, StringRef C, StringRef D) { 261 std::string Str = A; Str += '-'; Str += B; Str += '-'; Str += C; Str += '-'; 262 Str += D; return Str; 263 } 264 265 TEST(TripleTest, Normalization) { 266 267 EXPECT_EQ("", Triple::normalize("")); 268 EXPECT_EQ("-", Triple::normalize("-")); 269 EXPECT_EQ("--", Triple::normalize("--")); 270 EXPECT_EQ("---", Triple::normalize("---")); 271 EXPECT_EQ("----", Triple::normalize("----")); 272 273 EXPECT_EQ("a", Triple::normalize("a")); 274 EXPECT_EQ("a-b", Triple::normalize("a-b")); 275 EXPECT_EQ("a-b-c", Triple::normalize("a-b-c")); 276 EXPECT_EQ("a-b-c-d", Triple::normalize("a-b-c-d")); 277 278 EXPECT_EQ("i386-b-c", Triple::normalize("i386-b-c")); 279 EXPECT_EQ("i386-a-c", Triple::normalize("a-i386-c")); 280 EXPECT_EQ("i386-a-b", Triple::normalize("a-b-i386")); 281 EXPECT_EQ("i386-a-b-c", Triple::normalize("a-b-c-i386")); 282 283 EXPECT_EQ("a-pc-c", Triple::normalize("a-pc-c")); 284 EXPECT_EQ("-pc-b-c", Triple::normalize("pc-b-c")); 285 EXPECT_EQ("a-pc-b", Triple::normalize("a-b-pc")); 286 EXPECT_EQ("a-pc-b-c", Triple::normalize("a-b-c-pc")); 287 288 EXPECT_EQ("a-b-linux", Triple::normalize("a-b-linux")); 289 EXPECT_EQ("--linux-b-c", Triple::normalize("linux-b-c")); 290 EXPECT_EQ("a--linux-c", Triple::normalize("a-linux-c")); 291 292 EXPECT_EQ("i386-pc-a", Triple::normalize("a-pc-i386")); 293 EXPECT_EQ("i386-pc-", Triple::normalize("-pc-i386")); 294 EXPECT_EQ("-pc-linux-c", Triple::normalize("linux-pc-c")); 295 EXPECT_EQ("-pc-linux", Triple::normalize("linux-pc-")); 296 297 EXPECT_EQ("i386", Triple::normalize("i386")); 298 EXPECT_EQ("-pc", Triple::normalize("pc")); 299 EXPECT_EQ("--linux", Triple::normalize("linux")); 300 301 EXPECT_EQ("x86_64--linux-gnu", Triple::normalize("x86_64-gnu-linux")); 302 303 // Check that normalizing a permutated set of valid components returns a 304 // triple with the unpermuted components. 305 StringRef C[4]; 306 for (int Arch = 1+Triple::UnknownArch; Arch <= Triple::LastArchType; ++Arch) { 307 C[0] = Triple::getArchTypeName(Triple::ArchType(Arch)); 308 for (int Vendor = 1+Triple::UnknownVendor; Vendor <= Triple::LastVendorType; 309 ++Vendor) { 310 C[1] = Triple::getVendorTypeName(Triple::VendorType(Vendor)); 311 for (int OS = 1+Triple::UnknownOS; OS <= Triple::LastOSType; ++OS) { 312 if (OS == Triple::Win32) 313 continue; 314 315 C[2] = Triple::getOSTypeName(Triple::OSType(OS)); 316 317 std::string E = Join(C[0], C[1], C[2]); 318 EXPECT_EQ(E, Triple::normalize(Join(C[0], C[1], C[2]))); 319 320 EXPECT_EQ(E, Triple::normalize(Join(C[0], C[2], C[1]))); 321 EXPECT_EQ(E, Triple::normalize(Join(C[1], C[2], C[0]))); 322 EXPECT_EQ(E, Triple::normalize(Join(C[1], C[0], C[2]))); 323 EXPECT_EQ(E, Triple::normalize(Join(C[2], C[0], C[1]))); 324 EXPECT_EQ(E, Triple::normalize(Join(C[2], C[1], C[0]))); 325 326 for (int Env = 1 + Triple::UnknownEnvironment; Env <= Triple::LastEnvironmentType; 327 ++Env) { 328 C[3] = Triple::getEnvironmentTypeName(Triple::EnvironmentType(Env)); 329 330 std::string F = Join(C[0], C[1], C[2], C[3]); 331 EXPECT_EQ(F, Triple::normalize(Join(C[0], C[1], C[2], C[3]))); 332 333 EXPECT_EQ(F, Triple::normalize(Join(C[0], C[1], C[3], C[2]))); 334 EXPECT_EQ(F, Triple::normalize(Join(C[0], C[2], C[3], C[1]))); 335 EXPECT_EQ(F, Triple::normalize(Join(C[0], C[2], C[1], C[3]))); 336 EXPECT_EQ(F, Triple::normalize(Join(C[0], C[3], C[1], C[2]))); 337 EXPECT_EQ(F, Triple::normalize(Join(C[0], C[3], C[2], C[1]))); 338 EXPECT_EQ(F, Triple::normalize(Join(C[1], C[2], C[3], C[0]))); 339 EXPECT_EQ(F, Triple::normalize(Join(C[1], C[2], C[0], C[3]))); 340 EXPECT_EQ(F, Triple::normalize(Join(C[1], C[3], C[0], C[2]))); 341 EXPECT_EQ(F, Triple::normalize(Join(C[1], C[3], C[2], C[0]))); 342 EXPECT_EQ(F, Triple::normalize(Join(C[1], C[0], C[2], C[3]))); 343 EXPECT_EQ(F, Triple::normalize(Join(C[1], C[0], C[3], C[2]))); 344 EXPECT_EQ(F, Triple::normalize(Join(C[2], C[3], C[0], C[1]))); 345 EXPECT_EQ(F, Triple::normalize(Join(C[2], C[3], C[1], C[0]))); 346 EXPECT_EQ(F, Triple::normalize(Join(C[2], C[0], C[1], C[3]))); 347 EXPECT_EQ(F, Triple::normalize(Join(C[2], C[0], C[3], C[1]))); 348 EXPECT_EQ(F, Triple::normalize(Join(C[2], C[1], C[3], C[0]))); 349 EXPECT_EQ(F, Triple::normalize(Join(C[2], C[1], C[0], C[3]))); 350 EXPECT_EQ(F, Triple::normalize(Join(C[3], C[0], C[1], C[2]))); 351 EXPECT_EQ(F, Triple::normalize(Join(C[3], C[0], C[2], C[1]))); 352 EXPECT_EQ(F, Triple::normalize(Join(C[3], C[1], C[2], C[0]))); 353 EXPECT_EQ(F, Triple::normalize(Join(C[3], C[1], C[0], C[2]))); 354 EXPECT_EQ(F, Triple::normalize(Join(C[3], C[2], C[0], C[1]))); 355 EXPECT_EQ(F, Triple::normalize(Join(C[3], C[2], C[1], C[0]))); 356 } 357 } 358 } 359 } 360 361 // Various real-world funky triples. The value returned by GCC's config.sub 362 // is given in the comment. 363 EXPECT_EQ("i386--windows-gnu", Triple::normalize("i386-mingw32")); // i386-pc-mingw32 364 EXPECT_EQ("x86_64--linux-gnu", Triple::normalize("x86_64-linux-gnu")); // x86_64-pc-linux-gnu 365 EXPECT_EQ("i486--linux-gnu", Triple::normalize("i486-linux-gnu")); // i486-pc-linux-gnu 366 EXPECT_EQ("i386-redhat-linux", Triple::normalize("i386-redhat-linux")); // i386-redhat-linux-gnu 367 EXPECT_EQ("i686--linux", Triple::normalize("i686-linux")); // i686-pc-linux-gnu 368 EXPECT_EQ("arm-none--eabi", Triple::normalize("arm-none-eabi")); // arm-none-eabi 369 } 370 371 TEST(TripleTest, MutateName) { 372 Triple T; 373 EXPECT_EQ(Triple::UnknownArch, T.getArch()); 374 EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); 375 EXPECT_EQ(Triple::UnknownOS, T.getOS()); 376 EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); 377 378 T.setArchName("i386"); 379 EXPECT_EQ(Triple::x86, T.getArch()); 380 EXPECT_EQ("i386--", T.getTriple()); 381 382 T.setVendorName("pc"); 383 EXPECT_EQ(Triple::x86, T.getArch()); 384 EXPECT_EQ(Triple::PC, T.getVendor()); 385 EXPECT_EQ("i386-pc-", T.getTriple()); 386 387 T.setOSName("linux"); 388 EXPECT_EQ(Triple::x86, T.getArch()); 389 EXPECT_EQ(Triple::PC, T.getVendor()); 390 EXPECT_EQ(Triple::Linux, T.getOS()); 391 EXPECT_EQ("i386-pc-linux", T.getTriple()); 392 393 T.setEnvironmentName("gnu"); 394 EXPECT_EQ(Triple::x86, T.getArch()); 395 EXPECT_EQ(Triple::PC, T.getVendor()); 396 EXPECT_EQ(Triple::Linux, T.getOS()); 397 EXPECT_EQ("i386-pc-linux-gnu", T.getTriple()); 398 399 T.setOSName("freebsd"); 400 EXPECT_EQ(Triple::x86, T.getArch()); 401 EXPECT_EQ(Triple::PC, T.getVendor()); 402 EXPECT_EQ(Triple::FreeBSD, T.getOS()); 403 EXPECT_EQ("i386-pc-freebsd-gnu", T.getTriple()); 404 405 T.setOSAndEnvironmentName("darwin"); 406 EXPECT_EQ(Triple::x86, T.getArch()); 407 EXPECT_EQ(Triple::PC, T.getVendor()); 408 EXPECT_EQ(Triple::Darwin, T.getOS()); 409 EXPECT_EQ("i386-pc-darwin", T.getTriple()); 410 411 T.setEnvironmentName("amdopencl"); 412 EXPECT_EQ(Triple::AMDOpenCL, T.getEnvironment()); 413 } 414 415 TEST(TripleTest, BitWidthPredicates) { 416 Triple T; 417 EXPECT_FALSE(T.isArch16Bit()); 418 EXPECT_FALSE(T.isArch32Bit()); 419 EXPECT_FALSE(T.isArch64Bit()); 420 421 T.setArch(Triple::arm); 422 EXPECT_FALSE(T.isArch16Bit()); 423 EXPECT_TRUE(T.isArch32Bit()); 424 EXPECT_FALSE(T.isArch64Bit()); 425 426 T.setArch(Triple::hexagon); 427 EXPECT_FALSE(T.isArch16Bit()); 428 EXPECT_TRUE(T.isArch32Bit()); 429 EXPECT_FALSE(T.isArch64Bit()); 430 431 T.setArch(Triple::mips); 432 EXPECT_FALSE(T.isArch16Bit()); 433 EXPECT_TRUE(T.isArch32Bit()); 434 EXPECT_FALSE(T.isArch64Bit()); 435 436 T.setArch(Triple::mips64); 437 EXPECT_FALSE(T.isArch16Bit()); 438 EXPECT_FALSE(T.isArch32Bit()); 439 EXPECT_TRUE(T.isArch64Bit()); 440 441 T.setArch(Triple::msp430); 442 EXPECT_TRUE(T.isArch16Bit()); 443 EXPECT_FALSE(T.isArch32Bit()); 444 EXPECT_FALSE(T.isArch64Bit()); 445 446 T.setArch(Triple::ppc); 447 EXPECT_FALSE(T.isArch16Bit()); 448 EXPECT_TRUE(T.isArch32Bit()); 449 EXPECT_FALSE(T.isArch64Bit()); 450 451 T.setArch(Triple::ppc64); 452 EXPECT_FALSE(T.isArch16Bit()); 453 EXPECT_FALSE(T.isArch32Bit()); 454 EXPECT_TRUE(T.isArch64Bit()); 455 456 T.setArch(Triple::x86); 457 EXPECT_FALSE(T.isArch16Bit()); 458 EXPECT_TRUE(T.isArch32Bit()); 459 EXPECT_FALSE(T.isArch64Bit()); 460 461 T.setArch(Triple::x86_64); 462 EXPECT_FALSE(T.isArch16Bit()); 463 EXPECT_FALSE(T.isArch32Bit()); 464 EXPECT_TRUE(T.isArch64Bit()); 465 466 T.setArch(Triple::amdil); 467 EXPECT_FALSE(T.isArch16Bit()); 468 EXPECT_TRUE(T.isArch32Bit()); 469 EXPECT_FALSE(T.isArch64Bit()); 470 471 T.setArch(Triple::amdil64); 472 EXPECT_FALSE(T.isArch16Bit()); 473 EXPECT_FALSE(T.isArch32Bit()); 474 EXPECT_TRUE(T.isArch64Bit()); 475 476 T.setArch(Triple::hsail); 477 EXPECT_FALSE(T.isArch16Bit()); 478 EXPECT_TRUE(T.isArch32Bit()); 479 EXPECT_FALSE(T.isArch64Bit()); 480 481 T.setArch(Triple::hsail64); 482 EXPECT_FALSE(T.isArch16Bit()); 483 EXPECT_FALSE(T.isArch32Bit()); 484 EXPECT_TRUE(T.isArch64Bit()); 485 486 T.setArch(Triple::spir); 487 EXPECT_FALSE(T.isArch16Bit()); 488 EXPECT_TRUE(T.isArch32Bit()); 489 EXPECT_FALSE(T.isArch64Bit()); 490 491 T.setArch(Triple::spir64); 492 EXPECT_FALSE(T.isArch16Bit()); 493 EXPECT_FALSE(T.isArch32Bit()); 494 EXPECT_TRUE(T.isArch64Bit()); 495 496 T.setArch(Triple::sparc); 497 EXPECT_FALSE(T.isArch16Bit()); 498 EXPECT_TRUE(T.isArch32Bit()); 499 EXPECT_FALSE(T.isArch64Bit()); 500 501 T.setArch(Triple::sparcel); 502 EXPECT_FALSE(T.isArch16Bit()); 503 EXPECT_TRUE(T.isArch32Bit()); 504 EXPECT_FALSE(T.isArch64Bit()); 505 506 T.setArch(Triple::sparcv9); 507 EXPECT_FALSE(T.isArch16Bit()); 508 EXPECT_FALSE(T.isArch32Bit()); 509 EXPECT_TRUE(T.isArch64Bit()); 510 511 T.setArch(Triple::wasm32); 512 EXPECT_FALSE(T.isArch16Bit()); 513 EXPECT_TRUE(T.isArch32Bit()); 514 EXPECT_FALSE(T.isArch64Bit()); 515 516 T.setArch(Triple::wasm64); 517 EXPECT_FALSE(T.isArch16Bit()); 518 EXPECT_FALSE(T.isArch32Bit()); 519 EXPECT_TRUE(T.isArch64Bit()); 520 521 T.setArch(Triple::avr); 522 EXPECT_TRUE(T.isArch16Bit()); 523 EXPECT_FALSE(T.isArch32Bit()); 524 EXPECT_FALSE(T.isArch64Bit()); 525 526 T.setArch(Triple::lanai); 527 EXPECT_FALSE(T.isArch16Bit()); 528 EXPECT_TRUE(T.isArch32Bit()); 529 EXPECT_FALSE(T.isArch64Bit()); 530 } 531 532 TEST(TripleTest, BitWidthArchVariants) { 533 Triple T; 534 EXPECT_EQ(Triple::UnknownArch, T.get32BitArchVariant().getArch()); 535 EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch()); 536 537 T.setArch(Triple::UnknownArch); 538 EXPECT_EQ(Triple::UnknownArch, T.get32BitArchVariant().getArch()); 539 EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch()); 540 541 T.setArch(Triple::mips); 542 EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch()); 543 EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch()); 544 545 T.setArch(Triple::mipsel); 546 EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch()); 547 EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch()); 548 549 T.setArch(Triple::ppc); 550 EXPECT_EQ(Triple::ppc, T.get32BitArchVariant().getArch()); 551 EXPECT_EQ(Triple::ppc64, T.get64BitArchVariant().getArch()); 552 553 T.setArch(Triple::nvptx); 554 EXPECT_EQ(Triple::nvptx, T.get32BitArchVariant().getArch()); 555 EXPECT_EQ(Triple::nvptx64, T.get64BitArchVariant().getArch()); 556 557 T.setArch(Triple::sparc); 558 EXPECT_EQ(Triple::sparc, T.get32BitArchVariant().getArch()); 559 EXPECT_EQ(Triple::sparcv9, T.get64BitArchVariant().getArch()); 560 561 T.setArch(Triple::x86); 562 EXPECT_EQ(Triple::x86, T.get32BitArchVariant().getArch()); 563 EXPECT_EQ(Triple::x86_64, T.get64BitArchVariant().getArch()); 564 565 T.setArch(Triple::mips64); 566 EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch()); 567 EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch()); 568 569 T.setArch(Triple::mips64el); 570 EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch()); 571 EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch()); 572 573 T.setArch(Triple::ppc64); 574 EXPECT_EQ(Triple::ppc, T.get32BitArchVariant().getArch()); 575 EXPECT_EQ(Triple::ppc64, T.get64BitArchVariant().getArch()); 576 577 T.setArch(Triple::nvptx64); 578 EXPECT_EQ(Triple::nvptx, T.get32BitArchVariant().getArch()); 579 EXPECT_EQ(Triple::nvptx64, T.get64BitArchVariant().getArch()); 580 581 T.setArch(Triple::sparcv9); 582 EXPECT_EQ(Triple::sparc, T.get32BitArchVariant().getArch()); 583 EXPECT_EQ(Triple::sparcv9, T.get64BitArchVariant().getArch()); 584 585 T.setArch(Triple::x86_64); 586 EXPECT_EQ(Triple::x86, T.get32BitArchVariant().getArch()); 587 EXPECT_EQ(Triple::x86_64, T.get64BitArchVariant().getArch()); 588 589 T.setArch(Triple::amdil); 590 EXPECT_EQ(Triple::amdil, T.get32BitArchVariant().getArch()); 591 EXPECT_EQ(Triple::amdil64, T.get64BitArchVariant().getArch()); 592 593 T.setArch(Triple::amdil64); 594 EXPECT_EQ(Triple::amdil, T.get32BitArchVariant().getArch()); 595 EXPECT_EQ(Triple::amdil64, T.get64BitArchVariant().getArch()); 596 597 T.setArch(Triple::hsail); 598 EXPECT_EQ(Triple::hsail, T.get32BitArchVariant().getArch()); 599 EXPECT_EQ(Triple::hsail64, T.get64BitArchVariant().getArch()); 600 601 T.setArch(Triple::hsail64); 602 EXPECT_EQ(Triple::hsail, T.get32BitArchVariant().getArch()); 603 EXPECT_EQ(Triple::hsail64, T.get64BitArchVariant().getArch()); 604 605 T.setArch(Triple::spir); 606 EXPECT_EQ(Triple::spir, T.get32BitArchVariant().getArch()); 607 EXPECT_EQ(Triple::spir64, T.get64BitArchVariant().getArch()); 608 609 T.setArch(Triple::spir64); 610 EXPECT_EQ(Triple::spir, T.get32BitArchVariant().getArch()); 611 EXPECT_EQ(Triple::spir64, T.get64BitArchVariant().getArch()); 612 613 T.setArch(Triple::wasm32); 614 EXPECT_EQ(Triple::wasm32, T.get32BitArchVariant().getArch()); 615 EXPECT_EQ(Triple::wasm64, T.get64BitArchVariant().getArch()); 616 617 T.setArch(Triple::wasm64); 618 EXPECT_EQ(Triple::wasm32, T.get32BitArchVariant().getArch()); 619 EXPECT_EQ(Triple::wasm64, T.get64BitArchVariant().getArch()); 620 } 621 622 TEST(TripleTest, EndianArchVariants) { 623 Triple T; 624 EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch()); 625 EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch()); 626 627 T.setArch(Triple::UnknownArch); 628 EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch()); 629 EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch()); 630 631 T.setArch(Triple::aarch64_be); 632 EXPECT_EQ(Triple::aarch64_be, T.getBigEndianArchVariant().getArch()); 633 EXPECT_EQ(Triple::aarch64, T.getLittleEndianArchVariant().getArch()); 634 635 T.setArch(Triple::aarch64); 636 EXPECT_EQ(Triple::aarch64_be, T.getBigEndianArchVariant().getArch()); 637 EXPECT_EQ(Triple::aarch64, T.getLittleEndianArchVariant().getArch()); 638 639 T.setArch(Triple::armeb); 640 EXPECT_EQ(Triple::armeb, T.getBigEndianArchVariant().getArch()); 641 EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch()); 642 643 T.setArch(Triple::arm); 644 EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch()); 645 EXPECT_EQ(Triple::arm, T.getLittleEndianArchVariant().getArch()); 646 T = Triple("arm"); 647 EXPECT_TRUE(T.isLittleEndian()); 648 T = Triple("thumb"); 649 EXPECT_TRUE(T.isLittleEndian()); 650 T = Triple("armeb"); 651 EXPECT_FALSE(T.isLittleEndian()); 652 T = Triple("thumbeb"); 653 EXPECT_FALSE(T.isLittleEndian()); 654 655 T.setArch(Triple::bpfeb); 656 EXPECT_EQ(Triple::bpfeb, T.getBigEndianArchVariant().getArch()); 657 EXPECT_EQ(Triple::bpfel, T.getLittleEndianArchVariant().getArch()); 658 659 T.setArch(Triple::bpfel); 660 EXPECT_EQ(Triple::bpfeb, T.getBigEndianArchVariant().getArch()); 661 EXPECT_EQ(Triple::bpfel, T.getLittleEndianArchVariant().getArch()); 662 663 T.setArch(Triple::mips64); 664 EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch()); 665 EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch()); 666 667 T.setArch(Triple::mips64el); 668 EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch()); 669 EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch()); 670 671 T.setArch(Triple::mips); 672 EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch()); 673 EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch()); 674 675 T.setArch(Triple::mipsel); 676 EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch()); 677 EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch()); 678 679 T.setArch(Triple::ppc); 680 EXPECT_EQ(Triple::ppc, T.getBigEndianArchVariant().getArch()); 681 EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch()); 682 683 T.setArch(Triple::ppc64); 684 EXPECT_EQ(Triple::ppc64, T.getBigEndianArchVariant().getArch()); 685 EXPECT_EQ(Triple::ppc64le, T.getLittleEndianArchVariant().getArch()); 686 687 T.setArch(Triple::ppc64le); 688 EXPECT_EQ(Triple::ppc64, T.getBigEndianArchVariant().getArch()); 689 EXPECT_EQ(Triple::ppc64le, T.getLittleEndianArchVariant().getArch()); 690 691 T.setArch(Triple::sparc); 692 EXPECT_EQ(Triple::sparc, T.getBigEndianArchVariant().getArch()); 693 EXPECT_EQ(Triple::sparcel, T.getLittleEndianArchVariant().getArch()); 694 695 T.setArch(Triple::sparcel); 696 EXPECT_EQ(Triple::sparc, T.getBigEndianArchVariant().getArch()); 697 EXPECT_EQ(Triple::sparcel, T.getLittleEndianArchVariant().getArch()); 698 699 T.setArch(Triple::thumb); 700 EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch()); 701 EXPECT_EQ(Triple::thumb, T.getLittleEndianArchVariant().getArch()); 702 703 T.setArch(Triple::thumbeb); 704 EXPECT_EQ(Triple::thumbeb, T.getBigEndianArchVariant().getArch()); 705 EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch()); 706 707 T.setArch(Triple::lanai); 708 EXPECT_EQ(Triple::lanai, T.getBigEndianArchVariant().getArch()); 709 EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch()); 710 } 711 712 TEST(TripleTest, getOSVersion) { 713 Triple T; 714 unsigned Major, Minor, Micro; 715 716 T = Triple("i386-apple-darwin9"); 717 EXPECT_TRUE(T.isMacOSX()); 718 EXPECT_FALSE(T.isiOS()); 719 EXPECT_FALSE(T.isArch16Bit()); 720 EXPECT_TRUE(T.isArch32Bit()); 721 EXPECT_FALSE(T.isArch64Bit()); 722 T.getMacOSXVersion(Major, Minor, Micro); 723 EXPECT_EQ((unsigned)10, Major); 724 EXPECT_EQ((unsigned)5, Minor); 725 EXPECT_EQ((unsigned)0, Micro); 726 T.getiOSVersion(Major, Minor, Micro); 727 EXPECT_EQ((unsigned)5, Major); 728 EXPECT_EQ((unsigned)0, Minor); 729 EXPECT_EQ((unsigned)0, Micro); 730 731 T = Triple("x86_64-apple-darwin9"); 732 EXPECT_TRUE(T.isMacOSX()); 733 EXPECT_FALSE(T.isiOS()); 734 EXPECT_FALSE(T.isArch16Bit()); 735 EXPECT_FALSE(T.isArch32Bit()); 736 EXPECT_TRUE(T.isArch64Bit()); 737 T.getMacOSXVersion(Major, Minor, Micro); 738 EXPECT_EQ((unsigned)10, Major); 739 EXPECT_EQ((unsigned)5, Minor); 740 EXPECT_EQ((unsigned)0, Micro); 741 T.getiOSVersion(Major, Minor, Micro); 742 EXPECT_EQ((unsigned)5, Major); 743 EXPECT_EQ((unsigned)0, Minor); 744 EXPECT_EQ((unsigned)0, Micro); 745 746 T = Triple("x86_64-apple-macosx"); 747 EXPECT_TRUE(T.isMacOSX()); 748 EXPECT_FALSE(T.isiOS()); 749 EXPECT_FALSE(T.isArch16Bit()); 750 EXPECT_FALSE(T.isArch32Bit()); 751 EXPECT_TRUE(T.isArch64Bit()); 752 T.getMacOSXVersion(Major, Minor, Micro); 753 EXPECT_EQ((unsigned)10, Major); 754 EXPECT_EQ((unsigned)4, Minor); 755 EXPECT_EQ((unsigned)0, Micro); 756 T.getiOSVersion(Major, Minor, Micro); 757 EXPECT_EQ((unsigned)5, Major); 758 EXPECT_EQ((unsigned)0, Minor); 759 EXPECT_EQ((unsigned)0, Micro); 760 761 T = Triple("x86_64-apple-macosx10.7"); 762 EXPECT_TRUE(T.isMacOSX()); 763 EXPECT_FALSE(T.isiOS()); 764 EXPECT_FALSE(T.isArch16Bit()); 765 EXPECT_FALSE(T.isArch32Bit()); 766 EXPECT_TRUE(T.isArch64Bit()); 767 T.getMacOSXVersion(Major, Minor, Micro); 768 EXPECT_EQ((unsigned)10, Major); 769 EXPECT_EQ((unsigned)7, Minor); 770 EXPECT_EQ((unsigned)0, Micro); 771 T.getiOSVersion(Major, Minor, Micro); 772 EXPECT_EQ((unsigned)5, Major); 773 EXPECT_EQ((unsigned)0, Minor); 774 EXPECT_EQ((unsigned)0, Micro); 775 776 T = Triple("armv7-apple-ios"); 777 EXPECT_FALSE(T.isMacOSX()); 778 EXPECT_TRUE(T.isiOS()); 779 EXPECT_FALSE(T.isArch16Bit()); 780 EXPECT_TRUE(T.isArch32Bit()); 781 EXPECT_FALSE(T.isArch64Bit()); 782 T.getMacOSXVersion(Major, Minor, Micro); 783 EXPECT_EQ((unsigned)10, Major); 784 EXPECT_EQ((unsigned)4, Minor); 785 EXPECT_EQ((unsigned)0, Micro); 786 T.getiOSVersion(Major, Minor, Micro); 787 EXPECT_EQ((unsigned)5, Major); 788 EXPECT_EQ((unsigned)0, Minor); 789 EXPECT_EQ((unsigned)0, Micro); 790 791 T = Triple("armv7-apple-ios7.0"); 792 EXPECT_FALSE(T.isMacOSX()); 793 EXPECT_TRUE(T.isiOS()); 794 EXPECT_FALSE(T.isArch16Bit()); 795 EXPECT_TRUE(T.isArch32Bit()); 796 EXPECT_FALSE(T.isArch64Bit()); 797 T.getMacOSXVersion(Major, Minor, Micro); 798 EXPECT_EQ((unsigned)10, Major); 799 EXPECT_EQ((unsigned)4, Minor); 800 EXPECT_EQ((unsigned)0, Micro); 801 T.getiOSVersion(Major, Minor, Micro); 802 EXPECT_EQ((unsigned)7, Major); 803 EXPECT_EQ((unsigned)0, Minor); 804 EXPECT_EQ((unsigned)0, Micro); 805 } 806 807 TEST(TripleTest, FileFormat) { 808 EXPECT_EQ(Triple::ELF, Triple("i686-unknown-linux-gnu").getObjectFormat()); 809 EXPECT_EQ(Triple::ELF, Triple("i686-unknown-freebsd").getObjectFormat()); 810 EXPECT_EQ(Triple::ELF, Triple("i686-unknown-netbsd").getObjectFormat()); 811 EXPECT_EQ(Triple::ELF, Triple("i686--win32-elf").getObjectFormat()); 812 EXPECT_EQ(Triple::ELF, Triple("i686---elf").getObjectFormat()); 813 814 EXPECT_EQ(Triple::MachO, Triple("i686-apple-macosx").getObjectFormat()); 815 EXPECT_EQ(Triple::MachO, Triple("i686-apple-ios").getObjectFormat()); 816 EXPECT_EQ(Triple::MachO, Triple("i686---macho").getObjectFormat()); 817 818 EXPECT_EQ(Triple::COFF, Triple("i686--win32").getObjectFormat()); 819 820 EXPECT_EQ(Triple::ELF, Triple("i686-pc-windows-msvc-elf").getObjectFormat()); 821 EXPECT_EQ(Triple::ELF, Triple("i686-pc-cygwin-elf").getObjectFormat()); 822 823 Triple MSVCNormalized(Triple::normalize("i686-pc-windows-msvc-elf")); 824 EXPECT_EQ(Triple::ELF, MSVCNormalized.getObjectFormat()); 825 826 Triple GNUWindowsNormalized(Triple::normalize("i686-pc-windows-gnu-elf")); 827 EXPECT_EQ(Triple::ELF, GNUWindowsNormalized.getObjectFormat()); 828 829 Triple CygnusNormalised(Triple::normalize("i686-pc-windows-cygnus-elf")); 830 EXPECT_EQ(Triple::ELF, CygnusNormalised.getObjectFormat()); 831 832 Triple CygwinNormalized(Triple::normalize("i686-pc-cygwin-elf")); 833 EXPECT_EQ(Triple::ELF, CygwinNormalized.getObjectFormat()); 834 835 Triple T = Triple(""); 836 T.setObjectFormat(Triple::ELF); 837 EXPECT_EQ(Triple::ELF, T.getObjectFormat()); 838 } 839 840 TEST(TripleTest, NormalizeWindows) { 841 EXPECT_EQ("i686-pc-windows-msvc", Triple::normalize("i686-pc-win32")); 842 EXPECT_EQ("i686--windows-msvc", Triple::normalize("i686-win32")); 843 EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-mingw32")); 844 EXPECT_EQ("i686--windows-gnu", Triple::normalize("i686-mingw32")); 845 EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-mingw32-w64")); 846 EXPECT_EQ("i686--windows-gnu", Triple::normalize("i686-mingw32-w64")); 847 EXPECT_EQ("i686-pc-windows-cygnus", Triple::normalize("i686-pc-cygwin")); 848 EXPECT_EQ("i686--windows-cygnus", Triple::normalize("i686-cygwin")); 849 850 EXPECT_EQ("x86_64-pc-windows-msvc", Triple::normalize("x86_64-pc-win32")); 851 EXPECT_EQ("x86_64--windows-msvc", Triple::normalize("x86_64-win32")); 852 EXPECT_EQ("x86_64-pc-windows-gnu", Triple::normalize("x86_64-pc-mingw32")); 853 EXPECT_EQ("x86_64--windows-gnu", Triple::normalize("x86_64-mingw32")); 854 EXPECT_EQ("x86_64-pc-windows-gnu", Triple::normalize("x86_64-pc-mingw32-w64")); 855 EXPECT_EQ("x86_64--windows-gnu", Triple::normalize("x86_64-mingw32-w64")); 856 857 EXPECT_EQ("i686-pc-windows-elf", Triple::normalize("i686-pc-win32-elf")); 858 EXPECT_EQ("i686--windows-elf", Triple::normalize("i686-win32-elf")); 859 EXPECT_EQ("i686-pc-windows-macho", Triple::normalize("i686-pc-win32-macho")); 860 EXPECT_EQ("i686--windows-macho", Triple::normalize("i686-win32-macho")); 861 862 EXPECT_EQ("x86_64-pc-windows-elf", Triple::normalize("x86_64-pc-win32-elf")); 863 EXPECT_EQ("x86_64--windows-elf", Triple::normalize("x86_64-win32-elf")); 864 EXPECT_EQ("x86_64-pc-windows-macho", Triple::normalize("x86_64-pc-win32-macho")); 865 EXPECT_EQ("x86_64--windows-macho", Triple::normalize("x86_64-win32-macho")); 866 867 EXPECT_EQ("i686-pc-windows-cygnus", 868 Triple::normalize("i686-pc-windows-cygnus")); 869 EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-windows-gnu")); 870 EXPECT_EQ("i686-pc-windows-itanium", Triple::normalize("i686-pc-windows-itanium")); 871 EXPECT_EQ("i686-pc-windows-msvc", Triple::normalize("i686-pc-windows-msvc")); 872 873 EXPECT_EQ("i686-pc-windows-elf", Triple::normalize("i686-pc-windows-elf-elf")); 874 } 875 876 TEST(TripleTest, getARMCPUForArch) { 877 // Standard ARM Architectures. 878 { 879 llvm::Triple Triple("armv4-unknown-eabi"); 880 EXPECT_EQ("strongarm", Triple.getARMCPUForArch()); 881 } 882 { 883 llvm::Triple Triple("armv4t-unknown-eabi"); 884 EXPECT_EQ("arm7tdmi", Triple.getARMCPUForArch()); 885 } 886 { 887 llvm::Triple Triple("armv5-unknown-eabi"); 888 EXPECT_EQ("arm10tdmi", Triple.getARMCPUForArch()); 889 } 890 { 891 llvm::Triple Triple("armv5t-unknown-eabi"); 892 EXPECT_EQ("arm10tdmi", Triple.getARMCPUForArch()); 893 } 894 { 895 llvm::Triple Triple("armv5e-unknown-eabi"); 896 EXPECT_EQ("arm1022e", Triple.getARMCPUForArch()); 897 } 898 { 899 llvm::Triple Triple("armv5tej-unknown-eabi"); 900 EXPECT_EQ("arm926ej-s", Triple.getARMCPUForArch()); 901 } 902 { 903 llvm::Triple Triple("armv6-unknown-eabi"); 904 EXPECT_EQ("arm1136jf-s", Triple.getARMCPUForArch()); 905 } 906 { 907 llvm::Triple Triple("armv6j-unknown-eabi"); 908 EXPECT_EQ("arm1136jf-s", Triple.getARMCPUForArch()); 909 } 910 { 911 llvm::Triple Triple("armv6k-unknown-eabi"); 912 EXPECT_EQ("arm1176j-s", Triple.getARMCPUForArch()); 913 } 914 { 915 llvm::Triple Triple("armv6kz-unknown-eabi"); 916 EXPECT_EQ("arm1176jzf-s", Triple.getARMCPUForArch()); 917 } 918 { 919 llvm::Triple Triple("armv6zk-unknown-eabi"); 920 EXPECT_EQ("arm1176jzf-s", Triple.getARMCPUForArch()); 921 } 922 { 923 llvm::Triple Triple("armv6t2-unknown-eabi"); 924 EXPECT_EQ("arm1156t2-s", Triple.getARMCPUForArch()); 925 } 926 { 927 llvm::Triple Triple("armv6m-unknown-eabi"); 928 EXPECT_EQ("cortex-m0", Triple.getARMCPUForArch()); 929 } 930 { 931 llvm::Triple Triple("armv7-unknown-eabi"); 932 EXPECT_EQ("cortex-a8", Triple.getARMCPUForArch()); 933 } 934 { 935 llvm::Triple Triple("armv7a-unknown-eabi"); 936 EXPECT_EQ("cortex-a8", Triple.getARMCPUForArch()); 937 } 938 { 939 llvm::Triple Triple("armv7m-unknown-eabi"); 940 EXPECT_EQ("cortex-m3", Triple.getARMCPUForArch()); 941 } 942 { 943 llvm::Triple Triple("armv7r-unknown-eabi"); 944 EXPECT_EQ("cortex-r4", Triple.getARMCPUForArch()); 945 } 946 { 947 llvm::Triple Triple("armv7r-unknown-eabi"); 948 EXPECT_EQ("cortex-r4", Triple.getARMCPUForArch()); 949 } 950 { 951 llvm::Triple Triple("armv7r-unknown-eabi"); 952 EXPECT_EQ("cortex-r4", Triple.getARMCPUForArch()); 953 } 954 { 955 llvm::Triple Triple("armv7r-unknown-eabi"); 956 EXPECT_EQ("cortex-r4", Triple.getARMCPUForArch()); 957 } 958 { 959 llvm::Triple Triple("armv8a-unknown-eabi"); 960 EXPECT_EQ("cortex-a53", Triple.getARMCPUForArch()); 961 } 962 { 963 llvm::Triple Triple("armv8.1a-unknown-eabi"); 964 EXPECT_EQ("generic", Triple.getARMCPUForArch()); 965 } 966 // Non-synonym names, using -march style, not default arch. 967 { 968 llvm::Triple Triple("arm"); 969 EXPECT_EQ("cortex-a8", Triple.getARMCPUForArch("armv7-a")); 970 } 971 { 972 llvm::Triple Triple("arm"); 973 EXPECT_EQ("cortex-m3", Triple.getARMCPUForArch("armv7-m")); 974 } 975 { 976 llvm::Triple Triple("arm"); 977 EXPECT_EQ("cortex-a53", Triple.getARMCPUForArch("armv8")); 978 } 979 { 980 llvm::Triple Triple("arm"); 981 EXPECT_EQ("cortex-a53", Triple.getARMCPUForArch("armv8-a")); 982 } 983 // Platform specific defaults. 984 { 985 llvm::Triple Triple("arm--nacl"); 986 EXPECT_EQ("cortex-a8", Triple.getARMCPUForArch()); 987 } 988 { 989 llvm::Triple Triple("armv6-unknown-freebsd"); 990 EXPECT_EQ("arm1176jzf-s", Triple.getARMCPUForArch()); 991 } 992 { 993 llvm::Triple Triple("thumbv6-unknown-freebsd"); 994 EXPECT_EQ("arm1176jzf-s", Triple.getARMCPUForArch()); 995 } 996 { 997 llvm::Triple Triple("armebv6-unknown-freebsd"); 998 EXPECT_EQ("arm1176jzf-s", Triple.getARMCPUForArch()); 999 } 1000 { 1001 llvm::Triple Triple("arm--win32"); 1002 EXPECT_EQ("cortex-a9", Triple.getARMCPUForArch()); 1003 } 1004 // Some alternative architectures 1005 { 1006 llvm::Triple Triple("xscale-unknown-eabi"); 1007 EXPECT_EQ("xscale", Triple.getARMCPUForArch()); 1008 } 1009 { 1010 llvm::Triple Triple("iwmmxt-unknown-eabi"); 1011 EXPECT_EQ("iwmmxt", Triple.getARMCPUForArch()); 1012 } 1013 { 1014 llvm::Triple Triple("armv7s-apple-ios7"); 1015 EXPECT_EQ("swift", Triple.getARMCPUForArch()); 1016 } 1017 { 1018 llvm::Triple Triple("armv7k-apple-ios9"); 1019 EXPECT_EQ("cortex-a7", Triple.getARMCPUForArch()); 1020 } 1021 { 1022 llvm::Triple Triple("armv7k-apple-watchos3"); 1023 EXPECT_EQ("cortex-a7", Triple.getARMCPUForArch()); 1024 } 1025 { 1026 llvm::Triple Triple("armv7k-apple-tvos9"); 1027 EXPECT_EQ("cortex-a7", Triple.getARMCPUForArch()); 1028 } 1029 { 1030 llvm::Triple Triple("armv7em-apple-ios7"); 1031 EXPECT_EQ("cortex-m4", Triple.getARMCPUForArch()); 1032 } 1033 { 1034 llvm::Triple Triple("armv7l-linux-gnueabihf"); 1035 EXPECT_EQ("cortex-a8", Triple.getARMCPUForArch()); 1036 } 1037 { 1038 llvm::Triple Triple("armv6sm-apple-ios7"); 1039 EXPECT_EQ("cortex-m0", Triple.getARMCPUForArch()); 1040 } 1041 // armeb is permitted, but armebeb is not 1042 { 1043 llvm::Triple Triple("armeb-none-eabi"); 1044 EXPECT_EQ("arm7tdmi", Triple.getARMCPUForArch()); 1045 } 1046 { 1047 llvm::Triple Triple("armebeb-none-eabi"); 1048 EXPECT_EQ("", Triple.getARMCPUForArch()); 1049 } 1050 { 1051 llvm::Triple Triple("armebv6eb-none-eabi"); 1052 EXPECT_EQ("", Triple.getARMCPUForArch()); 1053 } 1054 // armebv6 and armv6eb are permitted, but armebv6eb is not 1055 { 1056 llvm::Triple Triple("armebv6-non-eabi"); 1057 EXPECT_EQ("arm1136jf-s", Triple.getARMCPUForArch()); 1058 } 1059 { 1060 llvm::Triple Triple("armv6eb-none-eabi"); 1061 EXPECT_EQ("arm1136jf-s", Triple.getARMCPUForArch()); 1062 } 1063 // xscaleeb is permitted, but armebxscale is not 1064 { 1065 llvm::Triple Triple("xscaleeb-none-eabi"); 1066 EXPECT_EQ("xscale", Triple.getARMCPUForArch()); 1067 } 1068 { 1069 llvm::Triple Triple("armebxscale-none-eabi"); 1070 EXPECT_EQ("", Triple.getARMCPUForArch()); 1071 } 1072 } 1073 1074 TEST(TripleTest, NormalizeARM) { 1075 EXPECT_EQ("armv6--netbsd-eabi", Triple::normalize("armv6-netbsd-eabi")); 1076 EXPECT_EQ("armv7--netbsd-eabi", Triple::normalize("armv7-netbsd-eabi")); 1077 EXPECT_EQ("armv6eb--netbsd-eabi", Triple::normalize("armv6eb-netbsd-eabi")); 1078 EXPECT_EQ("armv7eb--netbsd-eabi", Triple::normalize("armv7eb-netbsd-eabi")); 1079 EXPECT_EQ("armv6--netbsd-eabihf", Triple::normalize("armv6-netbsd-eabihf")); 1080 EXPECT_EQ("armv7--netbsd-eabihf", Triple::normalize("armv7-netbsd-eabihf")); 1081 EXPECT_EQ("armv6eb--netbsd-eabihf", Triple::normalize("armv6eb-netbsd-eabihf")); 1082 EXPECT_EQ("armv7eb--netbsd-eabihf", Triple::normalize("armv7eb-netbsd-eabihf")); 1083 1084 Triple T; 1085 T = Triple("armv6--netbsd-eabi"); 1086 EXPECT_EQ(Triple::arm, T.getArch()); 1087 T = Triple("armv6eb--netbsd-eabi"); 1088 EXPECT_EQ(Triple::armeb, T.getArch()); 1089 } 1090 1091 TEST(TripleTest, ParseARMArch) { 1092 // ARM 1093 { 1094 Triple T = Triple("arm"); 1095 EXPECT_EQ(Triple::arm, T.getArch()); 1096 } 1097 { 1098 Triple T = Triple("armv6t2"); 1099 EXPECT_EQ(Triple::arm, T.getArch()); 1100 } 1101 { 1102 Triple T = Triple("armv8"); 1103 EXPECT_EQ(Triple::arm, T.getArch()); 1104 } 1105 { 1106 Triple T = Triple("armeb"); 1107 EXPECT_EQ(Triple::armeb, T.getArch()); 1108 } 1109 { 1110 Triple T = Triple("armv5eb"); 1111 EXPECT_EQ(Triple::armeb, T.getArch()); 1112 } 1113 { 1114 Triple T = Triple("armebv7m"); 1115 EXPECT_EQ(Triple::armeb, T.getArch()); 1116 } 1117 { 1118 Triple T = Triple("armv7eb"); 1119 EXPECT_EQ(Triple::armeb, T.getArch()); 1120 } 1121 // THUMB 1122 { 1123 Triple T = Triple("thumb"); 1124 EXPECT_EQ(Triple::thumb, T.getArch()); 1125 } 1126 { 1127 Triple T = Triple("thumbv7a"); 1128 EXPECT_EQ(Triple::thumb, T.getArch()); 1129 } 1130 { 1131 Triple T = Triple("thumbeb"); 1132 EXPECT_EQ(Triple::thumbeb, T.getArch()); 1133 } 1134 { 1135 Triple T = Triple("thumbv4teb"); 1136 EXPECT_EQ(Triple::thumbeb, T.getArch()); 1137 } 1138 { 1139 Triple T = Triple("thumbebv7"); 1140 EXPECT_EQ(Triple::thumbeb, T.getArch()); 1141 } 1142 { 1143 Triple T = Triple("armv6m"); 1144 EXPECT_EQ(Triple::thumb, T.getArch()); 1145 } 1146 { 1147 Triple T = Triple("thumbv2"); 1148 EXPECT_EQ(Triple::UnknownArch, T.getArch()); 1149 } 1150 { 1151 Triple T = Triple("thumbebv6eb"); 1152 EXPECT_EQ(Triple::UnknownArch, T.getArch()); 1153 } 1154 // AARCH64 1155 { 1156 Triple T = Triple("arm64"); 1157 EXPECT_EQ(Triple::aarch64, T.getArch()); 1158 } 1159 { 1160 Triple T = Triple("aarch64"); 1161 EXPECT_EQ(Triple::aarch64, T.getArch()); 1162 } 1163 { 1164 Triple T = Triple("aarch64_be"); 1165 EXPECT_EQ(Triple::aarch64_be, T.getArch()); 1166 } 1167 { 1168 Triple T = Triple("aarch64be"); 1169 EXPECT_EQ(Triple::UnknownArch, T.getArch()); 1170 } 1171 { 1172 Triple T = Triple("arm64be"); 1173 EXPECT_EQ(Triple::UnknownArch, T.getArch()); 1174 } 1175 } 1176 } // end anonymous namespace 1177