blob: d51d35b59b0b17646748c609b3057f19a102f983 [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
10#if defined(_MSC_VER) && (_HAS_EXCEPTIONS == 0)
Kate Stoneb9c1b512016-09-06 20:57:50 +000011// Workaround for MSVC standard library bug, which fails to include <thread>
12// when
Pavel Labathb625a0e2016-02-09 17:28:01 +000013// exceptions are disabled.
14#include <eh.h>
15#endif
16
17#include "gtest/gtest.h"
18
Kate Stoneb9c1b512016-09-06 20:57:50 +000019#include "lldb/Core/DataExtractor.h"
Pavel Labathb625a0e2016-02-09 17:28:01 +000020#include "lldb/Core/Scalar.h"
Zachary Turner01c32432017-02-14 19:06:07 +000021#include "lldb/Utility/Endian.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000022#include "lldb/Utility/Error.h"
23#include "lldb/Utility/StreamString.h"
Pavel Labathb625a0e2016-02-09 17:28:01 +000024
25using namespace lldb_private;
26
Kate Stoneb9c1b512016-09-06 20:57:50 +000027TEST(ScalarTest, RightShiftOperator) {
28 int a = 0x00001000;
29 int b = 0xFFFFFFFF;
30 int c = 4;
31 Scalar a_scalar(a);
32 Scalar b_scalar(b);
33 Scalar c_scalar(c);
34 ASSERT_EQ(a >> c, a_scalar >> c_scalar);
35 ASSERT_EQ(b >> c, b_scalar >> c_scalar);
Pavel Labathb625a0e2016-02-09 17:28:01 +000036}
Ulrich Weigand9521ad22016-04-15 09:55:52 +000037
Kate Stoneb9c1b512016-09-06 20:57:50 +000038TEST(ScalarTest, GetBytes) {
39 int a = 0x01020304;
40 long long b = 0x0102030405060708LL;
41 float c = 1234567.89e42;
42 double d = 1234567.89e42;
43 char e[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
44 char f[32] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
45 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32};
46 Scalar a_scalar(a);
47 Scalar b_scalar(b);
48 Scalar c_scalar(c);
49 Scalar d_scalar(d);
50 Scalar e_scalar;
51 Scalar f_scalar;
52 DataExtractor e_data(e, sizeof(e), endian::InlHostByteOrder(),
53 sizeof(void *));
54 Error e_error =
55 e_scalar.SetValueFromData(e_data, lldb::eEncodingUint, sizeof(e));
56 DataExtractor f_data(f, sizeof(f), endian::InlHostByteOrder(),
57 sizeof(void *));
58 Error f_error =
59 f_scalar.SetValueFromData(f_data, lldb::eEncodingUint, sizeof(f));
60 ASSERT_EQ(0, memcmp(&a, a_scalar.GetBytes(), sizeof(a)));
61 ASSERT_EQ(0, memcmp(&b, b_scalar.GetBytes(), sizeof(b)));
62 ASSERT_EQ(0, memcmp(&c, c_scalar.GetBytes(), sizeof(c)));
63 ASSERT_EQ(0, memcmp(&d, d_scalar.GetBytes(), sizeof(d)));
64 ASSERT_EQ(0, e_error.Fail());
65 ASSERT_EQ(0, memcmp(e, e_scalar.GetBytes(), sizeof(e)));
66 ASSERT_EQ(0, f_error.Fail());
67 ASSERT_EQ(0, memcmp(f, f_scalar.GetBytes(), sizeof(f)));
Ulrich Weigand9521ad22016-04-15 09:55:52 +000068}
69
Kate Stoneb9c1b512016-09-06 20:57:50 +000070TEST(ScalarTest, CastOperations) {
71 long long a = 0xf1f2f3f4f5f6f7f8LL;
72 Scalar a_scalar(a);
73 ASSERT_EQ((signed char)a, a_scalar.SChar());
74 ASSERT_EQ((unsigned char)a, a_scalar.UChar());
75 ASSERT_EQ((signed short)a, a_scalar.SShort());
76 ASSERT_EQ((unsigned short)a, a_scalar.UShort());
77 ASSERT_EQ((signed int)a, a_scalar.SInt());
78 ASSERT_EQ((unsigned int)a, a_scalar.UInt());
79 ASSERT_EQ((signed long)a, a_scalar.SLong());
80 ASSERT_EQ((unsigned long)a, a_scalar.ULong());
81 ASSERT_EQ((signed long long)a, a_scalar.SLongLong());
82 ASSERT_EQ((unsigned long long)a, a_scalar.ULongLong());
Ulrich Weigand9521ad22016-04-15 09:55:52 +000083}
84
Kate Stoneb9c1b512016-09-06 20:57:50 +000085TEST(ScalarTest, ExtractBitfield) {
86 uint32_t len = sizeof(long long) * 8;
Bryan Chan01319e92016-05-19 13:51:20 +000087
Kate Stoneb9c1b512016-09-06 20:57:50 +000088 long long a1 = 0xf1f2f3f4f5f6f7f8LL;
89 long long b1 = 0xff1f2f3f4f5f6f7fLL;
90 Scalar s_scalar(a1);
91 ASSERT_TRUE(s_scalar.ExtractBitfield(0, 0));
92 ASSERT_EQ(0, memcmp(&a1, s_scalar.GetBytes(), sizeof(a1)));
93 ASSERT_TRUE(s_scalar.ExtractBitfield(len, 0));
94 ASSERT_EQ(0, memcmp(&a1, s_scalar.GetBytes(), sizeof(a1)));
95 ASSERT_TRUE(s_scalar.ExtractBitfield(len - 4, 4));
96 ASSERT_EQ(0, memcmp(&b1, s_scalar.GetBytes(), sizeof(b1)));
Bryan Chan01319e92016-05-19 13:51:20 +000097
Kate Stoneb9c1b512016-09-06 20:57:50 +000098 unsigned long long a2 = 0xf1f2f3f4f5f6f7f8ULL;
99 unsigned long long b2 = 0x0f1f2f3f4f5f6f7fULL;
100 Scalar u_scalar(a2);
101 ASSERT_TRUE(u_scalar.ExtractBitfield(0, 0));
102 ASSERT_EQ(0, memcmp(&a2, u_scalar.GetBytes(), sizeof(a2)));
103 ASSERT_TRUE(u_scalar.ExtractBitfield(len, 0));
104 ASSERT_EQ(0, memcmp(&a2, u_scalar.GetBytes(), sizeof(a2)));
105 ASSERT_TRUE(u_scalar.ExtractBitfield(len - 4, 4));
106 ASSERT_EQ(0, memcmp(&b2, u_scalar.GetBytes(), sizeof(b2)));
Bryan Chan01319e92016-05-19 13:51:20 +0000107}
Pavel Labathf92756e2016-09-02 10:58:52 +0000108
Kate Stoneb9c1b512016-09-06 20:57:50 +0000109template <typename T> static std::string ScalarGetValue(T value) {
110 StreamString stream;
111 Scalar(value).GetValue(&stream, false);
112 return stream.GetString();
Pavel Labathf92756e2016-09-02 10:58:52 +0000113}
114
Kate Stoneb9c1b512016-09-06 20:57:50 +0000115TEST(ScalarTest, GetValue) {
116 EXPECT_EQ("12345", ScalarGetValue<signed short>(12345));
117 EXPECT_EQ("-12345", ScalarGetValue<signed short>(-12345));
118 EXPECT_EQ("12345", ScalarGetValue<unsigned short>(12345));
119 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned short>::max()),
120 ScalarGetValue(std::numeric_limits<unsigned short>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000121
Kate Stoneb9c1b512016-09-06 20:57:50 +0000122 EXPECT_EQ("12345", ScalarGetValue<signed int>(12345));
123 EXPECT_EQ("-12345", ScalarGetValue<signed int>(-12345));
124 EXPECT_EQ("12345", ScalarGetValue<unsigned int>(12345));
125 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned int>::max()),
126 ScalarGetValue(std::numeric_limits<unsigned int>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000127
Kate Stoneb9c1b512016-09-06 20:57:50 +0000128 EXPECT_EQ("12345678", ScalarGetValue<signed long>(12345678L));
129 EXPECT_EQ("-12345678", ScalarGetValue<signed long>(-12345678L));
130 EXPECT_EQ("12345678", ScalarGetValue<unsigned long>(12345678UL));
131 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned long>::max()),
132 ScalarGetValue(std::numeric_limits<unsigned long>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000133
Kate Stoneb9c1b512016-09-06 20:57:50 +0000134 EXPECT_EQ("1234567890123", ScalarGetValue<signed long long>(1234567890123LL));
135 EXPECT_EQ("-1234567890123",
136 ScalarGetValue<signed long long>(-1234567890123LL));
137 EXPECT_EQ("1234567890123",
138 ScalarGetValue<unsigned long long>(1234567890123ULL));
139 EXPECT_EQ(std::to_string(std::numeric_limits<unsigned long long>::max()),
140 ScalarGetValue(std::numeric_limits<unsigned long long>::max()));
Pavel Labathf92756e2016-09-02 10:58:52 +0000141}