xref: /llvm-project/lldb/unittests/Utility/DataExtractorTest.cpp (revision 5e9b16b67f5b9543e8d22b5b0f22cc0980c310bd)
180814287SRaphael Isemann //===-- DataExtractorTest.cpp ---------------------------------------------===//
207e93c57SPavel Labath //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
607e93c57SPavel Labath //
707e93c57SPavel Labath //===----------------------------------------------------------------------===//
807e93c57SPavel Labath 
907e93c57SPavel Labath #include "gtest/gtest.h"
1007e93c57SPavel Labath 
1107e93c57SPavel Labath #include "lldb/Utility/DataExtractor.h"
1207e93c57SPavel Labath 
1307e93c57SPavel Labath using namespace lldb_private;
1407e93c57SPavel Labath 
TEST(DataExtractorTest,GetBitfield)1507e93c57SPavel Labath TEST(DataExtractorTest, GetBitfield) {
16fffd7029Sshafik   uint8_t buffer[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
1707e93c57SPavel Labath   DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,
1807e93c57SPavel Labath                    sizeof(void *));
1907e93c57SPavel Labath   DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *));
2007e93c57SPavel Labath 
2107e93c57SPavel Labath   lldb::offset_t offset;
2207e93c57SPavel Labath 
2307e93c57SPavel Labath   offset = 0;
2407e93c57SPavel Labath   ASSERT_EQ(buffer[1], LE.GetMaxU64Bitfield(&offset, sizeof(buffer), 8, 8));
2507e93c57SPavel Labath   offset = 0;
2607e93c57SPavel Labath   ASSERT_EQ(buffer[1], BE.GetMaxU64Bitfield(&offset, sizeof(buffer), 8, 8));
27fffd7029Sshafik   offset = 0;
287b90cdedSVedant Kumar   ASSERT_EQ(static_cast<uint64_t>(0xEFCDAB8967452301),
297b90cdedSVedant Kumar             LE.GetMaxU64Bitfield(&offset, sizeof(buffer), 64, 0));
307b90cdedSVedant Kumar   offset = 0;
31fffd7029Sshafik   ASSERT_EQ(static_cast<uint64_t>(0x0123456789ABCDEF),
32fffd7029Sshafik             BE.GetMaxU64Bitfield(&offset, sizeof(buffer), 64, 0));
33fffd7029Sshafik   offset = 0;
34fffd7029Sshafik   ASSERT_EQ(static_cast<uint64_t>(0x01234567),
35fffd7029Sshafik             BE.GetMaxU64Bitfield(&offset, sizeof(buffer), 32, 0));
36fffd7029Sshafik   offset = 0;
37fffd7029Sshafik   ASSERT_EQ(static_cast<uint64_t>(0x012345678),
38fffd7029Sshafik             BE.GetMaxU64Bitfield(&offset, sizeof(buffer), 36, 0));
3907e93c57SPavel Labath 
4007e93c57SPavel Labath   offset = 0;
4107e93c57SPavel Labath   ASSERT_EQ(int8_t(buffer[1]),
4207e93c57SPavel Labath             LE.GetMaxS64Bitfield(&offset, sizeof(buffer), 8, 8));
4307e93c57SPavel Labath   offset = 0;
4407e93c57SPavel Labath   ASSERT_EQ(int8_t(buffer[1]),
4507e93c57SPavel Labath             BE.GetMaxS64Bitfield(&offset, sizeof(buffer), 8, 8));
467b90cdedSVedant Kumar   offset = 0;
477b90cdedSVedant Kumar   ASSERT_EQ(static_cast<int64_t>(0xEFCDAB8967452301),
487b90cdedSVedant Kumar             LE.GetMaxS64Bitfield(&offset, sizeof(buffer), 64, 0));
497b90cdedSVedant Kumar   offset = 0;
507b90cdedSVedant Kumar   ASSERT_EQ(static_cast<int64_t>(0x0123456789ABCDEF),
517b90cdedSVedant Kumar             BE.GetMaxS64Bitfield(&offset, sizeof(buffer), 64, 0));
5207e93c57SPavel Labath }
5307e93c57SPavel Labath 
TEST(DataExtractorTest,PeekData)5407e93c57SPavel Labath TEST(DataExtractorTest, PeekData) {
5507e93c57SPavel Labath   uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04};
5607e93c57SPavel Labath   DataExtractor E(buffer, sizeof buffer, lldb::eByteOrderLittle, 4);
5707e93c57SPavel Labath 
5807e93c57SPavel Labath   EXPECT_EQ(buffer + 0, E.PeekData(0, 0));
5907e93c57SPavel Labath   EXPECT_EQ(buffer + 0, E.PeekData(0, 4));
6007e93c57SPavel Labath   EXPECT_EQ(nullptr, E.PeekData(0, 5));
6107e93c57SPavel Labath 
6207e93c57SPavel Labath   EXPECT_EQ(buffer + 2, E.PeekData(2, 0));
6307e93c57SPavel Labath   EXPECT_EQ(buffer + 2, E.PeekData(2, 2));
6407e93c57SPavel Labath   EXPECT_EQ(nullptr, E.PeekData(2, 3));
6507e93c57SPavel Labath 
6607e93c57SPavel Labath   EXPECT_EQ(buffer + 4, E.PeekData(4, 0));
6707e93c57SPavel Labath   EXPECT_EQ(nullptr, E.PeekData(4, 1));
6807e93c57SPavel Labath }
6907e93c57SPavel Labath 
TEST(DataExtractorTest,GetCStr)70067bb1f5SRaphael Isemann TEST(DataExtractorTest, GetCStr) {
71067bb1f5SRaphael Isemann   uint8_t buffer[] = {'X', 'f', 'o', 'o', '\0'};
72067bb1f5SRaphael Isemann   DataExtractor E(buffer, sizeof buffer, lldb::eByteOrderLittle, 4);
73067bb1f5SRaphael Isemann 
74067bb1f5SRaphael Isemann   lldb::offset_t offset = 1;
75067bb1f5SRaphael Isemann   EXPECT_STREQ("foo", E.GetCStr(&offset));
76067bb1f5SRaphael Isemann   EXPECT_EQ(5U, offset);
77067bb1f5SRaphael Isemann }
78067bb1f5SRaphael Isemann 
TEST(DataExtractorTest,GetCStrEmpty)79067bb1f5SRaphael Isemann TEST(DataExtractorTest, GetCStrEmpty) {
80067bb1f5SRaphael Isemann   uint8_t buffer[] = {'X', '\0'};
81067bb1f5SRaphael Isemann   DataExtractor E(buffer, sizeof buffer, lldb::eByteOrderLittle, 4);
82067bb1f5SRaphael Isemann 
83067bb1f5SRaphael Isemann   lldb::offset_t offset = 1;
84067bb1f5SRaphael Isemann   EXPECT_STREQ("", E.GetCStr(&offset));
85067bb1f5SRaphael Isemann   EXPECT_EQ(2U, offset);
86067bb1f5SRaphael Isemann }
87067bb1f5SRaphael Isemann 
TEST(DataExtractorTest,GetCStrUnterminated)88067bb1f5SRaphael Isemann TEST(DataExtractorTest, GetCStrUnterminated) {
89067bb1f5SRaphael Isemann   uint8_t buffer[] = {'X', 'f', 'o', 'o'};
90067bb1f5SRaphael Isemann   DataExtractor E(buffer, sizeof buffer, lldb::eByteOrderLittle, 4);
91067bb1f5SRaphael Isemann 
92067bb1f5SRaphael Isemann   lldb::offset_t offset = 1;
93067bb1f5SRaphael Isemann   EXPECT_EQ(nullptr, E.GetCStr(&offset));
94067bb1f5SRaphael Isemann   EXPECT_EQ(1U, offset);
95067bb1f5SRaphael Isemann }
96067bb1f5SRaphael Isemann 
TEST(DataExtractorTest,GetCStrAtEnd)97067bb1f5SRaphael Isemann TEST(DataExtractorTest, GetCStrAtEnd) {
98067bb1f5SRaphael Isemann   uint8_t buffer[] = {'X'};
99067bb1f5SRaphael Isemann   DataExtractor E(buffer, sizeof buffer, lldb::eByteOrderLittle, 4);
100067bb1f5SRaphael Isemann 
101067bb1f5SRaphael Isemann   lldb::offset_t offset = 1;
102067bb1f5SRaphael Isemann   EXPECT_EQ(nullptr, E.GetCStr(&offset));
103067bb1f5SRaphael Isemann   EXPECT_EQ(1U, offset);
104067bb1f5SRaphael Isemann }
105067bb1f5SRaphael Isemann 
TEST(DataExtractorTest,GetCStrAtNullOffset)106067bb1f5SRaphael Isemann TEST(DataExtractorTest, GetCStrAtNullOffset) {
107067bb1f5SRaphael Isemann   uint8_t buffer[] = {'f', 'o', 'o', '\0'};
108067bb1f5SRaphael Isemann   DataExtractor E(buffer, sizeof buffer, lldb::eByteOrderLittle, 4);
109067bb1f5SRaphael Isemann 
110067bb1f5SRaphael Isemann   lldb::offset_t offset = 0;
111067bb1f5SRaphael Isemann   EXPECT_STREQ("foo", E.GetCStr(&offset));
112067bb1f5SRaphael Isemann   EXPECT_EQ(4U, offset);
113067bb1f5SRaphael Isemann }
114067bb1f5SRaphael Isemann 
TEST(DataExtractorTest,UncommonAddressSize)115ec1efe71SAyke van Laethem TEST(DataExtractorTest, UncommonAddressSize) {
116ec1efe71SAyke van Laethem   uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
117ec1efe71SAyke van Laethem   DataExtractor E2(buffer, sizeof buffer, lldb::eByteOrderLittle, 2);
118ec1efe71SAyke van Laethem   DataExtractor E5(buffer, sizeof buffer, lldb::eByteOrderLittle, 5);
119ec1efe71SAyke van Laethem   DataExtractor E7(buffer, sizeof buffer, lldb::eByteOrderLittle, 7);
120ec1efe71SAyke van Laethem 
121ec1efe71SAyke van Laethem   lldb::offset_t offset;
122ec1efe71SAyke van Laethem 
123ec1efe71SAyke van Laethem   // Test 2-byte addresses (for AVR).
124ec1efe71SAyke van Laethem   offset = 0;
125ec1efe71SAyke van Laethem   EXPECT_EQ(0x0201U, E2.GetMaxU64(&offset, 2));
126ec1efe71SAyke van Laethem   EXPECT_EQ(2U, offset);
127ec1efe71SAyke van Laethem   offset = 0;
128ec1efe71SAyke van Laethem   EXPECT_EQ(0x0201U, E2.GetAddress(&offset));
129ec1efe71SAyke van Laethem   EXPECT_EQ(2U, offset);
130ec1efe71SAyke van Laethem 
131ec1efe71SAyke van Laethem   // Test 5-byte addresses.
132ec1efe71SAyke van Laethem   offset = 0;
133ec1efe71SAyke van Laethem   EXPECT_EQ(0x030201U, E5.GetMaxU64(&offset, 3));
134ec1efe71SAyke van Laethem   EXPECT_EQ(3U, offset);
135ec1efe71SAyke van Laethem   offset = 3;
136ec1efe71SAyke van Laethem   EXPECT_EQ(0x0807060504U, E5.GetAddress(&offset));
137ec1efe71SAyke van Laethem   EXPECT_EQ(8U, offset);
138ec1efe71SAyke van Laethem 
139ec1efe71SAyke van Laethem   // Test 7-byte addresses.
140ec1efe71SAyke van Laethem   offset = 0;
141ec1efe71SAyke van Laethem   EXPECT_EQ(0x0504030201U, E7.GetMaxU64(&offset, 5));
142ec1efe71SAyke van Laethem   EXPECT_EQ(5U, offset);
143ec1efe71SAyke van Laethem   offset = 0;
144ec1efe71SAyke van Laethem   EXPECT_EQ(0x07060504030201U, E7.GetAddress(&offset));
145ec1efe71SAyke van Laethem   EXPECT_EQ(7U, offset);
146ec1efe71SAyke van Laethem }
147ec1efe71SAyke van Laethem 
TEST(DataExtractorTest,GetMaxU64)14807e93c57SPavel Labath TEST(DataExtractorTest, GetMaxU64) {
14907e93c57SPavel Labath   uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
15007e93c57SPavel Labath   DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,
15107e93c57SPavel Labath                    sizeof(void *));
15207e93c57SPavel Labath   DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *));
15307e93c57SPavel Labath 
15407e93c57SPavel Labath   lldb::offset_t offset;
15507e93c57SPavel Labath 
15607e93c57SPavel Labath   // Check with the minimum allowed byte size.
15707e93c57SPavel Labath   offset = 0;
15807e93c57SPavel Labath   EXPECT_EQ(0x01U, LE.GetMaxU64(&offset, 1));
15907e93c57SPavel Labath   EXPECT_EQ(1U, offset);
16007e93c57SPavel Labath   offset = 0;
16107e93c57SPavel Labath   EXPECT_EQ(0x01U, BE.GetMaxU64(&offset, 1));
16207e93c57SPavel Labath   EXPECT_EQ(1U, offset);
16307e93c57SPavel Labath 
16407e93c57SPavel Labath   // Check with a non-zero offset.
16507e93c57SPavel Labath   offset = 1;
16607e93c57SPavel Labath   EXPECT_EQ(0x0302U, LE.GetMaxU64(&offset, 2));
16707e93c57SPavel Labath   EXPECT_EQ(3U, offset);
16807e93c57SPavel Labath   offset = 1;
16907e93c57SPavel Labath   EXPECT_EQ(0x0203U, BE.GetMaxU64(&offset, 2));
17007e93c57SPavel Labath   EXPECT_EQ(3U, offset);
17107e93c57SPavel Labath 
17207e93c57SPavel Labath   // Check with the byte size not being a multiple of 2.
17307e93c57SPavel Labath   offset = 0;
17407e93c57SPavel Labath   EXPECT_EQ(0x07060504030201U, LE.GetMaxU64(&offset, 7));
17507e93c57SPavel Labath   EXPECT_EQ(7U, offset);
17607e93c57SPavel Labath   offset = 0;
17707e93c57SPavel Labath   EXPECT_EQ(0x01020304050607U, BE.GetMaxU64(&offset, 7));
17807e93c57SPavel Labath   EXPECT_EQ(7U, offset);
17907e93c57SPavel Labath 
18007e93c57SPavel Labath   // Check with the maximum allowed byte size.
18107e93c57SPavel Labath   offset = 0;
18207e93c57SPavel Labath   EXPECT_EQ(0x0807060504030201U, LE.GetMaxU64(&offset, 8));
18307e93c57SPavel Labath   EXPECT_EQ(8U, offset);
18407e93c57SPavel Labath   offset = 0;
18507e93c57SPavel Labath   EXPECT_EQ(0x0102030405060708U, BE.GetMaxU64(&offset, 8));
18607e93c57SPavel Labath   EXPECT_EQ(8U, offset);
18707e93c57SPavel Labath }
18807e93c57SPavel Labath 
TEST(DataExtractorTest,GetMaxS64)18907e93c57SPavel Labath TEST(DataExtractorTest, GetMaxS64) {
19007e93c57SPavel Labath   uint8_t buffer[] = {0x01, 0x02, 0x83, 0x04, 0x05, 0x06, 0x07, 0x08};
19107e93c57SPavel Labath   DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,
19207e93c57SPavel Labath                    sizeof(void *));
19307e93c57SPavel Labath   DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *));
19407e93c57SPavel Labath 
19507e93c57SPavel Labath   lldb::offset_t offset;
19607e93c57SPavel Labath 
19707e93c57SPavel Labath   // Check with the minimum allowed byte size.
19807e93c57SPavel Labath   offset = 0;
19907e93c57SPavel Labath   EXPECT_EQ(0x01, LE.GetMaxS64(&offset, 1));
20007e93c57SPavel Labath   EXPECT_EQ(1U, offset);
20107e93c57SPavel Labath   offset = 0;
20207e93c57SPavel Labath   EXPECT_EQ(0x01, BE.GetMaxS64(&offset, 1));
20307e93c57SPavel Labath   EXPECT_EQ(1U, offset);
20407e93c57SPavel Labath 
20507e93c57SPavel Labath   // Check that sign extension works correctly.
20607e93c57SPavel Labath   offset = 0;
20707e93c57SPavel Labath   int64_t value = LE.GetMaxS64(&offset, 3);
20807e93c57SPavel Labath   EXPECT_EQ(0xffffffffff830201U, *reinterpret_cast<uint64_t *>(&value));
20907e93c57SPavel Labath   EXPECT_EQ(3U, offset);
21007e93c57SPavel Labath   offset = 2;
21107e93c57SPavel Labath   value = BE.GetMaxS64(&offset, 3);
21207e93c57SPavel Labath   EXPECT_EQ(0xffffffffff830405U, *reinterpret_cast<uint64_t *>(&value));
21307e93c57SPavel Labath   EXPECT_EQ(5U, offset);
21407e93c57SPavel Labath 
21507e93c57SPavel Labath   // Check with the maximum allowed byte size.
21607e93c57SPavel Labath   offset = 0;
21707e93c57SPavel Labath   EXPECT_EQ(0x0807060504830201, LE.GetMaxS64(&offset, 8));
21807e93c57SPavel Labath   EXPECT_EQ(8U, offset);
21907e93c57SPavel Labath   offset = 0;
22007e93c57SPavel Labath   EXPECT_EQ(0x0102830405060708, BE.GetMaxS64(&offset, 8));
22107e93c57SPavel Labath   EXPECT_EQ(8U, offset);
22207e93c57SPavel Labath }
22307e93c57SPavel Labath 
TEST(DataExtractorTest,GetMaxU64_unchecked)22407e93c57SPavel Labath TEST(DataExtractorTest, GetMaxU64_unchecked) {
22507e93c57SPavel Labath   uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
22607e93c57SPavel Labath   DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,
22707e93c57SPavel Labath                    sizeof(void *));
22807e93c57SPavel Labath   DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *));
22907e93c57SPavel Labath 
23007e93c57SPavel Labath   lldb::offset_t offset;
23107e93c57SPavel Labath 
23207e93c57SPavel Labath   // Check with the minimum allowed byte size.
23307e93c57SPavel Labath   offset = 0;
23407e93c57SPavel Labath   EXPECT_EQ(0x01U, LE.GetMaxU64_unchecked(&offset, 1));
23507e93c57SPavel Labath   EXPECT_EQ(1U, offset);
23607e93c57SPavel Labath   offset = 0;
23707e93c57SPavel Labath   EXPECT_EQ(0x01U, BE.GetMaxU64_unchecked(&offset, 1));
23807e93c57SPavel Labath   EXPECT_EQ(1U, offset);
23907e93c57SPavel Labath 
24007e93c57SPavel Labath   // Check with a non-zero offset.
24107e93c57SPavel Labath   offset = 1;
24207e93c57SPavel Labath   EXPECT_EQ(0x0302U, LE.GetMaxU64_unchecked(&offset, 2));
24307e93c57SPavel Labath   EXPECT_EQ(3U, offset);
24407e93c57SPavel Labath   offset = 1;
24507e93c57SPavel Labath   EXPECT_EQ(0x0203U, BE.GetMaxU64_unchecked(&offset, 2));
24607e93c57SPavel Labath   EXPECT_EQ(3U, offset);
24707e93c57SPavel Labath 
24807e93c57SPavel Labath   // Check with the byte size not being a multiple of 2.
24907e93c57SPavel Labath   offset = 0;
25007e93c57SPavel Labath   EXPECT_EQ(0x07060504030201U, LE.GetMaxU64_unchecked(&offset, 7));
25107e93c57SPavel Labath   EXPECT_EQ(7U, offset);
25207e93c57SPavel Labath   offset = 0;
25307e93c57SPavel Labath   EXPECT_EQ(0x01020304050607U, BE.GetMaxU64_unchecked(&offset, 7));
25407e93c57SPavel Labath   EXPECT_EQ(7U, offset);
25507e93c57SPavel Labath 
25607e93c57SPavel Labath   // Check with the maximum allowed byte size.
25707e93c57SPavel Labath   offset = 0;
25807e93c57SPavel Labath   EXPECT_EQ(0x0807060504030201U, LE.GetMaxU64_unchecked(&offset, 8));
25907e93c57SPavel Labath   EXPECT_EQ(8U, offset);
26007e93c57SPavel Labath   offset = 0;
26107e93c57SPavel Labath   EXPECT_EQ(0x0102030405060708U, BE.GetMaxU64_unchecked(&offset, 8));
26207e93c57SPavel Labath   EXPECT_EQ(8U, offset);
26307e93c57SPavel Labath }
264476f520aSJan Kratochvil 
TEST(DataExtractorTest,GetSLEB128_bit63)265476f520aSJan Kratochvil TEST(DataExtractorTest, GetSLEB128_bit63) {
266476f520aSJan Kratochvil   uint8_t buffer[] = {0xff, 0x80, 0xff, 0x80, 0xff, 0x80, 0xff, 0x80, 0x7f};
267476f520aSJan Kratochvil 
268476f520aSJan Kratochvil   DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,
269476f520aSJan Kratochvil                    sizeof(void *));
270476f520aSJan Kratochvil   DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *));
271476f520aSJan Kratochvil 
272476f520aSJan Kratochvil   lldb::offset_t offset;
273476f520aSJan Kratochvil 
274476f520aSJan Kratochvil   int64_t expected =
275476f520aSJan Kratochvil       0b1111111100000001111111000000011111110000000111111100000001111111;
276476f520aSJan Kratochvil   offset = 0;
277476f520aSJan Kratochvil   EXPECT_EQ(expected, LE.GetSLEB128(&offset));
278476f520aSJan Kratochvil   EXPECT_EQ(9U, offset);
279476f520aSJan Kratochvil   offset = 0;
280476f520aSJan Kratochvil   EXPECT_EQ(expected, BE.GetSLEB128(&offset));
281476f520aSJan Kratochvil   EXPECT_EQ(9U, offset);
282476f520aSJan Kratochvil }
283476f520aSJan Kratochvil 
TEST(DataExtractorTest,GetULEB128_bit63)284476f520aSJan Kratochvil TEST(DataExtractorTest, GetULEB128_bit63) {
285476f520aSJan Kratochvil   uint8_t buffer[] = {0xff, 0x80, 0xff, 0x80, 0xff, 0x80, 0xff, 0x80, 0x7f};
286476f520aSJan Kratochvil 
287476f520aSJan Kratochvil   DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,
288476f520aSJan Kratochvil                    sizeof(void *));
289476f520aSJan Kratochvil   DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *));
290476f520aSJan Kratochvil 
291476f520aSJan Kratochvil   lldb::offset_t offset;
292476f520aSJan Kratochvil 
293476f520aSJan Kratochvil   uint64_t expected =
294476f520aSJan Kratochvil       0b0111111100000001111111000000011111110000000111111100000001111111;
295476f520aSJan Kratochvil   offset = 0;
296476f520aSJan Kratochvil   EXPECT_EQ(expected, LE.GetULEB128(&offset));
297476f520aSJan Kratochvil   EXPECT_EQ(9U, offset);
298476f520aSJan Kratochvil   offset = 0;
299476f520aSJan Kratochvil   EXPECT_EQ(expected, BE.GetULEB128(&offset));
300476f520aSJan Kratochvil   EXPECT_EQ(9U, offset);
301476f520aSJan Kratochvil }
302*5e9b16b6SJonas Devlieghere 
TEST(DataExtractorTest,GetFloat)303*5e9b16b6SJonas Devlieghere TEST(DataExtractorTest, GetFloat) {
304*5e9b16b6SJonas Devlieghere   float expected = 4.0f;
305*5e9b16b6SJonas Devlieghere   lldb::offset_t offset;
306*5e9b16b6SJonas Devlieghere 
307*5e9b16b6SJonas Devlieghere   {
308*5e9b16b6SJonas Devlieghere     uint8_t buffer[] = {0x00, 0x00, 0x80, 0x40};
309*5e9b16b6SJonas Devlieghere     DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,
310*5e9b16b6SJonas Devlieghere                      sizeof(void *));
311*5e9b16b6SJonas Devlieghere 
312*5e9b16b6SJonas Devlieghere     offset = 0;
313*5e9b16b6SJonas Devlieghere     EXPECT_DOUBLE_EQ(expected, LE.GetFloat(&offset));
314*5e9b16b6SJonas Devlieghere     EXPECT_EQ(4U, offset);
315*5e9b16b6SJonas Devlieghere   }
316*5e9b16b6SJonas Devlieghere 
317*5e9b16b6SJonas Devlieghere   {
318*5e9b16b6SJonas Devlieghere     uint8_t buffer[] = {0x40, 0x80, 0x00, 0x00};
319*5e9b16b6SJonas Devlieghere     DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig,
320*5e9b16b6SJonas Devlieghere                      sizeof(void *));
321*5e9b16b6SJonas Devlieghere     offset = 0;
322*5e9b16b6SJonas Devlieghere     EXPECT_DOUBLE_EQ(expected, BE.GetFloat(&offset));
323*5e9b16b6SJonas Devlieghere     EXPECT_EQ(4U, offset);
324*5e9b16b6SJonas Devlieghere   }
325*5e9b16b6SJonas Devlieghere }
326*5e9b16b6SJonas Devlieghere 
TEST(DataExtractorTest,GetFloatUnaligned)327*5e9b16b6SJonas Devlieghere TEST(DataExtractorTest, GetFloatUnaligned) {
328*5e9b16b6SJonas Devlieghere   float expected = 4.0f;
329*5e9b16b6SJonas Devlieghere   lldb::offset_t offset;
330*5e9b16b6SJonas Devlieghere 
331*5e9b16b6SJonas Devlieghere   {
332*5e9b16b6SJonas Devlieghere     uint8_t buffer[] = {0x00, 0x00, 0x00, 0x80, 0x40};
333*5e9b16b6SJonas Devlieghere     DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,
334*5e9b16b6SJonas Devlieghere                      sizeof(void *));
335*5e9b16b6SJonas Devlieghere 
336*5e9b16b6SJonas Devlieghere     offset = 1;
337*5e9b16b6SJonas Devlieghere     EXPECT_DOUBLE_EQ(expected, LE.GetFloat(&offset));
338*5e9b16b6SJonas Devlieghere     EXPECT_EQ(5U, offset);
339*5e9b16b6SJonas Devlieghere   }
340*5e9b16b6SJonas Devlieghere 
341*5e9b16b6SJonas Devlieghere   {
342*5e9b16b6SJonas Devlieghere     uint8_t buffer[] = {0x00, 0x40, 0x80, 0x00, 0x00};
343*5e9b16b6SJonas Devlieghere     DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig,
344*5e9b16b6SJonas Devlieghere                      sizeof(void *));
345*5e9b16b6SJonas Devlieghere     offset = 1;
346*5e9b16b6SJonas Devlieghere     EXPECT_DOUBLE_EQ(expected, BE.GetFloat(&offset));
347*5e9b16b6SJonas Devlieghere     EXPECT_EQ(5U, offset);
348*5e9b16b6SJonas Devlieghere   }
349*5e9b16b6SJonas Devlieghere }
350*5e9b16b6SJonas Devlieghere 
TEST(DataExtractorTest,GetDouble)351*5e9b16b6SJonas Devlieghere TEST(DataExtractorTest, GetDouble) {
352*5e9b16b6SJonas Devlieghere   if (sizeof(double) != 8)
353*5e9b16b6SJonas Devlieghere     return;
354*5e9b16b6SJonas Devlieghere 
355*5e9b16b6SJonas Devlieghere   double expected = 4.0f;
356*5e9b16b6SJonas Devlieghere   lldb::offset_t offset;
357*5e9b16b6SJonas Devlieghere 
358*5e9b16b6SJonas Devlieghere   {
359*5e9b16b6SJonas Devlieghere     uint8_t buffer[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40};
360*5e9b16b6SJonas Devlieghere     DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,
361*5e9b16b6SJonas Devlieghere                      sizeof(void *));
362*5e9b16b6SJonas Devlieghere 
363*5e9b16b6SJonas Devlieghere     offset = 0;
364*5e9b16b6SJonas Devlieghere     EXPECT_DOUBLE_EQ(expected, LE.GetDouble(&offset));
365*5e9b16b6SJonas Devlieghere     EXPECT_EQ(8U, offset);
366*5e9b16b6SJonas Devlieghere   }
367*5e9b16b6SJonas Devlieghere 
368*5e9b16b6SJonas Devlieghere   {
369*5e9b16b6SJonas Devlieghere     uint8_t buffer[] = {0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
370*5e9b16b6SJonas Devlieghere     DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig,
371*5e9b16b6SJonas Devlieghere                      sizeof(void *));
372*5e9b16b6SJonas Devlieghere     offset = 0;
373*5e9b16b6SJonas Devlieghere     EXPECT_DOUBLE_EQ(expected, BE.GetDouble(&offset));
374*5e9b16b6SJonas Devlieghere     EXPECT_EQ(8U, offset);
375*5e9b16b6SJonas Devlieghere   }
376*5e9b16b6SJonas Devlieghere }
377*5e9b16b6SJonas Devlieghere 
TEST(DataExtractorTest,GetDoubleUnaligned)378*5e9b16b6SJonas Devlieghere TEST(DataExtractorTest, GetDoubleUnaligned) {
379*5e9b16b6SJonas Devlieghere   if (sizeof(double) != 8)
380*5e9b16b6SJonas Devlieghere     return;
381*5e9b16b6SJonas Devlieghere 
382*5e9b16b6SJonas Devlieghere   float expected = 4.0f;
383*5e9b16b6SJonas Devlieghere   lldb::offset_t offset;
384*5e9b16b6SJonas Devlieghere 
385*5e9b16b6SJonas Devlieghere   {
386*5e9b16b6SJonas Devlieghere     uint8_t buffer[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40};
387*5e9b16b6SJonas Devlieghere     DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,
388*5e9b16b6SJonas Devlieghere                      sizeof(void *));
389*5e9b16b6SJonas Devlieghere 
390*5e9b16b6SJonas Devlieghere     offset = 1;
391*5e9b16b6SJonas Devlieghere     EXPECT_DOUBLE_EQ(expected, LE.GetDouble(&offset));
392*5e9b16b6SJonas Devlieghere     EXPECT_EQ(9U, offset);
393*5e9b16b6SJonas Devlieghere   }
394*5e9b16b6SJonas Devlieghere 
395*5e9b16b6SJonas Devlieghere   {
396*5e9b16b6SJonas Devlieghere     uint8_t buffer[] = {0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
397*5e9b16b6SJonas Devlieghere     DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig,
398*5e9b16b6SJonas Devlieghere                      sizeof(void *));
399*5e9b16b6SJonas Devlieghere     offset = 1;
400*5e9b16b6SJonas Devlieghere     EXPECT_DOUBLE_EQ(expected, BE.GetDouble(&offset));
401*5e9b16b6SJonas Devlieghere     EXPECT_EQ(9U, offset);
402*5e9b16b6SJonas Devlieghere   }
403*5e9b16b6SJonas Devlieghere }
404