blob: 6ccc39070643bc2486d6341d82032861c82b3ca9 [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
12#include "lldb/Core/Scalar.h"
Zachary Turner666cc0b2017-03-04 01:30:05 +000013#include "lldb/Utility/DataExtractor.h"
Zachary Turner01c32432017-02-14 19:06:07 +000014#include "lldb/Utility/Endian.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 Labathb625a0e2016-02-09 17:28:01 +000017
18using namespace lldb_private;
19
Kate Stoneb9c1b512016-09-06 20:57:50 +000020TEST(ScalarTest, RightShiftOperator) {
21 int a = 0x00001000;
22 int b = 0xFFFFFFFF;
23 int c = 4;
24 Scalar a_scalar(a);
25 Scalar b_scalar(b);
26 Scalar c_scalar(c);
27 ASSERT_EQ(a >> c, a_scalar >> c_scalar);
28 ASSERT_EQ(b >> c, b_scalar >> c_scalar);
Pavel Labathb625a0e2016-02-09 17:28:01 +000029}
Ulrich Weigand9521ad22016-04-15 09:55:52 +000030
Kate Stoneb9c1b512016-09-06 20:57:50 +000031TEST(ScalarTest, GetBytes) {
32 int a = 0x01020304;
33 long long b = 0x0102030405060708LL;
Raphael Isemann0b16ef72018-01-22 08:11:29 +000034 float c = 1234567.89e32;
Kate Stoneb9c1b512016-09-06 20:57:50 +000035 double d = 1234567.89e42;
36 char e[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
37 char f[32] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
38 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32};
39 Scalar a_scalar(a);
40 Scalar b_scalar(b);
41 Scalar c_scalar(c);
42 Scalar d_scalar(d);
43 Scalar e_scalar;
44 Scalar f_scalar;
45 DataExtractor e_data(e, sizeof(e), endian::InlHostByteOrder(),
46 sizeof(void *));
Zachary Turner97206d52017-05-12 04:51:55 +000047 Status e_error =
Kate Stoneb9c1b512016-09-06 20:57:50 +000048 e_scalar.SetValueFromData(e_data, lldb::eEncodingUint, sizeof(e));
49 DataExtractor f_data(f, sizeof(f), endian::InlHostByteOrder(),
50 sizeof(void *));
Zachary Turner97206d52017-05-12 04:51:55 +000051 Status f_error =
Kate Stoneb9c1b512016-09-06 20:57:50 +000052 f_scalar.SetValueFromData(f_data, lldb::eEncodingUint, sizeof(f));
53 ASSERT_EQ(0, memcmp(&a, a_scalar.GetBytes(), sizeof(a)));
54 ASSERT_EQ(0, memcmp(&b, b_scalar.GetBytes(), sizeof(b)));
55 ASSERT_EQ(0, memcmp(&c, c_scalar.GetBytes(), sizeof(c)));
56 ASSERT_EQ(0, memcmp(&d, d_scalar.GetBytes(), sizeof(d)));
57 ASSERT_EQ(0, e_error.Fail());
58 ASSERT_EQ(0, memcmp(e, e_scalar.GetBytes(), sizeof(e)));
59 ASSERT_EQ(0, f_error.Fail());
60 ASSERT_EQ(0, memcmp(f, f_scalar.GetBytes(), sizeof(f)));
Ulrich Weigand9521ad22016-04-15 09:55:52 +000061}
62
Kate Stoneb9c1b512016-09-06 20:57:50 +000063TEST(ScalarTest, CastOperations) {
64 long long a = 0xf1f2f3f4f5f6f7f8LL;
65 Scalar a_scalar(a);
66 ASSERT_EQ((signed char)a, a_scalar.SChar());
67 ASSERT_EQ((unsigned char)a, a_scalar.UChar());
68 ASSERT_EQ((signed short)a, a_scalar.SShort());
69 ASSERT_EQ((unsigned short)a, a_scalar.UShort());
70 ASSERT_EQ((signed int)a, a_scalar.SInt());
71 ASSERT_EQ((unsigned int)a, a_scalar.UInt());
72 ASSERT_EQ((signed long)a, a_scalar.SLong());
73 ASSERT_EQ((unsigned long)a, a_scalar.ULong());
74 ASSERT_EQ((signed long long)a, a_scalar.SLongLong());
75 ASSERT_EQ((unsigned long long)a, a_scalar.ULongLong());
Davide Italiano49d80282018-04-02 16:50:54 +000076
77 int a2 = 23;
78 Scalar a2_scalar(a2);
79 ASSERT_EQ((float)a2, a2_scalar.Float());
80 ASSERT_EQ((double)a2, a2_scalar.Double());
81 ASSERT_EQ((long double)a2, a2_scalar.LongDouble());
Ulrich Weigand9521ad22016-04-15 09:55:52 +000082}
83
Kate Stoneb9c1b512016-09-06 20:57:50 +000084TEST(ScalarTest, ExtractBitfield) {
85 uint32_t len = sizeof(long long) * 8;
Bryan Chan01319e92016-05-19 13:51:20 +000086
Kate Stoneb9c1b512016-09-06 20:57:50 +000087 long long a1 = 0xf1f2f3f4f5f6f7f8LL;
88 long long b1 = 0xff1f2f3f4f5f6f7fLL;
89 Scalar s_scalar(a1);
90 ASSERT_TRUE(s_scalar.ExtractBitfield(0, 0));
91 ASSERT_EQ(0, memcmp(&a1, s_scalar.GetBytes(), sizeof(a1)));
92 ASSERT_TRUE(s_scalar.ExtractBitfield(len, 0));
93 ASSERT_EQ(0, memcmp(&a1, s_scalar.GetBytes(), sizeof(a1)));
94 ASSERT_TRUE(s_scalar.ExtractBitfield(len - 4, 4));
95 ASSERT_EQ(0, memcmp(&b1, s_scalar.GetBytes(), sizeof(b1)));
Bryan Chan01319e92016-05-19 13:51:20 +000096
Kate Stoneb9c1b512016-09-06 20:57:50 +000097 unsigned long long a2 = 0xf1f2f3f4f5f6f7f8ULL;
98 unsigned long long b2 = 0x0f1f2f3f4f5f6f7fULL;
99 Scalar u_scalar(a2);
100 ASSERT_TRUE(u_scalar.ExtractBitfield(0, 0));
101 ASSERT_EQ(0, memcmp(&a2, u_scalar.GetBytes(), sizeof(a2)));
102 ASSERT_TRUE(u_scalar.ExtractBitfield(len, 0));
103 ASSERT_EQ(0, memcmp(&a2, u_scalar.GetBytes(), sizeof(a2)));
104 ASSERT_TRUE(u_scalar.ExtractBitfield(len - 4, 4));
105 ASSERT_EQ(0, memcmp(&b2, u_scalar.GetBytes(), sizeof(b2)));
Bryan Chan01319e92016-05-19 13:51:20 +0000106}
Pavel Labathf92756e2016-09-02 10:58:52 +0000107
Kate Stoneb9c1b512016-09-06 20:57:50 +0000108template <typename T> static std::string ScalarGetValue(T value) {
109 StreamString stream;
110 Scalar(value).GetValue(&stream, false);
111 return stream.GetString();
Pavel Labathf92756e2016-09-02 10:58:52 +0000112}
113
Kate Stoneb9c1b512016-09-06 20:57:50 +0000114TEST(ScalarTest, GetValue) {
115 EXPECT_EQ("12345", ScalarGetValue<signed short>(12345));
116 EXPECT_EQ("-12345", ScalarGetValue<signed short>(-12345));
117 EXPECT_EQ("12345", ScalarGetValue<unsigned short>(12345));
118 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned short>::max()),
119 ScalarGetValue(std::numeric_limits<unsigned short>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000120
Kate Stoneb9c1b512016-09-06 20:57:50 +0000121 EXPECT_EQ("12345", ScalarGetValue<signed int>(12345));
122 EXPECT_EQ("-12345", ScalarGetValue<signed int>(-12345));
123 EXPECT_EQ("12345", ScalarGetValue<unsigned int>(12345));
124 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned int>::max()),
125 ScalarGetValue(std::numeric_limits<unsigned int>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000126
Kate Stoneb9c1b512016-09-06 20:57:50 +0000127 EXPECT_EQ("12345678", ScalarGetValue<signed long>(12345678L));
128 EXPECT_EQ("-12345678", ScalarGetValue<signed long>(-12345678L));
129 EXPECT_EQ("12345678", ScalarGetValue<unsigned long>(12345678UL));
130 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned long>::max()),
131 ScalarGetValue(std::numeric_limits<unsigned long>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000132
Kate Stoneb9c1b512016-09-06 20:57:50 +0000133 EXPECT_EQ("1234567890123", ScalarGetValue<signed long long>(1234567890123LL));
134 EXPECT_EQ("-1234567890123",
135 ScalarGetValue<signed long long>(-1234567890123LL));
136 EXPECT_EQ("1234567890123",
137 ScalarGetValue<unsigned long long>(1234567890123ULL));
138 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned long long>::max()),
139 ScalarGetValue(std::numeric_limits<unsigned long long>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000140}
Davide Italiano01c33b82018-03-27 18:37:54 +0000141
142TEST(ScalarTest, Division) {
143 Scalar lhs(5.0);
144 Scalar rhs(2.0);
145 Scalar r = lhs / rhs;
146 EXPECT_TRUE(r.IsValid());
147 EXPECT_EQ(r, Scalar(2.5));
148}
Davide Italiano49d80282018-04-02 16:50:54 +0000149
150TEST(ScalarTest, Promotion) {
151 static Scalar::Type int_types[] = {
152 Scalar::e_sint, Scalar::e_uint, Scalar::e_slong,
153 Scalar::e_ulong, Scalar::e_slonglong, Scalar::e_ulonglong,
154 Scalar::e_sint128, Scalar::e_uint128, Scalar::e_sint256,
155 Scalar::e_uint256,
156 Scalar::e_void // sentinel
157 };
158
159 static Scalar::Type float_types[] = {
160 Scalar::e_float, Scalar::e_double, Scalar::e_long_double,
161 Scalar::e_void // sentinel
162 };
163
164 for (int i = 0; int_types[i] != Scalar::e_void; ++i) {
165 for (int j = 0; float_types[j] != Scalar::e_void; ++j) {
166 Scalar lhs(2);
167 EXPECT_TRUE(lhs.Promote(int_types[i])) << "int promotion #" << i;
168 Scalar rhs(0.5f);
169 EXPECT_TRUE(rhs.Promote(float_types[j])) << "float promotion #" << j;
170 Scalar x(2.5f);
171 EXPECT_TRUE(x.Promote(float_types[j]));
172 EXPECT_EQ(lhs + rhs, x);
173 }
174 }
175
176 for (int i = 0; float_types[i] != Scalar::e_void; ++i) {
177 for (int j = 0; float_types[j] != Scalar::e_void; ++j) {
178 Scalar lhs(2);
179 EXPECT_TRUE(lhs.Promote(float_types[i])) << "float promotion #" << i;
180 Scalar rhs(0.5f);
181 EXPECT_TRUE(rhs.Promote(float_types[j])) << "float promotion #" << j;
182 Scalar x(2.5f);
183 EXPECT_TRUE(x.Promote(float_types[j]));
184 EXPECT_EQ(lhs + rhs, x);
185 }
186 }
187}