xref: /aosp_15_r20/system/unwinding/libunwindstack/tests/UnwindOfflineTest.cpp (revision eb293b8f56ee8303637c5595cfcdeef8039e85c6)
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 <sys/mman.h>
18*eb293b8fSAndroid Build Coastguard Worker 
19*eb293b8fSAndroid Build Coastguard Worker #include <android-base/strings.h>
20*eb293b8fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
21*eb293b8fSAndroid Build Coastguard Worker 
22*eb293b8fSAndroid Build Coastguard Worker #include <cstddef>
23*eb293b8fSAndroid Build Coastguard Worker #include <fstream>
24*eb293b8fSAndroid Build Coastguard Worker #include <memory>
25*eb293b8fSAndroid Build Coastguard Worker #include <sstream>
26*eb293b8fSAndroid Build Coastguard Worker #include <string>
27*eb293b8fSAndroid Build Coastguard Worker 
28*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/Arch.h>
29*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/Memory.h>
30*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/RegsArm64.h>
31*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/Unwinder.h>
32*eb293b8fSAndroid Build Coastguard Worker 
33*eb293b8fSAndroid Build Coastguard Worker #include "TestUtils.h"
34*eb293b8fSAndroid Build Coastguard Worker #include "utils/MemoryFake.h"
35*eb293b8fSAndroid Build Coastguard Worker #include "utils/OfflineUnwindUtils.h"
36*eb293b8fSAndroid Build Coastguard Worker 
37*eb293b8fSAndroid Build Coastguard Worker // This collection of tests exercises Unwinder::Unwind for offline unwinds.
38*eb293b8fSAndroid Build Coastguard Worker //
39*eb293b8fSAndroid Build Coastguard Worker // See `libunwindstack/utils/OfflineUnwindUtils.h` for more info on offline unwinds
40*eb293b8fSAndroid Build Coastguard Worker // and b/192012600 for additional information regarding offline unwind benchmarks.
41*eb293b8fSAndroid Build Coastguard Worker namespace unwindstack {
42*eb293b8fSAndroid Build Coastguard Worker namespace {
43*eb293b8fSAndroid Build Coastguard Worker 
44*eb293b8fSAndroid Build Coastguard Worker class UnwindOfflineTest : public ::testing::Test {
45*eb293b8fSAndroid Build Coastguard Worker  public:
GetExpectedSamplesFrameInfo(std::string * expected_frame_info,std::string * error_msg,const std::string & sample_name=OfflineUnwindUtils::kSingleSample)46*eb293b8fSAndroid Build Coastguard Worker   bool GetExpectedSamplesFrameInfo(
47*eb293b8fSAndroid Build Coastguard Worker       std::string* expected_frame_info, std::string* error_msg,
48*eb293b8fSAndroid Build Coastguard Worker       const std::string& sample_name = OfflineUnwindUtils::kSingleSample) {
49*eb293b8fSAndroid Build Coastguard Worker     const std::string* a_frame_info_path = offline_utils_.GetFrameInfoFilepath(sample_name);
50*eb293b8fSAndroid Build Coastguard Worker     if (a_frame_info_path == nullptr) {
51*eb293b8fSAndroid Build Coastguard Worker       std::stringstream err_stream;
52*eb293b8fSAndroid Build Coastguard Worker       err_stream << "Unable to get frame info filepath for invalid sample name " << sample_name
53*eb293b8fSAndroid Build Coastguard Worker                  << ".\n";
54*eb293b8fSAndroid Build Coastguard Worker       *error_msg = err_stream.str();
55*eb293b8fSAndroid Build Coastguard Worker       return false;
56*eb293b8fSAndroid Build Coastguard Worker     }
57*eb293b8fSAndroid Build Coastguard Worker 
58*eb293b8fSAndroid Build Coastguard Worker     std::ifstream in(*a_frame_info_path);
59*eb293b8fSAndroid Build Coastguard Worker     std::stringstream buffer;
60*eb293b8fSAndroid Build Coastguard Worker     buffer << in.rdbuf();
61*eb293b8fSAndroid Build Coastguard Worker     *expected_frame_info = buffer.str();
62*eb293b8fSAndroid Build Coastguard Worker     return true;
63*eb293b8fSAndroid Build Coastguard Worker   }
64*eb293b8fSAndroid Build Coastguard Worker 
ConsecutiveUnwindTest(const std::vector<UnwindSampleInfo> & sample_infos)65*eb293b8fSAndroid Build Coastguard Worker   void ConsecutiveUnwindTest(const std::vector<UnwindSampleInfo>& sample_infos) {
66*eb293b8fSAndroid Build Coastguard Worker     std::string error_msg;
67*eb293b8fSAndroid Build Coastguard Worker     if (!offline_utils_.Init(sample_infos, &error_msg)) FAIL() << error_msg;
68*eb293b8fSAndroid Build Coastguard Worker 
69*eb293b8fSAndroid Build Coastguard Worker     for (const auto& sample_info : sample_infos) {
70*eb293b8fSAndroid Build Coastguard Worker       const std::string& sample_name = sample_info.offline_files_dir;
71*eb293b8fSAndroid Build Coastguard Worker       // Need to change to sample directory for Unwinder to properly init ELF objects.
72*eb293b8fSAndroid Build Coastguard Worker       // See more info at OfflineUnwindUtils::ChangeToSampleDirectory.
73*eb293b8fSAndroid Build Coastguard Worker       if (!offline_utils_.ChangeToSampleDirectory(&error_msg, sample_name)) FAIL() << error_msg;
74*eb293b8fSAndroid Build Coastguard Worker 
75*eb293b8fSAndroid Build Coastguard Worker       Unwinder unwinder =
76*eb293b8fSAndroid Build Coastguard Worker           Unwinder(128, offline_utils_.GetMaps(sample_name), offline_utils_.GetRegs(sample_name),
77*eb293b8fSAndroid Build Coastguard Worker                    offline_utils_.GetProcessMemory(sample_name));
78*eb293b8fSAndroid Build Coastguard Worker       if (sample_info.memory_flag == ProcessMemoryFlag::kIncludeJitMemory) {
79*eb293b8fSAndroid Build Coastguard Worker         unwinder.SetJitDebug(offline_utils_.GetJitDebug(sample_name));
80*eb293b8fSAndroid Build Coastguard Worker       }
81*eb293b8fSAndroid Build Coastguard Worker       unwinder.Unwind();
82*eb293b8fSAndroid Build Coastguard Worker 
83*eb293b8fSAndroid Build Coastguard Worker       size_t expected_num_frames;
84*eb293b8fSAndroid Build Coastguard Worker       if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg, sample_name))
85*eb293b8fSAndroid Build Coastguard Worker         FAIL() << error_msg;
86*eb293b8fSAndroid Build Coastguard Worker       std::string expected_frame_info;
87*eb293b8fSAndroid Build Coastguard Worker       if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg, sample_name))
88*eb293b8fSAndroid Build Coastguard Worker         FAIL() << error_msg;
89*eb293b8fSAndroid Build Coastguard Worker 
90*eb293b8fSAndroid Build Coastguard Worker       std::string actual_frame_info = DumpFrames(unwinder);
91*eb293b8fSAndroid Build Coastguard Worker       ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << actual_frame_info;
92*eb293b8fSAndroid Build Coastguard Worker 
93*eb293b8fSAndroid Build Coastguard Worker       // The old demangler in external/libcxx adds an extra space when closing
94*eb293b8fSAndroid Build Coastguard Worker       // multiple sets of template args (e.g. "Foo<Bar<Baz> >"), but the new
95*eb293b8fSAndroid Build Coastguard Worker       // libc++ demangler omits it. Replace "> >" with ">>" to work with either
96*eb293b8fSAndroid Build Coastguard Worker       // demangler until libc++ is upgraded.
97*eb293b8fSAndroid Build Coastguard Worker       // TODO(b/329940638). Remove this workaround and fix the tests.
98*eb293b8fSAndroid Build Coastguard Worker       actual_frame_info = android::base::StringReplace(actual_frame_info, "> >", ">>", true);
99*eb293b8fSAndroid Build Coastguard Worker       expected_frame_info = android::base::StringReplace(expected_frame_info, "> >", ">>", true);
100*eb293b8fSAndroid Build Coastguard Worker 
101*eb293b8fSAndroid Build Coastguard Worker       EXPECT_EQ(expected_frame_info, actual_frame_info);
102*eb293b8fSAndroid Build Coastguard Worker     }
103*eb293b8fSAndroid Build Coastguard Worker   }
104*eb293b8fSAndroid Build Coastguard Worker 
105*eb293b8fSAndroid Build Coastguard Worker  protected:
TearDown()106*eb293b8fSAndroid Build Coastguard Worker   void TearDown() override { offline_utils_.ReturnToCurrentWorkingDirectory(); }
107*eb293b8fSAndroid Build Coastguard Worker 
108*eb293b8fSAndroid Build Coastguard Worker   OfflineUnwindUtils offline_utils_;
109*eb293b8fSAndroid Build Coastguard Worker };
110*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,pc_straddle_arm)111*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, pc_straddle_arm) {
112*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
113*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "straddle_arm/", .arch = ARCH_ARM}, &error_msg))
114*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
115*eb293b8fSAndroid Build Coastguard Worker 
116*eb293b8fSAndroid Build Coastguard Worker   Regs* regs = offline_utils_.GetRegs();
117*eb293b8fSAndroid Build Coastguard Worker   std::unique_ptr<Regs> regs_copy(regs->Clone());
118*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), regs, offline_utils_.GetProcessMemory());
119*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
120*eb293b8fSAndroid Build Coastguard Worker 
121*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
122*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
123*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
124*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
125*eb293b8fSAndroid Build Coastguard Worker 
126*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
127*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
128*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
129*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf31ea9f8U, unwinder.frames()[0].pc);
130*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe9c866f8U, unwinder.frames()[0].sp);
131*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf2da0a1bU, unwinder.frames()[1].pc);
132*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe9c86728U, unwinder.frames()[1].sp);
133*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf2da1441U, unwinder.frames()[2].pc);
134*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe9c86730U, unwinder.frames()[2].sp);
135*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf3367147U, unwinder.frames()[3].pc);
136*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe9c86778U, unwinder.frames()[3].sp);
137*eb293b8fSAndroid Build Coastguard Worker 
138*eb293b8fSAndroid Build Coastguard Worker   // Display build ids now.
139*eb293b8fSAndroid Build Coastguard Worker   unwinder.SetRegs(regs_copy.get());
140*eb293b8fSAndroid Build Coastguard Worker   unwinder.SetDisplayBuildID(true);
141*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
142*eb293b8fSAndroid Build Coastguard Worker 
143*eb293b8fSAndroid Build Coastguard Worker   frame_info = DumpFrames(unwinder);
144*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
145*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(
146*eb293b8fSAndroid Build Coastguard Worker       "  #00 pc 0001a9f8  libc.so (abort+64) (BuildId: 2dd0d4ba881322a0edabeed94808048c)\n"
147*eb293b8fSAndroid Build Coastguard Worker       "  #01 pc 00006a1b  libbase.so (android::base::DefaultAborter(char const*)+6) (BuildId: "
148*eb293b8fSAndroid Build Coastguard Worker       "ed43842c239cac1a618e600ea91c4cbd)\n"
149*eb293b8fSAndroid Build Coastguard Worker       "  #02 pc 00007441  libbase.so (android::base::LogMessage::~LogMessage()+748) (BuildId: "
150*eb293b8fSAndroid Build Coastguard Worker       "ed43842c239cac1a618e600ea91c4cbd)\n"
151*eb293b8fSAndroid Build Coastguard Worker       "  #03 pc 00015147  /does/not/exist/libhidlbase.so\n",
152*eb293b8fSAndroid Build Coastguard Worker       frame_info);
153*eb293b8fSAndroid Build Coastguard Worker }
154*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,pc_in_gnu_debugdata_arm)155*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, pc_in_gnu_debugdata_arm) {
156*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
157*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "gnu_debugdata_arm/", .arch = ARCH_ARM},
158*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
159*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
160*eb293b8fSAndroid Build Coastguard Worker 
161*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
162*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
163*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
164*eb293b8fSAndroid Build Coastguard Worker 
165*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
166*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
167*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
168*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
169*eb293b8fSAndroid Build Coastguard Worker 
170*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
171*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
172*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
173*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf1f6dc49U, unwinder.frames()[0].pc);
174*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xd8fe6930U, unwinder.frames()[0].sp);
175*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf1f6dce5U, unwinder.frames()[1].pc);
176*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xd8fe6958U, unwinder.frames()[1].sp);
177*eb293b8fSAndroid Build Coastguard Worker }
178*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,pc_straddle_arm64)179*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, pc_straddle_arm64) {
180*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
181*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "straddle_arm64/", .arch = ARCH_ARM64},
182*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
183*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
184*eb293b8fSAndroid Build Coastguard Worker 
185*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
186*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
187*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
188*eb293b8fSAndroid Build Coastguard Worker 
189*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
190*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
191*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
192*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
193*eb293b8fSAndroid Build Coastguard Worker 
194*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
195*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
196*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
197*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x64d09d4fd8U, unwinder.frames()[0].pc);
198*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe0d84040U, unwinder.frames()[0].sp);
199*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x64d09d5078U, unwinder.frames()[1].pc);
200*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe0d84070U, unwinder.frames()[1].sp);
201*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x64d09d508cU, unwinder.frames()[2].pc);
202*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe0d84080U, unwinder.frames()[2].sp);
203*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x64d09d88fcU, unwinder.frames()[3].pc);
204*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe0d84090U, unwinder.frames()[3].sp);
205*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x64d09d88d8U, unwinder.frames()[4].pc);
206*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe0d840f0U, unwinder.frames()[4].sp);
207*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x64d0a00d70U, unwinder.frames()[5].pc);
208*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe0d84110U, unwinder.frames()[5].sp);
209*eb293b8fSAndroid Build Coastguard Worker }
210*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,jit_debug_x86)211*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, jit_debug_x86) {
212*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
213*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "jit_debug_x86/",
214*eb293b8fSAndroid Build Coastguard Worker                             .arch = ARCH_X86,
215*eb293b8fSAndroid Build Coastguard Worker                             .memory_flag = ProcessMemoryFlag::kIncludeJitMemory},
216*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
217*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
218*eb293b8fSAndroid Build Coastguard Worker 
219*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
220*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
221*eb293b8fSAndroid Build Coastguard Worker   unwinder.SetJitDebug(offline_utils_.GetJitDebug());
222*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
223*eb293b8fSAndroid Build Coastguard Worker 
224*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
225*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
226*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
227*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
228*eb293b8fSAndroid Build Coastguard Worker 
229*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
230*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
231*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
232*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xeb89bfb8U, unwinder.frames()[0].pc);
233*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb5280U, unwinder.frames()[0].sp);
234*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xeb89af00U, unwinder.frames()[1].pc);
235*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb52a0U, unwinder.frames()[1].sp);
236*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xec6061a8U, unwinder.frames()[2].pc);
237*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb5ce0U, unwinder.frames()[2].sp);
238*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xee75be80U, unwinder.frames()[3].pc);
239*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb5d30U, unwinder.frames()[3].sp);
240*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf728e4d2U, unwinder.frames()[4].pc);
241*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb5d60U, unwinder.frames()[4].sp);
242*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6d27ab5U, unwinder.frames()[5].pc);
243*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb5d80U, unwinder.frames()[5].sp);
244*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[6].pc);
245*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb5e20U, unwinder.frames()[6].sp);
246*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f73552U, unwinder.frames()[7].pc);
247*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb5ec0U, unwinder.frames()[7].sp);
248*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f7499aU, unwinder.frames()[8].pc);
249*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb5f40U, unwinder.frames()[8].sp);
250*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf7265362U, unwinder.frames()[9].pc);
251*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb5fb0U, unwinder.frames()[9].sp);
252*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf72945bdU, unwinder.frames()[10].pc);
253*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6110U, unwinder.frames()[10].sp);
254*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xee75be03U, unwinder.frames()[11].pc);
255*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6160U, unwinder.frames()[11].sp);
256*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf728e4d2U, unwinder.frames()[12].pc);
257*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6180U, unwinder.frames()[12].sp);
258*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6d27ab5U, unwinder.frames()[13].pc);
259*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb61b0U, unwinder.frames()[13].sp);
260*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[14].pc);
261*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6250U, unwinder.frames()[14].sp);
262*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f73552U, unwinder.frames()[15].pc);
263*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb62f0U, unwinder.frames()[15].sp);
264*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f7499aU, unwinder.frames()[16].pc);
265*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6370U, unwinder.frames()[16].sp);
266*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf7265362U, unwinder.frames()[17].pc);
267*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb63e0U, unwinder.frames()[17].sp);
268*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf72945bdU, unwinder.frames()[18].pc);
269*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6530U, unwinder.frames()[18].sp);
270*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xee75bd3bU, unwinder.frames()[19].pc);
271*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6580U, unwinder.frames()[19].sp);
272*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf728e4d2U, unwinder.frames()[20].pc);
273*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb65b0U, unwinder.frames()[20].sp);
274*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6d27ab5U, unwinder.frames()[21].pc);
275*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb65e0U, unwinder.frames()[21].sp);
276*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[22].pc);
277*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6680U, unwinder.frames()[22].sp);
278*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f73552U, unwinder.frames()[23].pc);
279*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6720U, unwinder.frames()[23].sp);
280*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f7499aU, unwinder.frames()[24].pc);
281*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb67a0U, unwinder.frames()[24].sp);
282*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf7265362U, unwinder.frames()[25].pc);
283*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6810U, unwinder.frames()[25].sp);
284*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf72945bdU, unwinder.frames()[26].pc);
285*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6960U, unwinder.frames()[26].sp);
286*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xee75bbdbU, unwinder.frames()[27].pc);
287*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb69b0U, unwinder.frames()[27].sp);
288*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf728e6a2U, unwinder.frames()[28].pc);
289*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb69f0U, unwinder.frames()[28].sp);
290*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6d27acbU, unwinder.frames()[29].pc);
291*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6a20U, unwinder.frames()[29].sp);
292*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[30].pc);
293*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6ac0U, unwinder.frames()[30].sp);
294*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f73552U, unwinder.frames()[31].pc);
295*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6b60U, unwinder.frames()[31].sp);
296*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f7499aU, unwinder.frames()[32].pc);
297*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6be0U, unwinder.frames()[32].sp);
298*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf7265362U, unwinder.frames()[33].pc);
299*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6c50U, unwinder.frames()[33].sp);
300*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf72945bdU, unwinder.frames()[34].pc);
301*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6dd0U, unwinder.frames()[34].sp);
302*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xee75b624U, unwinder.frames()[35].pc);
303*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6e20U, unwinder.frames()[35].sp);
304*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf728e4d2U, unwinder.frames()[36].pc);
305*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6e50U, unwinder.frames()[36].sp);
306*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6d27ab5U, unwinder.frames()[37].pc);
307*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6e70U, unwinder.frames()[37].sp);
308*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[38].pc);
309*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6f10U, unwinder.frames()[38].sp);
310*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f73552U, unwinder.frames()[39].pc);
311*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb6fb0U, unwinder.frames()[39].sp);
312*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f7499aU, unwinder.frames()[40].pc);
313*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7030U, unwinder.frames()[40].sp);
314*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf7265362U, unwinder.frames()[41].pc);
315*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb70a0U, unwinder.frames()[41].sp);
316*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf72945bdU, unwinder.frames()[42].pc);
317*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb71f0U, unwinder.frames()[42].sp);
318*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xee75aedbU, unwinder.frames()[43].pc);
319*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7240U, unwinder.frames()[43].sp);
320*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf728e4d2U, unwinder.frames()[44].pc);
321*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb72a0U, unwinder.frames()[44].sp);
322*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6d27ab5U, unwinder.frames()[45].pc);
323*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb72c0U, unwinder.frames()[45].sp);
324*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[46].pc);
325*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7360U, unwinder.frames()[46].sp);
326*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f73552U, unwinder.frames()[47].pc);
327*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7400U, unwinder.frames()[47].sp);
328*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f7499aU, unwinder.frames()[48].pc);
329*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7480U, unwinder.frames()[48].sp);
330*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf7265362U, unwinder.frames()[49].pc);
331*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb74f0U, unwinder.frames()[49].sp);
332*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf72945bdU, unwinder.frames()[50].pc);
333*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7680U, unwinder.frames()[50].sp);
334*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xee756c21U, unwinder.frames()[51].pc);
335*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb76d0U, unwinder.frames()[51].sp);
336*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf728e6a2U, unwinder.frames()[52].pc);
337*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb76f0U, unwinder.frames()[52].sp);
338*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6d27acbU, unwinder.frames()[53].pc);
339*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7710U, unwinder.frames()[53].sp);
340*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[54].pc);
341*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb77b0U, unwinder.frames()[54].sp);
342*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f73552U, unwinder.frames()[55].pc);
343*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7850U, unwinder.frames()[55].sp);
344*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6f7499aU, unwinder.frames()[56].pc);
345*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb78d0U, unwinder.frames()[56].sp);
346*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf7265362U, unwinder.frames()[57].pc);
347*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7940U, unwinder.frames()[57].sp);
348*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf72945bdU, unwinder.frames()[58].pc);
349*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7a80U, unwinder.frames()[58].sp);
350*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf728e6a2U, unwinder.frames()[59].pc);
351*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7ad0U, unwinder.frames()[59].sp);
352*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6d27acbU, unwinder.frames()[60].pc);
353*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7af0U, unwinder.frames()[60].sp);
354*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf718bc95U, unwinder.frames()[61].pc);
355*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7b90U, unwinder.frames()[61].sp);
356*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf718bb5aU, unwinder.frames()[62].pc);
357*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7c50U, unwinder.frames()[62].sp);
358*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf706b3ddU, unwinder.frames()[63].pc);
359*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7d10U, unwinder.frames()[63].sp);
360*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6d6548cU, unwinder.frames()[64].pc);
361*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7d70U, unwinder.frames()[64].sp);
362*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6d5df06U, unwinder.frames()[65].pc);
363*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7df0U, unwinder.frames()[65].sp);
364*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x56574d8cU, unwinder.frames()[66].pc);
365*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7e40U, unwinder.frames()[66].sp);
366*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x56574a80U, unwinder.frames()[67].pc);
367*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7e70U, unwinder.frames()[67].sp);
368*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf7363275U, unwinder.frames()[68].pc);
369*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffeb7ef0U, unwinder.frames()[68].sp);
370*eb293b8fSAndroid Build Coastguard Worker }
371*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,jit_debug_arm)372*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, jit_debug_arm) {
373*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
374*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "jit_debug_arm/",
375*eb293b8fSAndroid Build Coastguard Worker                             .arch = ARCH_ARM,
376*eb293b8fSAndroid Build Coastguard Worker                             .memory_flag = ProcessMemoryFlag::kIncludeJitMemory},
377*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
378*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
379*eb293b8fSAndroid Build Coastguard Worker 
380*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
381*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
382*eb293b8fSAndroid Build Coastguard Worker   unwinder.SetJitDebug(offline_utils_.GetJitDebug());
383*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
384*eb293b8fSAndroid Build Coastguard Worker 
385*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
386*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
387*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
388*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
389*eb293b8fSAndroid Build Coastguard Worker 
390*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
391*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
392*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
393*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xdfe66a5eU, unwinder.frames()[0].pc);
394*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d180U, unwinder.frames()[0].sp);
395*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe044712dU, unwinder.frames()[1].pc);
396*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d200U, unwinder.frames()[1].sp);
397*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe27a7cb1U, unwinder.frames()[2].pc);
398*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d290U, unwinder.frames()[2].sp);
399*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed75c175U, unwinder.frames()[3].pc);
400*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d2b0U, unwinder.frames()[3].sp);
401*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed761129U, unwinder.frames()[4].pc);
402*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d2e8U, unwinder.frames()[4].sp);
403*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed3b97a9U, unwinder.frames()[5].pc);
404*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d370U, unwinder.frames()[5].sp);
405*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed541833U, unwinder.frames()[6].pc);
406*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d3d8U, unwinder.frames()[6].sp);
407*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed528935U, unwinder.frames()[7].pc);
408*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d428U, unwinder.frames()[7].sp);
409*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed52971dU, unwinder.frames()[8].pc);
410*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d470U, unwinder.frames()[8].sp);
411*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed73c865U, unwinder.frames()[9].pc);
412*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d4b0U, unwinder.frames()[9].sp);
413*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed7606ffU, unwinder.frames()[10].pc);
414*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d5d0U, unwinder.frames()[10].sp);
415*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe27a7c31U, unwinder.frames()[11].pc);
416*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d640U, unwinder.frames()[11].sp);
417*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed75c175U, unwinder.frames()[12].pc);
418*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d660U, unwinder.frames()[12].sp);
419*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed761129U, unwinder.frames()[13].pc);
420*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d698U, unwinder.frames()[13].sp);
421*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed3b97a9U, unwinder.frames()[14].pc);
422*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d720U, unwinder.frames()[14].sp);
423*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed541833U, unwinder.frames()[15].pc);
424*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d788U, unwinder.frames()[15].sp);
425*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed528935U, unwinder.frames()[16].pc);
426*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d7d8U, unwinder.frames()[16].sp);
427*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed52971dU, unwinder.frames()[17].pc);
428*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d820U, unwinder.frames()[17].sp);
429*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed73c865U, unwinder.frames()[18].pc);
430*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d860U, unwinder.frames()[18].sp);
431*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed7606ffU, unwinder.frames()[19].pc);
432*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d970U, unwinder.frames()[19].sp);
433*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe27a7b77U, unwinder.frames()[20].pc);
434*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85d9e0U, unwinder.frames()[20].sp);
435*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed75c175U, unwinder.frames()[21].pc);
436*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85da10U, unwinder.frames()[21].sp);
437*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed761129U, unwinder.frames()[22].pc);
438*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85da48U, unwinder.frames()[22].sp);
439*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed3b97a9U, unwinder.frames()[23].pc);
440*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85dad0U, unwinder.frames()[23].sp);
441*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed541833U, unwinder.frames()[24].pc);
442*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85db38U, unwinder.frames()[24].sp);
443*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed528935U, unwinder.frames()[25].pc);
444*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85db88U, unwinder.frames()[25].sp);
445*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed52971dU, unwinder.frames()[26].pc);
446*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85dbd0U, unwinder.frames()[26].sp);
447*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed73c865U, unwinder.frames()[27].pc);
448*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85dc10U, unwinder.frames()[27].sp);
449*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed7606ffU, unwinder.frames()[28].pc);
450*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85dd20U, unwinder.frames()[28].sp);
451*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe27a7a29U, unwinder.frames()[29].pc);
452*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85dd90U, unwinder.frames()[29].sp);
453*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed75c175U, unwinder.frames()[30].pc);
454*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85ddc0U, unwinder.frames()[30].sp);
455*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed76122fU, unwinder.frames()[31].pc);
456*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85de08U, unwinder.frames()[31].sp);
457*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed3b97bbU, unwinder.frames()[32].pc);
458*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85de90U, unwinder.frames()[32].sp);
459*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed541833U, unwinder.frames()[33].pc);
460*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85def8U, unwinder.frames()[33].sp);
461*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed528935U, unwinder.frames()[34].pc);
462*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85df48U, unwinder.frames()[34].sp);
463*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed52971dU, unwinder.frames()[35].pc);
464*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85df90U, unwinder.frames()[35].sp);
465*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed73c865U, unwinder.frames()[36].pc);
466*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85dfd0U, unwinder.frames()[36].sp);
467*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed7606ffU, unwinder.frames()[37].pc);
468*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e110U, unwinder.frames()[37].sp);
469*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe27a739bU, unwinder.frames()[38].pc);
470*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e180U, unwinder.frames()[38].sp);
471*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed75c175U, unwinder.frames()[39].pc);
472*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e1b0U, unwinder.frames()[39].sp);
473*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed761129U, unwinder.frames()[40].pc);
474*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e1e0U, unwinder.frames()[40].sp);
475*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed3b97a9U, unwinder.frames()[41].pc);
476*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e268U, unwinder.frames()[41].sp);
477*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed541833U, unwinder.frames()[42].pc);
478*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e2d0U, unwinder.frames()[42].sp);
479*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed528935U, unwinder.frames()[43].pc);
480*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e320U, unwinder.frames()[43].sp);
481*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed52971dU, unwinder.frames()[44].pc);
482*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e368U, unwinder.frames()[44].sp);
483*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed73c865U, unwinder.frames()[45].pc);
484*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e3a8U, unwinder.frames()[45].sp);
485*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed7606ffU, unwinder.frames()[46].pc);
486*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e4c0U, unwinder.frames()[46].sp);
487*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe27a6aa7U, unwinder.frames()[47].pc);
488*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e530U, unwinder.frames()[47].sp);
489*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed75c175U, unwinder.frames()[48].pc);
490*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e5a0U, unwinder.frames()[48].sp);
491*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed761129U, unwinder.frames()[49].pc);
492*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e5d8U, unwinder.frames()[49].sp);
493*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed3b97a9U, unwinder.frames()[50].pc);
494*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e660U, unwinder.frames()[50].sp);
495*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed541833U, unwinder.frames()[51].pc);
496*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e6c8U, unwinder.frames()[51].sp);
497*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed528935U, unwinder.frames()[52].pc);
498*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e718U, unwinder.frames()[52].sp);
499*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed52971dU, unwinder.frames()[53].pc);
500*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e760U, unwinder.frames()[53].sp);
501*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed73c865U, unwinder.frames()[54].pc);
502*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e7a0U, unwinder.frames()[54].sp);
503*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed7606ffU, unwinder.frames()[55].pc);
504*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e8f0U, unwinder.frames()[55].sp);
505*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe27a1a99U, unwinder.frames()[56].pc);
506*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e960U, unwinder.frames()[56].sp);
507*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed75c175U, unwinder.frames()[57].pc);
508*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e990U, unwinder.frames()[57].sp);
509*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed76122fU, unwinder.frames()[58].pc);
510*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85e9c8U, unwinder.frames()[58].sp);
511*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed3b97bbU, unwinder.frames()[59].pc);
512*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85ea50U, unwinder.frames()[59].sp);
513*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed541833U, unwinder.frames()[60].pc);
514*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85eab8U, unwinder.frames()[60].sp);
515*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed528935U, unwinder.frames()[61].pc);
516*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85eb08U, unwinder.frames()[61].sp);
517*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed52971dU, unwinder.frames()[62].pc);
518*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85eb50U, unwinder.frames()[62].sp);
519*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed73c865U, unwinder.frames()[63].pc);
520*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85eb90U, unwinder.frames()[63].sp);
521*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed7606ffU, unwinder.frames()[64].pc);
522*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85ec90U, unwinder.frames()[64].sp);
523*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed75c175U, unwinder.frames()[65].pc);
524*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85ed00U, unwinder.frames()[65].sp);
525*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed76122fU, unwinder.frames()[66].pc);
526*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85ed38U, unwinder.frames()[66].sp);
527*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed3b97bbU, unwinder.frames()[67].pc);
528*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85edc0U, unwinder.frames()[67].sp);
529*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed6ac92dU, unwinder.frames()[68].pc);
530*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85ee28U, unwinder.frames()[68].sp);
531*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed6ac6c3U, unwinder.frames()[69].pc);
532*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85eeb8U, unwinder.frames()[69].sp);
533*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed602411U, unwinder.frames()[70].pc);
534*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85ef48U, unwinder.frames()[70].sp);
535*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed3e0a9fU, unwinder.frames()[71].pc);
536*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85ef90U, unwinder.frames()[71].sp);
537*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed3db9b9U, unwinder.frames()[72].pc);
538*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85f008U, unwinder.frames()[72].sp);
539*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xab0d459fU, unwinder.frames()[73].pc);
540*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85f038U, unwinder.frames()[73].sp);
541*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xab0d4349U, unwinder.frames()[74].pc);
542*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85f050U, unwinder.frames()[74].sp);
543*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xedb0d0c9U, unwinder.frames()[75].pc);
544*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff85f0c0U, unwinder.frames()[75].sp);
545*eb293b8fSAndroid Build Coastguard Worker }
546*eb293b8fSAndroid Build Coastguard Worker 
547*eb293b8fSAndroid Build Coastguard Worker struct LeakType {
LeakTypeunwindstack::__anonff83ad870111::LeakType548*eb293b8fSAndroid Build Coastguard Worker   LeakType(Maps* maps, Regs* regs, std::shared_ptr<Memory>& process_memory,
549*eb293b8fSAndroid Build Coastguard Worker            size_t expected_num_frames)
550*eb293b8fSAndroid Build Coastguard Worker       : maps(maps),
551*eb293b8fSAndroid Build Coastguard Worker         regs(regs),
552*eb293b8fSAndroid Build Coastguard Worker         process_memory(process_memory),
553*eb293b8fSAndroid Build Coastguard Worker         expected_num_frames(expected_num_frames) {}
554*eb293b8fSAndroid Build Coastguard Worker 
555*eb293b8fSAndroid Build Coastguard Worker   Maps* maps;
556*eb293b8fSAndroid Build Coastguard Worker   Regs* regs;
557*eb293b8fSAndroid Build Coastguard Worker   std::shared_ptr<Memory>& process_memory;
558*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
559*eb293b8fSAndroid Build Coastguard Worker };
560*eb293b8fSAndroid Build Coastguard Worker 
OfflineUnwind(void * data)561*eb293b8fSAndroid Build Coastguard Worker static void OfflineUnwind(void* data) {
562*eb293b8fSAndroid Build Coastguard Worker   LeakType* leak_data = reinterpret_cast<LeakType*>(data);
563*eb293b8fSAndroid Build Coastguard Worker 
564*eb293b8fSAndroid Build Coastguard Worker   std::unique_ptr<Regs> regs_copy(leak_data->regs->Clone());
565*eb293b8fSAndroid Build Coastguard Worker   std::unique_ptr<JitDebug> jit_debug =
566*eb293b8fSAndroid Build Coastguard Worker       CreateJitDebug(leak_data->regs->Arch(), leak_data->process_memory);
567*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, leak_data->maps, regs_copy.get(), leak_data->process_memory);
568*eb293b8fSAndroid Build Coastguard Worker   unwinder.SetJitDebug(jit_debug.get());
569*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
570*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(leak_data->expected_num_frames, unwinder.NumFrames());
571*eb293b8fSAndroid Build Coastguard Worker }
572*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,unwind_offline_check_for_leaks)573*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, unwind_offline_check_for_leaks) {
574*eb293b8fSAndroid Build Coastguard Worker #if !defined(__BIONIC__)
575*eb293b8fSAndroid Build Coastguard Worker   GTEST_SKIP() << "Leak checking depends on bionic.";
576*eb293b8fSAndroid Build Coastguard Worker #endif
577*eb293b8fSAndroid Build Coastguard Worker 
578*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
579*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "jit_debug_arm/",
580*eb293b8fSAndroid Build Coastguard Worker                             .arch = ARCH_ARM,
581*eb293b8fSAndroid Build Coastguard Worker                             .memory_flag = ProcessMemoryFlag::kIncludeJitMemory},
582*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
583*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
584*eb293b8fSAndroid Build Coastguard Worker 
585*eb293b8fSAndroid Build Coastguard Worker   std::shared_ptr<Memory> process_memory = offline_utils_.GetProcessMemory();
586*eb293b8fSAndroid Build Coastguard Worker 
587*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
588*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
589*eb293b8fSAndroid Build Coastguard Worker   LeakType data(offline_utils_.GetMaps(), offline_utils_.GetRegs(), process_memory,
590*eb293b8fSAndroid Build Coastguard Worker                 expected_num_frames);
591*eb293b8fSAndroid Build Coastguard Worker   TestCheckForLeaks(OfflineUnwind, &data);
592*eb293b8fSAndroid Build Coastguard Worker }
593*eb293b8fSAndroid Build Coastguard Worker 
594*eb293b8fSAndroid Build Coastguard Worker // The eh_frame_hdr data is present but set to zero fdes. This should
595*eb293b8fSAndroid Build Coastguard Worker // fallback to iterating over the cies/fdes and ignore the eh_frame_hdr.
596*eb293b8fSAndroid Build Coastguard Worker // No .gnu_debugdata section in the elf file, so no symbols.
TEST_F(UnwindOfflineTest,bad_eh_frame_hdr_arm64)597*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, bad_eh_frame_hdr_arm64) {
598*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
599*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "bad_eh_frame_hdr_arm64/", .arch = ARCH_ARM64},
600*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
601*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
602*eb293b8fSAndroid Build Coastguard Worker 
603*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
604*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
605*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
606*eb293b8fSAndroid Build Coastguard Worker 
607*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
608*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
609*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
610*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
611*eb293b8fSAndroid Build Coastguard Worker 
612*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
613*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
614*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
615*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x60a9fdf550U, unwinder.frames()[0].pc);
616*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fdd141990U, unwinder.frames()[0].sp);
617*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x60a9fdf568U, unwinder.frames()[1].pc);
618*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fdd1419a0U, unwinder.frames()[1].sp);
619*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x60a9fdf57cU, unwinder.frames()[2].pc);
620*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fdd1419b0U, unwinder.frames()[2].sp);
621*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x60a9fdf590U, unwinder.frames()[3].pc);
622*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fdd1419c0U, unwinder.frames()[3].sp);
623*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7542d68e98U, unwinder.frames()[4].pc);
624*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fdd1419d0U, unwinder.frames()[4].sp);
625*eb293b8fSAndroid Build Coastguard Worker }
626*eb293b8fSAndroid Build Coastguard Worker 
627*eb293b8fSAndroid Build Coastguard Worker // The elf has bad eh_frame unwind information for the pcs. If eh_frame
628*eb293b8fSAndroid Build Coastguard Worker // is used first, the unwind will not match the expected output.
TEST_F(UnwindOfflineTest,debug_frame_first_x86)629*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, debug_frame_first_x86) {
630*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
631*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "debug_frame_first_x86/", .arch = ARCH_X86},
632*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
633*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
634*eb293b8fSAndroid Build Coastguard Worker 
635*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
636*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
637*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
638*eb293b8fSAndroid Build Coastguard Worker 
639*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
640*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
641*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
642*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
643*eb293b8fSAndroid Build Coastguard Worker 
644*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
645*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
646*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
647*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x56598685U, unwinder.frames()[0].pc);
648*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcf9e38U, unwinder.frames()[0].sp);
649*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x565986b7U, unwinder.frames()[1].pc);
650*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcf9e50U, unwinder.frames()[1].sp);
651*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x565986d7U, unwinder.frames()[2].pc);
652*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcf9e60U, unwinder.frames()[2].sp);
653*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x565986f7U, unwinder.frames()[3].pc);
654*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcf9e70U, unwinder.frames()[3].sp);
655*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf744a275U, unwinder.frames()[4].pc);
656*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcf9e80U, unwinder.frames()[4].sp);
657*eb293b8fSAndroid Build Coastguard Worker }
658*eb293b8fSAndroid Build Coastguard Worker 
659*eb293b8fSAndroid Build Coastguard Worker // Make sure that a pc that is at the beginning of an fde unwinds correctly.
TEST_F(UnwindOfflineTest,eh_frame_hdr_begin_x86_64)660*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, eh_frame_hdr_begin_x86_64) {
661*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
662*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "eh_frame_hdr_begin_x86_64/", .arch = ARCH_X86_64},
663*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
664*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
665*eb293b8fSAndroid Build Coastguard Worker 
666*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
667*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
668*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
669*eb293b8fSAndroid Build Coastguard Worker 
670*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
671*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
672*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
673*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
674*eb293b8fSAndroid Build Coastguard Worker 
675*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
676*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
677*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
678*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x561550b17a80U, unwinder.frames()[0].pc);
679*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcc8596ce8U, unwinder.frames()[0].sp);
680*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x561550b17dd9U, unwinder.frames()[1].pc);
681*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcc8596cf0U, unwinder.frames()[1].sp);
682*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x561550b1821eU, unwinder.frames()[2].pc);
683*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcc8596f40U, unwinder.frames()[2].sp);
684*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x561550b183edU, unwinder.frames()[3].pc);
685*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcc8597190U, unwinder.frames()[3].sp);
686*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7f4de62162b0U, unwinder.frames()[4].pc);
687*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcc85971a0U, unwinder.frames()[4].sp);
688*eb293b8fSAndroid Build Coastguard Worker }
689*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,art_quick_osr_stub_arm)690*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, art_quick_osr_stub_arm) {
691*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
692*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "art_quick_osr_stub_arm/",
693*eb293b8fSAndroid Build Coastguard Worker                             .arch = ARCH_ARM,
694*eb293b8fSAndroid Build Coastguard Worker                             .memory_flag = ProcessMemoryFlag::kIncludeJitMemory},
695*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
696*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
697*eb293b8fSAndroid Build Coastguard Worker 
698*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
699*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
700*eb293b8fSAndroid Build Coastguard Worker   unwinder.SetJitDebug(offline_utils_.GetJitDebug());
701*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
702*eb293b8fSAndroid Build Coastguard Worker 
703*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
704*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
705*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
706*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
707*eb293b8fSAndroid Build Coastguard Worker 
708*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
709*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
710*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
711*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xd025c788U, unwinder.frames()[0].pc);
712*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff140U, unwinder.frames()[0].sp);
713*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xd025cdd5U, unwinder.frames()[1].pc);
714*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff140U, unwinder.frames()[1].sp);
715*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe4a755bbU, unwinder.frames()[2].pc);
716*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff160U, unwinder.frames()[2].sp);
717*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe48c77a5U, unwinder.frames()[3].pc);
718*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff190U, unwinder.frames()[3].sp);
719*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe4a641a7U, unwinder.frames()[4].pc);
720*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff298U, unwinder.frames()[4].sp);
721*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe4a74474U, unwinder.frames()[5].pc);
722*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff2b8U, unwinder.frames()[5].sp);
723*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd8365b0U, unwinder.frames()[6].pc);
724*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff2e0U, unwinder.frames()[6].sp);
725*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe4839f1bU, unwinder.frames()[7].pc);
726*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff2e0U, unwinder.frames()[7].sp);
727*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe483e593U, unwinder.frames()[8].pc);
728*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff330U, unwinder.frames()[8].sp);
729*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe4856d01U, unwinder.frames()[9].pc);
730*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff380U, unwinder.frames()[9].sp);
731*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe4a60427U, unwinder.frames()[10].pc);
732*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff430U, unwinder.frames()[10].sp);
733*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe4a67b94U, unwinder.frames()[11].pc);
734*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff498U, unwinder.frames()[11].sp);
735*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7004873eU, unwinder.frames()[12].pc);
736*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff4c0U, unwinder.frames()[12].sp);
737*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe4839f1bU, unwinder.frames()[13].pc);
738*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff4c0U, unwinder.frames()[13].sp);
739*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe483e4d5U, unwinder.frames()[14].pc);
740*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff510U, unwinder.frames()[14].sp);
741*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe4a545abU, unwinder.frames()[15].pc);
742*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff538U, unwinder.frames()[15].sp);
743*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe4a79affU, unwinder.frames()[16].pc);
744*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff640U, unwinder.frames()[16].sp);
745*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe4a75575U, unwinder.frames()[17].pc);
746*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff6b0U, unwinder.frames()[17].sp);
747*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe4a7a531U, unwinder.frames()[18].pc);
748*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff6e8U, unwinder.frames()[18].sp);
749*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe471668dU, unwinder.frames()[19].pc);
750*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff770U, unwinder.frames()[19].sp);
751*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe49c4f49U, unwinder.frames()[20].pc);
752*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff7c8U, unwinder.frames()[20].sp);
753*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe49c5cd9U, unwinder.frames()[21].pc);
754*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff850U, unwinder.frames()[21].sp);
755*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe49e71ddU, unwinder.frames()[22].pc);
756*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff8e8U, unwinder.frames()[22].sp);
757*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe7df3925U, unwinder.frames()[23].pc);
758*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff958U, unwinder.frames()[23].sp);
759*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe7daee39U, unwinder.frames()[24].pc);
760*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff960U, unwinder.frames()[24].sp);
761*eb293b8fSAndroid Build Coastguard Worker }
762*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,jit_map_arm)763*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, jit_map_arm) {
764*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
765*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "jit_map_arm/", .arch = ARCH_ARM}, &error_msg))
766*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
767*eb293b8fSAndroid Build Coastguard Worker 
768*eb293b8fSAndroid Build Coastguard Worker   Maps* maps = offline_utils_.GetMaps();
769*eb293b8fSAndroid Build Coastguard Worker   maps->Add(0xd025c788, 0xd025c9f0, 0, PROT_READ | PROT_EXEC | MAPS_FLAGS_JIT_SYMFILE_MAP,
770*eb293b8fSAndroid Build Coastguard Worker             "jit_map0.so", 0);
771*eb293b8fSAndroid Build Coastguard Worker   maps->Add(0xd025cd98, 0xd025cff4, 0, PROT_READ | PROT_EXEC | MAPS_FLAGS_JIT_SYMFILE_MAP,
772*eb293b8fSAndroid Build Coastguard Worker             "jit_map1.so", 0);
773*eb293b8fSAndroid Build Coastguard Worker   maps->Sort();
774*eb293b8fSAndroid Build Coastguard Worker 
775*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, maps, offline_utils_.GetRegs(), offline_utils_.GetProcessMemory());
776*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
777*eb293b8fSAndroid Build Coastguard Worker 
778*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
779*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
780*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
781*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
782*eb293b8fSAndroid Build Coastguard Worker 
783*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
784*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
785*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
786*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xd025c788U, unwinder.frames()[0].pc);
787*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff140U, unwinder.frames()[0].sp);
788*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xd025cdd5U, unwinder.frames()[1].pc);
789*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff140U, unwinder.frames()[1].sp);
790*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe4a755bbU, unwinder.frames()[2].pc);
791*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff160U, unwinder.frames()[2].sp);
792*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe49e71ddU, unwinder.frames()[3].pc);
793*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff8e8U, unwinder.frames()[3].sp);
794*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe7df3925U, unwinder.frames()[4].pc);
795*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff958U, unwinder.frames()[4].sp);
796*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe7daee39U, unwinder.frames()[5].pc);
797*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xcd4ff960U, unwinder.frames()[5].sp);
798*eb293b8fSAndroid Build Coastguard Worker }
799*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,offset_arm)800*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, offset_arm) {
801*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
802*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "offset_arm/", .arch = ARCH_ARM}, &error_msg))
803*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
804*eb293b8fSAndroid Build Coastguard Worker 
805*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
806*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
807*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
808*eb293b8fSAndroid Build Coastguard Worker 
809*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
810*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
811*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
812*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
813*eb293b8fSAndroid Build Coastguard Worker 
814*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
815*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
816*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
817*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2e55fa0U, unwinder.frames()[0].pc);
818*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf43d2cccU, unwinder.frames()[0].sp);
819*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2e55febU, unwinder.frames()[1].pc);
820*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf43d2ce0U, unwinder.frames()[1].sp);
821*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2e55ff3U, unwinder.frames()[2].pc);
822*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf43d2ce8U, unwinder.frames()[2].sp);
823*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2e59ed3U, unwinder.frames()[3].pc);
824*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf43d2cf0U, unwinder.frames()[3].sp);
825*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf413652cU, unwinder.frames()[4].pc);
826*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf43d2d10U, unwinder.frames()[4].sp);
827*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0U, unwinder.frames()[5].pc);
828*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcc0ee0U, unwinder.frames()[5].sp);
829*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2e562d9U, unwinder.frames()[6].pc);
830*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcc0ee0U, unwinder.frames()[6].sp);
831*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2e56c4fU, unwinder.frames()[7].pc);
832*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcc1060U, unwinder.frames()[7].sp);
833*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2e56c81U, unwinder.frames()[8].pc);
834*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcc1078U, unwinder.frames()[8].sp);
835*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2e58547U, unwinder.frames()[9].pc);
836*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcc1090U, unwinder.frames()[9].sp);
837*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2e58d99U, unwinder.frames()[10].pc);
838*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcc1438U, unwinder.frames()[10].sp);
839*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2e7e453U, unwinder.frames()[11].pc);
840*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcc1448U, unwinder.frames()[11].sp);
841*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2e7ede7U, unwinder.frames()[12].pc);
842*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcc1458U, unwinder.frames()[12].sp);
843*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2e7f105U, unwinder.frames()[13].pc);
844*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcc1490U, unwinder.frames()[13].sp);
845*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2e84215U, unwinder.frames()[14].pc);
846*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcc14c0U, unwinder.frames()[14].sp);
847*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2e83f4fU, unwinder.frames()[15].pc);
848*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcc1510U, unwinder.frames()[15].sp);
849*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2e773dbU, unwinder.frames()[16].pc);
850*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcc1528U, unwinder.frames()[16].sp);
851*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf41a2c0dU, unwinder.frames()[17].pc);
852*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcc1540U, unwinder.frames()[17].sp);
853*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2b6c02fU, unwinder.frames()[18].pc);
854*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcc1558U, unwinder.frames()[18].sp);
855*eb293b8fSAndroid Build Coastguard Worker }
856*eb293b8fSAndroid Build Coastguard Worker 
857*eb293b8fSAndroid Build Coastguard Worker // Test using a non-zero load bias library that has the fde entries
858*eb293b8fSAndroid Build Coastguard Worker // encoded as 0xb, which is not set as pc relative.
TEST_F(UnwindOfflineTest,debug_frame_load_bias_arm)859*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, debug_frame_load_bias_arm) {
860*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
861*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "debug_frame_load_bias_arm/", .arch = ARCH_ARM},
862*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
863*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
864*eb293b8fSAndroid Build Coastguard Worker 
865*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
866*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
867*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
868*eb293b8fSAndroid Build Coastguard Worker 
869*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
870*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
871*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
872*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
873*eb293b8fSAndroid Build Coastguard Worker 
874*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
875*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
876*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
877*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf0be238cU, unwinder.frames()[0].pc);
878*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffd4a638U, unwinder.frames()[0].sp);
879*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf0bb240fU, unwinder.frames()[1].pc);
880*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffd4a638U, unwinder.frames()[1].sp);
881*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf1a75535U, unwinder.frames()[2].pc);
882*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffd4a650U, unwinder.frames()[2].sp);
883*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf1a75633U, unwinder.frames()[3].pc);
884*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffd4a6b0U, unwinder.frames()[3].sp);
885*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf1a75b57U, unwinder.frames()[4].pc);
886*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffd4a6d0U, unwinder.frames()[4].sp);
887*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x8d1cc21U, unwinder.frames()[5].pc);
888*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffd4a6e8U, unwinder.frames()[5].sp);
889*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf0c15b89U, unwinder.frames()[6].pc);
890*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffd4a700U, unwinder.frames()[6].sp);
891*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x8d1cb77U, unwinder.frames()[7].pc);
892*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffd4a718U, unwinder.frames()[7].sp);
893*eb293b8fSAndroid Build Coastguard Worker }
894*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,shared_lib_in_apk_arm64)895*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, shared_lib_in_apk_arm64) {
896*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
897*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "shared_lib_in_apk_arm64/", .arch = ARCH_ARM64},
898*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
899*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
900*eb293b8fSAndroid Build Coastguard Worker 
901*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
902*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
903*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
904*eb293b8fSAndroid Build Coastguard Worker 
905*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
906*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
907*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
908*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
909*eb293b8fSAndroid Build Coastguard Worker 
910*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
911*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
912*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
913*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7e82c4fcbcULL, unwinder.frames()[0].pc);
914*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7df8ca3bf0ULL, unwinder.frames()[0].sp);
915*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7e82b5726cULL, unwinder.frames()[1].pc);
916*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7df8ca3bf0ULL, unwinder.frames()[1].sp);
917*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7e82b018c0ULL, unwinder.frames()[2].pc);
918*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7df8ca3da0ULL, unwinder.frames()[2].sp);
919*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7e7eecc6f4ULL, unwinder.frames()[3].pc);
920*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7dabf3db60ULL, unwinder.frames()[3].sp);
921*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7e7eeccad4ULL, unwinder.frames()[4].pc);
922*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7dabf3dc40ULL, unwinder.frames()[4].sp);
923*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7dabc405b4ULL, unwinder.frames()[5].pc);
924*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7dabf3dc50ULL, unwinder.frames()[5].sp);
925*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7e7eec7e68ULL, unwinder.frames()[6].pc);
926*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7dabf3dc70ULL, unwinder.frames()[6].sp);
927*eb293b8fSAndroid Build Coastguard Worker   // Ignore top frame since the test code was modified to end in __libc_init.
928*eb293b8fSAndroid Build Coastguard Worker }
929*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,shared_lib_in_apk_memory_only_arm64)930*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, shared_lib_in_apk_memory_only_arm64) {
931*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
932*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init(
933*eb293b8fSAndroid Build Coastguard Worker           {.offline_files_dir = "shared_lib_in_apk_memory_only_arm64/", .arch = ARCH_ARM64},
934*eb293b8fSAndroid Build Coastguard Worker           &error_msg))
935*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
936*eb293b8fSAndroid Build Coastguard Worker   // Add the memory that represents the shared library.
937*eb293b8fSAndroid Build Coastguard Worker 
938*eb293b8fSAndroid Build Coastguard Worker   std::shared_ptr<Memory> process_memory = offline_utils_.GetProcessMemory();
939*eb293b8fSAndroid Build Coastguard Worker   MemoryOfflineParts* memory = reinterpret_cast<MemoryOfflineParts*>(process_memory.get());
940*eb293b8fSAndroid Build Coastguard Worker   const std::string* offline_files_path = offline_utils_.GetOfflineFilesPath();
941*eb293b8fSAndroid Build Coastguard Worker   if (offline_files_path == nullptr) FAIL() << "GetOfflineFilesPath() failed.";
942*eb293b8fSAndroid Build Coastguard Worker 
943*eb293b8fSAndroid Build Coastguard Worker   if (!AddMemory(*offline_files_path + "lib_mem.data", memory, &error_msg)) FAIL() << error_msg;
944*eb293b8fSAndroid Build Coastguard Worker 
945*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(), process_memory);
946*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
947*eb293b8fSAndroid Build Coastguard Worker 
948*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
949*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
950*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
951*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
952*eb293b8fSAndroid Build Coastguard Worker 
953*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
954*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
955*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
956*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7e82c4fcbcULL, unwinder.frames()[0].pc);
957*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7df8ca3bf0ULL, unwinder.frames()[0].sp);
958*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7e82b5726cULL, unwinder.frames()[1].pc);
959*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7df8ca3bf0ULL, unwinder.frames()[1].sp);
960*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7e82b018c0ULL, unwinder.frames()[2].pc);
961*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7df8ca3da0ULL, unwinder.frames()[2].sp);
962*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7e7eecc6f4ULL, unwinder.frames()[3].pc);
963*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7dabf3db60ULL, unwinder.frames()[3].sp);
964*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7e7eeccad4ULL, unwinder.frames()[4].pc);
965*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7dabf3dc40ULL, unwinder.frames()[4].sp);
966*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7dabc405b4ULL, unwinder.frames()[5].pc);
967*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7dabf3dc50ULL, unwinder.frames()[5].sp);
968*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7e7eec7e68ULL, unwinder.frames()[6].pc);
969*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7dabf3dc70ULL, unwinder.frames()[6].sp);
970*eb293b8fSAndroid Build Coastguard Worker   // Ignore top frame since the test code was modified to end in __libc_init.
971*eb293b8fSAndroid Build Coastguard Worker }
972*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,shared_lib_in_apk_single_map_arm64)973*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, shared_lib_in_apk_single_map_arm64) {
974*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
975*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init(
976*eb293b8fSAndroid Build Coastguard Worker           {.offline_files_dir = "shared_lib_in_apk_single_map_arm64/", .arch = ARCH_ARM64},
977*eb293b8fSAndroid Build Coastguard Worker           &error_msg))
978*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
979*eb293b8fSAndroid Build Coastguard Worker 
980*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
981*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
982*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
983*eb293b8fSAndroid Build Coastguard Worker 
984*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
985*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
986*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
987*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
988*eb293b8fSAndroid Build Coastguard Worker 
989*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
990*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
991*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
992*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7cbe0b14bcULL, unwinder.frames()[0].pc);
993*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be4f077d0ULL, unwinder.frames()[0].sp);
994*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be6715f5cULL, unwinder.frames()[1].pc);
995*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be4f077d0ULL, unwinder.frames()[1].sp);
996*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be6715e9cULL, unwinder.frames()[2].pc);
997*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be4f07800ULL, unwinder.frames()[2].sp);
998*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be6715d70ULL, unwinder.frames()[3].pc);
999*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be4f07840ULL, unwinder.frames()[3].sp);
1000*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be6716408ULL, unwinder.frames()[4].pc);
1001*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be4f07860ULL, unwinder.frames()[4].sp);
1002*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be67168d8ULL, unwinder.frames()[5].pc);
1003*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be4f07880ULL, unwinder.frames()[5].sp);
1004*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be6716814ULL, unwinder.frames()[6].pc);
1005*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be4f078f0ULL, unwinder.frames()[6].sp);
1006*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be6704f60ULL, unwinder.frames()[7].pc);
1007*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be4f07910ULL, unwinder.frames()[7].sp);
1008*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be5f7b024ULL, unwinder.frames()[8].pc);
1009*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be4f07950ULL, unwinder.frames()[8].sp);
1010*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be5f7cad0ULL, unwinder.frames()[9].pc);
1011*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be4f07aa0ULL, unwinder.frames()[9].sp);
1012*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be5f7cb64ULL, unwinder.frames()[10].pc);
1013*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be4f07ce0ULL, unwinder.frames()[10].sp);
1014*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7cbe11406cULL, unwinder.frames()[11].pc);
1015*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be4f07d00ULL, unwinder.frames()[11].sp);
1016*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7cbe0b5e18ULL, unwinder.frames()[12].pc);
1017*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7be4f07d20ULL, unwinder.frames()[12].sp);
1018*eb293b8fSAndroid Build Coastguard Worker }
1019*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,invalid_elf_offset_arm)1020*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, invalid_elf_offset_arm) {
1021*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
1022*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "invalid_elf_offset_arm/",
1023*eb293b8fSAndroid Build Coastguard Worker                             .arch = ARCH_ARM,
1024*eb293b8fSAndroid Build Coastguard Worker                             .memory_flag = ProcessMemoryFlag::kNoMemory},
1025*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
1026*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
1027*eb293b8fSAndroid Build Coastguard Worker 
1028*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1029*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
1030*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
1031*eb293b8fSAndroid Build Coastguard Worker 
1032*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
1033*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1034*eb293b8fSAndroid Build Coastguard Worker 
1035*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
1036*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1037*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ("  #00 pc 00aa7508  invalid.apk (offset 0x12e4000)\n", frame_info);
1038*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xc898f508, unwinder.frames()[0].pc);
1039*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xc2044218, unwinder.frames()[0].sp);
1040*eb293b8fSAndroid Build Coastguard Worker }
1041*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,load_bias_ro_rx_x86_64)1042*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, load_bias_ro_rx_x86_64) {
1043*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
1044*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "load_bias_ro_rx_x86_64/", .arch = ARCH_X86_64},
1045*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
1046*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
1047*eb293b8fSAndroid Build Coastguard Worker 
1048*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1049*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
1050*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
1051*eb293b8fSAndroid Build Coastguard Worker 
1052*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
1053*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1054*eb293b8fSAndroid Build Coastguard Worker 
1055*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
1056*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1057*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(
1058*eb293b8fSAndroid Build Coastguard Worker       "  #00 pc 00000000000e9dd4  libc.so (__write+20)\n"
1059*eb293b8fSAndroid Build Coastguard Worker       "  #01 pc 000000000007ab9c  libc.so (_IO_file_write+44)\n"
1060*eb293b8fSAndroid Build Coastguard Worker       "  #02 pc 0000000000079f3e  libc.so\n"
1061*eb293b8fSAndroid Build Coastguard Worker       "  #03 pc 000000000007bce8  libc.so (_IO_do_write+24)\n"
1062*eb293b8fSAndroid Build Coastguard Worker       "  #04 pc 000000000007b26e  libc.so (_IO_file_xsputn+270)\n"
1063*eb293b8fSAndroid Build Coastguard Worker       "  #05 pc 000000000004f7f9  libc.so (_IO_vfprintf+1945)\n"
1064*eb293b8fSAndroid Build Coastguard Worker       "  #06 pc 0000000000057cb5  libc.so (_IO_printf+165)\n"
1065*eb293b8fSAndroid Build Coastguard Worker       "  #07 pc 0000000000ed1796  perfetto_unittests "
1066*eb293b8fSAndroid Build Coastguard Worker       "(testing::internal::PrettyUnitTestResultPrinter::OnTestIterationStart(testing::UnitTest "
1067*eb293b8fSAndroid Build Coastguard Worker       "const&, int)+374)\n"
1068*eb293b8fSAndroid Build Coastguard Worker       "  #08 pc 0000000000ed30fd  perfetto_unittests "
1069*eb293b8fSAndroid Build Coastguard Worker       "(testing::internal::TestEventRepeater::OnTestIterationStart(testing::UnitTest const&, "
1070*eb293b8fSAndroid Build Coastguard Worker       "int)+125)\n"
1071*eb293b8fSAndroid Build Coastguard Worker       "  #09 pc 0000000000ed5e25  perfetto_unittests "
1072*eb293b8fSAndroid Build Coastguard Worker       "(testing::internal::UnitTestImpl::RunAllTests()+581)\n"
1073*eb293b8fSAndroid Build Coastguard Worker       "  #10 pc 0000000000ef63f3  perfetto_unittests "
1074*eb293b8fSAndroid Build Coastguard Worker       "(bool "
1075*eb293b8fSAndroid Build Coastguard Worker       "testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, "
1076*eb293b8fSAndroid Build Coastguard Worker       "bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char "
1077*eb293b8fSAndroid Build Coastguard Worker       "const*)+131)\n"
1078*eb293b8fSAndroid Build Coastguard Worker       "  #11 pc 0000000000ee2a21  perfetto_unittests "
1079*eb293b8fSAndroid Build Coastguard Worker       "(bool "
1080*eb293b8fSAndroid Build Coastguard Worker       "testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, "
1081*eb293b8fSAndroid Build Coastguard Worker       "bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char "
1082*eb293b8fSAndroid Build Coastguard Worker       "const*)+113)\n"
1083*eb293b8fSAndroid Build Coastguard Worker       "  #12 pc 0000000000ed5bb9  perfetto_unittests (testing::UnitTest::Run()+185)\n"
1084*eb293b8fSAndroid Build Coastguard Worker       "  #13 pc 0000000000e900f0  perfetto_unittests (RUN_ALL_TESTS()+16)\n"
1085*eb293b8fSAndroid Build Coastguard Worker       "  #14 pc 0000000000e900d8  perfetto_unittests (main+56)\n"
1086*eb293b8fSAndroid Build Coastguard Worker       "  #15 pc 000000000002352a  libc.so (__libc_start_main+234)\n"
1087*eb293b8fSAndroid Build Coastguard Worker       "  #16 pc 0000000000919029  perfetto_unittests (_start+41)\n",
1088*eb293b8fSAndroid Build Coastguard Worker       frame_info);
1089*eb293b8fSAndroid Build Coastguard Worker 
1090*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7f9326a57dd4ULL, unwinder.frames()[0].pc);
1091*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffd224153c8ULL, unwinder.frames()[0].sp);
1092*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7f93269e8b9cULL, unwinder.frames()[1].pc);
1093*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffd224153d0ULL, unwinder.frames()[1].sp);
1094*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7f93269e7f3eULL, unwinder.frames()[2].pc);
1095*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffd22415400ULL, unwinder.frames()[2].sp);
1096*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7f93269e9ce8ULL, unwinder.frames()[3].pc);
1097*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffd22415440ULL, unwinder.frames()[3].sp);
1098*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7f93269e926eULL, unwinder.frames()[4].pc);
1099*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffd22415450ULL, unwinder.frames()[4].sp);
1100*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7f93269bd7f9ULL, unwinder.frames()[5].pc);
1101*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffd22415490ULL, unwinder.frames()[5].sp);
1102*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7f93269c5cb5ULL, unwinder.frames()[6].pc);
1103*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffd22415a10ULL, unwinder.frames()[6].sp);
1104*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed1796ULL, unwinder.frames()[7].pc);
1105*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffd22415af0ULL, unwinder.frames()[7].sp);
1106*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed30fdULL, unwinder.frames()[8].pc);
1107*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffd22415b70ULL, unwinder.frames()[8].sp);
1108*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed5e25ULL, unwinder.frames()[9].pc);
1109*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffd22415bb0ULL, unwinder.frames()[9].sp);
1110*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xef63f3ULL, unwinder.frames()[10].pc);
1111*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffd22415c60ULL, unwinder.frames()[10].sp);
1112*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xee2a21ULL, unwinder.frames()[11].pc);
1113*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffd22415cc0ULL, unwinder.frames()[11].sp);
1114*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed5bb9ULL, unwinder.frames()[12].pc);
1115*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffd22415d40ULL, unwinder.frames()[12].sp);
1116*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe900f0ULL, unwinder.frames()[13].pc);
1117*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffd22415d90ULL, unwinder.frames()[13].sp);
1118*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xe900d8ULL, unwinder.frames()[14].pc);
1119*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffd22415da0ULL, unwinder.frames()[14].sp);
1120*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7f932699152aULL, unwinder.frames()[15].pc);
1121*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffd22415dd0ULL, unwinder.frames()[15].sp);
1122*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x919029ULL, unwinder.frames()[16].pc);
1123*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffd22415e90ULL, unwinder.frames()[16].sp);
1124*eb293b8fSAndroid Build Coastguard Worker }
1125*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,load_bias_different_section_bias_arm64)1126*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, load_bias_different_section_bias_arm64) {
1127*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
1128*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init(
1129*eb293b8fSAndroid Build Coastguard Worker           {.offline_files_dir = "load_bias_different_section_bias_arm64/", .arch = ARCH_ARM64},
1130*eb293b8fSAndroid Build Coastguard Worker           &error_msg))
1131*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
1132*eb293b8fSAndroid Build Coastguard Worker 
1133*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1134*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
1135*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
1136*eb293b8fSAndroid Build Coastguard Worker 
1137*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
1138*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1139*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
1140*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1141*eb293b8fSAndroid Build Coastguard Worker 
1142*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
1143*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1144*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
1145*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7112cb99bcULL, unwinder.frames()[0].pc);
1146*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7112bdbbf0ULL, unwinder.frames()[0].sp);
1147*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7112c394e8ULL, unwinder.frames()[1].pc);
1148*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7112bdbbf0ULL, unwinder.frames()[1].sp);
1149*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7112be28c0ULL, unwinder.frames()[2].pc);
1150*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7112bdbda0ULL, unwinder.frames()[2].sp);
1151*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x71115ab3e8ULL, unwinder.frames()[3].pc);
1152*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fdd4a3f00ULL, unwinder.frames()[3].sp);
1153*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5f739dc9fcULL, unwinder.frames()[4].pc);
1154*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fdd4a3fe0ULL, unwinder.frames()[4].sp);
1155*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5f739edd80ULL, unwinder.frames()[5].pc);
1156*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fdd4a3ff0ULL, unwinder.frames()[5].sp);
1157*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5f739ee24cULL, unwinder.frames()[6].pc);
1158*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fdd4a4010ULL, unwinder.frames()[6].sp);
1159*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5f739ee558ULL, unwinder.frames()[7].pc);
1160*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fdd4a4040ULL, unwinder.frames()[7].sp);
1161*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5f739f2ffcULL, unwinder.frames()[8].pc);
1162*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fdd4a4070ULL, unwinder.frames()[8].sp);
1163*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5f739f2d9cULL, unwinder.frames()[9].pc);
1164*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fdd4a4100ULL, unwinder.frames()[9].sp);
1165*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5f739dd4e4ULL, unwinder.frames()[10].pc);
1166*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fdd4a4130ULL, unwinder.frames()[10].sp);
1167*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x71115a6a34ULL, unwinder.frames()[11].pc);
1168*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fdd4a4170ULL, unwinder.frames()[11].sp);
1169*eb293b8fSAndroid Build Coastguard Worker }
1170*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,eh_frame_bias_x86)1171*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, eh_frame_bias_x86) {
1172*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
1173*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "eh_frame_bias_x86/", .arch = ARCH_X86},
1174*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
1175*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
1176*eb293b8fSAndroid Build Coastguard Worker 
1177*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1178*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
1179*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
1180*eb293b8fSAndroid Build Coastguard Worker 
1181*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
1182*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1183*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
1184*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1185*eb293b8fSAndroid Build Coastguard Worker 
1186*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
1187*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1188*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
1189*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffffe430ULL, unwinder.frames()[0].pc);
1190*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xfffe1a30ULL, unwinder.frames()[0].sp);
1191*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xeb585a4bULL, unwinder.frames()[1].pc);
1192*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xfffe1a40ULL, unwinder.frames()[1].sp);
1193*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xeb5333a3ULL, unwinder.frames()[2].pc);
1194*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xfffe1a60ULL, unwinder.frames()[2].sp);
1195*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xeb5333edULL, unwinder.frames()[3].pc);
1196*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xfffe1ab0ULL, unwinder.frames()[3].sp);
1197*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xeb841ea2ULL, unwinder.frames()[4].pc);
1198*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xfffe1ae0ULL, unwinder.frames()[4].sp);
1199*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xeb83d5e7ULL, unwinder.frames()[5].pc);
1200*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xfffe1b30ULL, unwinder.frames()[5].sp);
1201*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xeb83d193ULL, unwinder.frames()[6].pc);
1202*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xfffe1bd0ULL, unwinder.frames()[6].sp);
1203*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xeb836c77ULL, unwinder.frames()[7].pc);
1204*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xfffe1c00ULL, unwinder.frames()[7].sp);
1205*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xeb518f66ULL, unwinder.frames()[8].pc);
1206*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xfffe1d00ULL, unwinder.frames()[8].sp);
1207*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xeb83460eULL, unwinder.frames()[9].pc);
1208*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xfffe1d40ULL, unwinder.frames()[9].sp);
1209*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x00000001ULL, unwinder.frames()[10].pc);
1210*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xfffe1d74ULL, unwinder.frames()[10].sp);
1211*eb293b8fSAndroid Build Coastguard Worker }
1212*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,signal_load_bias_arm)1213*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, signal_load_bias_arm) {
1214*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
1215*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "signal_load_bias_arm/", .arch = ARCH_ARM},
1216*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
1217*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
1218*eb293b8fSAndroid Build Coastguard Worker 
1219*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1220*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
1221*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
1222*eb293b8fSAndroid Build Coastguard Worker 
1223*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
1224*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1225*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
1226*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1227*eb293b8fSAndroid Build Coastguard Worker 
1228*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
1229*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1230*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
1231*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xb6955f9eULL, unwinder.frames()[0].pc);
1232*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf2790ce8ULL, unwinder.frames()[0].sp);
1233*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xb6955fa7ULL, unwinder.frames()[1].pc);
1234*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf2790ce8ULL, unwinder.frames()[1].sp);
1235*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xb6955fafULL, unwinder.frames()[2].pc);
1236*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf2790cf0ULL, unwinder.frames()[2].sp);
1237*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xb695980bULL, unwinder.frames()[3].pc);
1238*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf2790cf8ULL, unwinder.frames()[3].sp);
1239*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf23febd4ULL, unwinder.frames()[4].pc);
1240*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf2790d10ULL, unwinder.frames()[4].sp);
1241*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xb695601eULL, unwinder.frames()[5].pc);
1242*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffe67798ULL, unwinder.frames()[5].sp);
1243*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xb6956633ULL, unwinder.frames()[6].pc);
1244*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffe67890ULL, unwinder.frames()[6].sp);
1245*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xb695664bULL, unwinder.frames()[7].pc);
1246*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffe678a0ULL, unwinder.frames()[7].sp);
1247*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xb6958711ULL, unwinder.frames()[8].pc);
1248*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffe678b0ULL, unwinder.frames()[8].sp);
1249*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xb6958603ULL, unwinder.frames()[9].pc);
1250*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffe67ac8ULL, unwinder.frames()[9].sp);
1251*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xb697ffe3ULL, unwinder.frames()[10].pc);
1252*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffe67ad8ULL, unwinder.frames()[10].sp);
1253*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xb6980b25ULL, unwinder.frames()[11].pc);
1254*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffe67ae8ULL, unwinder.frames()[11].sp);
1255*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xb6980e27ULL, unwinder.frames()[12].pc);
1256*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffe67b18ULL, unwinder.frames()[12].sp);
1257*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xb698893dULL, unwinder.frames()[13].pc);
1258*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffe67b48ULL, unwinder.frames()[13].sp);
1259*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xb698860bULL, unwinder.frames()[14].pc);
1260*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffe67bb0ULL, unwinder.frames()[14].sp);
1261*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xb6995035ULL, unwinder.frames()[15].pc);
1262*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffe67bd0ULL, unwinder.frames()[15].sp);
1263*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf23fe155ULL, unwinder.frames()[16].pc);
1264*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffe67d10ULL, unwinder.frames()[16].sp);
1265*eb293b8fSAndroid Build Coastguard Worker }
1266*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,empty_arm64)1267*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, empty_arm64) {
1268*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
1269*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "empty_arm64/", .arch = ARCH_ARM64}, &error_msg))
1270*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
1271*eb293b8fSAndroid Build Coastguard Worker 
1272*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1273*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
1274*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
1275*eb293b8fSAndroid Build Coastguard Worker 
1276*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
1277*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1278*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
1279*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1280*eb293b8fSAndroid Build Coastguard Worker 
1281*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
1282*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1283*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
1284*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x72a02203a4U, unwinder.frames()[0].pc);
1285*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffb6c0b50U, unwinder.frames()[0].sp);
1286*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x72a01dd44cU, unwinder.frames()[1].pc);
1287*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffb6c0b50U, unwinder.frames()[1].sp);
1288*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x729f759ce4U, unwinder.frames()[2].pc);
1289*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffb6c0c50U, unwinder.frames()[2].sp);
1290*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x729f759e98U, unwinder.frames()[3].pc);
1291*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffb6c0ce0U, unwinder.frames()[3].sp);
1292*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x729f75a6acU, unwinder.frames()[4].pc);
1293*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffb6c0d10U, unwinder.frames()[4].sp);
1294*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5d478af3b0U, unwinder.frames()[5].pc);
1295*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffb6c0d40U, unwinder.frames()[5].sp);
1296*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x72a01cf594U, unwinder.frames()[6].pc);
1297*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffb6c0f30U, unwinder.frames()[6].sp);
1298*eb293b8fSAndroid Build Coastguard Worker }
1299*eb293b8fSAndroid Build Coastguard Worker 
1300*eb293b8fSAndroid Build Coastguard Worker // This test has a libc.so where the __restore has been changed so
1301*eb293b8fSAndroid Build Coastguard Worker // that the signal handler match does not occur and it uses the
1302*eb293b8fSAndroid Build Coastguard Worker // fde to do the unwind.
TEST_F(UnwindOfflineTest,signal_fde_x86)1303*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, signal_fde_x86) {
1304*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
1305*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "signal_fde_x86/", .arch = ARCH_X86}, &error_msg))
1306*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
1307*eb293b8fSAndroid Build Coastguard Worker 
1308*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1309*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
1310*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
1311*eb293b8fSAndroid Build Coastguard Worker 
1312*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
1313*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1314*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
1315*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1316*eb293b8fSAndroid Build Coastguard Worker 
1317*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
1318*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1319*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
1320*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5ae0d4d9U, unwinder.frames()[0].pc);
1321*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xecb37188U, unwinder.frames()[0].sp);
1322*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5ae0d4fcU, unwinder.frames()[1].pc);
1323*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xecb37190U, unwinder.frames()[1].sp);
1324*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5ae0d52cU, unwinder.frames()[2].pc);
1325*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xecb371b0U, unwinder.frames()[2].sp);
1326*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5ae16f62U, unwinder.frames()[3].pc);
1327*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xecb371d0U, unwinder.frames()[3].sp);
1328*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xec169fb0U, unwinder.frames()[4].pc);
1329*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xecb371f0U, unwinder.frames()[4].sp);
1330*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x0U, unwinder.frames()[5].pc);
1331*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcfac6cU, unwinder.frames()[5].sp);
1332*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5ae0d61aU, unwinder.frames()[6].pc);
1333*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcfac6cU, unwinder.frames()[6].sp);
1334*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5ae0e3aaU, unwinder.frames()[7].pc);
1335*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcfad60U, unwinder.frames()[7].sp);
1336*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5ae0e3eaU, unwinder.frames()[8].pc);
1337*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcfad90U, unwinder.frames()[8].sp);
1338*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5ae13444U, unwinder.frames()[9].pc);
1339*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcfadc0U, unwinder.frames()[9].sp);
1340*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5ae145b8U, unwinder.frames()[10].pc);
1341*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcfb020U, unwinder.frames()[10].sp);
1342*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5ae93a19U, unwinder.frames()[11].pc);
1343*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcfb050U, unwinder.frames()[11].sp);
1344*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5ae938c5U, unwinder.frames()[12].pc);
1345*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcfb090U, unwinder.frames()[12].sp);
1346*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5ae94d3eU, unwinder.frames()[13].pc);
1347*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcfb0f0U, unwinder.frames()[13].sp);
1348*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5ae958b4U, unwinder.frames()[14].pc);
1349*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcfb160U, unwinder.frames()[14].sp);
1350*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5aea4cb0U, unwinder.frames()[15].pc);
1351*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcfb1d0U, unwinder.frames()[15].sp);
1352*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5aea470fU, unwinder.frames()[16].pc);
1353*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcfb270U, unwinder.frames()[16].sp);
1354*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5aebc31eU, unwinder.frames()[17].pc);
1355*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcfb2c0U, unwinder.frames()[17].sp);
1356*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5aebb9e9U, unwinder.frames()[18].pc);
1357*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcfc3c0U, unwinder.frames()[18].sp);
1358*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xec161646U, unwinder.frames()[19].pc);
1359*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xffcfc3f0U, unwinder.frames()[19].sp);
1360*eb293b8fSAndroid Build Coastguard Worker }
1361*eb293b8fSAndroid Build Coastguard Worker 
1362*eb293b8fSAndroid Build Coastguard Worker // This test has a libc.so where the __restore_rt has been changed so
1363*eb293b8fSAndroid Build Coastguard Worker // that the signal handler match does not occur and it uses the
1364*eb293b8fSAndroid Build Coastguard Worker // fde to do the unwind.
TEST_F(UnwindOfflineTest,signal_fde_x86_64)1365*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, signal_fde_x86_64) {
1366*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
1367*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "signal_fde_x86_64/", .arch = ARCH_X86_64},
1368*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
1369*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
1370*eb293b8fSAndroid Build Coastguard Worker 
1371*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1372*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
1373*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
1374*eb293b8fSAndroid Build Coastguard Worker 
1375*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
1376*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1377*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
1378*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1379*eb293b8fSAndroid Build Coastguard Worker 
1380*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
1381*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1382*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
1383*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5bb41271e15bU, unwinder.frames()[0].pc);
1384*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x707eb5aa8320U, unwinder.frames()[0].sp);
1385*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5bb41271e168U, unwinder.frames()[1].pc);
1386*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x707eb5aa8330U, unwinder.frames()[1].sp);
1387*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5bb41271e178U, unwinder.frames()[2].pc);
1388*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x707eb5aa8340U, unwinder.frames()[2].sp);
1389*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5bb412724c77U, unwinder.frames()[3].pc);
1390*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x707eb5aa8350U, unwinder.frames()[3].sp);
1391*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x707eb2ca5d10U, unwinder.frames()[4].pc);
1392*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x707eb5aa8380U, unwinder.frames()[4].sp);
1393*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x0U, unwinder.frames()[5].pc);
1394*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcaadde078U, unwinder.frames()[5].sp);
1395*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5bb41271e244U, unwinder.frames()[6].pc);
1396*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcaadde078U, unwinder.frames()[6].sp);
1397*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5bb41271eb44U, unwinder.frames()[7].pc);
1398*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcaadde1a0U, unwinder.frames()[7].sp);
1399*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5bb41271eb64U, unwinder.frames()[8].pc);
1400*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcaadde1c0U, unwinder.frames()[8].sp);
1401*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5bb412722457U, unwinder.frames()[9].pc);
1402*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcaadde1e0U, unwinder.frames()[9].sp);
1403*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5bb412722f67U, unwinder.frames()[10].pc);
1404*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcaadde510U, unwinder.frames()[10].sp);
1405*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5bb412773c38U, unwinder.frames()[11].pc);
1406*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcaadde530U, unwinder.frames()[11].sp);
1407*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5bb412774f9aU, unwinder.frames()[12].pc);
1408*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcaadde560U, unwinder.frames()[12].sp);
1409*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5bb412775a46U, unwinder.frames()[13].pc);
1410*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcaadde5b0U, unwinder.frames()[13].sp);
1411*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5bb4127844c6U, unwinder.frames()[14].pc);
1412*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcaadde5f0U, unwinder.frames()[14].sp);
1413*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5bb412783f61U, unwinder.frames()[15].pc);
1414*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcaadde6c0U, unwinder.frames()[15].sp);
1415*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5bb41279a155U, unwinder.frames()[16].pc);
1416*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcaadde720U, unwinder.frames()[16].sp);
1417*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x707eb2c9c405U, unwinder.frames()[17].pc);
1418*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ffcaaddf870U, unwinder.frames()[17].sp);
1419*eb293b8fSAndroid Build Coastguard Worker }
1420*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,pauth_pc_arm64)1421*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, pauth_pc_arm64) {
1422*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
1423*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "pauth_pc_arm64/", .arch = ARCH_ARM64},
1424*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
1425*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
1426*eb293b8fSAndroid Build Coastguard Worker 
1427*eb293b8fSAndroid Build Coastguard Worker   static_cast<RegsArm64*>(offline_utils_.GetRegs())->SetPACMask(0x007fff8000000000ULL);
1428*eb293b8fSAndroid Build Coastguard Worker 
1429*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1430*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
1431*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
1432*eb293b8fSAndroid Build Coastguard Worker 
1433*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
1434*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1435*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
1436*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1437*eb293b8fSAndroid Build Coastguard Worker 
1438*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
1439*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1440*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
1441*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c390884a8U, unwinder.frames()[0].pc);
1442*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511750U, unwinder.frames()[0].sp);
1443*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c39088270U, unwinder.frames()[1].pc);
1444*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511770U, unwinder.frames()[1].sp);
1445*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c39074640U, unwinder.frames()[2].pc);
1446*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511930U, unwinder.frames()[2].sp);
1447*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c39074588U, unwinder.frames()[3].pc);
1448*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511960U, unwinder.frames()[3].sp);
1449*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[4].pc);
1450*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff35119a0U, unwinder.frames()[4].sp);
1451*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c39074588U, unwinder.frames()[5].pc);
1452*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff35119d0U, unwinder.frames()[5].sp);
1453*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[6].pc);
1454*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511a10U, unwinder.frames()[6].sp);
1455*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c39074588U, unwinder.frames()[7].pc);
1456*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511a40U, unwinder.frames()[7].sp);
1457*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[8].pc);
1458*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511a80U, unwinder.frames()[8].sp);
1459*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c39074588U, unwinder.frames()[9].pc);
1460*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511ab0U, unwinder.frames()[9].sp);
1461*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[10].pc);
1462*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511af0U, unwinder.frames()[10].sp);
1463*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c39074588U, unwinder.frames()[11].pc);
1464*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511b20U, unwinder.frames()[11].sp);
1465*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[12].pc);
1466*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511b60U, unwinder.frames()[12].sp);
1467*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c39074588U, unwinder.frames()[13].pc);
1468*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511b90U, unwinder.frames()[13].sp);
1469*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[14].pc);
1470*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511bd0U, unwinder.frames()[14].sp);
1471*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c39074588U, unwinder.frames()[15].pc);
1472*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511c00U, unwinder.frames()[15].sp);
1473*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[16].pc);
1474*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511c40U, unwinder.frames()[16].sp);
1475*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c39074588U, unwinder.frames()[17].pc);
1476*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511c70U, unwinder.frames()[17].sp);
1477*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[18].pc);
1478*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511cb0U, unwinder.frames()[18].sp);
1479*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c39074588U, unwinder.frames()[19].pc);
1480*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511ce0U, unwinder.frames()[19].sp);
1481*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[20].pc);
1482*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511d20U, unwinder.frames()[20].sp);
1483*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c39086e54U, unwinder.frames()[21].pc);
1484*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511d50U, unwinder.frames()[21].sp);
1485*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c3907c834U, unwinder.frames()[22].pc);
1486*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511db0U, unwinder.frames()[22].sp);
1487*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c3907c2ccU, unwinder.frames()[23].pc);
1488*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511dc0U, unwinder.frames()[23].sp);
1489*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5c3907c8b4U, unwinder.frames()[24].pc);
1490*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511e40U, unwinder.frames()[24].sp);
1491*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7e4ede29d8U, unwinder.frames()[25].pc);
1492*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff3511e70U, unwinder.frames()[25].sp);
1493*eb293b8fSAndroid Build Coastguard Worker }
1494*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,profiler_like_multi_process)1495*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, profiler_like_multi_process) {
1496*eb293b8fSAndroid Build Coastguard Worker   ConsecutiveUnwindTest(std::vector<UnwindSampleInfo>{
1497*eb293b8fSAndroid Build Coastguard Worker       {.offline_files_dir = "bluetooth_arm64/pc_1/", .arch = ARCH_ARM64},
1498*eb293b8fSAndroid Build Coastguard Worker       {.offline_files_dir = "jit_debug_arm/",
1499*eb293b8fSAndroid Build Coastguard Worker        .arch = ARCH_ARM,
1500*eb293b8fSAndroid Build Coastguard Worker        .memory_flag = ProcessMemoryFlag::kIncludeJitMemory},
1501*eb293b8fSAndroid Build Coastguard Worker       {.offline_files_dir = "photos_reset_arm64/", .arch = ARCH_ARM64},
1502*eb293b8fSAndroid Build Coastguard Worker       {.offline_files_dir = "youtube_compiled_arm64/", .arch = ARCH_ARM64},
1503*eb293b8fSAndroid Build Coastguard Worker       {.offline_files_dir = "yt_music_arm64/", .arch = ARCH_ARM64},
1504*eb293b8fSAndroid Build Coastguard Worker       {.offline_files_dir = "maps_compiled_arm64/28656_oat_odex_jar/", .arch = ARCH_ARM64}});
1505*eb293b8fSAndroid Build Coastguard Worker }
1506*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,profiler_like_single_process_multi_thread)1507*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, profiler_like_single_process_multi_thread) {
1508*eb293b8fSAndroid Build Coastguard Worker   ConsecutiveUnwindTest(std::vector<UnwindSampleInfo>{
1509*eb293b8fSAndroid Build Coastguard Worker       {.offline_files_dir = "maps_compiled_arm64/28656_oat_odex_jar/", .arch = ARCH_ARM64},
1510*eb293b8fSAndroid Build Coastguard Worker       {.offline_files_dir = "maps_compiled_arm64/28613_main-thread/", .arch = ARCH_ARM64},
1511*eb293b8fSAndroid Build Coastguard Worker       {.offline_files_dir = "maps_compiled_arm64/28644/", .arch = ARCH_ARM64},
1512*eb293b8fSAndroid Build Coastguard Worker       {.offline_files_dir = "maps_compiled_arm64/28648/", .arch = ARCH_ARM64},
1513*eb293b8fSAndroid Build Coastguard Worker       {.offline_files_dir = "maps_compiled_arm64/28667/", .arch = ARCH_ARM64}});
1514*eb293b8fSAndroid Build Coastguard Worker }
1515*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,profiler_like_single_thread_diverse_pcs)1516*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, profiler_like_single_thread_diverse_pcs) {
1517*eb293b8fSAndroid Build Coastguard Worker   ConsecutiveUnwindTest(std::vector<UnwindSampleInfo>{
1518*eb293b8fSAndroid Build Coastguard Worker       {.offline_files_dir = "bluetooth_arm64/pc_1/", .arch = ARCH_ARM64},
1519*eb293b8fSAndroid Build Coastguard Worker       {.offline_files_dir = "bluetooth_arm64/pc_2/", .arch = ARCH_ARM64},
1520*eb293b8fSAndroid Build Coastguard Worker       {.offline_files_dir = "bluetooth_arm64/pc_3/", .arch = ARCH_ARM64},
1521*eb293b8fSAndroid Build Coastguard Worker       {.offline_files_dir = "bluetooth_arm64/pc_4/", .arch = ARCH_ARM64}});
1522*eb293b8fSAndroid Build Coastguard Worker }
1523*eb293b8fSAndroid Build Coastguard Worker 
VerifyApkRORX(Unwinder & unwinder)1524*eb293b8fSAndroid Build Coastguard Worker static void VerifyApkRORX(Unwinder& unwinder) {
1525*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7426d2e030U, unwinder.frames()[0].pc);
1526*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe740cc90U, unwinder.frames()[0].sp);
1527*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7426d2e08cU, unwinder.frames()[1].pc);
1528*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe740ccd0U, unwinder.frames()[1].sp);
1529*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7426d2e0b8U, unwinder.frames()[2].pc);
1530*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe740ccf0U, unwinder.frames()[2].sp);
1531*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7426d2e0e4U, unwinder.frames()[3].pc);
1532*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe740cd10U, unwinder.frames()[3].sp);
1533*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x603b0c5154U, unwinder.frames()[4].pc);
1534*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe740cd30U, unwinder.frames()[4].sp);
1535*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x76b6df0b10U, unwinder.frames()[5].pc);
1536*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe740cdb0U, unwinder.frames()[5].sp);
1537*eb293b8fSAndroid Build Coastguard Worker }
1538*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,apk_rorx_arm64)1539*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, apk_rorx_arm64) {
1540*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
1541*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "apk_rorx_arm64/", .arch = ARCH_ARM64},
1542*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
1543*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
1544*eb293b8fSAndroid Build Coastguard Worker 
1545*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1546*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
1547*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
1548*eb293b8fSAndroid Build Coastguard Worker 
1549*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
1550*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1551*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
1552*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1553*eb293b8fSAndroid Build Coastguard Worker 
1554*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
1555*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1556*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
1557*eb293b8fSAndroid Build Coastguard Worker 
1558*eb293b8fSAndroid Build Coastguard Worker   VerifyApkRORX(unwinder);
1559*eb293b8fSAndroid Build Coastguard Worker }
1560*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,apk_rorx_unreadable_arm64)1561*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, apk_rorx_unreadable_arm64) {
1562*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
1563*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "apk_rorx_unreadable_arm64/", .arch = ARCH_ARM64},
1564*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
1565*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
1566*eb293b8fSAndroid Build Coastguard Worker 
1567*eb293b8fSAndroid Build Coastguard Worker   // Create a process memory object that holds the apk data in memory
1568*eb293b8fSAndroid Build Coastguard Worker   // along with the stack data.
1569*eb293b8fSAndroid Build Coastguard Worker   MemoryOffline* stack_memory = new MemoryOffline;
1570*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(stack_memory->Init("stack.data", 0));
1571*eb293b8fSAndroid Build Coastguard Worker 
1572*eb293b8fSAndroid Build Coastguard Worker   MemoryOffline* apk_memory = new MemoryOffline;
1573*eb293b8fSAndroid Build Coastguard Worker   auto info1 = offline_utils_.GetMaps()->Find(0x7426d2d000);
1574*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(info1 != nullptr);
1575*eb293b8fSAndroid Build Coastguard Worker   auto info2 = offline_utils_.GetMaps()->Find(0x7426d2e000);
1576*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(info2 != nullptr);
1577*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(
1578*eb293b8fSAndroid Build Coastguard Worker       apk_memory->Init("fake.apk", info1->offset(), info1->start(), info2->end() - info1->start()));
1579*eb293b8fSAndroid Build Coastguard Worker 
1580*eb293b8fSAndroid Build Coastguard Worker   std::unique_ptr<MemoryOfflineParts> parts(new MemoryOfflineParts);
1581*eb293b8fSAndroid Build Coastguard Worker   parts->Add(stack_memory);
1582*eb293b8fSAndroid Build Coastguard Worker   parts->Add(apk_memory);
1583*eb293b8fSAndroid Build Coastguard Worker 
1584*eb293b8fSAndroid Build Coastguard Worker   std::shared_ptr<Memory> process_memory(parts.release());
1585*eb293b8fSAndroid Build Coastguard Worker 
1586*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(), process_memory);
1587*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
1588*eb293b8fSAndroid Build Coastguard Worker 
1589*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
1590*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1591*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
1592*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1593*eb293b8fSAndroid Build Coastguard Worker 
1594*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
1595*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1596*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
1597*eb293b8fSAndroid Build Coastguard Worker 
1598*eb293b8fSAndroid Build Coastguard Worker   VerifyApkRORX(unwinder);
1599*eb293b8fSAndroid Build Coastguard Worker }
1600*eb293b8fSAndroid Build Coastguard Worker 
VerifyApkRX(Unwinder & unwinder)1601*eb293b8fSAndroid Build Coastguard Worker static void VerifyApkRX(Unwinder& unwinder) {
1602*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7cb0e6266cU, unwinder.frames()[0].pc);
1603*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe563be90U, unwinder.frames()[0].sp);
1604*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7cb0e626c0U, unwinder.frames()[1].pc);
1605*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe563bed0U, unwinder.frames()[1].sp);
1606*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7cb0e626ecU, unwinder.frames()[2].pc);
1607*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe563bef0U, unwinder.frames()[2].sp);
1608*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7cb0e62718U, unwinder.frames()[3].pc);
1609*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe563bf10U, unwinder.frames()[3].sp);
1610*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x5e004f0154U, unwinder.frames()[4].pc);
1611*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe563bf30U, unwinder.frames()[4].sp);
1612*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7f41124b10U, unwinder.frames()[5].pc);
1613*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fe563bfb0U, unwinder.frames()[5].sp);
1614*eb293b8fSAndroid Build Coastguard Worker }
1615*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,apk_rx_arm64)1616*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, apk_rx_arm64) {
1617*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
1618*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "apk_rx_arm64/", .arch = ARCH_ARM64}, &error_msg))
1619*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
1620*eb293b8fSAndroid Build Coastguard Worker 
1621*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1622*eb293b8fSAndroid Build Coastguard Worker                     offline_utils_.GetProcessMemory());
1623*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
1624*eb293b8fSAndroid Build Coastguard Worker 
1625*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
1626*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1627*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
1628*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1629*eb293b8fSAndroid Build Coastguard Worker 
1630*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
1631*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1632*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
1633*eb293b8fSAndroid Build Coastguard Worker 
1634*eb293b8fSAndroid Build Coastguard Worker   VerifyApkRX(unwinder);
1635*eb293b8fSAndroid Build Coastguard Worker }
1636*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,apk_rx_unreadable_arm64)1637*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, apk_rx_unreadable_arm64) {
1638*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
1639*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "apk_rx_unreadable_arm64/", .arch = ARCH_ARM64},
1640*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
1641*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
1642*eb293b8fSAndroid Build Coastguard Worker 
1643*eb293b8fSAndroid Build Coastguard Worker   // Create a process memory object that holds the apk data in memory
1644*eb293b8fSAndroid Build Coastguard Worker   // along with the stack data.
1645*eb293b8fSAndroid Build Coastguard Worker   MemoryOffline* stack_memory = new MemoryOffline;
1646*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(stack_memory->Init("stack.data", 0));
1647*eb293b8fSAndroid Build Coastguard Worker 
1648*eb293b8fSAndroid Build Coastguard Worker   MemoryOffline* apk_memory = new MemoryOffline;
1649*eb293b8fSAndroid Build Coastguard Worker   auto info = offline_utils_.GetMaps()->Find(0x7cb0e62000);
1650*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(info != nullptr);
1651*eb293b8fSAndroid Build Coastguard Worker   ASSERT_TRUE(
1652*eb293b8fSAndroid Build Coastguard Worker       apk_memory->Init("fake.apk", info->offset(), info->start(), info->end() - info->start()));
1653*eb293b8fSAndroid Build Coastguard Worker 
1654*eb293b8fSAndroid Build Coastguard Worker   std::unique_ptr<MemoryOfflineParts> parts(new MemoryOfflineParts);
1655*eb293b8fSAndroid Build Coastguard Worker   parts->Add(stack_memory);
1656*eb293b8fSAndroid Build Coastguard Worker   parts->Add(apk_memory);
1657*eb293b8fSAndroid Build Coastguard Worker 
1658*eb293b8fSAndroid Build Coastguard Worker   std::shared_ptr<Memory> process_memory(parts.release());
1659*eb293b8fSAndroid Build Coastguard Worker 
1660*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(), process_memory);
1661*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
1662*eb293b8fSAndroid Build Coastguard Worker 
1663*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
1664*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1665*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
1666*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1667*eb293b8fSAndroid Build Coastguard Worker 
1668*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
1669*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1670*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
1671*eb293b8fSAndroid Build Coastguard Worker 
1672*eb293b8fSAndroid Build Coastguard Worker   VerifyApkRX(unwinder);
1673*eb293b8fSAndroid Build Coastguard Worker }
1674*eb293b8fSAndroid Build Coastguard Worker 
TEST_F(UnwindOfflineTest,apk_soname_at_end_arm64)1675*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, apk_soname_at_end_arm64) {
1676*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
1677*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "apk_soname_at_end_arm64/", .arch = ARCH_ARM64},
1678*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
1679*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
1680*eb293b8fSAndroid Build Coastguard Worker 
1681*eb293b8fSAndroid Build Coastguard Worker   Regs* regs = offline_utils_.GetRegs();
1682*eb293b8fSAndroid Build Coastguard Worker   std::unique_ptr<Regs> regs_copy(regs->Clone());
1683*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), regs, offline_utils_.GetProcessMemory());
1684*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
1685*eb293b8fSAndroid Build Coastguard Worker 
1686*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
1687*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1688*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
1689*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1690*eb293b8fSAndroid Build Coastguard Worker 
1691*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
1692*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1693*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
1694*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7c0064b13cULL, unwinder.frames()[0].pc);
1695*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff9ec4b90ULL, unwinder.frames()[0].sp);
1696*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x580e17d0f0ULL, unwinder.frames()[1].pc);
1697*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff9ec4bb0ULL, unwinder.frames()[1].sp);
1698*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7e908c9cc8ULL, unwinder.frames()[2].pc);
1699*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff9ec4c10ULL, unwinder.frames()[2].sp);
1700*eb293b8fSAndroid Build Coastguard Worker }
1701*eb293b8fSAndroid Build Coastguard Worker 
1702*eb293b8fSAndroid Build Coastguard Worker // Unwind through libraries with debug_frames compressed with zstd.
TEST_F(UnwindOfflineTest,zstd_compress_arm)1703*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, zstd_compress_arm) {
1704*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
1705*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "zstd_compress_arm/", .arch = ARCH_ARM},
1706*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
1707*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
1708*eb293b8fSAndroid Build Coastguard Worker 
1709*eb293b8fSAndroid Build Coastguard Worker   Regs* regs = offline_utils_.GetRegs();
1710*eb293b8fSAndroid Build Coastguard Worker   std::unique_ptr<Regs> regs_copy(regs->Clone());
1711*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), regs, offline_utils_.GetProcessMemory());
1712*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
1713*eb293b8fSAndroid Build Coastguard Worker 
1714*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
1715*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1716*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
1717*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1718*eb293b8fSAndroid Build Coastguard Worker 
1719*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
1720*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1721*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
1722*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf7868324ULL, unwinder.frames()[0].pc);
1723*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf779eae0ULL, unwinder.frames()[0].sp);
1724*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf77dd1e3ULL, unwinder.frames()[1].pc);
1725*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf779eaf0ULL, unwinder.frames()[1].sp);
1726*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf786dc40ULL, unwinder.frames()[2].pc);
1727*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf779ec90ULL, unwinder.frames()[2].sp);
1728*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xf6ebeeaeULL, unwinder.frames()[3].pc);
1729*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff7fa398ULL, unwinder.frames()[3].sp);
1730*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xbafff4fULL, unwinder.frames()[4].pc);
1731*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff7fa468ULL, unwinder.frames()[4].sp);
1732*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xbb00337ULL, unwinder.frames()[5].pc);
1733*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff7fa478ULL, unwinder.frames()[5].sp);
1734*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xbb01191ULL, unwinder.frames()[6].pc);
1735*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff7fa568ULL, unwinder.frames()[6].sp);
1736*eb293b8fSAndroid Build Coastguard Worker }
1737*eb293b8fSAndroid Build Coastguard Worker 
1738*eb293b8fSAndroid Build Coastguard Worker // Unwind through libraries with debug_frames compressed with zlib.
TEST_F(UnwindOfflineTest,zlib_compress_arm)1739*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, zlib_compress_arm) {
1740*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
1741*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "zlib_compress_arm/", .arch = ARCH_ARM},
1742*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
1743*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
1744*eb293b8fSAndroid Build Coastguard Worker 
1745*eb293b8fSAndroid Build Coastguard Worker   Regs* regs = offline_utils_.GetRegs();
1746*eb293b8fSAndroid Build Coastguard Worker   std::unique_ptr<Regs> regs_copy(regs->Clone());
1747*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), regs, offline_utils_.GetProcessMemory());
1748*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
1749*eb293b8fSAndroid Build Coastguard Worker 
1750*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
1751*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1752*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
1753*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1754*eb293b8fSAndroid Build Coastguard Worker 
1755*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
1756*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1757*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
1758*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed8dc324ULL, unwinder.frames()[0].pc);
1759*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed812ae0ULL, unwinder.frames()[0].sp);
1760*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed8511f5ULL, unwinder.frames()[1].pc);
1761*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed812af0ULL, unwinder.frames()[1].sp);
1762*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed8e1c40ULL, unwinder.frames()[2].pc);
1763*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xed812c90ULL, unwinder.frames()[2].sp);
1764*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xecfc2eaeULL, unwinder.frames()[3].pc);
1765*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff96c328ULL, unwinder.frames()[3].sp);
1766*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2d72f4fULL, unwinder.frames()[4].pc);
1767*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff96c3f8ULL, unwinder.frames()[4].sp);
1768*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2d73337ULL, unwinder.frames()[5].pc);
1769*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff96c408ULL, unwinder.frames()[5].sp);
1770*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x2d74191ULL, unwinder.frames()[6].pc);
1771*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0xff96c4f8ULL, unwinder.frames()[6].sp);
1772*eb293b8fSAndroid Build Coastguard Worker }
1773*eb293b8fSAndroid Build Coastguard Worker 
1774*eb293b8fSAndroid Build Coastguard Worker // Make sure that an unwind using vlenb works properly.
TEST_F(UnwindOfflineTest,vlenb_riscv64)1775*eb293b8fSAndroid Build Coastguard Worker TEST_F(UnwindOfflineTest, vlenb_riscv64) {
1776*eb293b8fSAndroid Build Coastguard Worker   std::string error_msg;
1777*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.Init({.offline_files_dir = "vlenb_riscv64/", .arch = ARCH_RISCV64},
1778*eb293b8fSAndroid Build Coastguard Worker                            &error_msg))
1779*eb293b8fSAndroid Build Coastguard Worker     FAIL() << error_msg;
1780*eb293b8fSAndroid Build Coastguard Worker 
1781*eb293b8fSAndroid Build Coastguard Worker   Regs* regs = offline_utils_.GetRegs();
1782*eb293b8fSAndroid Build Coastguard Worker   std::unique_ptr<Regs> regs_copy(regs->Clone());
1783*eb293b8fSAndroid Build Coastguard Worker   Unwinder unwinder(128, offline_utils_.GetMaps(), regs, offline_utils_.GetProcessMemory());
1784*eb293b8fSAndroid Build Coastguard Worker   unwinder.Unwind();
1785*eb293b8fSAndroid Build Coastguard Worker 
1786*eb293b8fSAndroid Build Coastguard Worker   size_t expected_num_frames;
1787*eb293b8fSAndroid Build Coastguard Worker   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1788*eb293b8fSAndroid Build Coastguard Worker   std::string expected_frame_info;
1789*eb293b8fSAndroid Build Coastguard Worker   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1790*eb293b8fSAndroid Build Coastguard Worker 
1791*eb293b8fSAndroid Build Coastguard Worker   std::string frame_info(DumpFrames(unwinder));
1792*eb293b8fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1793*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_frame_info, frame_info);
1794*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x555c440735dcULL, unwinder.frames()[0].pc);
1795*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fffe388a680ULL, unwinder.frames()[0].sp);
1796*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x555c4408bdfcULL, unwinder.frames()[1].pc);
1797*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fffe388a6a0ULL, unwinder.frames()[1].sp);
1798*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x555c4408cc76ULL, unwinder.frames()[2].pc);
1799*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fffe388a6e0ULL, unwinder.frames()[2].sp);
1800*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x555c4408d604ULL, unwinder.frames()[3].pc);
1801*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fffe388a730ULL, unwinder.frames()[3].sp);
1802*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x555c44099cd2ULL, unwinder.frames()[4].pc);
1803*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fffe388a7b0ULL, unwinder.frames()[4].sp);
1804*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x555c4409939eULL, unwinder.frames()[5].pc);
1805*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fffe388a930ULL, unwinder.frames()[5].sp);
1806*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x555c440a2c7cULL, unwinder.frames()[6].pc);
1807*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fffe388a970ULL, unwinder.frames()[6].sp);
1808*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7ff2fdf27394ULL, unwinder.frames()[7].pc);
1809*eb293b8fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7fffe388bb20ULL, unwinder.frames()[7].sp);
1810*eb293b8fSAndroid Build Coastguard Worker }
1811*eb293b8fSAndroid Build Coastguard Worker 
1812*eb293b8fSAndroid Build Coastguard Worker }  // namespace
1813*eb293b8fSAndroid Build Coastguard Worker }  // namespace unwindstack
1814