blob: 9c241c26e66c21bc6f64ba0e43b17bf0822f88c2 [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 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
Kate Stoneb9c1b512016-09-06 20:57:50 +000022TEST(ScalarTest, RightShiftOperator) {
23 int a = 0x00001000;
24 int b = 0xFFFFFFFF;
25 int c = 4;
26 Scalar a_scalar(a);
27 Scalar b_scalar(b);
28 Scalar c_scalar(c);
29 ASSERT_EQ(a >> c, a_scalar >> c_scalar);
30 ASSERT_EQ(b >> c, b_scalar >> c_scalar);
Pavel Labathb625a0e2016-02-09 17:28:01 +000031}
Ulrich Weigand9521ad22016-04-15 09:55:52 +000032
Kate Stoneb9c1b512016-09-06 20:57:50 +000033TEST(ScalarTest, GetBytes) {
34 int a = 0x01020304;
35 long long b = 0x0102030405060708LL;
Adrian McCarthy4ee16bf2018-04-19 18:31:57 +000036 float c = 1234567.89e32f;
Kate Stoneb9c1b512016-09-06 20:57:50 +000037 double d = 1234567.89e42;
38 char e[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
39 char f[32] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
40 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32};
41 Scalar a_scalar(a);
42 Scalar b_scalar(b);
43 Scalar c_scalar(c);
44 Scalar d_scalar(d);
45 Scalar e_scalar;
46 Scalar f_scalar;
47 DataExtractor e_data(e, sizeof(e), endian::InlHostByteOrder(),
48 sizeof(void *));
Zachary Turner97206d52017-05-12 04:51:55 +000049 Status e_error =
Kate Stoneb9c1b512016-09-06 20:57:50 +000050 e_scalar.SetValueFromData(e_data, lldb::eEncodingUint, sizeof(e));
51 DataExtractor f_data(f, sizeof(f), endian::InlHostByteOrder(),
52 sizeof(void *));
Zachary Turner97206d52017-05-12 04:51:55 +000053 Status f_error =
Kate Stoneb9c1b512016-09-06 20:57:50 +000054 f_scalar.SetValueFromData(f_data, lldb::eEncodingUint, sizeof(f));
55 ASSERT_EQ(0, memcmp(&a, a_scalar.GetBytes(), sizeof(a)));
56 ASSERT_EQ(0, memcmp(&b, b_scalar.GetBytes(), sizeof(b)));
57 ASSERT_EQ(0, memcmp(&c, c_scalar.GetBytes(), sizeof(c)));
58 ASSERT_EQ(0, memcmp(&d, d_scalar.GetBytes(), sizeof(d)));
59 ASSERT_EQ(0, e_error.Fail());
60 ASSERT_EQ(0, memcmp(e, e_scalar.GetBytes(), sizeof(e)));
61 ASSERT_EQ(0, f_error.Fail());
62 ASSERT_EQ(0, memcmp(f, f_scalar.GetBytes(), sizeof(f)));
Ulrich Weigand9521ad22016-04-15 09:55:52 +000063}
64
Kate Stoneb9c1b512016-09-06 20:57:50 +000065TEST(ScalarTest, CastOperations) {
66 long long a = 0xf1f2f3f4f5f6f7f8LL;
67 Scalar a_scalar(a);
68 ASSERT_EQ((signed char)a, a_scalar.SChar());
69 ASSERT_EQ((unsigned char)a, a_scalar.UChar());
70 ASSERT_EQ((signed short)a, a_scalar.SShort());
71 ASSERT_EQ((unsigned short)a, a_scalar.UShort());
72 ASSERT_EQ((signed int)a, a_scalar.SInt());
73 ASSERT_EQ((unsigned int)a, a_scalar.UInt());
74 ASSERT_EQ((signed long)a, a_scalar.SLong());
75 ASSERT_EQ((unsigned long)a, a_scalar.ULong());
76 ASSERT_EQ((signed long long)a, a_scalar.SLongLong());
77 ASSERT_EQ((unsigned long long)a, a_scalar.ULongLong());
Davide Italiano49d80282018-04-02 16:50:54 +000078
79 int a2 = 23;
80 Scalar a2_scalar(a2);
81 ASSERT_EQ((float)a2, a2_scalar.Float());
82 ASSERT_EQ((double)a2, a2_scalar.Double());
83 ASSERT_EQ((long double)a2, a2_scalar.LongDouble());
Ulrich Weigand9521ad22016-04-15 09:55:52 +000084}
85
Kate Stoneb9c1b512016-09-06 20:57:50 +000086TEST(ScalarTest, ExtractBitfield) {
87 uint32_t len = sizeof(long long) * 8;
Bryan Chan01319e92016-05-19 13:51:20 +000088
Kate Stoneb9c1b512016-09-06 20:57:50 +000089 long long a1 = 0xf1f2f3f4f5f6f7f8LL;
90 long long b1 = 0xff1f2f3f4f5f6f7fLL;
91 Scalar s_scalar(a1);
92 ASSERT_TRUE(s_scalar.ExtractBitfield(0, 0));
93 ASSERT_EQ(0, memcmp(&a1, s_scalar.GetBytes(), sizeof(a1)));
94 ASSERT_TRUE(s_scalar.ExtractBitfield(len, 0));
95 ASSERT_EQ(0, memcmp(&a1, s_scalar.GetBytes(), sizeof(a1)));
96 ASSERT_TRUE(s_scalar.ExtractBitfield(len - 4, 4));
97 ASSERT_EQ(0, memcmp(&b1, s_scalar.GetBytes(), sizeof(b1)));
Bryan Chan01319e92016-05-19 13:51:20 +000098
Kate Stoneb9c1b512016-09-06 20:57:50 +000099 unsigned long long a2 = 0xf1f2f3f4f5f6f7f8ULL;
100 unsigned long long b2 = 0x0f1f2f3f4f5f6f7fULL;
101 Scalar u_scalar(a2);
102 ASSERT_TRUE(u_scalar.ExtractBitfield(0, 0));
103 ASSERT_EQ(0, memcmp(&a2, u_scalar.GetBytes(), sizeof(a2)));
104 ASSERT_TRUE(u_scalar.ExtractBitfield(len, 0));
105 ASSERT_EQ(0, memcmp(&a2, u_scalar.GetBytes(), sizeof(a2)));
106 ASSERT_TRUE(u_scalar.ExtractBitfield(len - 4, 4));
107 ASSERT_EQ(0, memcmp(&b2, u_scalar.GetBytes(), sizeof(b2)));
Bryan Chan01319e92016-05-19 13:51:20 +0000108}
Pavel Labathf92756e2016-09-02 10:58:52 +0000109
Kate Stoneb9c1b512016-09-06 20:57:50 +0000110template <typename T> static std::string ScalarGetValue(T value) {
111 StreamString stream;
112 Scalar(value).GetValue(&stream, false);
113 return stream.GetString();
Pavel Labathf92756e2016-09-02 10:58:52 +0000114}
115
Kate Stoneb9c1b512016-09-06 20:57:50 +0000116TEST(ScalarTest, GetValue) {
117 EXPECT_EQ("12345", ScalarGetValue<signed short>(12345));
118 EXPECT_EQ("-12345", ScalarGetValue<signed short>(-12345));
119 EXPECT_EQ("12345", ScalarGetValue<unsigned short>(12345));
120 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned short>::max()),
121 ScalarGetValue(std::numeric_limits<unsigned short>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000122
Kate Stoneb9c1b512016-09-06 20:57:50 +0000123 EXPECT_EQ("12345", ScalarGetValue<signed int>(12345));
124 EXPECT_EQ("-12345", ScalarGetValue<signed int>(-12345));
125 EXPECT_EQ("12345", ScalarGetValue<unsigned int>(12345));
126 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned int>::max()),
127 ScalarGetValue(std::numeric_limits<unsigned int>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000128
Kate Stoneb9c1b512016-09-06 20:57:50 +0000129 EXPECT_EQ("12345678", ScalarGetValue<signed long>(12345678L));
130 EXPECT_EQ("-12345678", ScalarGetValue<signed long>(-12345678L));
131 EXPECT_EQ("12345678", ScalarGetValue<unsigned long>(12345678UL));
132 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned long>::max()),
133 ScalarGetValue(std::numeric_limits<unsigned long>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000134
Kate Stoneb9c1b512016-09-06 20:57:50 +0000135 EXPECT_EQ("1234567890123", ScalarGetValue<signed long long>(1234567890123LL));
136 EXPECT_EQ("-1234567890123",
137 ScalarGetValue<signed long long>(-1234567890123LL));
138 EXPECT_EQ("1234567890123",
139 ScalarGetValue<unsigned long long>(1234567890123ULL));
140 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned long long>::max()),
141 ScalarGetValue(std::numeric_limits<unsigned long long>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000142}
Davide Italiano01c33b82018-03-27 18:37:54 +0000143
144TEST(ScalarTest, Division) {
145 Scalar lhs(5.0);
146 Scalar rhs(2.0);
147 Scalar r = lhs / rhs;
148 EXPECT_TRUE(r.IsValid());
149 EXPECT_EQ(r, Scalar(2.5));
150}
Davide Italiano49d80282018-04-02 16:50:54 +0000151
152TEST(ScalarTest, Promotion) {
153 static Scalar::Type int_types[] = {
154 Scalar::e_sint, Scalar::e_uint, Scalar::e_slong,
155 Scalar::e_ulong, Scalar::e_slonglong, Scalar::e_ulonglong,
156 Scalar::e_sint128, Scalar::e_uint128, Scalar::e_sint256,
157 Scalar::e_uint256,
158 Scalar::e_void // sentinel
159 };
160
161 static Scalar::Type float_types[] = {
162 Scalar::e_float, Scalar::e_double, Scalar::e_long_double,
163 Scalar::e_void // sentinel
164 };
165
166 for (int i = 0; int_types[i] != Scalar::e_void; ++i) {
167 for (int j = 0; float_types[j] != Scalar::e_void; ++j) {
168 Scalar lhs(2);
169 EXPECT_TRUE(lhs.Promote(int_types[i])) << "int promotion #" << i;
170 Scalar rhs(0.5f);
171 EXPECT_TRUE(rhs.Promote(float_types[j])) << "float promotion #" << j;
172 Scalar x(2.5f);
173 EXPECT_TRUE(x.Promote(float_types[j]));
174 EXPECT_EQ(lhs + rhs, x);
175 }
176 }
177
178 for (int i = 0; float_types[i] != Scalar::e_void; ++i) {
179 for (int j = 0; float_types[j] != Scalar::e_void; ++j) {
180 Scalar lhs(2);
181 EXPECT_TRUE(lhs.Promote(float_types[i])) << "float promotion #" << i;
182 Scalar rhs(0.5f);
183 EXPECT_TRUE(rhs.Promote(float_types[j])) << "float promotion #" << j;
184 Scalar x(2.5f);
185 EXPECT_TRUE(x.Promote(float_types[j]));
186 EXPECT_EQ(lhs + rhs, x);
187 }
188 }
189}
Pavel Labath61547252018-06-19 17:24:03 +0000190
191TEST(ScalarTest, SetValueFromCString) {
192 Scalar a;
193
194 EXPECT_THAT_ERROR(
195 a.SetValueFromCString("1234567890123", lldb::eEncodingUint, 8).ToError(),
196 Succeeded());
197 EXPECT_EQ(1234567890123ull, a);
198
199 EXPECT_THAT_ERROR(
200 a.SetValueFromCString("-1234567890123", lldb::eEncodingSint, 8).ToError(),
201 Succeeded());
202 EXPECT_EQ(-1234567890123ll, a);
203
204 EXPECT_THAT_ERROR(
205 a.SetValueFromCString("asdf", lldb::eEncodingSint, 8).ToError(),
206 Failed());
207 EXPECT_THAT_ERROR(
208 a.SetValueFromCString("asdf", lldb::eEncodingUint, 8).ToError(),
209 Failed());
210 EXPECT_THAT_ERROR(
211 a.SetValueFromCString("1234567890123", lldb::eEncodingUint, 4).ToError(),
212 Failed());
213 EXPECT_THAT_ERROR(a.SetValueFromCString("123456789012345678901234567890",
214 lldb::eEncodingUint, 8)
215 .ToError(),
216 Failed());
217 EXPECT_THAT_ERROR(
218 a.SetValueFromCString("-123", lldb::eEncodingUint, 8).ToError(),
219 Failed());
220}