blob: 99acbfdd8b9f0a91315a5e1fa5098cdab2dbe672 [file] [log] [blame]
Pavel Labathb625a0e2016-02-09 17:28:01 +00001//===-- ScalarTest.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
Pavel Labathb625a0e2016-02-09 17:28:01 +000010#include "gtest/gtest.h"
11
Zachary Turner666cc0b2017-03-04 01:30:05 +000012#include "lldb/Utility/DataExtractor.h"
Zachary Turner01c32432017-02-14 19:06:07 +000013#include "lldb/Utility/Endian.h"
Pavel Labathd821c992018-08-07 11:07:21 +000014#include "lldb/Utility/Scalar.h"
Zachary Turner97206d52017-05-12 04:51:55 +000015#include "lldb/Utility/Status.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000016#include "lldb/Utility/StreamString.h"
Pavel Labath61547252018-06-19 17:24:03 +000017#include "llvm/Testing/Support/Error.h"
Pavel Labathb625a0e2016-02-09 17:28:01 +000018
19using namespace lldb_private;
Pavel Labath61547252018-06-19 17:24:03 +000020using namespace llvm;
Pavel Labathb625a0e2016-02-09 17:28:01 +000021
Davide Italiano18a0ce92018-12-21 22:42:00 +000022template <typename T>
23bool checkInequality(T c1, T c2) {
24 return (Scalar(c1) != Scalar(c2));
25}
26
27template <typename T>
28bool checkEquality(T c1, T c2) {
29 return (Scalar(c1) == Scalar(c2));
30}
31
32TEST(ScalarTest, Equality) {
33 ASSERT_TRUE(checkInequality<int>(23, 24));
34 ASSERT_TRUE(checkEquality<int>(96, 96));
35 ASSERT_TRUE(checkInequality<float>(4.0f, 4.5f));
36 ASSERT_TRUE(checkEquality<float>(4.0f, 4.0f));
37 uint64_t apint1 = 234;
38 uint64_t apint2 = 246;
39 ASSERT_TRUE(checkInequality<APInt>(APInt(64, apint1), APInt(64, apint2)));
40 ASSERT_TRUE(checkEquality<APInt>(APInt(64, apint1), APInt(64, apint1)));
41
42 Scalar void1;
43 Scalar void2;
44 float f1 = 2.0;
45 ASSERT_TRUE(void1 == void2);
46 ASSERT_FALSE(void1 == Scalar(f1));
47}
48
Kate Stoneb9c1b512016-09-06 20:57:50 +000049TEST(ScalarTest, RightShiftOperator) {
50 int a = 0x00001000;
51 int b = 0xFFFFFFFF;
52 int c = 4;
53 Scalar a_scalar(a);
54 Scalar b_scalar(b);
55 Scalar c_scalar(c);
56 ASSERT_EQ(a >> c, a_scalar >> c_scalar);
57 ASSERT_EQ(b >> c, b_scalar >> c_scalar);
Pavel Labathb625a0e2016-02-09 17:28:01 +000058}
Ulrich Weigand9521ad22016-04-15 09:55:52 +000059
Kate Stoneb9c1b512016-09-06 20:57:50 +000060TEST(ScalarTest, GetBytes) {
61 int a = 0x01020304;
62 long long b = 0x0102030405060708LL;
Adrian McCarthy4ee16bf2018-04-19 18:31:57 +000063 float c = 1234567.89e32f;
Kate Stoneb9c1b512016-09-06 20:57:50 +000064 double d = 1234567.89e42;
65 char e[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
66 char f[32] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
67 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32};
68 Scalar a_scalar(a);
69 Scalar b_scalar(b);
70 Scalar c_scalar(c);
71 Scalar d_scalar(d);
72 Scalar e_scalar;
73 Scalar f_scalar;
74 DataExtractor e_data(e, sizeof(e), endian::InlHostByteOrder(),
75 sizeof(void *));
Zachary Turner97206d52017-05-12 04:51:55 +000076 Status e_error =
Kate Stoneb9c1b512016-09-06 20:57:50 +000077 e_scalar.SetValueFromData(e_data, lldb::eEncodingUint, sizeof(e));
78 DataExtractor f_data(f, sizeof(f), endian::InlHostByteOrder(),
79 sizeof(void *));
Zachary Turner97206d52017-05-12 04:51:55 +000080 Status f_error =
Kate Stoneb9c1b512016-09-06 20:57:50 +000081 f_scalar.SetValueFromData(f_data, lldb::eEncodingUint, sizeof(f));
82 ASSERT_EQ(0, memcmp(&a, a_scalar.GetBytes(), sizeof(a)));
83 ASSERT_EQ(0, memcmp(&b, b_scalar.GetBytes(), sizeof(b)));
84 ASSERT_EQ(0, memcmp(&c, c_scalar.GetBytes(), sizeof(c)));
85 ASSERT_EQ(0, memcmp(&d, d_scalar.GetBytes(), sizeof(d)));
86 ASSERT_EQ(0, e_error.Fail());
87 ASSERT_EQ(0, memcmp(e, e_scalar.GetBytes(), sizeof(e)));
88 ASSERT_EQ(0, f_error.Fail());
89 ASSERT_EQ(0, memcmp(f, f_scalar.GetBytes(), sizeof(f)));
Ulrich Weigand9521ad22016-04-15 09:55:52 +000090}
91
Kate Stoneb9c1b512016-09-06 20:57:50 +000092TEST(ScalarTest, CastOperations) {
93 long long a = 0xf1f2f3f4f5f6f7f8LL;
94 Scalar a_scalar(a);
95 ASSERT_EQ((signed char)a, a_scalar.SChar());
96 ASSERT_EQ((unsigned char)a, a_scalar.UChar());
97 ASSERT_EQ((signed short)a, a_scalar.SShort());
98 ASSERT_EQ((unsigned short)a, a_scalar.UShort());
99 ASSERT_EQ((signed int)a, a_scalar.SInt());
100 ASSERT_EQ((unsigned int)a, a_scalar.UInt());
101 ASSERT_EQ((signed long)a, a_scalar.SLong());
102 ASSERT_EQ((unsigned long)a, a_scalar.ULong());
103 ASSERT_EQ((signed long long)a, a_scalar.SLongLong());
104 ASSERT_EQ((unsigned long long)a, a_scalar.ULongLong());
Davide Italiano49d80282018-04-02 16:50:54 +0000105
106 int a2 = 23;
107 Scalar a2_scalar(a2);
108 ASSERT_EQ((float)a2, a2_scalar.Float());
109 ASSERT_EQ((double)a2, a2_scalar.Double());
110 ASSERT_EQ((long double)a2, a2_scalar.LongDouble());
Ulrich Weigand9521ad22016-04-15 09:55:52 +0000111}
112
Kate Stoneb9c1b512016-09-06 20:57:50 +0000113TEST(ScalarTest, ExtractBitfield) {
114 uint32_t len = sizeof(long long) * 8;
Bryan Chan01319e92016-05-19 13:51:20 +0000115
Kate Stoneb9c1b512016-09-06 20:57:50 +0000116 long long a1 = 0xf1f2f3f4f5f6f7f8LL;
117 long long b1 = 0xff1f2f3f4f5f6f7fLL;
118 Scalar s_scalar(a1);
119 ASSERT_TRUE(s_scalar.ExtractBitfield(0, 0));
120 ASSERT_EQ(0, memcmp(&a1, s_scalar.GetBytes(), sizeof(a1)));
121 ASSERT_TRUE(s_scalar.ExtractBitfield(len, 0));
122 ASSERT_EQ(0, memcmp(&a1, s_scalar.GetBytes(), sizeof(a1)));
123 ASSERT_TRUE(s_scalar.ExtractBitfield(len - 4, 4));
124 ASSERT_EQ(0, memcmp(&b1, s_scalar.GetBytes(), sizeof(b1)));
Bryan Chan01319e92016-05-19 13:51:20 +0000125
Kate Stoneb9c1b512016-09-06 20:57:50 +0000126 unsigned long long a2 = 0xf1f2f3f4f5f6f7f8ULL;
127 unsigned long long b2 = 0x0f1f2f3f4f5f6f7fULL;
128 Scalar u_scalar(a2);
129 ASSERT_TRUE(u_scalar.ExtractBitfield(0, 0));
130 ASSERT_EQ(0, memcmp(&a2, u_scalar.GetBytes(), sizeof(a2)));
131 ASSERT_TRUE(u_scalar.ExtractBitfield(len, 0));
132 ASSERT_EQ(0, memcmp(&a2, u_scalar.GetBytes(), sizeof(a2)));
133 ASSERT_TRUE(u_scalar.ExtractBitfield(len - 4, 4));
134 ASSERT_EQ(0, memcmp(&b2, u_scalar.GetBytes(), sizeof(b2)));
Bryan Chan01319e92016-05-19 13:51:20 +0000135}
Pavel Labathf92756e2016-09-02 10:58:52 +0000136
Kate Stoneb9c1b512016-09-06 20:57:50 +0000137template <typename T> static std::string ScalarGetValue(T value) {
138 StreamString stream;
139 Scalar(value).GetValue(&stream, false);
140 return stream.GetString();
Pavel Labathf92756e2016-09-02 10:58:52 +0000141}
142
Kate Stoneb9c1b512016-09-06 20:57:50 +0000143TEST(ScalarTest, GetValue) {
144 EXPECT_EQ("12345", ScalarGetValue<signed short>(12345));
145 EXPECT_EQ("-12345", ScalarGetValue<signed short>(-12345));
146 EXPECT_EQ("12345", ScalarGetValue<unsigned short>(12345));
147 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned short>::max()),
148 ScalarGetValue(std::numeric_limits<unsigned short>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000149
Kate Stoneb9c1b512016-09-06 20:57:50 +0000150 EXPECT_EQ("12345", ScalarGetValue<signed int>(12345));
151 EXPECT_EQ("-12345", ScalarGetValue<signed int>(-12345));
152 EXPECT_EQ("12345", ScalarGetValue<unsigned int>(12345));
153 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned int>::max()),
154 ScalarGetValue(std::numeric_limits<unsigned int>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000155
Kate Stoneb9c1b512016-09-06 20:57:50 +0000156 EXPECT_EQ("12345678", ScalarGetValue<signed long>(12345678L));
157 EXPECT_EQ("-12345678", ScalarGetValue<signed long>(-12345678L));
158 EXPECT_EQ("12345678", ScalarGetValue<unsigned long>(12345678UL));
159 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned long>::max()),
160 ScalarGetValue(std::numeric_limits<unsigned long>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000161
Kate Stoneb9c1b512016-09-06 20:57:50 +0000162 EXPECT_EQ("1234567890123", ScalarGetValue<signed long long>(1234567890123LL));
163 EXPECT_EQ("-1234567890123",
164 ScalarGetValue<signed long long>(-1234567890123LL));
165 EXPECT_EQ("1234567890123",
166 ScalarGetValue<unsigned long long>(1234567890123ULL));
167 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned long long>::max()),
168 ScalarGetValue(std::numeric_limits<unsigned long long>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000169}
Davide Italiano01c33b82018-03-27 18:37:54 +0000170
171TEST(ScalarTest, Division) {
172 Scalar lhs(5.0);
173 Scalar rhs(2.0);
174 Scalar r = lhs / rhs;
175 EXPECT_TRUE(r.IsValid());
176 EXPECT_EQ(r, Scalar(2.5));
177}
Davide Italiano49d80282018-04-02 16:50:54 +0000178
179TEST(ScalarTest, Promotion) {
180 static Scalar::Type int_types[] = {
181 Scalar::e_sint, Scalar::e_uint, Scalar::e_slong,
182 Scalar::e_ulong, Scalar::e_slonglong, Scalar::e_ulonglong,
183 Scalar::e_sint128, Scalar::e_uint128, Scalar::e_sint256,
184 Scalar::e_uint256,
185 Scalar::e_void // sentinel
186 };
187
188 static Scalar::Type float_types[] = {
189 Scalar::e_float, Scalar::e_double, Scalar::e_long_double,
190 Scalar::e_void // sentinel
191 };
192
193 for (int i = 0; int_types[i] != Scalar::e_void; ++i) {
194 for (int j = 0; float_types[j] != Scalar::e_void; ++j) {
195 Scalar lhs(2);
196 EXPECT_TRUE(lhs.Promote(int_types[i])) << "int promotion #" << i;
197 Scalar rhs(0.5f);
198 EXPECT_TRUE(rhs.Promote(float_types[j])) << "float promotion #" << j;
199 Scalar x(2.5f);
200 EXPECT_TRUE(x.Promote(float_types[j]));
201 EXPECT_EQ(lhs + rhs, x);
202 }
203 }
204
205 for (int i = 0; float_types[i] != Scalar::e_void; ++i) {
206 for (int j = 0; float_types[j] != Scalar::e_void; ++j) {
207 Scalar lhs(2);
208 EXPECT_TRUE(lhs.Promote(float_types[i])) << "float promotion #" << i;
209 Scalar rhs(0.5f);
210 EXPECT_TRUE(rhs.Promote(float_types[j])) << "float promotion #" << j;
211 Scalar x(2.5f);
212 EXPECT_TRUE(x.Promote(float_types[j]));
213 EXPECT_EQ(lhs + rhs, x);
214 }
215 }
216}
Pavel Labath61547252018-06-19 17:24:03 +0000217
218TEST(ScalarTest, SetValueFromCString) {
219 Scalar a;
220
221 EXPECT_THAT_ERROR(
222 a.SetValueFromCString("1234567890123", lldb::eEncodingUint, 8).ToError(),
223 Succeeded());
224 EXPECT_EQ(1234567890123ull, a);
225
226 EXPECT_THAT_ERROR(
227 a.SetValueFromCString("-1234567890123", lldb::eEncodingSint, 8).ToError(),
228 Succeeded());
229 EXPECT_EQ(-1234567890123ll, a);
230
231 EXPECT_THAT_ERROR(
232 a.SetValueFromCString("asdf", lldb::eEncodingSint, 8).ToError(),
233 Failed());
234 EXPECT_THAT_ERROR(
235 a.SetValueFromCString("asdf", lldb::eEncodingUint, 8).ToError(),
236 Failed());
237 EXPECT_THAT_ERROR(
238 a.SetValueFromCString("1234567890123", lldb::eEncodingUint, 4).ToError(),
239 Failed());
240 EXPECT_THAT_ERROR(a.SetValueFromCString("123456789012345678901234567890",
241 lldb::eEncodingUint, 8)
242 .ToError(),
243 Failed());
244 EXPECT_THAT_ERROR(
245 a.SetValueFromCString("-123", lldb::eEncodingUint, 8).ToError(),
246 Failed());
247}