1 //===-- DataExtractorTest.cpp -----------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "gtest/gtest.h" 10 11 #include "lldb/Utility/DataExtractor.h" 12 13 using namespace lldb_private; 14 15 TEST(DataExtractorTest, GetBitfield) { 16 uint8_t buffer[] = {0x01, 0x23, 0x45, 0x67}; 17 DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle, 18 sizeof(void *)); 19 DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *)); 20 21 lldb::offset_t offset; 22 23 offset = 0; 24 ASSERT_EQ(buffer[1], LE.GetMaxU64Bitfield(&offset, sizeof(buffer), 8, 8)); 25 offset = 0; 26 ASSERT_EQ(buffer[1], BE.GetMaxU64Bitfield(&offset, sizeof(buffer), 8, 8)); 27 28 offset = 0; 29 ASSERT_EQ(int8_t(buffer[1]), 30 LE.GetMaxS64Bitfield(&offset, sizeof(buffer), 8, 8)); 31 offset = 0; 32 ASSERT_EQ(int8_t(buffer[1]), 33 BE.GetMaxS64Bitfield(&offset, sizeof(buffer), 8, 8)); 34 } 35 36 TEST(DataExtractorTest, PeekData) { 37 uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04}; 38 DataExtractor E(buffer, sizeof buffer, lldb::eByteOrderLittle, 4); 39 40 EXPECT_EQ(buffer + 0, E.PeekData(0, 0)); 41 EXPECT_EQ(buffer + 0, E.PeekData(0, 4)); 42 EXPECT_EQ(nullptr, E.PeekData(0, 5)); 43 44 EXPECT_EQ(buffer + 2, E.PeekData(2, 0)); 45 EXPECT_EQ(buffer + 2, E.PeekData(2, 2)); 46 EXPECT_EQ(nullptr, E.PeekData(2, 3)); 47 48 EXPECT_EQ(buffer + 4, E.PeekData(4, 0)); 49 EXPECT_EQ(nullptr, E.PeekData(4, 1)); 50 } 51 52 TEST(DataExtractorTest, GetMaxU64) { 53 uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; 54 DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle, 55 sizeof(void *)); 56 DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *)); 57 58 lldb::offset_t offset; 59 60 // Check with the minimum allowed byte size. 61 offset = 0; 62 EXPECT_EQ(0x01U, LE.GetMaxU64(&offset, 1)); 63 EXPECT_EQ(1U, offset); 64 offset = 0; 65 EXPECT_EQ(0x01U, BE.GetMaxU64(&offset, 1)); 66 EXPECT_EQ(1U, offset); 67 68 // Check with a non-zero offset. 69 offset = 1; 70 EXPECT_EQ(0x0302U, LE.GetMaxU64(&offset, 2)); 71 EXPECT_EQ(3U, offset); 72 offset = 1; 73 EXPECT_EQ(0x0203U, BE.GetMaxU64(&offset, 2)); 74 EXPECT_EQ(3U, offset); 75 76 // Check with the byte size not being a multiple of 2. 77 offset = 0; 78 EXPECT_EQ(0x07060504030201U, LE.GetMaxU64(&offset, 7)); 79 EXPECT_EQ(7U, offset); 80 offset = 0; 81 EXPECT_EQ(0x01020304050607U, BE.GetMaxU64(&offset, 7)); 82 EXPECT_EQ(7U, offset); 83 84 // Check with the maximum allowed byte size. 85 offset = 0; 86 EXPECT_EQ(0x0807060504030201U, LE.GetMaxU64(&offset, 8)); 87 EXPECT_EQ(8U, offset); 88 offset = 0; 89 EXPECT_EQ(0x0102030405060708U, BE.GetMaxU64(&offset, 8)); 90 EXPECT_EQ(8U, offset); 91 } 92 93 TEST(DataExtractorTest, GetMaxS64) { 94 uint8_t buffer[] = {0x01, 0x02, 0x83, 0x04, 0x05, 0x06, 0x07, 0x08}; 95 DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle, 96 sizeof(void *)); 97 DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *)); 98 99 lldb::offset_t offset; 100 101 // Check with the minimum allowed byte size. 102 offset = 0; 103 EXPECT_EQ(0x01, LE.GetMaxS64(&offset, 1)); 104 EXPECT_EQ(1U, offset); 105 offset = 0; 106 EXPECT_EQ(0x01, BE.GetMaxS64(&offset, 1)); 107 EXPECT_EQ(1U, offset); 108 109 // Check that sign extension works correctly. 110 offset = 0; 111 int64_t value = LE.GetMaxS64(&offset, 3); 112 EXPECT_EQ(0xffffffffff830201U, *reinterpret_cast<uint64_t *>(&value)); 113 EXPECT_EQ(3U, offset); 114 offset = 2; 115 value = BE.GetMaxS64(&offset, 3); 116 EXPECT_EQ(0xffffffffff830405U, *reinterpret_cast<uint64_t *>(&value)); 117 EXPECT_EQ(5U, offset); 118 119 // Check with the maximum allowed byte size. 120 offset = 0; 121 EXPECT_EQ(0x0807060504830201, LE.GetMaxS64(&offset, 8)); 122 EXPECT_EQ(8U, offset); 123 offset = 0; 124 EXPECT_EQ(0x0102830405060708, BE.GetMaxS64(&offset, 8)); 125 EXPECT_EQ(8U, offset); 126 } 127 128 TEST(DataExtractorTest, GetMaxU64_unchecked) { 129 uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; 130 DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle, 131 sizeof(void *)); 132 DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *)); 133 134 lldb::offset_t offset; 135 136 // Check with the minimum allowed byte size. 137 offset = 0; 138 EXPECT_EQ(0x01U, LE.GetMaxU64_unchecked(&offset, 1)); 139 EXPECT_EQ(1U, offset); 140 offset = 0; 141 EXPECT_EQ(0x01U, BE.GetMaxU64_unchecked(&offset, 1)); 142 EXPECT_EQ(1U, offset); 143 144 // Check with a non-zero offset. 145 offset = 1; 146 EXPECT_EQ(0x0302U, LE.GetMaxU64_unchecked(&offset, 2)); 147 EXPECT_EQ(3U, offset); 148 offset = 1; 149 EXPECT_EQ(0x0203U, BE.GetMaxU64_unchecked(&offset, 2)); 150 EXPECT_EQ(3U, offset); 151 152 // Check with the byte size not being a multiple of 2. 153 offset = 0; 154 EXPECT_EQ(0x07060504030201U, LE.GetMaxU64_unchecked(&offset, 7)); 155 EXPECT_EQ(7U, offset); 156 offset = 0; 157 EXPECT_EQ(0x01020304050607U, BE.GetMaxU64_unchecked(&offset, 7)); 158 EXPECT_EQ(7U, offset); 159 160 // Check with the maximum allowed byte size. 161 offset = 0; 162 EXPECT_EQ(0x0807060504030201U, LE.GetMaxU64_unchecked(&offset, 8)); 163 EXPECT_EQ(8U, offset); 164 offset = 0; 165 EXPECT_EQ(0x0102030405060708U, BE.GetMaxU64_unchecked(&offset, 8)); 166 EXPECT_EQ(8U, offset); 167 } 168