xref: /llvm-project/lldb/unittests/Utility/ArchSpecTest.cpp (revision de252e7777c1c6b45626a58aa34ea99dee58cc40)
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