180814287SRaphael Isemann //===-- ArchSpecTest.cpp --------------------------------------------------===// 25f19b907SPavel Labath // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65f19b907SPavel Labath // 75f19b907SPavel Labath //===----------------------------------------------------------------------===// 85f19b907SPavel Labath 95f19b907SPavel Labath #include "gtest/gtest.h" 105f19b907SPavel Labath 115f19b907SPavel Labath #include "lldb/Utility/ArchSpec.h" 125f8e88cdSGreg Clayton #include "llvm/BinaryFormat/ELF.h" 130ce3b710SJonas Devlieghere #include "llvm/BinaryFormat/MachO.h" 145f19b907SPavel Labath 155f19b907SPavel Labath using namespace lldb; 165f19b907SPavel Labath using namespace lldb_private; 175f19b907SPavel Labath 185f19b907SPavel Labath TEST(ArchSpecTest, TestParseMachCPUDashSubtypeTripleSimple) { 195f19b907SPavel Labath 205f19b907SPavel Labath // Success conditions. Valid cpu/subtype combinations using both - and . 215f19b907SPavel Labath ArchSpec AS; 225f19b907SPavel Labath EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-10", AS)); 235f19b907SPavel Labath EXPECT_EQ(12u, AS.GetMachOCPUType()); 245f19b907SPavel Labath EXPECT_EQ(10u, AS.GetMachOCPUSubType()); 255f19b907SPavel Labath 265f19b907SPavel Labath AS = ArchSpec(); 275f19b907SPavel Labath EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-15", AS)); 285f19b907SPavel Labath EXPECT_EQ(12u, AS.GetMachOCPUType()); 295f19b907SPavel Labath EXPECT_EQ(15u, AS.GetMachOCPUSubType()); 305f19b907SPavel Labath 315f19b907SPavel Labath AS = ArchSpec(); 325f19b907SPavel Labath EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12.15", AS)); 335f19b907SPavel Labath EXPECT_EQ(12u, AS.GetMachOCPUType()); 345f19b907SPavel Labath EXPECT_EQ(15u, AS.GetMachOCPUSubType()); 355f19b907SPavel Labath 365f19b907SPavel Labath // Failure conditions. 375f19b907SPavel Labath 385f19b907SPavel Labath // Valid string, unknown cpu/subtype. 395f19b907SPavel Labath AS = ArchSpec(); 405f19b907SPavel Labath EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("13.11", AS)); 415f19b907SPavel Labath EXPECT_EQ(0u, AS.GetMachOCPUType()); 425f19b907SPavel Labath EXPECT_EQ(0u, AS.GetMachOCPUSubType()); 435f19b907SPavel Labath 445f19b907SPavel Labath // Missing / invalid cpu or subtype 455f19b907SPavel Labath AS = ArchSpec(); 465f19b907SPavel Labath EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("13", AS)); 475f19b907SPavel Labath 485f19b907SPavel Labath AS = ArchSpec(); 495f19b907SPavel Labath EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("13.A", AS)); 505f19b907SPavel Labath 515f19b907SPavel Labath AS = ArchSpec(); 525f19b907SPavel Labath EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("A.13", AS)); 535f19b907SPavel Labath 545f19b907SPavel Labath // Empty string. 555f19b907SPavel Labath AS = ArchSpec(); 565f19b907SPavel Labath EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("", AS)); 575f19b907SPavel Labath } 585f19b907SPavel Labath 595f19b907SPavel Labath TEST(ArchSpecTest, TestParseMachCPUDashSubtypeTripleExtra) { 605f19b907SPavel Labath ArchSpec AS; 615f19b907SPavel Labath EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-15-vendor-os", AS)); 625f19b907SPavel Labath EXPECT_EQ(12u, AS.GetMachOCPUType()); 635f19b907SPavel Labath EXPECT_EQ(15u, AS.GetMachOCPUSubType()); 645f19b907SPavel Labath EXPECT_EQ("vendor", AS.GetTriple().getVendorName()); 655f19b907SPavel Labath EXPECT_EQ("os", AS.GetTriple().getOSName()); 665f19b907SPavel Labath 675f19b907SPavel Labath AS = ArchSpec(); 685f19b907SPavel Labath EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-10-vendor-os-name", AS)); 695f19b907SPavel Labath EXPECT_EQ(12u, AS.GetMachOCPUType()); 705f19b907SPavel Labath EXPECT_EQ(10u, AS.GetMachOCPUSubType()); 715f19b907SPavel Labath EXPECT_EQ("vendor", AS.GetTriple().getVendorName()); 725f19b907SPavel Labath EXPECT_EQ("os", AS.GetTriple().getOSName()); 735f19b907SPavel Labath 745f19b907SPavel Labath AS = ArchSpec(); 755f19b907SPavel Labath EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-15-vendor.os-name", AS)); 765f19b907SPavel Labath EXPECT_EQ(12u, AS.GetMachOCPUType()); 775f19b907SPavel Labath EXPECT_EQ(15u, AS.GetMachOCPUSubType()); 785f19b907SPavel Labath EXPECT_EQ("vendor.os", AS.GetTriple().getVendorName()); 795f19b907SPavel Labath EXPECT_EQ("name", AS.GetTriple().getOSName()); 805f19b907SPavel Labath 815f19b907SPavel Labath // These there should parse correctly, but the vendor / OS should be defaulted 825f19b907SPavel Labath // since they are unrecognized. 835f19b907SPavel Labath AS = ArchSpec(); 845f19b907SPavel Labath EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-10-vendor", AS)); 855f19b907SPavel Labath EXPECT_EQ(12u, AS.GetMachOCPUType()); 865f19b907SPavel Labath EXPECT_EQ(10u, AS.GetMachOCPUSubType()); 875f19b907SPavel Labath EXPECT_EQ("apple", AS.GetTriple().getVendorName()); 885f19b907SPavel Labath EXPECT_EQ("", AS.GetTriple().getOSName()); 895f19b907SPavel Labath 905f19b907SPavel Labath AS = ArchSpec(); 915f19b907SPavel Labath EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("12.10.10", AS)); 925f19b907SPavel Labath 935f19b907SPavel Labath AS = ArchSpec(); 945f19b907SPavel Labath EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("12-10.10", AS)); 955f19b907SPavel Labath } 965f19b907SPavel Labath 975f19b907SPavel Labath TEST(ArchSpecTest, TestSetTriple) { 985f19b907SPavel Labath ArchSpec AS; 995f19b907SPavel Labath 1005f19b907SPavel Labath // Various flavors of valid triples. 1015f19b907SPavel Labath EXPECT_TRUE(AS.SetTriple("12-10-apple-darwin")); 1025f19b907SPavel Labath EXPECT_EQ(uint32_t(llvm::MachO::CPU_TYPE_ARM), AS.GetMachOCPUType()); 1035f19b907SPavel Labath EXPECT_EQ(10u, AS.GetMachOCPUSubType()); 1045f19b907SPavel Labath EXPECT_TRUE(llvm::StringRef(AS.GetTriple().str()) 1055f19b907SPavel Labath .consume_front("armv7f-apple-darwin")); 1065f19b907SPavel Labath EXPECT_EQ(ArchSpec::eCore_arm_armv7f, AS.GetCore()); 1075f19b907SPavel Labath 1085f19b907SPavel Labath AS = ArchSpec(); 1095f19b907SPavel Labath EXPECT_TRUE(AS.SetTriple("18.100-apple-darwin")); 1105f19b907SPavel Labath EXPECT_EQ(uint32_t(llvm::MachO::CPU_TYPE_POWERPC), AS.GetMachOCPUType()); 1115f19b907SPavel Labath EXPECT_EQ(100u, AS.GetMachOCPUSubType()); 1125f19b907SPavel Labath EXPECT_TRUE(llvm::StringRef(AS.GetTriple().str()) 1135f19b907SPavel Labath .consume_front("powerpc-apple-darwin")); 1145f19b907SPavel Labath EXPECT_EQ(ArchSpec::eCore_ppc_ppc970, AS.GetCore()); 1155f19b907SPavel Labath 1165f19b907SPavel Labath AS = ArchSpec(); 1175f19b907SPavel Labath EXPECT_TRUE(AS.SetTriple("i686-pc-windows")); 1185f19b907SPavel Labath EXPECT_EQ(llvm::Triple::x86, AS.GetTriple().getArch()); 1195f19b907SPavel Labath EXPECT_EQ(llvm::Triple::PC, AS.GetTriple().getVendor()); 1205f19b907SPavel Labath EXPECT_EQ(llvm::Triple::Win32, AS.GetTriple().getOS()); 1215f19b907SPavel Labath EXPECT_TRUE( 1225f19b907SPavel Labath llvm::StringRef(AS.GetTriple().str()).consume_front("i686-pc-windows")); 1235f19b907SPavel Labath EXPECT_STREQ("i686", AS.GetArchitectureName()); 1245f19b907SPavel Labath EXPECT_EQ(ArchSpec::eCore_x86_32_i686, AS.GetCore()); 1255f19b907SPavel Labath 12681beb15dSIlya Kuklin AS = ArchSpec(); 12781beb15dSIlya Kuklin EXPECT_TRUE(AS.SetTriple("msp430---elf")); 12881beb15dSIlya Kuklin EXPECT_EQ(llvm::Triple::msp430, AS.GetTriple().getArch()); 12981beb15dSIlya Kuklin EXPECT_STREQ("msp430", AS.GetArchitectureName()); 13081beb15dSIlya Kuklin EXPECT_EQ(ArchSpec::eCore_msp430, AS.GetCore()); 13181beb15dSIlya Kuklin 132*de252e77SBrad Smith AS = ArchSpec(); 133*de252e77SBrad Smith EXPECT_TRUE(AS.SetTriple("amd64-unknown-openbsd")); 134*de252e77SBrad Smith EXPECT_EQ(llvm::Triple::x86_64, AS.GetTriple().getArch()); 135*de252e77SBrad Smith EXPECT_STREQ("amd64", AS.GetArchitectureName()); 136*de252e77SBrad Smith EXPECT_EQ(ArchSpec::eCore_x86_64_amd64, AS.GetCore()); 137*de252e77SBrad Smith 1385f19b907SPavel Labath // Various flavors of invalid triples. 1395f19b907SPavel Labath AS = ArchSpec(); 1405f19b907SPavel Labath EXPECT_FALSE(AS.SetTriple("unknown-unknown-unknown")); 1415f19b907SPavel Labath 1425f19b907SPavel Labath AS = ArchSpec(); 1435f19b907SPavel Labath EXPECT_FALSE(AS.SetTriple("unknown")); 1445f19b907SPavel Labath 1455f19b907SPavel Labath AS = ArchSpec(); 1465f19b907SPavel Labath EXPECT_FALSE(AS.SetTriple("")); 1475f19b907SPavel Labath } 1485f19b907SPavel Labath 1495f19b907SPavel Labath TEST(ArchSpecTest, MergeFrom) { 1506d6288aeSAlex Langford { 1515f19b907SPavel Labath ArchSpec A; 1525f19b907SPavel Labath ArchSpec B("x86_64-pc-linux"); 1535f19b907SPavel Labath 1545f19b907SPavel Labath EXPECT_FALSE(A.IsValid()); 1555f19b907SPavel Labath ASSERT_TRUE(B.IsValid()); 1565f19b907SPavel Labath EXPECT_EQ(llvm::Triple::ArchType::x86_64, B.GetTriple().getArch()); 1575f19b907SPavel Labath EXPECT_EQ(llvm::Triple::VendorType::PC, B.GetTriple().getVendor()); 1585f19b907SPavel Labath EXPECT_EQ(llvm::Triple::OSType::Linux, B.GetTriple().getOS()); 1595f19b907SPavel Labath EXPECT_EQ(ArchSpec::eCore_x86_64_x86_64, B.GetCore()); 1605f19b907SPavel Labath 1615f19b907SPavel Labath A.MergeFrom(B); 1625f19b907SPavel Labath ASSERT_TRUE(A.IsValid()); 1635f19b907SPavel Labath EXPECT_EQ(llvm::Triple::ArchType::x86_64, A.GetTriple().getArch()); 1645f19b907SPavel Labath EXPECT_EQ(llvm::Triple::VendorType::PC, A.GetTriple().getVendor()); 1655f19b907SPavel Labath EXPECT_EQ(llvm::Triple::OSType::Linux, A.GetTriple().getOS()); 1665f19b907SPavel Labath EXPECT_EQ(ArchSpec::eCore_x86_64_x86_64, A.GetCore()); 1675f19b907SPavel Labath } 1686d6288aeSAlex Langford { 1696d6288aeSAlex Langford ArchSpec A("aarch64"); 1706d6288aeSAlex Langford ArchSpec B("aarch64--linux-android"); 1716d6288aeSAlex Langford 1727dd7a360SJason Molenda ArchSpec C("arm64_32"); 1737dd7a360SJason Molenda ArchSpec D("arm64_32--watchos"); 1747dd7a360SJason Molenda 1756d6288aeSAlex Langford EXPECT_TRUE(A.IsValid()); 1766d6288aeSAlex Langford EXPECT_TRUE(B.IsValid()); 1777dd7a360SJason Molenda EXPECT_TRUE(C.IsValid()); 1787dd7a360SJason Molenda EXPECT_TRUE(D.IsValid()); 1796d6288aeSAlex Langford 1806d6288aeSAlex Langford EXPECT_EQ(llvm::Triple::ArchType::aarch64, B.GetTriple().getArch()); 1816d6288aeSAlex Langford EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor, 1826d6288aeSAlex Langford B.GetTriple().getVendor()); 1836d6288aeSAlex Langford EXPECT_EQ(llvm::Triple::OSType::Linux, B.GetTriple().getOS()); 1846d6288aeSAlex Langford EXPECT_EQ(llvm::Triple::EnvironmentType::Android, 1856d6288aeSAlex Langford B.GetTriple().getEnvironment()); 1866d6288aeSAlex Langford 1876d6288aeSAlex Langford A.MergeFrom(B); 1886d6288aeSAlex Langford EXPECT_EQ(llvm::Triple::ArchType::aarch64, A.GetTriple().getArch()); 1896d6288aeSAlex Langford EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor, 1906d6288aeSAlex Langford A.GetTriple().getVendor()); 1916d6288aeSAlex Langford EXPECT_EQ(llvm::Triple::OSType::Linux, A.GetTriple().getOS()); 1926d6288aeSAlex Langford EXPECT_EQ(llvm::Triple::EnvironmentType::Android, 1936d6288aeSAlex Langford A.GetTriple().getEnvironment()); 1947dd7a360SJason Molenda 1957dd7a360SJason Molenda EXPECT_EQ(llvm::Triple::ArchType::aarch64_32, D.GetTriple().getArch()); 1967dd7a360SJason Molenda EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor, 1977dd7a360SJason Molenda D.GetTriple().getVendor()); 1987dd7a360SJason Molenda EXPECT_EQ(llvm::Triple::OSType::WatchOS, D.GetTriple().getOS()); 1997dd7a360SJason Molenda 2007dd7a360SJason Molenda C.MergeFrom(D); 2017dd7a360SJason Molenda EXPECT_EQ(llvm::Triple::ArchType::aarch64_32, C.GetTriple().getArch()); 2027dd7a360SJason Molenda EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor, 2037dd7a360SJason Molenda C.GetTriple().getVendor()); 2047dd7a360SJason Molenda EXPECT_EQ(llvm::Triple::OSType::WatchOS, C.GetTriple().getOS()); 2056d6288aeSAlex Langford } 2065f8e88cdSGreg Clayton { 2075f8e88cdSGreg Clayton ArchSpec A, B; 2085f8e88cdSGreg Clayton A.SetArchitecture(eArchTypeELF, llvm::ELF::EM_ARM, 2095f8e88cdSGreg Clayton LLDB_INVALID_CPUTYPE, llvm::ELF::ELFOSABI_NONE); 2105f8e88cdSGreg Clayton B.SetArchitecture(eArchTypeELF, llvm::ELF::EM_ARM, 2115f8e88cdSGreg Clayton LLDB_INVALID_CPUTYPE, llvm::ELF::ELFOSABI_LINUX); 2125f8e88cdSGreg Clayton 2135f8e88cdSGreg Clayton EXPECT_TRUE(A.IsValid()); 2145f8e88cdSGreg Clayton EXPECT_TRUE(B.IsValid()); 2155f8e88cdSGreg Clayton 2165f8e88cdSGreg Clayton EXPECT_EQ(llvm::Triple::ArchType::arm, B.GetTriple().getArch()); 2175f8e88cdSGreg Clayton EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor, 2185f8e88cdSGreg Clayton B.GetTriple().getVendor()); 2195f8e88cdSGreg Clayton EXPECT_EQ(llvm::Triple::OSType::Linux, B.GetTriple().getOS()); 2205f8e88cdSGreg Clayton EXPECT_EQ(llvm::Triple::EnvironmentType::UnknownEnvironment, 2215f8e88cdSGreg Clayton B.GetTriple().getEnvironment()); 2225f8e88cdSGreg Clayton 2235f8e88cdSGreg Clayton A.MergeFrom(B); 2245f8e88cdSGreg Clayton EXPECT_EQ(llvm::Triple::ArchType::arm, A.GetTriple().getArch()); 2255f8e88cdSGreg Clayton EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor, 2265f8e88cdSGreg Clayton A.GetTriple().getVendor()); 2275f8e88cdSGreg Clayton EXPECT_EQ(llvm::Triple::OSType::Linux, A.GetTriple().getOS()); 2285f8e88cdSGreg Clayton EXPECT_EQ(llvm::Triple::EnvironmentType::UnknownEnvironment, 2295f8e88cdSGreg Clayton A.GetTriple().getEnvironment()); 2305f8e88cdSGreg Clayton } 2318b8185bbSMuhammad Omair Javaid { 2328b8185bbSMuhammad Omair Javaid ArchSpec A("arm--linux-eabihf"); 2338b8185bbSMuhammad Omair Javaid ArchSpec B("armv8l--linux-gnueabihf"); 2348b8185bbSMuhammad Omair Javaid 2358b8185bbSMuhammad Omair Javaid EXPECT_TRUE(A.IsValid()); 2368b8185bbSMuhammad Omair Javaid EXPECT_TRUE(B.IsValid()); 2378b8185bbSMuhammad Omair Javaid 2388b8185bbSMuhammad Omair Javaid EXPECT_EQ(llvm::Triple::ArchType::arm, A.GetTriple().getArch()); 2398b8185bbSMuhammad Omair Javaid EXPECT_EQ(llvm::Triple::ArchType::arm, B.GetTriple().getArch()); 2408b8185bbSMuhammad Omair Javaid 2418b8185bbSMuhammad Omair Javaid EXPECT_EQ(ArchSpec::eCore_arm_generic, A.GetCore()); 2428b8185bbSMuhammad Omair Javaid EXPECT_EQ(ArchSpec::eCore_arm_armv8l, B.GetCore()); 2438b8185bbSMuhammad Omair Javaid 2448b8185bbSMuhammad Omair Javaid EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor, 2458b8185bbSMuhammad Omair Javaid A.GetTriple().getVendor()); 2468b8185bbSMuhammad Omair Javaid EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor, 2478b8185bbSMuhammad Omair Javaid B.GetTriple().getVendor()); 2488b8185bbSMuhammad Omair Javaid 2498b8185bbSMuhammad Omair Javaid EXPECT_EQ(llvm::Triple::OSType::Linux, A.GetTriple().getOS()); 2508b8185bbSMuhammad Omair Javaid EXPECT_EQ(llvm::Triple::OSType::Linux, B.GetTriple().getOS()); 2518b8185bbSMuhammad Omair Javaid 2528b8185bbSMuhammad Omair Javaid EXPECT_EQ(llvm::Triple::EnvironmentType::EABIHF, 2538b8185bbSMuhammad Omair Javaid A.GetTriple().getEnvironment()); 2548b8185bbSMuhammad Omair Javaid EXPECT_EQ(llvm::Triple::EnvironmentType::GNUEABIHF, 2558b8185bbSMuhammad Omair Javaid B.GetTriple().getEnvironment()); 2568b8185bbSMuhammad Omair Javaid 2578b8185bbSMuhammad Omair Javaid A.MergeFrom(B); 2588b8185bbSMuhammad Omair Javaid EXPECT_EQ(llvm::Triple::ArchType::arm, A.GetTriple().getArch()); 2598b8185bbSMuhammad Omair Javaid EXPECT_EQ(ArchSpec::eCore_arm_armv8l, A.GetCore()); 2608b8185bbSMuhammad Omair Javaid EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor, 2618b8185bbSMuhammad Omair Javaid A.GetTriple().getVendor()); 2628b8185bbSMuhammad Omair Javaid EXPECT_EQ(llvm::Triple::OSType::Linux, A.GetTriple().getOS()); 2638b8185bbSMuhammad Omair Javaid EXPECT_EQ(llvm::Triple::EnvironmentType::EABIHF, 2648b8185bbSMuhammad Omair Javaid A.GetTriple().getEnvironment()); 2658b8185bbSMuhammad Omair Javaid } 2666d6288aeSAlex Langford } 26708e52bc8SDavide Italiano 26808e52bc8SDavide Italiano TEST(ArchSpecTest, MergeFromMachOUnknown) { 26908e52bc8SDavide Italiano class MyArchSpec : public ArchSpec { 27008e52bc8SDavide Italiano public: 27108e52bc8SDavide Italiano MyArchSpec() { 27208e52bc8SDavide Italiano this->SetTriple("unknown-mach-64"); 27308e52bc8SDavide Italiano this->m_core = ArchSpec::eCore_uknownMach64; 27408e52bc8SDavide Italiano this->m_byte_order = eByteOrderLittle; 27508e52bc8SDavide Italiano this->m_flags = 0; 27608e52bc8SDavide Italiano } 27708e52bc8SDavide Italiano }; 27808e52bc8SDavide Italiano 27908e52bc8SDavide Italiano MyArchSpec A; 28008e52bc8SDavide Italiano ASSERT_TRUE(A.IsValid()); 28108e52bc8SDavide Italiano MyArchSpec B; 28208e52bc8SDavide Italiano ASSERT_TRUE(B.IsValid()); 28308e52bc8SDavide Italiano A.MergeFrom(B); 28408e52bc8SDavide Italiano ASSERT_EQ(A.GetCore(), ArchSpec::eCore_uknownMach64); 28508e52bc8SDavide Italiano } 2867b8a0375SAdrian Prantl 2877b8a0375SAdrian Prantl TEST(ArchSpecTest, Compatibility) { 2887b8a0375SAdrian Prantl { 2897b8a0375SAdrian Prantl ArchSpec A("x86_64-apple-macosx10.12"); 2907b8a0375SAdrian Prantl ArchSpec B("x86_64-apple-macosx10.12"); 2917b8a0375SAdrian Prantl ASSERT_TRUE(A.IsExactMatch(B)); 2927b8a0375SAdrian Prantl ASSERT_TRUE(A.IsCompatibleMatch(B)); 2937b8a0375SAdrian Prantl } 2947b8a0375SAdrian Prantl { 295e9264b74SKazuaki Ishizaki // The version information is auxiliary to support availability but 2967b8a0375SAdrian Prantl // doesn't affect compatibility. 2977b8a0375SAdrian Prantl ArchSpec A("x86_64-apple-macosx10.11"); 2987b8a0375SAdrian Prantl ArchSpec B("x86_64-apple-macosx10.12"); 2997b8a0375SAdrian Prantl ASSERT_TRUE(A.IsExactMatch(B)); 3007b8a0375SAdrian Prantl ASSERT_TRUE(A.IsCompatibleMatch(B)); 3017b8a0375SAdrian Prantl } 3027b8a0375SAdrian Prantl { 3037b8a0375SAdrian Prantl ArchSpec A("x86_64-apple-macosx10.13"); 3047b8a0375SAdrian Prantl ArchSpec B("x86_64h-apple-macosx10.13"); 3057b8a0375SAdrian Prantl ASSERT_FALSE(A.IsExactMatch(B)); 3067b8a0375SAdrian Prantl ASSERT_TRUE(A.IsCompatibleMatch(B)); 3077b8a0375SAdrian Prantl } 3087b8a0375SAdrian Prantl { 3097b8a0375SAdrian Prantl ArchSpec A("x86_64-apple-macosx"); 3107b8a0375SAdrian Prantl ArchSpec B("x86_64-apple-ios-simulator"); 3117b8a0375SAdrian Prantl ASSERT_FALSE(A.IsExactMatch(B)); 3127b8a0375SAdrian Prantl ASSERT_FALSE(A.IsCompatibleMatch(B)); 3137b8a0375SAdrian Prantl } 3147b8a0375SAdrian Prantl { 3157b8a0375SAdrian Prantl ArchSpec A("x86_64-*-*"); 3167b8a0375SAdrian Prantl ArchSpec B("x86_64-apple-ios-simulator"); 3177b8a0375SAdrian Prantl ASSERT_FALSE(A.IsExactMatch(B)); 3187b8a0375SAdrian Prantl ASSERT_FALSE(A.IsCompatibleMatch(B)); 31905df9cc7SAdrian Prantl ASSERT_FALSE(B.IsExactMatch(A)); 32005df9cc7SAdrian Prantl ASSERT_FALSE(B.IsCompatibleMatch(A)); 32105df9cc7SAdrian Prantl } 32205df9cc7SAdrian Prantl { 32305df9cc7SAdrian Prantl ArchSpec A("x86_64-apple-ios"); 32405df9cc7SAdrian Prantl ArchSpec B("x86_64-apple-ios-simulator"); 32505df9cc7SAdrian Prantl ASSERT_FALSE(A.IsExactMatch(B)); 32605df9cc7SAdrian Prantl ASSERT_FALSE(A.IsCompatibleMatch(B)); 32705df9cc7SAdrian Prantl ASSERT_FALSE(B.IsExactMatch(A)); 32805df9cc7SAdrian Prantl ASSERT_FALSE(B.IsCompatibleMatch(A)); 32905df9cc7SAdrian Prantl } 33005df9cc7SAdrian Prantl { 33105df9cc7SAdrian Prantl // FIXME: This is surprisingly not equivalent to "x86_64-*-*". 33205df9cc7SAdrian Prantl ArchSpec A("x86_64"); 33305df9cc7SAdrian Prantl ArchSpec B("x86_64-apple-ios-simulator"); 33405df9cc7SAdrian Prantl ASSERT_FALSE(A.IsExactMatch(B)); 33505df9cc7SAdrian Prantl ASSERT_TRUE(A.IsCompatibleMatch(B)); 33605df9cc7SAdrian Prantl ASSERT_FALSE(B.IsExactMatch(A)); 33705df9cc7SAdrian Prantl ASSERT_TRUE(B.IsCompatibleMatch(A)); 3387b8a0375SAdrian Prantl } 3397b8a0375SAdrian Prantl { 3408120eba5SFred Riss ArchSpec A("arm64-apple-ios"); 3418120eba5SFred Riss ArchSpec B("arm64-apple-ios-simulator"); 3428120eba5SFred Riss ASSERT_FALSE(A.IsExactMatch(B)); 3438120eba5SFred Riss ASSERT_FALSE(A.IsCompatibleMatch(B)); 3448120eba5SFred Riss ASSERT_FALSE(B.IsCompatibleMatch(A)); 3458120eba5SFred Riss ASSERT_FALSE(B.IsCompatibleMatch(A)); 3468120eba5SFred Riss } 3478120eba5SFred Riss { 3487b8a0375SAdrian Prantl ArchSpec A("arm64-*-*"); 3497b8a0375SAdrian Prantl ArchSpec B("arm64-apple-ios"); 3507b8a0375SAdrian Prantl ASSERT_FALSE(A.IsExactMatch(B)); 3517b8a0375SAdrian Prantl // FIXME: This looks unintuitive and we should investigate whether 35296f69637SAdrian Prantl // this is the desired behavior. 3537b8a0375SAdrian Prantl ASSERT_FALSE(A.IsCompatibleMatch(B)); 3547b8a0375SAdrian Prantl } 3557b8a0375SAdrian Prantl { 3567b8a0375SAdrian Prantl ArchSpec A("x86_64-*-*"); 3577b8a0375SAdrian Prantl ArchSpec B("x86_64-apple-ios-simulator"); 3587b8a0375SAdrian Prantl ASSERT_FALSE(A.IsExactMatch(B)); 3597b8a0375SAdrian Prantl // FIXME: See above, though the extra environment complicates things. 3607b8a0375SAdrian Prantl ASSERT_FALSE(A.IsCompatibleMatch(B)); 3617b8a0375SAdrian Prantl } 36296f69637SAdrian Prantl { 36396f69637SAdrian Prantl ArchSpec A("x86_64"); 36496f69637SAdrian Prantl ArchSpec B("x86_64-apple-macosx10.14"); 36596f69637SAdrian Prantl // FIXME: The exact match also looks unintuitive. 36696f69637SAdrian Prantl ASSERT_TRUE(A.IsExactMatch(B)); 36796f69637SAdrian Prantl ASSERT_TRUE(A.IsCompatibleMatch(B)); 36896f69637SAdrian Prantl } 369e937840dSAdrian Prantl { 370e937840dSAdrian Prantl ArchSpec A("x86_64"); 371e937840dSAdrian Prantl ArchSpec B("x86_64-apple-ios12.0.0-macabi"); 372e937840dSAdrian Prantl // FIXME: The exact match also looks unintuitive. 373e937840dSAdrian Prantl ASSERT_TRUE(A.IsExactMatch(B)); 374e937840dSAdrian Prantl ASSERT_TRUE(A.IsCompatibleMatch(B)); 375e937840dSAdrian Prantl } 376e937840dSAdrian Prantl { 377e937840dSAdrian Prantl ArchSpec A("x86_64-apple-ios12.0.0"); 378e937840dSAdrian Prantl ArchSpec B("x86_64-apple-ios12.0.0-macabi"); 379e937840dSAdrian Prantl ASSERT_FALSE(A.IsExactMatch(B)); 380e937840dSAdrian Prantl ASSERT_FALSE(A.IsCompatibleMatch(B)); 381e937840dSAdrian Prantl } 382e937840dSAdrian Prantl { 383e937840dSAdrian Prantl ArchSpec A("x86_64-apple-macosx10.14.2"); 384e937840dSAdrian Prantl ArchSpec B("x86_64-apple-ios12.0.0-macabi"); 385e937840dSAdrian Prantl ASSERT_FALSE(A.IsExactMatch(B)); 386e937840dSAdrian Prantl ASSERT_TRUE(A.IsCompatibleMatch(B)); 387e937840dSAdrian Prantl } 388e937840dSAdrian Prantl { 389e937840dSAdrian Prantl ArchSpec A("x86_64-apple-macosx10.14.2"); 390e937840dSAdrian Prantl ArchSpec B("x86_64-apple-ios12.0.0-macabi"); 391e937840dSAdrian Prantl // ios-macabi wins. 392e937840dSAdrian Prantl A.MergeFrom(B); 393e937840dSAdrian Prantl ASSERT_TRUE(A.IsExactMatch(B)); 394e937840dSAdrian Prantl } 395e937840dSAdrian Prantl { 396e937840dSAdrian Prantl ArchSpec A("x86_64-apple-macosx10.14.2"); 397e937840dSAdrian Prantl ArchSpec B("x86_64-apple-ios12.0.0-macabi"); 398e937840dSAdrian Prantl ArchSpec C(B); 399e937840dSAdrian Prantl // ios-macabi wins. 400e937840dSAdrian Prantl B.MergeFrom(A); 401e937840dSAdrian Prantl ASSERT_TRUE(B.IsExactMatch(C)); 402e937840dSAdrian Prantl } 4037b8a0375SAdrian Prantl } 404f760f5aeSPavel Labath 405f760f5aeSPavel Labath TEST(ArchSpecTest, OperatorBool) { 406f760f5aeSPavel Labath EXPECT_FALSE(ArchSpec()); 407f760f5aeSPavel Labath EXPECT_TRUE(ArchSpec("x86_64-pc-linux")); 408f760f5aeSPavel Labath } 409bee015efSAlex Langford 410bee015efSAlex Langford TEST(ArchSpecTest, TripleComponentsWereSpecified) { 411bee015efSAlex Langford { 412bee015efSAlex Langford ArchSpec A(""); 413bee015efSAlex Langford ArchSpec B("-"); 414bee015efSAlex Langford ArchSpec C("--"); 415bee015efSAlex Langford ArchSpec D("---"); 416bee015efSAlex Langford 417bee015efSAlex Langford ASSERT_FALSE(A.TripleVendorWasSpecified()); 418bee015efSAlex Langford ASSERT_FALSE(A.TripleOSWasSpecified()); 419bee015efSAlex Langford ASSERT_FALSE(A.TripleEnvironmentWasSpecified()); 420bee015efSAlex Langford 421bee015efSAlex Langford ASSERT_FALSE(B.TripleVendorWasSpecified()); 422bee015efSAlex Langford ASSERT_FALSE(B.TripleOSWasSpecified()); 423bee015efSAlex Langford ASSERT_FALSE(B.TripleEnvironmentWasSpecified()); 424bee015efSAlex Langford 425bee015efSAlex Langford ASSERT_FALSE(C.TripleVendorWasSpecified()); 426bee015efSAlex Langford ASSERT_FALSE(C.TripleOSWasSpecified()); 427bee015efSAlex Langford ASSERT_FALSE(C.TripleEnvironmentWasSpecified()); 428bee015efSAlex Langford 429bee015efSAlex Langford ASSERT_FALSE(D.TripleVendorWasSpecified()); 430bee015efSAlex Langford ASSERT_FALSE(D.TripleOSWasSpecified()); 431bee015efSAlex Langford ASSERT_FALSE(D.TripleEnvironmentWasSpecified()); 432bee015efSAlex Langford } 433bee015efSAlex Langford { 434bee015efSAlex Langford // TODO: llvm::Triple::normalize treats the missing components from these 435bee015efSAlex Langford // triples as specified unknown components instead of unspecified 436bee015efSAlex Langford // components. We need to either change the behavior in llvm or work around 437bee015efSAlex Langford // this in lldb. 438bee015efSAlex Langford ArchSpec A("armv7"); 439bee015efSAlex Langford ArchSpec B("armv7-"); 440bee015efSAlex Langford ArchSpec C("armv7--"); 441bee015efSAlex Langford ArchSpec D("armv7---"); 442bee015efSAlex Langford 443bee015efSAlex Langford ASSERT_FALSE(A.TripleVendorWasSpecified()); 444bee015efSAlex Langford ASSERT_FALSE(A.TripleOSWasSpecified()); 445bee015efSAlex Langford ASSERT_FALSE(A.TripleEnvironmentWasSpecified()); 446bee015efSAlex Langford 447bee015efSAlex Langford ASSERT_TRUE(B.TripleVendorWasSpecified()); 448bee015efSAlex Langford ASSERT_FALSE(B.TripleOSWasSpecified()); 449bee015efSAlex Langford ASSERT_FALSE(B.TripleEnvironmentWasSpecified()); 450bee015efSAlex Langford 451bee015efSAlex Langford ASSERT_TRUE(C.TripleVendorWasSpecified()); 452bee015efSAlex Langford ASSERT_TRUE(C.TripleOSWasSpecified()); 453bee015efSAlex Langford ASSERT_FALSE(C.TripleEnvironmentWasSpecified()); 454bee015efSAlex Langford 455bee015efSAlex Langford ASSERT_TRUE(D.TripleVendorWasSpecified()); 456bee015efSAlex Langford ASSERT_TRUE(D.TripleOSWasSpecified()); 457bee015efSAlex Langford ASSERT_TRUE(D.TripleEnvironmentWasSpecified()); 458bee015efSAlex Langford } 459bee015efSAlex Langford { 460bee015efSAlex Langford ArchSpec A("x86_64-unknown"); 461bee015efSAlex Langford ArchSpec B("powerpc-unknown-linux"); 462bee015efSAlex Langford ArchSpec C("i386-pc-windows-msvc"); 463bee015efSAlex Langford ArchSpec D("aarch64-unknown-linux-android"); 464bee015efSAlex Langford 465bee015efSAlex Langford ASSERT_TRUE(A.TripleVendorWasSpecified()); 466bee015efSAlex Langford ASSERT_FALSE(A.TripleOSWasSpecified()); 467bee015efSAlex Langford ASSERT_FALSE(A.TripleEnvironmentWasSpecified()); 468bee015efSAlex Langford 469bee015efSAlex Langford ASSERT_TRUE(B.TripleVendorWasSpecified()); 470bee015efSAlex Langford ASSERT_TRUE(B.TripleOSWasSpecified()); 471bee015efSAlex Langford ASSERT_FALSE(B.TripleEnvironmentWasSpecified()); 472bee015efSAlex Langford 473bee015efSAlex Langford ASSERT_TRUE(C.TripleVendorWasSpecified()); 474bee015efSAlex Langford ASSERT_TRUE(C.TripleOSWasSpecified()); 475bee015efSAlex Langford ASSERT_TRUE(C.TripleEnvironmentWasSpecified()); 476bee015efSAlex Langford 477bee015efSAlex Langford ASSERT_TRUE(D.TripleVendorWasSpecified()); 478bee015efSAlex Langford ASSERT_TRUE(D.TripleOSWasSpecified()); 479bee015efSAlex Langford ASSERT_TRUE(D.TripleEnvironmentWasSpecified()); 480bee015efSAlex Langford } 481bee015efSAlex Langford } 482