1*eb293b8fSAndroid Build Coastguard Worker /*
2*eb293b8fSAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project
3*eb293b8fSAndroid Build Coastguard Worker *
4*eb293b8fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*eb293b8fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*eb293b8fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*eb293b8fSAndroid Build Coastguard Worker *
8*eb293b8fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*eb293b8fSAndroid Build Coastguard Worker *
10*eb293b8fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*eb293b8fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*eb293b8fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*eb293b8fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*eb293b8fSAndroid Build Coastguard Worker * limitations under the License.
15*eb293b8fSAndroid Build Coastguard Worker */
16*eb293b8fSAndroid Build Coastguard Worker
17*eb293b8fSAndroid Build Coastguard Worker #include <stdint.h>
18*eb293b8fSAndroid Build Coastguard Worker
19*eb293b8fSAndroid Build Coastguard Worker #include <ios>
20*eb293b8fSAndroid Build Coastguard Worker #include <memory>
21*eb293b8fSAndroid Build Coastguard Worker #include <vector>
22*eb293b8fSAndroid Build Coastguard Worker
23*eb293b8fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
24*eb293b8fSAndroid Build Coastguard Worker
25*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/DwarfMemory.h>
26*eb293b8fSAndroid Build Coastguard Worker
27*eb293b8fSAndroid Build Coastguard Worker #include "utils/MemoryFake.h"
28*eb293b8fSAndroid Build Coastguard Worker
29*eb293b8fSAndroid Build Coastguard Worker namespace unwindstack {
30*eb293b8fSAndroid Build Coastguard Worker
31*eb293b8fSAndroid Build Coastguard Worker class DwarfMemoryTest : public ::testing::Test {
32*eb293b8fSAndroid Build Coastguard Worker protected:
SetUp()33*eb293b8fSAndroid Build Coastguard Worker void SetUp() override {
34*eb293b8fSAndroid Build Coastguard Worker fake_memory_ = new MemoryFake;
35*eb293b8fSAndroid Build Coastguard Worker std::shared_ptr<Memory> memory(fake_memory_);
36*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_.reset(new DwarfMemory(memory));
37*eb293b8fSAndroid Build Coastguard Worker }
38*eb293b8fSAndroid Build Coastguard Worker
39*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
40*eb293b8fSAndroid Build Coastguard Worker void GetEncodedSizeTest(uint8_t value, size_t expected);
41*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
42*eb293b8fSAndroid Build Coastguard Worker void ReadEncodedValue_omit();
43*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
44*eb293b8fSAndroid Build Coastguard Worker void ReadEncodedValue_leb128();
45*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
46*eb293b8fSAndroid Build Coastguard Worker void ReadEncodedValue_data1();
47*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
48*eb293b8fSAndroid Build Coastguard Worker void ReadEncodedValue_data2();
49*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
50*eb293b8fSAndroid Build Coastguard Worker void ReadEncodedValue_data4();
51*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
52*eb293b8fSAndroid Build Coastguard Worker void ReadEncodedValue_data8();
53*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
54*eb293b8fSAndroid Build Coastguard Worker void ReadEncodedValue_non_zero_adjust();
55*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
56*eb293b8fSAndroid Build Coastguard Worker void ReadEncodedValue_overflow();
57*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
58*eb293b8fSAndroid Build Coastguard Worker void ReadEncodedValue_high_bit_set();
59*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
60*eb293b8fSAndroid Build Coastguard Worker void ReadEncodedValue_all();
61*eb293b8fSAndroid Build Coastguard Worker
62*eb293b8fSAndroid Build Coastguard Worker MemoryFake* fake_memory_;
63*eb293b8fSAndroid Build Coastguard Worker std::unique_ptr<DwarfMemory> dwarf_mem_;
64*eb293b8fSAndroid Build Coastguard Worker };
65*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadBytes)66*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadBytes) {
67*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetMemory(0, std::vector<uint8_t>{0x10, 0x18, 0xff, 0xfe});
68*eb293b8fSAndroid Build Coastguard Worker
69*eb293b8fSAndroid Build Coastguard Worker uint8_t byte;
70*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadBytes(&byte, 1));
71*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x10U, byte);
72*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadBytes(&byte, 1));
73*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x18U, byte);
74*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadBytes(&byte, 1));
75*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xffU, byte);
76*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadBytes(&byte, 1));
77*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xfeU, byte);
78*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(4U, dwarf_mem_->cur_offset());
79*eb293b8fSAndroid Build Coastguard Worker
80*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_cur_offset(2);
81*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadBytes(&byte, 1));
82*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xffU, byte);
83*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(3U, dwarf_mem_->cur_offset());
84*eb293b8fSAndroid Build Coastguard Worker }
85*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadSigned_check)86*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadSigned_check) {
87*eb293b8fSAndroid Build Coastguard Worker uint64_t value;
88*eb293b8fSAndroid Build Coastguard Worker
89*eb293b8fSAndroid Build Coastguard Worker // Signed 8 byte reads.
90*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData8(0, static_cast<uint8_t>(-10));
91*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData8(1, 200);
92*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadSigned<int8_t>(&value));
93*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(static_cast<int8_t>(-10), static_cast<int8_t>(value));
94*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadSigned<int8_t>(&value));
95*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(static_cast<int8_t>(200), static_cast<int8_t>(value));
96*eb293b8fSAndroid Build Coastguard Worker
97*eb293b8fSAndroid Build Coastguard Worker // Signed 16 byte reads.
98*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData16(0x10, static_cast<uint16_t>(-1000));
99*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData16(0x12, 50100);
100*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_cur_offset(0x10);
101*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadSigned<int16_t>(&value));
102*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(static_cast<int16_t>(-1000), static_cast<int16_t>(value));
103*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadSigned<int16_t>(&value));
104*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(static_cast<int16_t>(50100), static_cast<int16_t>(value));
105*eb293b8fSAndroid Build Coastguard Worker
106*eb293b8fSAndroid Build Coastguard Worker // Signed 32 byte reads.
107*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData32(0x100, static_cast<uint32_t>(-1000000000));
108*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData32(0x104, 3000000000);
109*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_cur_offset(0x100);
110*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadSigned<int32_t>(&value));
111*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(static_cast<int32_t>(-1000000000), static_cast<int32_t>(value));
112*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadSigned<int32_t>(&value));
113*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(static_cast<int32_t>(3000000000), static_cast<int32_t>(value));
114*eb293b8fSAndroid Build Coastguard Worker
115*eb293b8fSAndroid Build Coastguard Worker // Signed 64 byte reads.
116*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData64(0x200, static_cast<uint64_t>(-2000000000000LL));
117*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData64(0x208, 5000000000000LL);
118*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_cur_offset(0x200);
119*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadSigned<int64_t>(&value));
120*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(static_cast<int64_t>(-2000000000000), static_cast<int64_t>(value));
121*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadSigned<int64_t>(&value));
122*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(static_cast<int64_t>(5000000000000), static_cast<int64_t>(value));
123*eb293b8fSAndroid Build Coastguard Worker }
124*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadULEB128)125*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadULEB128) {
126*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetMemory(0, std::vector<uint8_t>{0x01, 0x80, 0x24, 0xff, 0xc3, 0xff, 0x7f});
127*eb293b8fSAndroid Build Coastguard Worker
128*eb293b8fSAndroid Build Coastguard Worker uint64_t value;
129*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadULEB128(&value));
130*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(1U, dwarf_mem_->cur_offset());
131*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(1U, value);
132*eb293b8fSAndroid Build Coastguard Worker
133*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadULEB128(&value));
134*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(3U, dwarf_mem_->cur_offset());
135*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x1200U, value);
136*eb293b8fSAndroid Build Coastguard Worker
137*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadULEB128(&value));
138*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(7U, dwarf_mem_->cur_offset());
139*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xfffe1ffU, value);
140*eb293b8fSAndroid Build Coastguard Worker }
141*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadSLEB128)142*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadSLEB128) {
143*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetMemory(0, std::vector<uint8_t>{0x06, 0x40, 0x82, 0x34, 0x89, 0x64, 0xf9, 0xc3,
144*eb293b8fSAndroid Build Coastguard Worker 0x8f, 0x2f, 0xbf, 0xc3, 0xf7, 0x5f});
145*eb293b8fSAndroid Build Coastguard Worker
146*eb293b8fSAndroid Build Coastguard Worker int64_t value;
147*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadSLEB128(&value));
148*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(1U, dwarf_mem_->cur_offset());
149*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(6U, value);
150*eb293b8fSAndroid Build Coastguard Worker
151*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadSLEB128(&value));
152*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(2U, dwarf_mem_->cur_offset());
153*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xffffffffffffffc0ULL, static_cast<uint64_t>(value));
154*eb293b8fSAndroid Build Coastguard Worker
155*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadSLEB128(&value));
156*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(4U, dwarf_mem_->cur_offset());
157*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x1a02U, value);
158*eb293b8fSAndroid Build Coastguard Worker
159*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadSLEB128(&value));
160*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(6U, dwarf_mem_->cur_offset());
161*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xfffffffffffff209ULL, static_cast<uint64_t>(value));
162*eb293b8fSAndroid Build Coastguard Worker
163*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadSLEB128(&value));
164*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(10U, dwarf_mem_->cur_offset());
165*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x5e3e1f9U, value);
166*eb293b8fSAndroid Build Coastguard Worker
167*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadSLEB128(&value));
168*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(14U, dwarf_mem_->cur_offset());
169*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xfffffffffbfde1bfULL, static_cast<uint64_t>(value));
170*eb293b8fSAndroid Build Coastguard Worker }
171*eb293b8fSAndroid Build Coastguard Worker
172*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
GetEncodedSizeTest(uint8_t value,size_t expected)173*eb293b8fSAndroid Build Coastguard Worker void DwarfMemoryTest::GetEncodedSizeTest(uint8_t value, size_t expected) {
174*eb293b8fSAndroid Build Coastguard Worker for (size_t i = 0; i < 16; i++) {
175*eb293b8fSAndroid Build Coastguard Worker uint8_t encoding = (i << 4) | value;
176*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(expected, dwarf_mem_->GetEncodedSize<AddressType>(encoding))
177*eb293b8fSAndroid Build Coastguard Worker << "encoding 0x" << std::hex << static_cast<uint32_t>(encoding) << " test value 0x"
178*eb293b8fSAndroid Build Coastguard Worker << static_cast<size_t>(value);
179*eb293b8fSAndroid Build Coastguard Worker }
180*eb293b8fSAndroid Build Coastguard Worker }
181*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,GetEncodedSize_absptr_uint32_t)182*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, GetEncodedSize_absptr_uint32_t) {
183*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint32_t>(0, sizeof(uint32_t));
184*eb293b8fSAndroid Build Coastguard Worker }
185*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,GetEncodedSize_absptr_uint64_t)186*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, GetEncodedSize_absptr_uint64_t) {
187*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint64_t>(0, sizeof(uint64_t));
188*eb293b8fSAndroid Build Coastguard Worker }
189*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,GetEncodedSize_data1)190*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, GetEncodedSize_data1) {
191*eb293b8fSAndroid Build Coastguard Worker // udata1
192*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint32_t>(0x0d, 1);
193*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint64_t>(0x0d, 1);
194*eb293b8fSAndroid Build Coastguard Worker
195*eb293b8fSAndroid Build Coastguard Worker // sdata1
196*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint32_t>(0x0e, 1);
197*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint64_t>(0x0e, 1);
198*eb293b8fSAndroid Build Coastguard Worker }
199*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,GetEncodedSize_data2)200*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, GetEncodedSize_data2) {
201*eb293b8fSAndroid Build Coastguard Worker // udata2
202*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint32_t>(0x02, 2);
203*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint64_t>(0x02, 2);
204*eb293b8fSAndroid Build Coastguard Worker
205*eb293b8fSAndroid Build Coastguard Worker // sdata2
206*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint32_t>(0x0a, 2);
207*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint64_t>(0x0a, 2);
208*eb293b8fSAndroid Build Coastguard Worker }
209*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,GetEncodedSize_data4)210*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, GetEncodedSize_data4) {
211*eb293b8fSAndroid Build Coastguard Worker // udata4
212*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint32_t>(0x03, 4);
213*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint64_t>(0x03, 4);
214*eb293b8fSAndroid Build Coastguard Worker
215*eb293b8fSAndroid Build Coastguard Worker // sdata4
216*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint32_t>(0x0b, 4);
217*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint64_t>(0x0b, 4);
218*eb293b8fSAndroid Build Coastguard Worker }
219*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,GetEncodedSize_data8)220*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, GetEncodedSize_data8) {
221*eb293b8fSAndroid Build Coastguard Worker // udata8
222*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint32_t>(0x04, 8);
223*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint64_t>(0x04, 8);
224*eb293b8fSAndroid Build Coastguard Worker
225*eb293b8fSAndroid Build Coastguard Worker // sdata8
226*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint32_t>(0x0c, 8);
227*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint64_t>(0x0c, 8);
228*eb293b8fSAndroid Build Coastguard Worker }
229*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,GetEncodedSize_unknown)230*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, GetEncodedSize_unknown) {
231*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint32_t>(0x01, 0);
232*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint64_t>(0x01, 0);
233*eb293b8fSAndroid Build Coastguard Worker
234*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint32_t>(0x09, 0);
235*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint64_t>(0x09, 0);
236*eb293b8fSAndroid Build Coastguard Worker
237*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint32_t>(0x0f, 0);
238*eb293b8fSAndroid Build Coastguard Worker GetEncodedSizeTest<uint64_t>(0x0f, 0);
239*eb293b8fSAndroid Build Coastguard Worker }
240*eb293b8fSAndroid Build Coastguard Worker
241*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
ReadEncodedValue_omit()242*eb293b8fSAndroid Build Coastguard Worker void DwarfMemoryTest::ReadEncodedValue_omit() {
243*eb293b8fSAndroid Build Coastguard Worker uint64_t value = 123;
244*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0xff, &value));
245*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0U, value);
246*eb293b8fSAndroid Build Coastguard Worker }
247*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_omit_uint32_t)248*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_omit_uint32_t) {
249*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_omit<uint32_t>();
250*eb293b8fSAndroid Build Coastguard Worker }
251*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_omit_uint64_t)252*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_omit_uint64_t) {
253*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_omit<uint64_t>();
254*eb293b8fSAndroid Build Coastguard Worker }
255*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_absptr_uint32_t)256*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_absptr_uint32_t) {
257*eb293b8fSAndroid Build Coastguard Worker uint64_t value = 100;
258*eb293b8fSAndroid Build Coastguard Worker ASSERT_FALSE(dwarf_mem_->ReadEncodedValue<uint32_t>(0x00, &value));
259*eb293b8fSAndroid Build Coastguard Worker
260*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData32(0, 0x12345678);
261*eb293b8fSAndroid Build Coastguard Worker
262*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<uint32_t>(0x00, &value));
263*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(4U, dwarf_mem_->cur_offset());
264*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x12345678U, value);
265*eb293b8fSAndroid Build Coastguard Worker }
266*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_absptr_uint64_t)267*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_absptr_uint64_t) {
268*eb293b8fSAndroid Build Coastguard Worker uint64_t value = 100;
269*eb293b8fSAndroid Build Coastguard Worker ASSERT_FALSE(dwarf_mem_->ReadEncodedValue<uint64_t>(0x00, &value));
270*eb293b8fSAndroid Build Coastguard Worker
271*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData64(0, 0x12345678f1f2f3f4ULL);
272*eb293b8fSAndroid Build Coastguard Worker
273*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<uint64_t>(0x00, &value));
274*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(8U, dwarf_mem_->cur_offset());
275*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x12345678f1f2f3f4ULL, value);
276*eb293b8fSAndroid Build Coastguard Worker }
277*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_aligned_uint32_t)278*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_aligned_uint32_t) {
279*eb293b8fSAndroid Build Coastguard Worker uint64_t value = 100;
280*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_cur_offset(1);
281*eb293b8fSAndroid Build Coastguard Worker ASSERT_FALSE(dwarf_mem_->ReadEncodedValue<uint32_t>(0x50, &value));
282*eb293b8fSAndroid Build Coastguard Worker
283*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData32(4, 0x12345678);
284*eb293b8fSAndroid Build Coastguard Worker
285*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<uint32_t>(0x50, &value));
286*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(8U, dwarf_mem_->cur_offset());
287*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x12345678U, value);
288*eb293b8fSAndroid Build Coastguard Worker }
289*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_aligned_uint64_t)290*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_aligned_uint64_t) {
291*eb293b8fSAndroid Build Coastguard Worker uint64_t value = 100;
292*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_cur_offset(1);
293*eb293b8fSAndroid Build Coastguard Worker ASSERT_FALSE(dwarf_mem_->ReadEncodedValue<uint64_t>(0x50, &value));
294*eb293b8fSAndroid Build Coastguard Worker
295*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData64(8, 0x12345678f1f2f3f4ULL);
296*eb293b8fSAndroid Build Coastguard Worker
297*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<uint64_t>(0x50, &value));
298*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(16U, dwarf_mem_->cur_offset());
299*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x12345678f1f2f3f4ULL, value);
300*eb293b8fSAndroid Build Coastguard Worker }
301*eb293b8fSAndroid Build Coastguard Worker
302*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
ReadEncodedValue_leb128()303*eb293b8fSAndroid Build Coastguard Worker void DwarfMemoryTest::ReadEncodedValue_leb128() {
304*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetMemory(0, std::vector<uint8_t>{0x80, 0x42});
305*eb293b8fSAndroid Build Coastguard Worker
306*eb293b8fSAndroid Build Coastguard Worker uint64_t value = 100;
307*eb293b8fSAndroid Build Coastguard Worker // uleb128
308*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x01, &value));
309*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x2100U, value);
310*eb293b8fSAndroid Build Coastguard Worker
311*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_cur_offset(0);
312*eb293b8fSAndroid Build Coastguard Worker // sleb128
313*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x09, &value));
314*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xffffffffffffe100ULL, value);
315*eb293b8fSAndroid Build Coastguard Worker }
316*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_leb128_uint32_t)317*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_leb128_uint32_t) {
318*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_leb128<uint32_t>();
319*eb293b8fSAndroid Build Coastguard Worker }
320*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_leb128_uint64_t)321*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_leb128_uint64_t) {
322*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_leb128<uint64_t>();
323*eb293b8fSAndroid Build Coastguard Worker }
324*eb293b8fSAndroid Build Coastguard Worker
325*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
ReadEncodedValue_data1()326*eb293b8fSAndroid Build Coastguard Worker void DwarfMemoryTest::ReadEncodedValue_data1() {
327*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData8(0, 0xe0);
328*eb293b8fSAndroid Build Coastguard Worker
329*eb293b8fSAndroid Build Coastguard Worker uint64_t value = 0;
330*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x0d, &value));
331*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xe0U, value);
332*eb293b8fSAndroid Build Coastguard Worker
333*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_cur_offset(0);
334*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x0e, &value));
335*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xffffffffffffffe0ULL, value);
336*eb293b8fSAndroid Build Coastguard Worker }
337*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_data1_uint32_t)338*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_data1_uint32_t) {
339*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_data1<uint32_t>();
340*eb293b8fSAndroid Build Coastguard Worker }
341*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_data1_uint64_t)342*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_data1_uint64_t) {
343*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_data1<uint64_t>();
344*eb293b8fSAndroid Build Coastguard Worker }
345*eb293b8fSAndroid Build Coastguard Worker
346*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
ReadEncodedValue_data2()347*eb293b8fSAndroid Build Coastguard Worker void DwarfMemoryTest::ReadEncodedValue_data2() {
348*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData16(0, 0xe000);
349*eb293b8fSAndroid Build Coastguard Worker
350*eb293b8fSAndroid Build Coastguard Worker uint64_t value = 0;
351*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x02, &value));
352*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xe000U, value);
353*eb293b8fSAndroid Build Coastguard Worker
354*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_cur_offset(0);
355*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x0a, &value));
356*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xffffffffffffe000ULL, value);
357*eb293b8fSAndroid Build Coastguard Worker }
358*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_data2_uint32_t)359*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_data2_uint32_t) {
360*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_data2<uint32_t>();
361*eb293b8fSAndroid Build Coastguard Worker }
362*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_data2_uint64_t)363*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_data2_uint64_t) {
364*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_data2<uint64_t>();
365*eb293b8fSAndroid Build Coastguard Worker }
366*eb293b8fSAndroid Build Coastguard Worker
367*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
ReadEncodedValue_data4()368*eb293b8fSAndroid Build Coastguard Worker void DwarfMemoryTest::ReadEncodedValue_data4() {
369*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData32(0, 0xe0000000);
370*eb293b8fSAndroid Build Coastguard Worker
371*eb293b8fSAndroid Build Coastguard Worker uint64_t value = 0;
372*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x03, &value));
373*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xe0000000U, value);
374*eb293b8fSAndroid Build Coastguard Worker
375*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_cur_offset(0);
376*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x0b, &value));
377*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xffffffffe0000000ULL, value);
378*eb293b8fSAndroid Build Coastguard Worker }
379*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_data4_uint32_t)380*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_data4_uint32_t) {
381*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_data4<uint32_t>();
382*eb293b8fSAndroid Build Coastguard Worker }
383*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_data4_uint64_t)384*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_data4_uint64_t) {
385*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_data4<uint64_t>();
386*eb293b8fSAndroid Build Coastguard Worker }
387*eb293b8fSAndroid Build Coastguard Worker
388*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
ReadEncodedValue_data8()389*eb293b8fSAndroid Build Coastguard Worker void DwarfMemoryTest::ReadEncodedValue_data8() {
390*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData64(0, 0xe000000000000000ULL);
391*eb293b8fSAndroid Build Coastguard Worker
392*eb293b8fSAndroid Build Coastguard Worker uint64_t value = 0;
393*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x04, &value));
394*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xe000000000000000ULL, value);
395*eb293b8fSAndroid Build Coastguard Worker
396*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_cur_offset(0);
397*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x0c, &value));
398*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xe000000000000000ULL, value);
399*eb293b8fSAndroid Build Coastguard Worker }
400*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_data8_uint32_t)401*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_data8_uint32_t) {
402*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_data8<uint32_t>();
403*eb293b8fSAndroid Build Coastguard Worker }
404*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_data8_uint64_t)405*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_data8_uint64_t) {
406*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_data8<uint64_t>();
407*eb293b8fSAndroid Build Coastguard Worker }
408*eb293b8fSAndroid Build Coastguard Worker
409*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
ReadEncodedValue_non_zero_adjust()410*eb293b8fSAndroid Build Coastguard Worker void DwarfMemoryTest::ReadEncodedValue_non_zero_adjust() {
411*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData64(0, 0xe000000000000000ULL);
412*eb293b8fSAndroid Build Coastguard Worker
413*eb293b8fSAndroid Build Coastguard Worker uint64_t value = 0;
414*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_pc_offset(0x2000);
415*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x14, &value));
416*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xe000000000002000ULL, value);
417*eb293b8fSAndroid Build Coastguard Worker }
418*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_non_zero_adjust_uint32_t)419*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_non_zero_adjust_uint32_t) {
420*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_non_zero_adjust<uint32_t>();
421*eb293b8fSAndroid Build Coastguard Worker }
422*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_non_zero_adjust_uint64_t)423*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_non_zero_adjust_uint64_t) {
424*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_non_zero_adjust<uint64_t>();
425*eb293b8fSAndroid Build Coastguard Worker }
426*eb293b8fSAndroid Build Coastguard Worker
427*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
ReadEncodedValue_overflow()428*eb293b8fSAndroid Build Coastguard Worker void DwarfMemoryTest::ReadEncodedValue_overflow() {
429*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData64(0, 0);
430*eb293b8fSAndroid Build Coastguard Worker
431*eb293b8fSAndroid Build Coastguard Worker uint64_t value = 0;
432*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_cur_offset(UINT64_MAX);
433*eb293b8fSAndroid Build Coastguard Worker ASSERT_FALSE(dwarf_mem_->ReadEncodedValue<AddressType>(0x50, &value));
434*eb293b8fSAndroid Build Coastguard Worker }
435*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_overflow_uint32_t)436*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_overflow_uint32_t) {
437*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_overflow<uint32_t>();
438*eb293b8fSAndroid Build Coastguard Worker }
439*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_overflow_uint64_t)440*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_overflow_uint64_t) {
441*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_overflow<uint64_t>();
442*eb293b8fSAndroid Build Coastguard Worker }
443*eb293b8fSAndroid Build Coastguard Worker
444*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
ReadEncodedValue_high_bit_set()445*eb293b8fSAndroid Build Coastguard Worker void DwarfMemoryTest::ReadEncodedValue_high_bit_set() {
446*eb293b8fSAndroid Build Coastguard Worker uint64_t value;
447*eb293b8fSAndroid Build Coastguard Worker fake_memory_->SetData32(0, 0x15234);
448*eb293b8fSAndroid Build Coastguard Worker ASSERT_FALSE(dwarf_mem_->ReadEncodedValue<AddressType>(0xc3, &value));
449*eb293b8fSAndroid Build Coastguard Worker
450*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_func_offset(0x60000);
451*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_cur_offset(0);
452*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0xc3, &value));
453*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x75234U, value);
454*eb293b8fSAndroid Build Coastguard Worker }
455*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_high_bit_set_uint32_t)456*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_high_bit_set_uint32_t) {
457*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_high_bit_set<uint32_t>();
458*eb293b8fSAndroid Build Coastguard Worker }
459*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_high_bit_set_uint64_t)460*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_high_bit_set_uint64_t) {
461*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_high_bit_set<uint64_t>();
462*eb293b8fSAndroid Build Coastguard Worker }
463*eb293b8fSAndroid Build Coastguard Worker
464*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType>
ReadEncodedValue_all()465*eb293b8fSAndroid Build Coastguard Worker void DwarfMemoryTest::ReadEncodedValue_all() {
466*eb293b8fSAndroid Build Coastguard Worker std::shared_ptr<Memory> memory(new MemoryFakeAlwaysReadZero);
467*eb293b8fSAndroid Build Coastguard Worker DwarfMemory dwarf_mem(memory);
468*eb293b8fSAndroid Build Coastguard Worker
469*eb293b8fSAndroid Build Coastguard Worker for (size_t i = 0; i <= 0xff; i++) {
470*eb293b8fSAndroid Build Coastguard Worker uint64_t value;
471*eb293b8fSAndroid Build Coastguard Worker if (dwarf_mem.ReadEncodedValue<AddressType>(static_cast<uint8_t>(i), &value)) {
472*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0U, value);
473*eb293b8fSAndroid Build Coastguard Worker }
474*eb293b8fSAndroid Build Coastguard Worker }
475*eb293b8fSAndroid Build Coastguard Worker }
476*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_all_uint32_t)477*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_all_uint32_t) {
478*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_all<uint32_t>();
479*eb293b8fSAndroid Build Coastguard Worker }
480*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,ReadEncodedValue_all_uint64_t)481*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, ReadEncodedValue_all_uint64_t) {
482*eb293b8fSAndroid Build Coastguard Worker ReadEncodedValue_all<uint64_t>();
483*eb293b8fSAndroid Build Coastguard Worker }
484*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,AdjustEncodedValue_absptr)485*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, AdjustEncodedValue_absptr) {
486*eb293b8fSAndroid Build Coastguard Worker uint64_t value = 0x1234;
487*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x00, &value));
488*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x1234U, value);
489*eb293b8fSAndroid Build Coastguard Worker }
490*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,AdjustEncodedValue_pcrel)491*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, AdjustEncodedValue_pcrel) {
492*eb293b8fSAndroid Build Coastguard Worker uint64_t value = 0x1234;
493*eb293b8fSAndroid Build Coastguard Worker ASSERT_FALSE(dwarf_mem_->AdjustEncodedValue(0x10, &value));
494*eb293b8fSAndroid Build Coastguard Worker
495*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_pc_offset(0x2000);
496*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x10, &value));
497*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x3234U, value);
498*eb293b8fSAndroid Build Coastguard Worker
499*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_pc_offset(static_cast<uint64_t>(-4));
500*eb293b8fSAndroid Build Coastguard Worker value = 0x1234;
501*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x10, &value));
502*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x1230U, value);
503*eb293b8fSAndroid Build Coastguard Worker }
504*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,AdjustEncodedValue_textrel)505*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, AdjustEncodedValue_textrel) {
506*eb293b8fSAndroid Build Coastguard Worker uint64_t value = 0x8234;
507*eb293b8fSAndroid Build Coastguard Worker ASSERT_FALSE(dwarf_mem_->AdjustEncodedValue(0x20, &value));
508*eb293b8fSAndroid Build Coastguard Worker
509*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_text_offset(0x1000);
510*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x20, &value));
511*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x9234U, value);
512*eb293b8fSAndroid Build Coastguard Worker
513*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_text_offset(static_cast<uint64_t>(-16));
514*eb293b8fSAndroid Build Coastguard Worker value = 0x8234;
515*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x20, &value));
516*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x8224U, value);
517*eb293b8fSAndroid Build Coastguard Worker }
518*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,AdjustEncodedValue_datarel)519*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, AdjustEncodedValue_datarel) {
520*eb293b8fSAndroid Build Coastguard Worker uint64_t value = 0xb234;
521*eb293b8fSAndroid Build Coastguard Worker ASSERT_FALSE(dwarf_mem_->AdjustEncodedValue(0x30, &value));
522*eb293b8fSAndroid Build Coastguard Worker
523*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_data_offset(0x1200);
524*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x30, &value));
525*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xc434U, value);
526*eb293b8fSAndroid Build Coastguard Worker
527*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_data_offset(static_cast<uint64_t>(-256));
528*eb293b8fSAndroid Build Coastguard Worker value = 0xb234;
529*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x30, &value));
530*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0xb134U, value);
531*eb293b8fSAndroid Build Coastguard Worker }
532*eb293b8fSAndroid Build Coastguard Worker
TEST_F(DwarfMemoryTest,AdjustEncodedValue_funcrel)533*eb293b8fSAndroid Build Coastguard Worker TEST_F(DwarfMemoryTest, AdjustEncodedValue_funcrel) {
534*eb293b8fSAndroid Build Coastguard Worker uint64_t value = 0x15234;
535*eb293b8fSAndroid Build Coastguard Worker ASSERT_FALSE(dwarf_mem_->AdjustEncodedValue(0x40, &value));
536*eb293b8fSAndroid Build Coastguard Worker
537*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_func_offset(0x60000);
538*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x40, &value));
539*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x75234U, value);
540*eb293b8fSAndroid Build Coastguard Worker
541*eb293b8fSAndroid Build Coastguard Worker dwarf_mem_->set_func_offset(static_cast<uint64_t>(-4096));
542*eb293b8fSAndroid Build Coastguard Worker value = 0x15234;
543*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x40, &value));
544*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(0x14234U, value);
545*eb293b8fSAndroid Build Coastguard Worker }
546*eb293b8fSAndroid Build Coastguard Worker
547*eb293b8fSAndroid Build Coastguard Worker } // namespace unwindstack
548