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