]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - unittests/Core/ArchSpecTest.cpp
Vendor import of lldb trunk r300890:
[FreeBSD/FreeBSD.git] / unittests / Core / ArchSpecTest.cpp
1 //===-- ArchSpecTest.cpp ----------------------------------------*- C++ -*-===//
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
12 #include "lldb/Core/ArchSpec.h"
13
14 #include "llvm/Support/MachO.h"
15
16 using namespace lldb;
17 using namespace lldb_private;
18
19 TEST(ArchSpecTest, TestParseMachCPUDashSubtypeTripleSimple) {
20
21   // Success conditions.  Valid cpu/subtype combinations using both - and .
22   ArchSpec AS;
23   EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-10", AS));
24   EXPECT_EQ(12u, AS.GetMachOCPUType());
25   EXPECT_EQ(10u, AS.GetMachOCPUSubType());
26
27   AS = ArchSpec();
28   EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-15", AS));
29   EXPECT_EQ(12u, AS.GetMachOCPUType());
30   EXPECT_EQ(15u, AS.GetMachOCPUSubType());
31
32   AS = ArchSpec();
33   EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12.15", AS));
34   EXPECT_EQ(12u, AS.GetMachOCPUType());
35   EXPECT_EQ(15u, AS.GetMachOCPUSubType());
36
37   // Failure conditions.
38
39   // Valid string, unknown cpu/subtype.
40   AS = ArchSpec();
41   EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("13.11", AS));
42   EXPECT_EQ(0u, AS.GetMachOCPUType());
43   EXPECT_EQ(0u, AS.GetMachOCPUSubType());
44
45   // Missing / invalid cpu or subtype
46   AS = ArchSpec();
47   EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("13", AS));
48
49   AS = ArchSpec();
50   EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("13.A", AS));
51
52   AS = ArchSpec();
53   EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("A.13", AS));
54
55   // Empty string.
56   AS = ArchSpec();
57   EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("", AS));
58 }
59
60 TEST(ArchSpecTest, TestParseMachCPUDashSubtypeTripleExtra) {
61   ArchSpec AS;
62   EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-15-vendor-os", AS));
63   EXPECT_EQ(12u, AS.GetMachOCPUType());
64   EXPECT_EQ(15u, AS.GetMachOCPUSubType());
65   EXPECT_EQ("vendor", AS.GetTriple().getVendorName());
66   EXPECT_EQ("os", AS.GetTriple().getOSName());
67
68   AS = ArchSpec();
69   EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-10-vendor-os-name", AS));
70   EXPECT_EQ(12u, AS.GetMachOCPUType());
71   EXPECT_EQ(10u, AS.GetMachOCPUSubType());
72   EXPECT_EQ("vendor", AS.GetTriple().getVendorName());
73   EXPECT_EQ("os", AS.GetTriple().getOSName());
74
75   AS = ArchSpec();
76   EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-15-vendor.os-name", AS));
77   EXPECT_EQ(12u, AS.GetMachOCPUType());
78   EXPECT_EQ(15u, AS.GetMachOCPUSubType());
79   EXPECT_EQ("vendor.os", AS.GetTriple().getVendorName());
80   EXPECT_EQ("name", AS.GetTriple().getOSName());
81
82   // These there should parse correctly, but the vendor / OS should be defaulted
83   // since they are unrecognized.
84   AS = ArchSpec();
85   EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-10-vendor", AS));
86   EXPECT_EQ(12u, AS.GetMachOCPUType());
87   EXPECT_EQ(10u, AS.GetMachOCPUSubType());
88   EXPECT_EQ("apple", AS.GetTriple().getVendorName());
89   EXPECT_EQ("", AS.GetTriple().getOSName());
90
91   AS = ArchSpec();
92   EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("12.10.10", AS));
93
94   AS = ArchSpec();
95   EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("12-10.10", AS));
96 }
97
98 TEST(ArchSpecTest, TestSetTriple) {
99   ArchSpec AS;
100
101   // Various flavors of valid triples.
102   EXPECT_TRUE(AS.SetTriple("12-10-apple-darwin"));
103   EXPECT_EQ(uint32_t(llvm::MachO::CPU_TYPE_ARM), AS.GetMachOCPUType());
104   EXPECT_EQ(10u, AS.GetMachOCPUSubType());
105   EXPECT_TRUE(llvm::StringRef(AS.GetTriple().str())
106                   .consume_front("armv7f-apple-darwin"));
107   EXPECT_EQ(ArchSpec::eCore_arm_armv7f, AS.GetCore());
108
109   AS = ArchSpec();
110   EXPECT_TRUE(AS.SetTriple("18.100-apple-darwin"));
111   EXPECT_EQ(uint32_t(llvm::MachO::CPU_TYPE_POWERPC), AS.GetMachOCPUType());
112   EXPECT_EQ(100u, AS.GetMachOCPUSubType());
113   EXPECT_TRUE(llvm::StringRef(AS.GetTriple().str())
114                   .consume_front("powerpc-apple-darwin"));
115   EXPECT_EQ(ArchSpec::eCore_ppc_ppc970, AS.GetCore());
116
117   AS = ArchSpec();
118   EXPECT_TRUE(AS.SetTriple("i686-pc-windows"));
119   EXPECT_EQ(llvm::Triple::x86, AS.GetTriple().getArch());
120   EXPECT_EQ(llvm::Triple::PC, AS.GetTriple().getVendor());
121   EXPECT_EQ(llvm::Triple::Win32, AS.GetTriple().getOS());
122   EXPECT_TRUE(
123       llvm::StringRef(AS.GetTriple().str()).consume_front("i686-pc-windows"));
124   EXPECT_STREQ("i686", AS.GetArchitectureName());
125   EXPECT_EQ(ArchSpec::eCore_x86_32_i686, AS.GetCore());
126
127   // Various flavors of invalid triples.
128   AS = ArchSpec();
129   EXPECT_FALSE(AS.SetTriple("unknown-unknown-unknown"));
130
131   AS = ArchSpec();
132   EXPECT_FALSE(AS.SetTriple("unknown"));
133
134   AS = ArchSpec();
135   EXPECT_FALSE(AS.SetTriple(""));
136 }
137
138 TEST(ArchSpecTest, MergeFrom) {
139   ArchSpec A;
140   ArchSpec B("x86_64-pc-linux");
141
142   EXPECT_FALSE(A.IsValid());
143   ASSERT_TRUE(B.IsValid());
144   EXPECT_EQ(llvm::Triple::ArchType::x86_64, B.GetTriple().getArch());
145   EXPECT_EQ(llvm::Triple::VendorType::PC, B.GetTriple().getVendor());
146   EXPECT_EQ(llvm::Triple::OSType::Linux, B.GetTriple().getOS());
147   EXPECT_EQ(ArchSpec::eCore_x86_64_x86_64, B.GetCore());
148
149   A.MergeFrom(B);
150   ASSERT_TRUE(A.IsValid());
151   EXPECT_EQ(llvm::Triple::ArchType::x86_64, A.GetTriple().getArch());
152   EXPECT_EQ(llvm::Triple::VendorType::PC, A.GetTriple().getVendor());
153   EXPECT_EQ(llvm::Triple::OSType::Linux, A.GetTriple().getOS());
154   EXPECT_EQ(ArchSpec::eCore_x86_64_x86_64, A.GetCore());
155 }