1*eb293b8fSAndroid Build Coastguard Worker /*
2*eb293b8fSAndroid Build Coastguard Worker * Copyright (C) 2016 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 <vector>
20*eb293b8fSAndroid Build Coastguard Worker
21*eb293b8fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
22*eb293b8fSAndroid Build Coastguard Worker
23*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/DwarfError.h>
24*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/Elf.h>
25*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/ElfInterface.h>
26*eb293b8fSAndroid Build Coastguard Worker
27*eb293b8fSAndroid Build Coastguard Worker #include "DwarfDebugFrame.h"
28*eb293b8fSAndroid Build Coastguard Worker #include "DwarfEncoding.h"
29*eb293b8fSAndroid Build Coastguard Worker
30*eb293b8fSAndroid Build Coastguard Worker #include "LogFake.h"
31*eb293b8fSAndroid Build Coastguard Worker #include "utils/MemoryFake.h"
32*eb293b8fSAndroid Build Coastguard Worker
33*eb293b8fSAndroid Build Coastguard Worker namespace unwindstack {
34*eb293b8fSAndroid Build Coastguard Worker
35*eb293b8fSAndroid Build Coastguard Worker template <typename TypeParam>
36*eb293b8fSAndroid Build Coastguard Worker class DwarfDebugFrameTest : public ::testing::Test {
37*eb293b8fSAndroid Build Coastguard Worker protected:
SetUp()38*eb293b8fSAndroid Build Coastguard Worker void SetUp() override {
39*eb293b8fSAndroid Build Coastguard Worker fake_memory_ = new MemoryFake;
40*eb293b8fSAndroid Build Coastguard Worker std::shared_ptr<Memory> memory(fake_memory_);
41*eb293b8fSAndroid Build Coastguard Worker debug_frame_ = new DwarfDebugFrame<TypeParam>(memory);
42*eb293b8fSAndroid Build Coastguard Worker ResetLogs();
43*eb293b8fSAndroid Build Coastguard Worker }
44*eb293b8fSAndroid Build Coastguard Worker
TearDown()45*eb293b8fSAndroid Build Coastguard Worker void TearDown() override { delete debug_frame_; }
46*eb293b8fSAndroid Build Coastguard Worker
47*eb293b8fSAndroid Build Coastguard Worker MemoryFake* fake_memory_;
48*eb293b8fSAndroid Build Coastguard Worker DwarfDebugFrame<TypeParam>* debug_frame_ = nullptr;
49*eb293b8fSAndroid Build Coastguard Worker };
50*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_SUITE_P(DwarfDebugFrameTest);
51*eb293b8fSAndroid Build Coastguard Worker
52*eb293b8fSAndroid Build Coastguard Worker // NOTE: All test class variables need to be referenced as this->.
53*eb293b8fSAndroid Build Coastguard Worker
SetCie32(MemoryFake * memory,uint64_t offset,uint32_t length,std::vector<uint8_t> data)54*eb293b8fSAndroid Build Coastguard Worker static void SetCie32(MemoryFake* memory, uint64_t offset, uint32_t length,
55*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t> data) {
56*eb293b8fSAndroid Build Coastguard Worker memory->SetData32(offset, length);
57*eb293b8fSAndroid Build Coastguard Worker offset += 4;
58*eb293b8fSAndroid Build Coastguard Worker // Indicates this is a cie.
59*eb293b8fSAndroid Build Coastguard Worker memory->SetData32(offset, 0xffffffff);
60*eb293b8fSAndroid Build Coastguard Worker offset += 4;
61*eb293b8fSAndroid Build Coastguard Worker memory->SetMemory(offset, data);
62*eb293b8fSAndroid Build Coastguard Worker }
63*eb293b8fSAndroid Build Coastguard Worker
SetCie64(MemoryFake * memory,uint64_t offset,uint64_t length,std::vector<uint8_t> data)64*eb293b8fSAndroid Build Coastguard Worker static void SetCie64(MemoryFake* memory, uint64_t offset, uint64_t length,
65*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t> data) {
66*eb293b8fSAndroid Build Coastguard Worker memory->SetData32(offset, 0xffffffff);
67*eb293b8fSAndroid Build Coastguard Worker offset += 4;
68*eb293b8fSAndroid Build Coastguard Worker memory->SetData64(offset, length);
69*eb293b8fSAndroid Build Coastguard Worker offset += 8;
70*eb293b8fSAndroid Build Coastguard Worker // Indicates this is a cie.
71*eb293b8fSAndroid Build Coastguard Worker memory->SetData64(offset, 0xffffffffffffffffUL);
72*eb293b8fSAndroid Build Coastguard Worker offset += 8;
73*eb293b8fSAndroid Build Coastguard Worker memory->SetMemory(offset, data);
74*eb293b8fSAndroid Build Coastguard Worker }
75*eb293b8fSAndroid Build Coastguard Worker
SetFde32(MemoryFake * memory,uint64_t offset,uint32_t length,uint64_t cie_offset,uint32_t pc_start,uint32_t pc_length,uint64_t segment_length=0,std::vector<uint8_t> * data=nullptr)76*eb293b8fSAndroid Build Coastguard Worker static void SetFde32(MemoryFake* memory, uint64_t offset, uint32_t length, uint64_t cie_offset,
77*eb293b8fSAndroid Build Coastguard Worker uint32_t pc_start, uint32_t pc_length, uint64_t segment_length = 0,
78*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t>* data = nullptr) {
79*eb293b8fSAndroid Build Coastguard Worker memory->SetData32(offset, length);
80*eb293b8fSAndroid Build Coastguard Worker offset += 4;
81*eb293b8fSAndroid Build Coastguard Worker memory->SetData32(offset, cie_offset);
82*eb293b8fSAndroid Build Coastguard Worker offset += 4 + segment_length;
83*eb293b8fSAndroid Build Coastguard Worker memory->SetData32(offset, pc_start);
84*eb293b8fSAndroid Build Coastguard Worker offset += 4;
85*eb293b8fSAndroid Build Coastguard Worker memory->SetData32(offset, pc_length);
86*eb293b8fSAndroid Build Coastguard Worker if (data != nullptr) {
87*eb293b8fSAndroid Build Coastguard Worker offset += 4;
88*eb293b8fSAndroid Build Coastguard Worker memory->SetMemory(offset, *data);
89*eb293b8fSAndroid Build Coastguard Worker }
90*eb293b8fSAndroid Build Coastguard Worker }
91*eb293b8fSAndroid Build Coastguard Worker
SetFde64(MemoryFake * memory,uint64_t offset,uint64_t length,uint64_t cie_offset,uint64_t pc_start,uint64_t pc_length,uint64_t segment_length=0,std::vector<uint8_t> * data=nullptr)92*eb293b8fSAndroid Build Coastguard Worker static void SetFde64(MemoryFake* memory, uint64_t offset, uint64_t length, uint64_t cie_offset,
93*eb293b8fSAndroid Build Coastguard Worker uint64_t pc_start, uint64_t pc_length, uint64_t segment_length = 0,
94*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t>* data = nullptr) {
95*eb293b8fSAndroid Build Coastguard Worker memory->SetData32(offset, 0xffffffff);
96*eb293b8fSAndroid Build Coastguard Worker offset += 4;
97*eb293b8fSAndroid Build Coastguard Worker memory->SetData64(offset, length);
98*eb293b8fSAndroid Build Coastguard Worker offset += 8;
99*eb293b8fSAndroid Build Coastguard Worker memory->SetData64(offset, cie_offset);
100*eb293b8fSAndroid Build Coastguard Worker offset += 8 + segment_length;
101*eb293b8fSAndroid Build Coastguard Worker memory->SetData64(offset, pc_start);
102*eb293b8fSAndroid Build Coastguard Worker offset += 8;
103*eb293b8fSAndroid Build Coastguard Worker memory->SetData64(offset, pc_length);
104*eb293b8fSAndroid Build Coastguard Worker if (data != nullptr) {
105*eb293b8fSAndroid Build Coastguard Worker offset += 8;
106*eb293b8fSAndroid Build Coastguard Worker memory->SetMemory(offset, *data);
107*eb293b8fSAndroid Build Coastguard Worker }
108*eb293b8fSAndroid Build Coastguard Worker }
109*eb293b8fSAndroid Build Coastguard Worker
SetFourFdes32(MemoryFake * memory)110*eb293b8fSAndroid Build Coastguard Worker static void SetFourFdes32(MemoryFake* memory) {
111*eb293b8fSAndroid Build Coastguard Worker SetCie32(memory, 0x5000, 0xfc, std::vector<uint8_t>{1, '\0', 0, 0, 1});
112*eb293b8fSAndroid Build Coastguard Worker
113*eb293b8fSAndroid Build Coastguard Worker // FDE 32 information.
114*eb293b8fSAndroid Build Coastguard Worker SetFde32(memory, 0x5100, 0xfc, 0, 0x1500, 0x200);
115*eb293b8fSAndroid Build Coastguard Worker SetFde32(memory, 0x5200, 0xfc, 0, 0x2500, 0x300);
116*eb293b8fSAndroid Build Coastguard Worker
117*eb293b8fSAndroid Build Coastguard Worker // CIE 32 information.
118*eb293b8fSAndroid Build Coastguard Worker SetCie32(memory, 0x5300, 0xfc, std::vector<uint8_t>{1, '\0', 0, 0, 1});
119*eb293b8fSAndroid Build Coastguard Worker
120*eb293b8fSAndroid Build Coastguard Worker // FDE 32 information.
121*eb293b8fSAndroid Build Coastguard Worker SetFde32(memory, 0x5400, 0xfc, 0x300, 0x3500, 0x400);
122*eb293b8fSAndroid Build Coastguard Worker SetFde32(memory, 0x5500, 0xfc, 0x300, 0x4500, 0x500);
123*eb293b8fSAndroid Build Coastguard Worker }
124*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,Init_compressed)125*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, Init_compressed) {
126*eb293b8fSAndroid Build Coastguard Worker SetFourFdes32(this->fake_memory_);
127*eb293b8fSAndroid Build Coastguard Worker ASSERT_FALSE(this->debug_frame_->Init(
128*eb293b8fSAndroid Build Coastguard Worker SectionInfo{.offset = 0x5000, .size = 0x600, .flags = SHF_COMPRESSED}));
129*eb293b8fSAndroid Build Coastguard Worker }
130*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdes32)131*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdes32) {
132*eb293b8fSAndroid Build Coastguard Worker SetFourFdes32(this->fake_memory_);
133*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(this->debug_frame_->Init(SectionInfo{.offset = 0x5000, .size = 0x600}));
134*eb293b8fSAndroid Build Coastguard Worker
135*eb293b8fSAndroid Build Coastguard Worker std::vector<const DwarfFde*> fdes;
136*eb293b8fSAndroid Build Coastguard Worker this->debug_frame_->GetFdes(&fdes);
137*eb293b8fSAndroid Build Coastguard Worker
138*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(4U, fdes.size());
139*eb293b8fSAndroid Build Coastguard Worker
140*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5000U, fdes[0]->cie_offset);
141*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5110U, fdes[0]->cfa_instructions_offset);
142*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5200U, fdes[0]->cfa_instructions_end);
143*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x1500U, fdes[0]->pc_start);
144*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x1700U, fdes[0]->pc_end);
145*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fdes[0]->lsda_address);
146*eb293b8fSAndroid Build Coastguard Worker EXPECT_TRUE(fdes[0]->cie != nullptr);
147*eb293b8fSAndroid Build Coastguard Worker
148*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5000U, fdes[1]->cie_offset);
149*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5210U, fdes[1]->cfa_instructions_offset);
150*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5300U, fdes[1]->cfa_instructions_end);
151*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x2500U, fdes[1]->pc_start);
152*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x2800U, fdes[1]->pc_end);
153*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fdes[1]->lsda_address);
154*eb293b8fSAndroid Build Coastguard Worker EXPECT_TRUE(fdes[1]->cie != nullptr);
155*eb293b8fSAndroid Build Coastguard Worker
156*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5300U, fdes[2]->cie_offset);
157*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5410U, fdes[2]->cfa_instructions_offset);
158*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5500U, fdes[2]->cfa_instructions_end);
159*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x3500U, fdes[2]->pc_start);
160*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x3900U, fdes[2]->pc_end);
161*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fdes[2]->lsda_address);
162*eb293b8fSAndroid Build Coastguard Worker EXPECT_TRUE(fdes[2]->cie != nullptr);
163*eb293b8fSAndroid Build Coastguard Worker
164*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5300U, fdes[3]->cie_offset);
165*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5510U, fdes[3]->cfa_instructions_offset);
166*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5600U, fdes[3]->cfa_instructions_end);
167*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4500U, fdes[3]->pc_start);
168*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4a00U, fdes[3]->pc_end);
169*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fdes[3]->lsda_address);
170*eb293b8fSAndroid Build Coastguard Worker EXPECT_TRUE(fdes[3]->cie != nullptr);
171*eb293b8fSAndroid Build Coastguard Worker }
172*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdes32_after_GetFdeFromPc)173*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdes32_after_GetFdeFromPc) {
174*eb293b8fSAndroid Build Coastguard Worker SetFourFdes32(this->fake_memory_);
175*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(this->debug_frame_->Init(SectionInfo{.offset = 0x5000, .size = 0x600}));
176*eb293b8fSAndroid Build Coastguard Worker
177*eb293b8fSAndroid Build Coastguard Worker const DwarfFde* fde = this->debug_frame_->GetFdeFromPc(0x3600);
178*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
179*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x3500U, fde->pc_start);
180*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x3900U, fde->pc_end);
181*eb293b8fSAndroid Build Coastguard Worker
182*eb293b8fSAndroid Build Coastguard Worker std::vector<const DwarfFde*> fdes;
183*eb293b8fSAndroid Build Coastguard Worker this->debug_frame_->GetFdes(&fdes);
184*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(4U, fdes.size());
185*eb293b8fSAndroid Build Coastguard Worker
186*eb293b8fSAndroid Build Coastguard Worker // Verify that they got added in the correct order.
187*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x1500U, fdes[0]->pc_start);
188*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x1700U, fdes[0]->pc_end);
189*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x2500U, fdes[1]->pc_start);
190*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x2800U, fdes[1]->pc_end);
191*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x3500U, fdes[2]->pc_start);
192*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x3900U, fdes[2]->pc_end);
193*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4500U, fdes[3]->pc_start);
194*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4a00U, fdes[3]->pc_end);
195*eb293b8fSAndroid Build Coastguard Worker }
196*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdes32_not_in_section)197*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdes32_not_in_section) {
198*eb293b8fSAndroid Build Coastguard Worker SetFourFdes32(this->fake_memory_);
199*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(this->debug_frame_->Init(SectionInfo{.offset = 0x5000, .size = 0x500}));
200*eb293b8fSAndroid Build Coastguard Worker
201*eb293b8fSAndroid Build Coastguard Worker std::vector<const DwarfFde*> fdes;
202*eb293b8fSAndroid Build Coastguard Worker this->debug_frame_->GetFdes(&fdes);
203*eb293b8fSAndroid Build Coastguard Worker
204*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(3U, fdes.size());
205*eb293b8fSAndroid Build Coastguard Worker }
206*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdes32_big_function_address)207*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdes32_big_function_address) {
208*eb293b8fSAndroid Build Coastguard Worker SetCie32(this->fake_memory_, 0x5000, 0xfc, std::vector<uint8_t>{1, '\0', 0, 0, 1});
209*eb293b8fSAndroid Build Coastguard Worker SetFde32(this->fake_memory_, 0x5100, 0xfc, 0, 0xe9ad9b1f, 0x200);
210*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(this->debug_frame_->Init(SectionInfo{.offset = 0x5000, .size = 0x200}));
211*eb293b8fSAndroid Build Coastguard Worker
212*eb293b8fSAndroid Build Coastguard Worker std::vector<const DwarfFde*> fdes;
213*eb293b8fSAndroid Build Coastguard Worker this->debug_frame_->GetFdes(&fdes);
214*eb293b8fSAndroid Build Coastguard Worker
215*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(1U, fdes.size());
216*eb293b8fSAndroid Build Coastguard Worker
217*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5000U, fdes[0]->cie_offset);
218*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5110U, fdes[0]->cfa_instructions_offset);
219*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5200U, fdes[0]->cfa_instructions_end);
220*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0xe9ad9b1fU, fdes[0]->pc_start);
221*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0xe9ad9d1fU, fdes[0]->pc_end);
222*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fdes[0]->lsda_address);
223*eb293b8fSAndroid Build Coastguard Worker EXPECT_TRUE(fdes[0]->cie != nullptr);
224*eb293b8fSAndroid Build Coastguard Worker }
225*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdeFromPc32)226*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdeFromPc32) {
227*eb293b8fSAndroid Build Coastguard Worker SetFourFdes32(this->fake_memory_);
228*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(this->debug_frame_->Init(SectionInfo{.offset = 0x5000, .size = 0x600}));
229*eb293b8fSAndroid Build Coastguard Worker
230*eb293b8fSAndroid Build Coastguard Worker const DwarfFde* fde = this->debug_frame_->GetFdeFromPc(0x1600);
231*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
232*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x1500U, fde->pc_start);
233*eb293b8fSAndroid Build Coastguard Worker
234*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x2600);
235*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
236*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x2500U, fde->pc_start);
237*eb293b8fSAndroid Build Coastguard Worker
238*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x3600);
239*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
240*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x3500U, fde->pc_start);
241*eb293b8fSAndroid Build Coastguard Worker
242*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x4600);
243*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
244*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4500U, fde->pc_start);
245*eb293b8fSAndroid Build Coastguard Worker
246*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0);
247*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde == nullptr);
248*eb293b8fSAndroid Build Coastguard Worker }
249*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdeFromPc32_reverse)250*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdeFromPc32_reverse) {
251*eb293b8fSAndroid Build Coastguard Worker SetFourFdes32(this->fake_memory_);
252*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(this->debug_frame_->Init(SectionInfo{.offset = 0x5000, .size = 0x600}));
253*eb293b8fSAndroid Build Coastguard Worker
254*eb293b8fSAndroid Build Coastguard Worker const DwarfFde* fde = this->debug_frame_->GetFdeFromPc(0x4600);
255*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
256*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4500U, fde->pc_start);
257*eb293b8fSAndroid Build Coastguard Worker
258*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x3600);
259*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
260*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x3500U, fde->pc_start);
261*eb293b8fSAndroid Build Coastguard Worker
262*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x2600);
263*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
264*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x2500U, fde->pc_start);
265*eb293b8fSAndroid Build Coastguard Worker
266*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x1600);
267*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
268*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x1500U, fde->pc_start);
269*eb293b8fSAndroid Build Coastguard Worker
270*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0);
271*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde == nullptr);
272*eb293b8fSAndroid Build Coastguard Worker }
273*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdeFromPc32_not_in_section)274*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdeFromPc32_not_in_section) {
275*eb293b8fSAndroid Build Coastguard Worker SetFourFdes32(this->fake_memory_);
276*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(this->debug_frame_->Init(SectionInfo{.offset = 0x5000, .size = 0x500}));
277*eb293b8fSAndroid Build Coastguard Worker
278*eb293b8fSAndroid Build Coastguard Worker const DwarfFde* fde = this->debug_frame_->GetFdeFromPc(0x4600);
279*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde == nullptr);
280*eb293b8fSAndroid Build Coastguard Worker }
281*eb293b8fSAndroid Build Coastguard Worker
SetFourFdes64(MemoryFake * memory)282*eb293b8fSAndroid Build Coastguard Worker static void SetFourFdes64(MemoryFake* memory) {
283*eb293b8fSAndroid Build Coastguard Worker // CIE 64 information.
284*eb293b8fSAndroid Build Coastguard Worker SetCie64(memory, 0x5000, 0xf4, std::vector<uint8_t>{1, '\0', 0, 0, 1});
285*eb293b8fSAndroid Build Coastguard Worker
286*eb293b8fSAndroid Build Coastguard Worker // FDE 64 information.
287*eb293b8fSAndroid Build Coastguard Worker SetFde64(memory, 0x5100, 0xf4, 0, 0x1500, 0x200);
288*eb293b8fSAndroid Build Coastguard Worker SetFde64(memory, 0x5200, 0xf4, 0, 0x2500, 0x300);
289*eb293b8fSAndroid Build Coastguard Worker
290*eb293b8fSAndroid Build Coastguard Worker // CIE 64 information.
291*eb293b8fSAndroid Build Coastguard Worker SetCie64(memory, 0x5300, 0xf4, std::vector<uint8_t>{1, '\0', 0, 0, 1});
292*eb293b8fSAndroid Build Coastguard Worker
293*eb293b8fSAndroid Build Coastguard Worker // FDE 64 information.
294*eb293b8fSAndroid Build Coastguard Worker SetFde64(memory, 0x5400, 0xf4, 0x300, 0x3500, 0x400);
295*eb293b8fSAndroid Build Coastguard Worker SetFde64(memory, 0x5500, 0xf4, 0x300, 0x4500, 0x500);
296*eb293b8fSAndroid Build Coastguard Worker }
297*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdes64)298*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdes64) {
299*eb293b8fSAndroid Build Coastguard Worker SetFourFdes64(this->fake_memory_);
300*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(this->debug_frame_->Init(SectionInfo{.offset = 0x5000, .size = 0x600}));
301*eb293b8fSAndroid Build Coastguard Worker
302*eb293b8fSAndroid Build Coastguard Worker std::vector<const DwarfFde*> fdes;
303*eb293b8fSAndroid Build Coastguard Worker this->debug_frame_->GetFdes(&fdes);
304*eb293b8fSAndroid Build Coastguard Worker
305*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(4U, fdes.size());
306*eb293b8fSAndroid Build Coastguard Worker
307*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5000U, fdes[0]->cie_offset);
308*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5124U, fdes[0]->cfa_instructions_offset);
309*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5200U, fdes[0]->cfa_instructions_end);
310*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x1500U, fdes[0]->pc_start);
311*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x1700U, fdes[0]->pc_end);
312*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fdes[0]->lsda_address);
313*eb293b8fSAndroid Build Coastguard Worker EXPECT_TRUE(fdes[0]->cie != nullptr);
314*eb293b8fSAndroid Build Coastguard Worker
315*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5000U, fdes[1]->cie_offset);
316*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5224U, fdes[1]->cfa_instructions_offset);
317*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5300U, fdes[1]->cfa_instructions_end);
318*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x2500U, fdes[1]->pc_start);
319*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x2800U, fdes[1]->pc_end);
320*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fdes[1]->lsda_address);
321*eb293b8fSAndroid Build Coastguard Worker EXPECT_TRUE(fdes[1]->cie != nullptr);
322*eb293b8fSAndroid Build Coastguard Worker
323*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5300U, fdes[2]->cie_offset);
324*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5424U, fdes[2]->cfa_instructions_offset);
325*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5500U, fdes[2]->cfa_instructions_end);
326*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x3500U, fdes[2]->pc_start);
327*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x3900U, fdes[2]->pc_end);
328*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fdes[2]->lsda_address);
329*eb293b8fSAndroid Build Coastguard Worker EXPECT_TRUE(fdes[2]->cie != nullptr);
330*eb293b8fSAndroid Build Coastguard Worker
331*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5300U, fdes[3]->cie_offset);
332*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5524U, fdes[3]->cfa_instructions_offset);
333*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5600U, fdes[3]->cfa_instructions_end);
334*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4500U, fdes[3]->pc_start);
335*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4a00U, fdes[3]->pc_end);
336*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fdes[3]->lsda_address);
337*eb293b8fSAndroid Build Coastguard Worker EXPECT_TRUE(fdes[3]->cie != nullptr);
338*eb293b8fSAndroid Build Coastguard Worker }
339*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdes64_after_GetFdeFromPc)340*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdes64_after_GetFdeFromPc) {
341*eb293b8fSAndroid Build Coastguard Worker SetFourFdes64(this->fake_memory_);
342*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(this->debug_frame_->Init(SectionInfo{.offset = 0x5000, .size = 0x600}));
343*eb293b8fSAndroid Build Coastguard Worker
344*eb293b8fSAndroid Build Coastguard Worker const DwarfFde* fde = this->debug_frame_->GetFdeFromPc(0x2600);
345*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
346*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x2500U, fde->pc_start);
347*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x2800U, fde->pc_end);
348*eb293b8fSAndroid Build Coastguard Worker
349*eb293b8fSAndroid Build Coastguard Worker std::vector<const DwarfFde*> fdes;
350*eb293b8fSAndroid Build Coastguard Worker this->debug_frame_->GetFdes(&fdes);
351*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(4U, fdes.size());
352*eb293b8fSAndroid Build Coastguard Worker
353*eb293b8fSAndroid Build Coastguard Worker // Verify that they got added in the correct order.
354*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x1500U, fdes[0]->pc_start);
355*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x1700U, fdes[0]->pc_end);
356*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x2500U, fdes[1]->pc_start);
357*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x2800U, fdes[1]->pc_end);
358*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x3500U, fdes[2]->pc_start);
359*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x3900U, fdes[2]->pc_end);
360*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4500U, fdes[3]->pc_start);
361*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4a00U, fdes[3]->pc_end);
362*eb293b8fSAndroid Build Coastguard Worker }
363*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdes64_not_in_section)364*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdes64_not_in_section) {
365*eb293b8fSAndroid Build Coastguard Worker SetFourFdes64(this->fake_memory_);
366*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(this->debug_frame_->Init(SectionInfo{.offset = 0x5000, .size = 0x500}));
367*eb293b8fSAndroid Build Coastguard Worker
368*eb293b8fSAndroid Build Coastguard Worker std::vector<const DwarfFde*> fdes;
369*eb293b8fSAndroid Build Coastguard Worker this->debug_frame_->GetFdes(&fdes);
370*eb293b8fSAndroid Build Coastguard Worker
371*eb293b8fSAndroid Build Coastguard Worker ASSERT_EQ(3U, fdes.size());
372*eb293b8fSAndroid Build Coastguard Worker }
373*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdeFromPc64)374*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdeFromPc64) {
375*eb293b8fSAndroid Build Coastguard Worker SetFourFdes64(this->fake_memory_);
376*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(this->debug_frame_->Init(SectionInfo{.offset = 0x5000, .size = 0x600}));
377*eb293b8fSAndroid Build Coastguard Worker
378*eb293b8fSAndroid Build Coastguard Worker const DwarfFde* fde = this->debug_frame_->GetFdeFromPc(0x1600);
379*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
380*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x1500U, fde->pc_start);
381*eb293b8fSAndroid Build Coastguard Worker
382*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x2600);
383*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
384*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x2500U, fde->pc_start);
385*eb293b8fSAndroid Build Coastguard Worker
386*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x3600);
387*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
388*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x3500U, fde->pc_start);
389*eb293b8fSAndroid Build Coastguard Worker
390*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x4600);
391*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
392*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4500U, fde->pc_start);
393*eb293b8fSAndroid Build Coastguard Worker
394*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0);
395*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde == nullptr);
396*eb293b8fSAndroid Build Coastguard Worker }
397*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdeFromPc64_reverse)398*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdeFromPc64_reverse) {
399*eb293b8fSAndroid Build Coastguard Worker SetFourFdes64(this->fake_memory_);
400*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(this->debug_frame_->Init(SectionInfo{.offset = 0x5000, .size = 0x600}));
401*eb293b8fSAndroid Build Coastguard Worker
402*eb293b8fSAndroid Build Coastguard Worker const DwarfFde* fde = this->debug_frame_->GetFdeFromPc(0x4600);
403*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
404*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4500U, fde->pc_start);
405*eb293b8fSAndroid Build Coastguard Worker
406*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x3600);
407*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
408*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x3500U, fde->pc_start);
409*eb293b8fSAndroid Build Coastguard Worker
410*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x2600);
411*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
412*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x2500U, fde->pc_start);
413*eb293b8fSAndroid Build Coastguard Worker
414*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x1600);
415*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
416*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x1500U, fde->pc_start);
417*eb293b8fSAndroid Build Coastguard Worker
418*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0);
419*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde == nullptr);
420*eb293b8fSAndroid Build Coastguard Worker }
421*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdeFromPc64_not_in_section)422*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdeFromPc64_not_in_section) {
423*eb293b8fSAndroid Build Coastguard Worker SetFourFdes64(this->fake_memory_);
424*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(this->debug_frame_->Init(SectionInfo{.offset = 0x5000, .size = 0x500}));
425*eb293b8fSAndroid Build Coastguard Worker
426*eb293b8fSAndroid Build Coastguard Worker const DwarfFde* fde = this->debug_frame_->GetFdeFromPc(0x4600);
427*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde == nullptr);
428*eb293b8fSAndroid Build Coastguard Worker }
429*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetCieFde32)430*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetCieFde32) {
431*eb293b8fSAndroid Build Coastguard Worker SetCie32(this->fake_memory_, 0xf000, 0x100, std::vector<uint8_t>{1, '\0', 4, 8, 0x20});
432*eb293b8fSAndroid Build Coastguard Worker SetFde32(this->fake_memory_, 0x14000, 0x20, 0xf000, 0x9000, 0x100);
433*eb293b8fSAndroid Build Coastguard Worker
434*eb293b8fSAndroid Build Coastguard Worker const DwarfFde* fde = this->debug_frame_->GetFdeFromOffset(0x14000);
435*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
436*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x14010U, fde->cfa_instructions_offset);
437*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x14024U, fde->cfa_instructions_end);
438*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x9000U, fde->pc_start);
439*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x9100U, fde->pc_end);
440*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0xf000U, fde->cie_offset);
441*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fde->lsda_address);
442*eb293b8fSAndroid Build Coastguard Worker
443*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde->cie != nullptr);
444*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(1U, fde->cie->version);
445*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DW_EH_PE_udata4, fde->cie->fde_address_encoding);
446*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DW_EH_PE_omit, fde->cie->lsda_encoding);
447*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fde->cie->segment_size);
448*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(1U, fde->cie->augmentation_string.size());
449*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ('\0', fde->cie->augmentation_string[0]);
450*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fde->cie->personality_handler);
451*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0xf00dU, fde->cie->cfa_instructions_offset);
452*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0xf104U, fde->cie->cfa_instructions_end);
453*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(4U, fde->cie->code_alignment_factor);
454*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(8, fde->cie->data_alignment_factor);
455*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x20U, fde->cie->return_address_register);
456*eb293b8fSAndroid Build Coastguard Worker }
457*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetCieFde64)458*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetCieFde64) {
459*eb293b8fSAndroid Build Coastguard Worker SetCie64(this->fake_memory_, 0x6000, 0x100, std::vector<uint8_t>{1, '\0', 4, 8, 0x20});
460*eb293b8fSAndroid Build Coastguard Worker SetFde64(this->fake_memory_, 0x8000, 0x200, 0x6000, 0x5000, 0x300);
461*eb293b8fSAndroid Build Coastguard Worker
462*eb293b8fSAndroid Build Coastguard Worker const DwarfFde* fde = this->debug_frame_->GetFdeFromOffset(0x8000);
463*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
464*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x8024U, fde->cfa_instructions_offset);
465*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x820cU, fde->cfa_instructions_end);
466*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5000U, fde->pc_start);
467*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5300U, fde->pc_end);
468*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x6000U, fde->cie_offset);
469*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fde->lsda_address);
470*eb293b8fSAndroid Build Coastguard Worker
471*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde->cie != nullptr);
472*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(1U, fde->cie->version);
473*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DW_EH_PE_udata8, fde->cie->fde_address_encoding);
474*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DW_EH_PE_omit, fde->cie->lsda_encoding);
475*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fde->cie->segment_size);
476*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(1U, fde->cie->augmentation_string.size());
477*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ('\0', fde->cie->augmentation_string[0]);
478*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fde->cie->personality_handler);
479*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x6019U, fde->cie->cfa_instructions_offset);
480*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x610cU, fde->cie->cfa_instructions_end);
481*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(4U, fde->cie->code_alignment_factor);
482*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(8, fde->cie->data_alignment_factor);
483*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x20U, fde->cie->return_address_register);
484*eb293b8fSAndroid Build Coastguard Worker }
485*eb293b8fSAndroid Build Coastguard Worker
VerifyCieVersion(const DwarfCie * cie,uint8_t version,uint8_t segment_size,uint8_t fde_encoding,uint64_t return_address,uint64_t start_offset,uint64_t end_offset)486*eb293b8fSAndroid Build Coastguard Worker static void VerifyCieVersion(const DwarfCie* cie, uint8_t version, uint8_t segment_size,
487*eb293b8fSAndroid Build Coastguard Worker uint8_t fde_encoding, uint64_t return_address, uint64_t start_offset,
488*eb293b8fSAndroid Build Coastguard Worker uint64_t end_offset) {
489*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(version, cie->version);
490*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(fde_encoding, cie->fde_address_encoding);
491*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DW_EH_PE_omit, cie->lsda_encoding);
492*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(segment_size, cie->segment_size);
493*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(1U, cie->augmentation_string.size());
494*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ('\0', cie->augmentation_string[0]);
495*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, cie->personality_handler);
496*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(4U, cie->code_alignment_factor);
497*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(8, cie->data_alignment_factor);
498*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(return_address, cie->return_address_register);
499*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5000U + start_offset, cie->cfa_instructions_offset);
500*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5000U + end_offset, cie->cfa_instructions_end);
501*eb293b8fSAndroid Build Coastguard Worker }
502*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetCieFromOffset32_cie_cached)503*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetCieFromOffset32_cie_cached) {
504*eb293b8fSAndroid Build Coastguard Worker SetCie32(this->fake_memory_, 0x5000, 0x100, std::vector<uint8_t>{1, '\0', 4, 8, 0x20});
505*eb293b8fSAndroid Build Coastguard Worker const DwarfCie* cie = this->debug_frame_->GetCieFromOffset(0x5000);
506*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_NONE, this->debug_frame_->LastErrorCode());
507*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(cie != nullptr);
508*eb293b8fSAndroid Build Coastguard Worker VerifyCieVersion(cie, 1, 0, DW_EH_PE_udata4, 0x20, 0xd, 0x104);
509*eb293b8fSAndroid Build Coastguard Worker
510*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t> zero(0x100, 0);
511*eb293b8fSAndroid Build Coastguard Worker this->fake_memory_->SetMemory(0x5000, zero);
512*eb293b8fSAndroid Build Coastguard Worker cie = this->debug_frame_->GetCieFromOffset(0x5000);
513*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_NONE, this->debug_frame_->LastErrorCode());
514*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(cie != nullptr);
515*eb293b8fSAndroid Build Coastguard Worker VerifyCieVersion(cie, 1, 0, DW_EH_PE_udata4, 0x20, 0xd, 0x104);
516*eb293b8fSAndroid Build Coastguard Worker }
517*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetCieFromOffset64_cie_cached)518*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetCieFromOffset64_cie_cached) {
519*eb293b8fSAndroid Build Coastguard Worker SetCie64(this->fake_memory_, 0x5000, 0x100, std::vector<uint8_t>{1, '\0', 4, 8, 0x20});
520*eb293b8fSAndroid Build Coastguard Worker const DwarfCie* cie = this->debug_frame_->GetCieFromOffset(0x5000);
521*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_NONE, this->debug_frame_->LastErrorCode());
522*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(cie != nullptr);
523*eb293b8fSAndroid Build Coastguard Worker VerifyCieVersion(cie, 1, 0, DW_EH_PE_udata8, 0x20, 0x19, 0x10c);
524*eb293b8fSAndroid Build Coastguard Worker
525*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t> zero(0x100, 0);
526*eb293b8fSAndroid Build Coastguard Worker this->fake_memory_->SetMemory(0x5000, zero);
527*eb293b8fSAndroid Build Coastguard Worker cie = this->debug_frame_->GetCieFromOffset(0x5000);
528*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_NONE, this->debug_frame_->LastErrorCode());
529*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(cie != nullptr);
530*eb293b8fSAndroid Build Coastguard Worker VerifyCieVersion(cie, 1, 0, DW_EH_PE_udata8, 0x20, 0x19, 0x10c);
531*eb293b8fSAndroid Build Coastguard Worker }
532*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetCieFromOffset32_version1)533*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetCieFromOffset32_version1) {
534*eb293b8fSAndroid Build Coastguard Worker SetCie32(this->fake_memory_, 0x5000, 0x100, std::vector<uint8_t>{1, '\0', 4, 8, 0x20});
535*eb293b8fSAndroid Build Coastguard Worker const DwarfCie* cie = this->debug_frame_->GetCieFromOffset(0x5000);
536*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_NONE, this->debug_frame_->LastErrorCode());
537*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(cie != nullptr);
538*eb293b8fSAndroid Build Coastguard Worker VerifyCieVersion(cie, 1, 0, DW_EH_PE_udata4, 0x20, 0xd, 0x104);
539*eb293b8fSAndroid Build Coastguard Worker }
540*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetCieFromOffset64_version1)541*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetCieFromOffset64_version1) {
542*eb293b8fSAndroid Build Coastguard Worker SetCie64(this->fake_memory_, 0x5000, 0x100, std::vector<uint8_t>{1, '\0', 4, 8, 0x20});
543*eb293b8fSAndroid Build Coastguard Worker const DwarfCie* cie = this->debug_frame_->GetCieFromOffset(0x5000);
544*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_NONE, this->debug_frame_->LastErrorCode());
545*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(cie != nullptr);
546*eb293b8fSAndroid Build Coastguard Worker VerifyCieVersion(cie, 1, 0, DW_EH_PE_udata8, 0x20, 0x19, 0x10c);
547*eb293b8fSAndroid Build Coastguard Worker }
548*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetCieFromOffset32_version3)549*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetCieFromOffset32_version3) {
550*eb293b8fSAndroid Build Coastguard Worker SetCie32(this->fake_memory_, 0x5000, 0x100, std::vector<uint8_t>{3, '\0', 4, 8, 0x81, 3});
551*eb293b8fSAndroid Build Coastguard Worker const DwarfCie* cie = this->debug_frame_->GetCieFromOffset(0x5000);
552*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_NONE, this->debug_frame_->LastErrorCode());
553*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(cie != nullptr);
554*eb293b8fSAndroid Build Coastguard Worker VerifyCieVersion(cie, 3, 0, DW_EH_PE_udata4, 0x181, 0xe, 0x104);
555*eb293b8fSAndroid Build Coastguard Worker }
556*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetCieFromOffset64_version3)557*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetCieFromOffset64_version3) {
558*eb293b8fSAndroid Build Coastguard Worker SetCie64(this->fake_memory_, 0x5000, 0x100, std::vector<uint8_t>{3, '\0', 4, 8, 0x81, 3});
559*eb293b8fSAndroid Build Coastguard Worker const DwarfCie* cie = this->debug_frame_->GetCieFromOffset(0x5000);
560*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_NONE, this->debug_frame_->LastErrorCode());
561*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(cie != nullptr);
562*eb293b8fSAndroid Build Coastguard Worker VerifyCieVersion(cie, 3, 0, DW_EH_PE_udata8, 0x181, 0x1a, 0x10c);
563*eb293b8fSAndroid Build Coastguard Worker }
564*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetCieFromOffset32_version4_32bit_address)565*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetCieFromOffset32_version4_32bit_address) {
566*eb293b8fSAndroid Build Coastguard Worker SetCie32(this->fake_memory_, 0x5000, 0x100, std::vector<uint8_t>{4, '\0', 4, 10, 4, 8, 0x81, 3});
567*eb293b8fSAndroid Build Coastguard Worker const DwarfCie* cie = this->debug_frame_->GetCieFromOffset(0x5000);
568*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_NONE, this->debug_frame_->LastErrorCode());
569*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(cie != nullptr);
570*eb293b8fSAndroid Build Coastguard Worker VerifyCieVersion(cie, 4, 10, DW_EH_PE_udata4, 0x181, 0x10, 0x104);
571*eb293b8fSAndroid Build Coastguard Worker }
572*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetCieFromOffset32_version4_64bit_address)573*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetCieFromOffset32_version4_64bit_address) {
574*eb293b8fSAndroid Build Coastguard Worker SetCie32(this->fake_memory_, 0x5000, 0x100, std::vector<uint8_t>{4, '\0', 8, 10, 4, 8, 0x81, 3});
575*eb293b8fSAndroid Build Coastguard Worker const DwarfCie* cie = this->debug_frame_->GetCieFromOffset(0x5000);
576*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_NONE, this->debug_frame_->LastErrorCode());
577*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(cie != nullptr);
578*eb293b8fSAndroid Build Coastguard Worker VerifyCieVersion(cie, 4, 10, DW_EH_PE_udata8, 0x181, 0x10, 0x104);
579*eb293b8fSAndroid Build Coastguard Worker }
580*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetCieFromOffset64_version4_32bit_address)581*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetCieFromOffset64_version4_32bit_address) {
582*eb293b8fSAndroid Build Coastguard Worker SetCie64(this->fake_memory_, 0x5000, 0x100, std::vector<uint8_t>{4, '\0', 4, 10, 4, 8, 0x81, 3});
583*eb293b8fSAndroid Build Coastguard Worker const DwarfCie* cie = this->debug_frame_->GetCieFromOffset(0x5000);
584*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_NONE, this->debug_frame_->LastErrorCode());
585*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(cie != nullptr);
586*eb293b8fSAndroid Build Coastguard Worker VerifyCieVersion(cie, 4, 10, DW_EH_PE_udata4, 0x181, 0x1c, 0x10c);
587*eb293b8fSAndroid Build Coastguard Worker }
588*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetCieFromOffset64_version4_64bit_address)589*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetCieFromOffset64_version4_64bit_address) {
590*eb293b8fSAndroid Build Coastguard Worker SetCie64(this->fake_memory_, 0x5000, 0x100, std::vector<uint8_t>{4, '\0', 8, 10, 4, 8, 0x81, 3});
591*eb293b8fSAndroid Build Coastguard Worker const DwarfCie* cie = this->debug_frame_->GetCieFromOffset(0x5000);
592*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_NONE, this->debug_frame_->LastErrorCode());
593*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(cie != nullptr);
594*eb293b8fSAndroid Build Coastguard Worker VerifyCieVersion(cie, 4, 10, DW_EH_PE_udata8, 0x181, 0x1c, 0x10c);
595*eb293b8fSAndroid Build Coastguard Worker }
596*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetCieFromOffset32_version5)597*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetCieFromOffset32_version5) {
598*eb293b8fSAndroid Build Coastguard Worker SetCie32(this->fake_memory_, 0x5000, 0x100, std::vector<uint8_t>{5, '\0', 4, 10, 4, 8, 0x81, 3});
599*eb293b8fSAndroid Build Coastguard Worker const DwarfCie* cie = this->debug_frame_->GetCieFromOffset(0x5000);
600*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_NONE, this->debug_frame_->LastErrorCode());
601*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(cie != nullptr);
602*eb293b8fSAndroid Build Coastguard Worker VerifyCieVersion(cie, 5, 10, DW_EH_PE_udata4, 0x181, 0x10, 0x104);
603*eb293b8fSAndroid Build Coastguard Worker }
604*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetCieFromOffset64_version5)605*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetCieFromOffset64_version5) {
606*eb293b8fSAndroid Build Coastguard Worker SetCie64(this->fake_memory_, 0x5000, 0x100, std::vector<uint8_t>{5, '\0', 8, 10, 4, 8, 0x81, 3});
607*eb293b8fSAndroid Build Coastguard Worker const DwarfCie* cie = this->debug_frame_->GetCieFromOffset(0x5000);
608*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_NONE, this->debug_frame_->LastErrorCode());
609*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(cie != nullptr);
610*eb293b8fSAndroid Build Coastguard Worker VerifyCieVersion(cie, 5, 10, DW_EH_PE_udata8, 0x181, 0x1c, 0x10c);
611*eb293b8fSAndroid Build Coastguard Worker }
612*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetCieFromOffset_version_invalid)613*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetCieFromOffset_version_invalid) {
614*eb293b8fSAndroid Build Coastguard Worker SetCie32(this->fake_memory_, 0x5000, 0x100, std::vector<uint8_t>{0, '\0', 1, 2, 3, 4, 5, 6, 7});
615*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(this->debug_frame_->GetCieFromOffset(0x5000) == nullptr);
616*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_UNSUPPORTED_VERSION, this->debug_frame_->LastErrorCode());
617*eb293b8fSAndroid Build Coastguard Worker SetCie64(this->fake_memory_, 0x6000, 0x100, std::vector<uint8_t>{0, '\0', 1, 2, 3, 4, 5, 6, 7});
618*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(this->debug_frame_->GetCieFromOffset(0x6000) == nullptr);
619*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_UNSUPPORTED_VERSION, this->debug_frame_->LastErrorCode());
620*eb293b8fSAndroid Build Coastguard Worker
621*eb293b8fSAndroid Build Coastguard Worker SetCie32(this->fake_memory_, 0x7000, 0x100, std::vector<uint8_t>{6, '\0', 1, 2, 3, 4, 5, 6, 7});
622*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(this->debug_frame_->GetCieFromOffset(0x7000) == nullptr);
623*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_UNSUPPORTED_VERSION, this->debug_frame_->LastErrorCode());
624*eb293b8fSAndroid Build Coastguard Worker SetCie64(this->fake_memory_, 0x8000, 0x100, std::vector<uint8_t>{6, '\0', 1, 2, 3, 4, 5, 6, 7});
625*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(this->debug_frame_->GetCieFromOffset(0x8000) == nullptr);
626*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DWARF_ERROR_UNSUPPORTED_VERSION, this->debug_frame_->LastErrorCode());
627*eb293b8fSAndroid Build Coastguard Worker }
628*eb293b8fSAndroid Build Coastguard Worker
VerifyCieAugment(const DwarfCie * cie,uint64_t inst_offset,uint64_t inst_end)629*eb293b8fSAndroid Build Coastguard Worker static void VerifyCieAugment(const DwarfCie* cie, uint64_t inst_offset, uint64_t inst_end) {
630*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(1U, cie->version);
631*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DW_EH_PE_udata2, cie->fde_address_encoding);
632*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(DW_EH_PE_textrel | DW_EH_PE_udata2, cie->lsda_encoding);
633*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, cie->segment_size);
634*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(5U, cie->augmentation_string.size());
635*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ('z', cie->augmentation_string[0]);
636*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ('L', cie->augmentation_string[1]);
637*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ('P', cie->augmentation_string[2]);
638*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ('R', cie->augmentation_string[3]);
639*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ('\0', cie->augmentation_string[4]);
640*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x12345678U, cie->personality_handler);
641*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(4U, cie->code_alignment_factor);
642*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(8, cie->data_alignment_factor);
643*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x10U, cie->return_address_register);
644*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(inst_offset, cie->cfa_instructions_offset);
645*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(inst_end, cie->cfa_instructions_end);
646*eb293b8fSAndroid Build Coastguard Worker }
647*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetCieFromOffset32_augment)648*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetCieFromOffset32_augment) {
649*eb293b8fSAndroid Build Coastguard Worker SetCie32(this->fake_memory_, 0x5000, 0x100,
650*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t>{/* version */ 1,
651*eb293b8fSAndroid Build Coastguard Worker /* augment string */ 'z', 'L', 'P', 'R', '\0',
652*eb293b8fSAndroid Build Coastguard Worker /* code alignment factor */ 4,
653*eb293b8fSAndroid Build Coastguard Worker /* data alignment factor */ 8,
654*eb293b8fSAndroid Build Coastguard Worker /* return address register */ 0x10,
655*eb293b8fSAndroid Build Coastguard Worker /* augment length */ 0xf,
656*eb293b8fSAndroid Build Coastguard Worker /* L data */ DW_EH_PE_textrel | DW_EH_PE_udata2,
657*eb293b8fSAndroid Build Coastguard Worker /* P data */ DW_EH_PE_udata4, 0x78, 0x56, 0x34, 0x12,
658*eb293b8fSAndroid Build Coastguard Worker /* R data */ DW_EH_PE_udata2});
659*eb293b8fSAndroid Build Coastguard Worker
660*eb293b8fSAndroid Build Coastguard Worker const DwarfCie* cie = this->debug_frame_->GetCieFromOffset(0x5000);
661*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(cie != nullptr);
662*eb293b8fSAndroid Build Coastguard Worker VerifyCieAugment(cie, 0x5021, 0x5104);
663*eb293b8fSAndroid Build Coastguard Worker }
664*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetCieFromOffset64_augment)665*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetCieFromOffset64_augment) {
666*eb293b8fSAndroid Build Coastguard Worker SetCie64(this->fake_memory_, 0x5000, 0x100,
667*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t>{/* version */ 1,
668*eb293b8fSAndroid Build Coastguard Worker /* augment string */ 'z', 'L', 'P', 'R', '\0',
669*eb293b8fSAndroid Build Coastguard Worker /* code alignment factor */ 4,
670*eb293b8fSAndroid Build Coastguard Worker /* data alignment factor */ 8,
671*eb293b8fSAndroid Build Coastguard Worker /* return address register */ 0x10,
672*eb293b8fSAndroid Build Coastguard Worker /* augment length */ 0xf,
673*eb293b8fSAndroid Build Coastguard Worker /* L data */ DW_EH_PE_textrel | DW_EH_PE_udata2,
674*eb293b8fSAndroid Build Coastguard Worker /* P data */ DW_EH_PE_udata4, 0x78, 0x56, 0x34, 0x12,
675*eb293b8fSAndroid Build Coastguard Worker /* R data */ DW_EH_PE_udata2});
676*eb293b8fSAndroid Build Coastguard Worker
677*eb293b8fSAndroid Build Coastguard Worker const DwarfCie* cie = this->debug_frame_->GetCieFromOffset(0x5000);
678*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(cie != nullptr);
679*eb293b8fSAndroid Build Coastguard Worker VerifyCieAugment(cie, 0x502d, 0x510c);
680*eb293b8fSAndroid Build Coastguard Worker }
681*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdeFromOffset32_augment)682*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdeFromOffset32_augment) {
683*eb293b8fSAndroid Build Coastguard Worker SetCie32(this->fake_memory_, 0x5000, 0xfc,
684*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t>{/* version */ 4,
685*eb293b8fSAndroid Build Coastguard Worker /* augment string */ 'z', '\0',
686*eb293b8fSAndroid Build Coastguard Worker /* address size */ 4,
687*eb293b8fSAndroid Build Coastguard Worker /* segment size */ 0x10,
688*eb293b8fSAndroid Build Coastguard Worker /* code alignment factor */ 16,
689*eb293b8fSAndroid Build Coastguard Worker /* data alignment factor */ 32,
690*eb293b8fSAndroid Build Coastguard Worker /* return address register */ 10,
691*eb293b8fSAndroid Build Coastguard Worker /* augment length */ 0x0});
692*eb293b8fSAndroid Build Coastguard Worker
693*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t> data{/* augment length */ 0x80, 0x3};
694*eb293b8fSAndroid Build Coastguard Worker SetFde32(this->fake_memory_, 0x5200, 0x300, 0x5000, 0x4300, 0x300, 0x10, &data);
695*eb293b8fSAndroid Build Coastguard Worker
696*eb293b8fSAndroid Build Coastguard Worker const DwarfFde* fde = this->debug_frame_->GetFdeFromOffset(0x5200);
697*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
698*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde->cie != nullptr);
699*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(4U, fde->cie->version);
700*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5000U, fde->cie_offset);
701*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x53a2U, fde->cfa_instructions_offset);
702*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5504U, fde->cfa_instructions_end);
703*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4300U, fde->pc_start);
704*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4600U, fde->pc_end);
705*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fde->lsda_address);
706*eb293b8fSAndroid Build Coastguard Worker }
707*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdeFromOffset64_augment)708*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdeFromOffset64_augment) {
709*eb293b8fSAndroid Build Coastguard Worker SetCie64(this->fake_memory_, 0x5000, 0xfc,
710*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t>{/* version */ 4,
711*eb293b8fSAndroid Build Coastguard Worker /* augment string */ 'z', '\0',
712*eb293b8fSAndroid Build Coastguard Worker /* address size */ 8,
713*eb293b8fSAndroid Build Coastguard Worker /* segment size */ 0x10,
714*eb293b8fSAndroid Build Coastguard Worker /* code alignment factor */ 16,
715*eb293b8fSAndroid Build Coastguard Worker /* data alignment factor */ 32,
716*eb293b8fSAndroid Build Coastguard Worker /* return address register */ 10,
717*eb293b8fSAndroid Build Coastguard Worker /* augment length */ 0x0});
718*eb293b8fSAndroid Build Coastguard Worker
719*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t> data{/* augment length */ 0x80, 0x3};
720*eb293b8fSAndroid Build Coastguard Worker SetFde64(this->fake_memory_, 0x5200, 0x300, 0x5000, 0x4300, 0x300, 0x10, &data);
721*eb293b8fSAndroid Build Coastguard Worker
722*eb293b8fSAndroid Build Coastguard Worker const DwarfFde* fde = this->debug_frame_->GetFdeFromOffset(0x5200);
723*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
724*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde->cie != nullptr);
725*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(4U, fde->cie->version);
726*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5000U, fde->cie_offset);
727*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x53b6U, fde->cfa_instructions_offset);
728*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x550cU, fde->cfa_instructions_end);
729*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4300U, fde->pc_start);
730*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4600U, fde->pc_end);
731*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fde->lsda_address);
732*eb293b8fSAndroid Build Coastguard Worker }
733*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdeFromOffset32_lsda_address)734*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdeFromOffset32_lsda_address) {
735*eb293b8fSAndroid Build Coastguard Worker SetCie32(this->fake_memory_, 0x5000, 0xfc,
736*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t>{/* version */ 1,
737*eb293b8fSAndroid Build Coastguard Worker /* augment string */ 'z', 'L', '\0',
738*eb293b8fSAndroid Build Coastguard Worker /* address size */ 8,
739*eb293b8fSAndroid Build Coastguard Worker /* code alignment factor */ 16,
740*eb293b8fSAndroid Build Coastguard Worker /* data alignment factor */ 32,
741*eb293b8fSAndroid Build Coastguard Worker /* return address register */ 10,
742*eb293b8fSAndroid Build Coastguard Worker /* augment length */ 0x2,
743*eb293b8fSAndroid Build Coastguard Worker /* L data */ DW_EH_PE_udata2});
744*eb293b8fSAndroid Build Coastguard Worker
745*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t> data{/* augment length */ 0x80, 0x3,
746*eb293b8fSAndroid Build Coastguard Worker /* lsda address */ 0x20, 0x45};
747*eb293b8fSAndroid Build Coastguard Worker SetFde32(this->fake_memory_, 0x5200, 0x300, 0x5000, 0x4300, 0x300, 0, &data);
748*eb293b8fSAndroid Build Coastguard Worker
749*eb293b8fSAndroid Build Coastguard Worker const DwarfFde* fde = this->debug_frame_->GetFdeFromOffset(0x5200);
750*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
751*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde->cie != nullptr);
752*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(1U, fde->cie->version);
753*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5000U, fde->cie_offset);
754*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5392U, fde->cfa_instructions_offset);
755*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5504U, fde->cfa_instructions_end);
756*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4300U, fde->pc_start);
757*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4600U, fde->pc_end);
758*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4520U, fde->lsda_address);
759*eb293b8fSAndroid Build Coastguard Worker }
760*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdeFromOffset64_lsda_address)761*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdeFromOffset64_lsda_address) {
762*eb293b8fSAndroid Build Coastguard Worker SetCie64(this->fake_memory_, 0x5000, 0xfc,
763*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t>{/* version */ 1,
764*eb293b8fSAndroid Build Coastguard Worker /* augment string */ 'z', 'L', '\0',
765*eb293b8fSAndroid Build Coastguard Worker /* address size */ 8,
766*eb293b8fSAndroid Build Coastguard Worker /* code alignment factor */ 16,
767*eb293b8fSAndroid Build Coastguard Worker /* data alignment factor */ 32,
768*eb293b8fSAndroid Build Coastguard Worker /* return address register */ 10,
769*eb293b8fSAndroid Build Coastguard Worker /* augment length */ 0x2,
770*eb293b8fSAndroid Build Coastguard Worker /* L data */ DW_EH_PE_udata2});
771*eb293b8fSAndroid Build Coastguard Worker
772*eb293b8fSAndroid Build Coastguard Worker std::vector<uint8_t> data{/* augment length */ 0x80, 0x3,
773*eb293b8fSAndroid Build Coastguard Worker /* lsda address */ 0x20, 0x45};
774*eb293b8fSAndroid Build Coastguard Worker SetFde64(this->fake_memory_, 0x5200, 0x300, 0x5000, 0x4300, 0x300, 0, &data);
775*eb293b8fSAndroid Build Coastguard Worker
776*eb293b8fSAndroid Build Coastguard Worker const DwarfFde* fde = this->debug_frame_->GetFdeFromOffset(0x5200);
777*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
778*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde->cie != nullptr);
779*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(1U, fde->cie->version);
780*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x5000U, fde->cie_offset);
781*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x53a6U, fde->cfa_instructions_offset);
782*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x550cU, fde->cfa_instructions_end);
783*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4300U, fde->pc_start);
784*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4600U, fde->pc_end);
785*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x4520U, fde->lsda_address);
786*eb293b8fSAndroid Build Coastguard Worker }
787*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdeFromPc_interleaved)788*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdeFromPc_interleaved) {
789*eb293b8fSAndroid Build Coastguard Worker SetCie32(this->fake_memory_, 0x5000, 0xfc, std::vector<uint8_t>{1, '\0', 0, 0, 1});
790*eb293b8fSAndroid Build Coastguard Worker
791*eb293b8fSAndroid Build Coastguard Worker // FDE 0 (0x100 - 0x200)
792*eb293b8fSAndroid Build Coastguard Worker SetFde32(this->fake_memory_, 0x5100, 0xfc, 0, 0x100, 0x100);
793*eb293b8fSAndroid Build Coastguard Worker // FDE 1 (0x300 - 0x500)
794*eb293b8fSAndroid Build Coastguard Worker SetFde32(this->fake_memory_, 0x5200, 0xfc, 0, 0x300, 0x200);
795*eb293b8fSAndroid Build Coastguard Worker // FDE 2 (0x700 - 0x800)
796*eb293b8fSAndroid Build Coastguard Worker SetFde32(this->fake_memory_, 0x5300, 0xfc, 0, 0x700, 0x100);
797*eb293b8fSAndroid Build Coastguard Worker // FDE 3 (0xa00 - 0xb00)
798*eb293b8fSAndroid Build Coastguard Worker SetFde32(this->fake_memory_, 0x5400, 0xfc, 0, 0xa00, 0x100);
799*eb293b8fSAndroid Build Coastguard Worker // FDE 4 (0x100 - 0xb00)
800*eb293b8fSAndroid Build Coastguard Worker SetFde32(this->fake_memory_, 0x5500, 0xfc, 0, 0x150, 0xa00);
801*eb293b8fSAndroid Build Coastguard Worker // FDE 5 (0x50 - 0xa0)
802*eb293b8fSAndroid Build Coastguard Worker SetFde32(this->fake_memory_, 0x5600, 0xfc, 0, 0x50, 0x50);
803*eb293b8fSAndroid Build Coastguard Worker // FDE 6 (0x0 - 0x50)
804*eb293b8fSAndroid Build Coastguard Worker SetFde32(this->fake_memory_, 0x5700, 0xfc, 0, 0, 0x50);
805*eb293b8fSAndroid Build Coastguard Worker
806*eb293b8fSAndroid Build Coastguard Worker this->debug_frame_->Init(SectionInfo{.offset = 0x5000, .size = 0x800});
807*eb293b8fSAndroid Build Coastguard Worker
808*eb293b8fSAndroid Build Coastguard Worker // Force reading all entries so no entries are found.
809*eb293b8fSAndroid Build Coastguard Worker const DwarfFde* fde = this->debug_frame_->GetFdeFromPc(0xfffff);
810*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde == nullptr);
811*eb293b8fSAndroid Build Coastguard Worker
812*eb293b8fSAndroid Build Coastguard Worker // 0x50 - 0xa0 FDE 5
813*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x60);
814*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
815*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x50U, fde->pc_start);
816*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0xa0U, fde->pc_end);
817*eb293b8fSAndroid Build Coastguard Worker
818*eb293b8fSAndroid Build Coastguard Worker // 0x0 - 0x50 FDE 6
819*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x10);
820*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
821*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0U, fde->pc_start);
822*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x50U, fde->pc_end);
823*eb293b8fSAndroid Build Coastguard Worker
824*eb293b8fSAndroid Build Coastguard Worker // 0x100 - 0x200 FDE 0
825*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x170);
826*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
827*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x100U, fde->pc_start);
828*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x200U, fde->pc_end);
829*eb293b8fSAndroid Build Coastguard Worker
830*eb293b8fSAndroid Build Coastguard Worker // 0x200 - 0x300 FDE 4
831*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x210);
832*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
833*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x150U, fde->pc_start);
834*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0xb50U, fde->pc_end);
835*eb293b8fSAndroid Build Coastguard Worker
836*eb293b8fSAndroid Build Coastguard Worker // 0x300 - 0x500 FDE 1
837*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x310);
838*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
839*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x300U, fde->pc_start);
840*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x500U, fde->pc_end);
841*eb293b8fSAndroid Build Coastguard Worker
842*eb293b8fSAndroid Build Coastguard Worker // 0x700 - 0x800 FDE 2
843*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x790);
844*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
845*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x700U, fde->pc_start);
846*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x800U, fde->pc_end);
847*eb293b8fSAndroid Build Coastguard Worker
848*eb293b8fSAndroid Build Coastguard Worker // 0x800 - 0x900 FDE 4
849*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x850);
850*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
851*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x150U, fde->pc_start);
852*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0xb50U, fde->pc_end);
853*eb293b8fSAndroid Build Coastguard Worker
854*eb293b8fSAndroid Build Coastguard Worker // 0xa00 - 0xb00 FDE 3
855*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0xa35);
856*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
857*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0xa00U, fde->pc_start);
858*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0xb00U, fde->pc_end);
859*eb293b8fSAndroid Build Coastguard Worker
860*eb293b8fSAndroid Build Coastguard Worker // 0xb00 - 0xb50 FDE 4
861*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0xb20);
862*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
863*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x150U, fde->pc_start);
864*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0xb50U, fde->pc_end);
865*eb293b8fSAndroid Build Coastguard Worker }
866*eb293b8fSAndroid Build Coastguard Worker
TYPED_TEST_P(DwarfDebugFrameTest,GetFdeFromPc_overlap)867*eb293b8fSAndroid Build Coastguard Worker TYPED_TEST_P(DwarfDebugFrameTest, GetFdeFromPc_overlap) {
868*eb293b8fSAndroid Build Coastguard Worker SetCie32(this->fake_memory_, 0x5000, 0xfc, std::vector<uint8_t>{1, '\0', 0, 0, 1});
869*eb293b8fSAndroid Build Coastguard Worker
870*eb293b8fSAndroid Build Coastguard Worker // FDE 0 (0x100 - 0x200)
871*eb293b8fSAndroid Build Coastguard Worker SetFde32(this->fake_memory_, 0x5100, 0xfc, 0, 0x100, 0x100);
872*eb293b8fSAndroid Build Coastguard Worker // FDE 1 (0x50 - 0x550)
873*eb293b8fSAndroid Build Coastguard Worker SetFde32(this->fake_memory_, 0x5200, 0xfc, 0, 0x50, 0x500);
874*eb293b8fSAndroid Build Coastguard Worker // FDE 2 (0x00 - 0x800)
875*eb293b8fSAndroid Build Coastguard Worker SetFde32(this->fake_memory_, 0x5300, 0xfc, 0, 0x0, 0x800);
876*eb293b8fSAndroid Build Coastguard Worker
877*eb293b8fSAndroid Build Coastguard Worker this->debug_frame_->Init(SectionInfo{.offset = 0x5000, .size = 0x400});
878*eb293b8fSAndroid Build Coastguard Worker
879*eb293b8fSAndroid Build Coastguard Worker // Force reading all entries so no entries are found.
880*eb293b8fSAndroid Build Coastguard Worker const DwarfFde* fde = this->debug_frame_->GetFdeFromPc(0xfffff);
881*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde == nullptr);
882*eb293b8fSAndroid Build Coastguard Worker
883*eb293b8fSAndroid Build Coastguard Worker // 0x0 - 0x50 FDE 2
884*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x10);
885*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
886*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x0U, fde->pc_start);
887*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x800U, fde->pc_end);
888*eb293b8fSAndroid Build Coastguard Worker
889*eb293b8fSAndroid Build Coastguard Worker // 0x50 - 0x100 FDE 1 or FDE 2
890*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x60);
891*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
892*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x00U, fde->pc_start);
893*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x800U, fde->pc_end);
894*eb293b8fSAndroid Build Coastguard Worker
895*eb293b8fSAndroid Build Coastguard Worker // 0x100 - 0x200 FDE 0, FDE 1, or FDE 2
896*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x170);
897*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
898*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x100U, fde->pc_start);
899*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x200U, fde->pc_end);
900*eb293b8fSAndroid Build Coastguard Worker
901*eb293b8fSAndroid Build Coastguard Worker // 0x200 - 0x550 FDE 1, or FDE 2
902*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x210);
903*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
904*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x50U, fde->pc_start);
905*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x550U, fde->pc_end);
906*eb293b8fSAndroid Build Coastguard Worker
907*eb293b8fSAndroid Build Coastguard Worker // 0x550 - 0x800 FDE 2
908*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x580);
909*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde != nullptr);
910*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x0U, fde->pc_start);
911*eb293b8fSAndroid Build Coastguard Worker EXPECT_EQ(0x800U, fde->pc_end);
912*eb293b8fSAndroid Build Coastguard Worker
913*eb293b8fSAndroid Build Coastguard Worker fde = this->debug_frame_->GetFdeFromPc(0x810);
914*eb293b8fSAndroid Build Coastguard Worker ASSERT_TRUE(fde == nullptr);
915*eb293b8fSAndroid Build Coastguard Worker }
916*eb293b8fSAndroid Build Coastguard Worker
917*eb293b8fSAndroid Build Coastguard Worker REGISTER_TYPED_TEST_SUITE_P(
918*eb293b8fSAndroid Build Coastguard Worker DwarfDebugFrameTest, Init_compressed, GetFdes32, GetFdes32_after_GetFdeFromPc,
919*eb293b8fSAndroid Build Coastguard Worker GetFdes32_not_in_section, GetFdes32_big_function_address, GetFdeFromPc32,
920*eb293b8fSAndroid Build Coastguard Worker GetFdeFromPc32_reverse, GetFdeFromPc32_not_in_section, GetFdes64, GetFdes64_after_GetFdeFromPc,
921*eb293b8fSAndroid Build Coastguard Worker GetFdes64_not_in_section, GetFdeFromPc64, GetFdeFromPc64_reverse, GetFdeFromPc64_not_in_section,
922*eb293b8fSAndroid Build Coastguard Worker GetCieFde32, GetCieFde64, GetCieFromOffset32_cie_cached, GetCieFromOffset64_cie_cached,
923*eb293b8fSAndroid Build Coastguard Worker GetCieFromOffset32_version1, GetCieFromOffset64_version1, GetCieFromOffset32_version3,
924*eb293b8fSAndroid Build Coastguard Worker GetCieFromOffset64_version3, GetCieFromOffset32_version4_32bit_address,
925*eb293b8fSAndroid Build Coastguard Worker GetCieFromOffset32_version4_64bit_address, GetCieFromOffset64_version4_32bit_address,
926*eb293b8fSAndroid Build Coastguard Worker GetCieFromOffset64_version4_64bit_address, GetCieFromOffset32_version5,
927*eb293b8fSAndroid Build Coastguard Worker GetCieFromOffset64_version5, GetCieFromOffset_version_invalid, GetCieFromOffset32_augment,
928*eb293b8fSAndroid Build Coastguard Worker GetCieFromOffset64_augment, GetFdeFromOffset32_augment, GetFdeFromOffset64_augment,
929*eb293b8fSAndroid Build Coastguard Worker GetFdeFromOffset32_lsda_address, GetFdeFromOffset64_lsda_address, GetFdeFromPc_interleaved,
930*eb293b8fSAndroid Build Coastguard Worker GetFdeFromPc_overlap);
931*eb293b8fSAndroid Build Coastguard Worker
932*eb293b8fSAndroid Build Coastguard Worker typedef ::testing::Types<uint32_t, uint64_t> DwarfDebugFrameTestTypes;
933*eb293b8fSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(Libunwindstack, DwarfDebugFrameTest, DwarfDebugFrameTestTypes);
934*eb293b8fSAndroid Build Coastguard Worker
935*eb293b8fSAndroid Build Coastguard Worker } // namespace unwindstack
936