Fix null pointer dereference in RegsArm.

Fix RegsArm::GetPcAdjustment to check for an invalid elf before trying
to read memory.
Modify the tests for this so it crashes without this change.

Also modify the GetPcAdjustment for all different architectures so
that unless the relative pc is too small, it will return the minimum
amount that should be adjusted. This is to handle cases where we still
want to adjust the pc but it's in an invalid elf. Mostly this is for
handling cases when the pc is in jit gdb debug code so that we use the
right unwind information.

Bug: 77233204

Test: Passes unit tests for libbacktrace/libunwindstack.
Change-Id: Id73609adaf3b80a583584441de228156fec3afa7
This commit is contained in:
Christopher Ferris 2018-03-28 15:12:49 -07:00
parent c41ff1b366
commit 6dbc28ece3
8 changed files with 99 additions and 86 deletions

View file

@ -51,13 +51,23 @@ void RegsArm::set_sp(uint64_t sp) {
}
uint64_t RegsArm::GetPcAdjustment(uint64_t rel_pc, Elf* elf) {
if (!elf->valid()) {
return 2;
}
uint64_t load_bias = elf->GetLoadBias();
if (rel_pc < load_bias) {
return 0;
if (rel_pc < 2) {
return 0;
}
return 2;
}
uint64_t adjusted_rel_pc = rel_pc - load_bias;
if (adjusted_rel_pc < 5) {
return 0;
if (adjusted_rel_pc < 2) {
return 0;
}
return 2;
}
if (adjusted_rel_pc & 1) {

View file

@ -51,8 +51,8 @@ void RegsArm64::set_sp(uint64_t sp) {
regs_[ARM64_REG_SP] = sp;
}
uint64_t RegsArm64::GetPcAdjustment(uint64_t rel_pc, Elf* elf) {
if (!elf->valid() || rel_pc < 4) {
uint64_t RegsArm64::GetPcAdjustment(uint64_t rel_pc, Elf*) {
if (rel_pc < 4) {
return 0;
}
return 4;

View file

@ -51,8 +51,8 @@ void RegsMips::set_sp(uint64_t sp) {
regs_[MIPS_REG_SP] = static_cast<uint32_t>(sp);
}
uint64_t RegsMips::GetPcAdjustment(uint64_t rel_pc, Elf* elf) {
if (!elf->valid() || rel_pc < 8) {
uint64_t RegsMips::GetPcAdjustment(uint64_t rel_pc, Elf*) {
if (rel_pc < 8) {
return 0;
}
// For now, just assume no compact branches

View file

@ -51,8 +51,8 @@ void RegsMips64::set_sp(uint64_t sp) {
regs_[MIPS64_REG_SP] = sp;
}
uint64_t RegsMips64::GetPcAdjustment(uint64_t rel_pc, Elf* elf) {
if (!elf->valid() || rel_pc < 8) {
uint64_t RegsMips64::GetPcAdjustment(uint64_t rel_pc, Elf*) {
if (rel_pc < 8) {
return 0;
}
// For now, just assume no compact branches

View file

@ -50,8 +50,8 @@ void RegsX86::set_sp(uint64_t sp) {
regs_[X86_REG_SP] = static_cast<uint32_t>(sp);
}
uint64_t RegsX86::GetPcAdjustment(uint64_t rel_pc, Elf* elf) {
if (!elf->valid() || rel_pc == 0) {
uint64_t RegsX86::GetPcAdjustment(uint64_t rel_pc, Elf*) {
if (rel_pc == 0) {
return 0;
}
return 1;

View file

@ -50,8 +50,8 @@ void RegsX86_64::set_sp(uint64_t sp) {
regs_[X86_64_REG_SP] = sp;
}
uint64_t RegsX86_64::GetPcAdjustment(uint64_t rel_pc, Elf* elf) {
if (!elf->valid() || rel_pc == 0) {
uint64_t RegsX86_64::GetPcAdjustment(uint64_t rel_pc, Elf*) {
if (rel_pc == 0) {
return 0;
}
return 1;

View file

@ -94,48 +94,48 @@ TEST_F(RegsTest, regs64) {
TEST_F(RegsTest, rel_pc) {
RegsArm64 arm64;
ASSERT_EQ(4U, arm64.GetPcAdjustment(0x10, elf_.get()));
ASSERT_EQ(4U, arm64.GetPcAdjustment(0x4, elf_.get()));
ASSERT_EQ(0U, arm64.GetPcAdjustment(0x3, elf_.get()));
ASSERT_EQ(0U, arm64.GetPcAdjustment(0x2, elf_.get()));
ASSERT_EQ(0U, arm64.GetPcAdjustment(0x1, elf_.get()));
ASSERT_EQ(0U, arm64.GetPcAdjustment(0x0, elf_.get()));
EXPECT_EQ(4U, arm64.GetPcAdjustment(0x10, elf_.get()));
EXPECT_EQ(4U, arm64.GetPcAdjustment(0x4, elf_.get()));
EXPECT_EQ(0U, arm64.GetPcAdjustment(0x3, elf_.get()));
EXPECT_EQ(0U, arm64.GetPcAdjustment(0x2, elf_.get()));
EXPECT_EQ(0U, arm64.GetPcAdjustment(0x1, elf_.get()));
EXPECT_EQ(0U, arm64.GetPcAdjustment(0x0, elf_.get()));
RegsX86 x86;
ASSERT_EQ(1U, x86.GetPcAdjustment(0x100, elf_.get()));
ASSERT_EQ(1U, x86.GetPcAdjustment(0x2, elf_.get()));
ASSERT_EQ(1U, x86.GetPcAdjustment(0x1, elf_.get()));
ASSERT_EQ(0U, x86.GetPcAdjustment(0x0, elf_.get()));
EXPECT_EQ(1U, x86.GetPcAdjustment(0x100, elf_.get()));
EXPECT_EQ(1U, x86.GetPcAdjustment(0x2, elf_.get()));
EXPECT_EQ(1U, x86.GetPcAdjustment(0x1, elf_.get()));
EXPECT_EQ(0U, x86.GetPcAdjustment(0x0, elf_.get()));
RegsX86_64 x86_64;
ASSERT_EQ(1U, x86_64.GetPcAdjustment(0x100, elf_.get()));
ASSERT_EQ(1U, x86_64.GetPcAdjustment(0x2, elf_.get()));
ASSERT_EQ(1U, x86_64.GetPcAdjustment(0x1, elf_.get()));
ASSERT_EQ(0U, x86_64.GetPcAdjustment(0x0, elf_.get()));
EXPECT_EQ(1U, x86_64.GetPcAdjustment(0x100, elf_.get()));
EXPECT_EQ(1U, x86_64.GetPcAdjustment(0x2, elf_.get()));
EXPECT_EQ(1U, x86_64.GetPcAdjustment(0x1, elf_.get()));
EXPECT_EQ(0U, x86_64.GetPcAdjustment(0x0, elf_.get()));
RegsMips mips;
ASSERT_EQ(8U, mips.GetPcAdjustment(0x10, elf_.get()));
ASSERT_EQ(8U, mips.GetPcAdjustment(0x8, elf_.get()));
ASSERT_EQ(0U, mips.GetPcAdjustment(0x7, elf_.get()));
ASSERT_EQ(0U, mips.GetPcAdjustment(0x6, elf_.get()));
ASSERT_EQ(0U, mips.GetPcAdjustment(0x5, elf_.get()));
ASSERT_EQ(0U, mips.GetPcAdjustment(0x4, elf_.get()));
ASSERT_EQ(0U, mips.GetPcAdjustment(0x3, elf_.get()));
ASSERT_EQ(0U, mips.GetPcAdjustment(0x2, elf_.get()));
ASSERT_EQ(0U, mips.GetPcAdjustment(0x1, elf_.get()));
ASSERT_EQ(0U, mips.GetPcAdjustment(0x0, elf_.get()));
EXPECT_EQ(8U, mips.GetPcAdjustment(0x10, elf_.get()));
EXPECT_EQ(8U, mips.GetPcAdjustment(0x8, elf_.get()));
EXPECT_EQ(0U, mips.GetPcAdjustment(0x7, elf_.get()));
EXPECT_EQ(0U, mips.GetPcAdjustment(0x6, elf_.get()));
EXPECT_EQ(0U, mips.GetPcAdjustment(0x5, elf_.get()));
EXPECT_EQ(0U, mips.GetPcAdjustment(0x4, elf_.get()));
EXPECT_EQ(0U, mips.GetPcAdjustment(0x3, elf_.get()));
EXPECT_EQ(0U, mips.GetPcAdjustment(0x2, elf_.get()));
EXPECT_EQ(0U, mips.GetPcAdjustment(0x1, elf_.get()));
EXPECT_EQ(0U, mips.GetPcAdjustment(0x0, elf_.get()));
RegsMips64 mips64;
ASSERT_EQ(8U, mips64.GetPcAdjustment(0x10, elf_.get()));
ASSERT_EQ(8U, mips64.GetPcAdjustment(0x8, elf_.get()));
ASSERT_EQ(0U, mips64.GetPcAdjustment(0x7, elf_.get()));
ASSERT_EQ(0U, mips64.GetPcAdjustment(0x6, elf_.get()));
ASSERT_EQ(0U, mips64.GetPcAdjustment(0x5, elf_.get()));
ASSERT_EQ(0U, mips64.GetPcAdjustment(0x4, elf_.get()));
ASSERT_EQ(0U, mips64.GetPcAdjustment(0x3, elf_.get()));
ASSERT_EQ(0U, mips64.GetPcAdjustment(0x2, elf_.get()));
ASSERT_EQ(0U, mips64.GetPcAdjustment(0x1, elf_.get()));
ASSERT_EQ(0U, mips64.GetPcAdjustment(0x0, elf_.get()));
EXPECT_EQ(8U, mips64.GetPcAdjustment(0x10, elf_.get()));
EXPECT_EQ(8U, mips64.GetPcAdjustment(0x8, elf_.get()));
EXPECT_EQ(0U, mips64.GetPcAdjustment(0x7, elf_.get()));
EXPECT_EQ(0U, mips64.GetPcAdjustment(0x6, elf_.get()));
EXPECT_EQ(0U, mips64.GetPcAdjustment(0x5, elf_.get()));
EXPECT_EQ(0U, mips64.GetPcAdjustment(0x4, elf_.get()));
EXPECT_EQ(0U, mips64.GetPcAdjustment(0x3, elf_.get()));
EXPECT_EQ(0U, mips64.GetPcAdjustment(0x2, elf_.get()));
EXPECT_EQ(0U, mips64.GetPcAdjustment(0x1, elf_.get()));
EXPECT_EQ(0U, mips64.GetPcAdjustment(0x0, elf_.get()));
}
TEST_F(RegsTest, rel_pc_arm) {
@ -143,34 +143,36 @@ TEST_F(RegsTest, rel_pc_arm) {
// Check fence posts.
elf_->FakeSetLoadBias(0);
ASSERT_EQ(2U, arm.GetPcAdjustment(0x5, elf_.get()));
ASSERT_EQ(0U, arm.GetPcAdjustment(0x4, elf_.get()));
ASSERT_EQ(0U, arm.GetPcAdjustment(0x3, elf_.get()));
ASSERT_EQ(0U, arm.GetPcAdjustment(0x2, elf_.get()));
ASSERT_EQ(0U, arm.GetPcAdjustment(0x1, elf_.get()));
ASSERT_EQ(0U, arm.GetPcAdjustment(0x0, elf_.get()));
EXPECT_EQ(2U, arm.GetPcAdjustment(0x5, elf_.get()));
EXPECT_EQ(2U, arm.GetPcAdjustment(0x4, elf_.get()));
EXPECT_EQ(2U, arm.GetPcAdjustment(0x3, elf_.get()));
EXPECT_EQ(2U, arm.GetPcAdjustment(0x2, elf_.get()));
EXPECT_EQ(0U, arm.GetPcAdjustment(0x1, elf_.get()));
EXPECT_EQ(0U, arm.GetPcAdjustment(0x0, elf_.get()));
elf_->FakeSetLoadBias(0x100);
ASSERT_EQ(0U, arm.GetPcAdjustment(0xff, elf_.get()));
ASSERT_EQ(2U, arm.GetPcAdjustment(0x105, elf_.get()));
ASSERT_EQ(0U, arm.GetPcAdjustment(0x104, elf_.get()));
ASSERT_EQ(0U, arm.GetPcAdjustment(0x103, elf_.get()));
ASSERT_EQ(0U, arm.GetPcAdjustment(0x102, elf_.get()));
ASSERT_EQ(0U, arm.GetPcAdjustment(0x101, elf_.get()));
ASSERT_EQ(0U, arm.GetPcAdjustment(0x100, elf_.get()));
EXPECT_EQ(0U, arm.GetPcAdjustment(0x1, elf_.get()));
EXPECT_EQ(2U, arm.GetPcAdjustment(0x2, elf_.get()));
EXPECT_EQ(2U, arm.GetPcAdjustment(0xff, elf_.get()));
EXPECT_EQ(2U, arm.GetPcAdjustment(0x105, elf_.get()));
EXPECT_EQ(2U, arm.GetPcAdjustment(0x104, elf_.get()));
EXPECT_EQ(2U, arm.GetPcAdjustment(0x103, elf_.get()));
EXPECT_EQ(2U, arm.GetPcAdjustment(0x102, elf_.get()));
EXPECT_EQ(0U, arm.GetPcAdjustment(0x101, elf_.get()));
EXPECT_EQ(0U, arm.GetPcAdjustment(0x100, elf_.get()));
// Check thumb instructions handling.
elf_->FakeSetLoadBias(0);
memory_->SetData32(0x2000, 0);
ASSERT_EQ(2U, arm.GetPcAdjustment(0x2005, elf_.get()));
EXPECT_EQ(2U, arm.GetPcAdjustment(0x2005, elf_.get()));
memory_->SetData32(0x2000, 0xe000f000);
ASSERT_EQ(4U, arm.GetPcAdjustment(0x2005, elf_.get()));
EXPECT_EQ(4U, arm.GetPcAdjustment(0x2005, elf_.get()));
elf_->FakeSetLoadBias(0x400);
memory_->SetData32(0x2100, 0);
ASSERT_EQ(2U, arm.GetPcAdjustment(0x2505, elf_.get()));
EXPECT_EQ(2U, arm.GetPcAdjustment(0x2505, elf_.get()));
memory_->SetData32(0x2100, 0xf111f111);
ASSERT_EQ(4U, arm.GetPcAdjustment(0x2505, elf_.get()));
EXPECT_EQ(4U, arm.GetPcAdjustment(0x2505, elf_.get()));
}
TEST_F(RegsTest, elf_invalid) {
@ -181,32 +183,33 @@ TEST_F(RegsTest, elf_invalid) {
RegsMips regs_mips;
RegsMips64 regs_mips64;
MapInfo map_info(0x1000, 0x2000);
Elf* invalid_elf = new Elf(new MemoryFake);
Elf* invalid_elf = new Elf(nullptr);
map_info.elf.reset(invalid_elf);
regs_arm.set_pc(0x1500);
EXPECT_EQ(0x500U, invalid_elf->GetRelPc(regs_arm.pc(), &map_info));
EXPECT_EQ(4U, regs_arm.GetPcAdjustment(0x500U, invalid_elf));
EXPECT_EQ(2U, regs_arm.GetPcAdjustment(0x500U, invalid_elf));
EXPECT_EQ(2U, regs_arm.GetPcAdjustment(0x511U, invalid_elf));
regs_arm64.set_pc(0x1600);
EXPECT_EQ(0x600U, invalid_elf->GetRelPc(regs_arm64.pc(), &map_info));
EXPECT_EQ(0U, regs_arm64.GetPcAdjustment(0x600U, invalid_elf));
EXPECT_EQ(4U, regs_arm64.GetPcAdjustment(0x600U, invalid_elf));
regs_x86.set_pc(0x1700);
EXPECT_EQ(0x700U, invalid_elf->GetRelPc(regs_x86.pc(), &map_info));
EXPECT_EQ(0U, regs_x86.GetPcAdjustment(0x700U, invalid_elf));
EXPECT_EQ(1U, regs_x86.GetPcAdjustment(0x700U, invalid_elf));
regs_x86_64.set_pc(0x1800);
EXPECT_EQ(0x800U, invalid_elf->GetRelPc(regs_x86_64.pc(), &map_info));
EXPECT_EQ(0U, regs_x86_64.GetPcAdjustment(0x800U, invalid_elf));
EXPECT_EQ(1U, regs_x86_64.GetPcAdjustment(0x800U, invalid_elf));
regs_mips.set_pc(0x1900);
EXPECT_EQ(0x900U, invalid_elf->GetRelPc(regs_mips.pc(), &map_info));
EXPECT_EQ(0U, regs_mips.GetPcAdjustment(0x900U, invalid_elf));
EXPECT_EQ(8U, regs_mips.GetPcAdjustment(0x900U, invalid_elf));
regs_mips64.set_pc(0x1a00);
EXPECT_EQ(0xa00U, invalid_elf->GetRelPc(regs_mips64.pc(), &map_info));
EXPECT_EQ(0U, regs_mips64.GetPcAdjustment(0xa00U, invalid_elf));
EXPECT_EQ(8U, regs_mips64.GetPcAdjustment(0xa00U, invalid_elf));
}
TEST_F(RegsTest, arm_verify_sp_pc) {

View file

@ -285,7 +285,7 @@ TEST_F(UnwindOfflineTest, jit_debug_x86) {
" #01 pc 00067f00 libarttestd.so (Java_Main_unwindInProcess+10032)\n"
" #02 pc 000021a8 (offset 0x2000) 137-cfi.odex (boolean Main.unwindInProcess(boolean, int, "
"boolean)+136)\n"
" #03 pc 0000fe81 anonymous:ee74c000 (boolean Main.bar(boolean)+65)\n"
" #03 pc 0000fe80 anonymous:ee74c000 (boolean Main.bar(boolean)+64)\n"
" #04 pc 006ad4d2 libartd.so (art_quick_invoke_stub+338)\n"
" #05 pc 00146ab5 libartd.so "
"(_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+885)\n"
@ -300,7 +300,7 @@ TEST_F(UnwindOfflineTest, jit_debug_x86) {
"20CodeItemDataAccessorEPNS_11ShadowFrameE+234)\n"
" #09 pc 00684362 libartd.so (artQuickToInterpreterBridge+1058)\n"
" #10 pc 006b35bd libartd.so (art_quick_to_interpreter_bridge+77)\n"
" #11 pc 0000fe04 anonymous:ee74c000 (int Main.compare(Main, Main)+52)\n"
" #11 pc 0000fe03 anonymous:ee74c000 (int Main.compare(Main, Main)+51)\n"
" #12 pc 006ad4d2 libartd.so (art_quick_invoke_stub+338)\n"
" #13 pc 00146ab5 libartd.so "
"(_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+885)\n"
@ -315,8 +315,8 @@ TEST_F(UnwindOfflineTest, jit_debug_x86) {
"20CodeItemDataAccessorEPNS_11ShadowFrameE+234)\n"
" #17 pc 00684362 libartd.so (artQuickToInterpreterBridge+1058)\n"
" #18 pc 006b35bd libartd.so (art_quick_to_interpreter_bridge+77)\n"
" #19 pc 0000fd3c anonymous:ee74c000 (int Main.compare(java.lang.Object, "
"java.lang.Object)+108)\n"
" #19 pc 0000fd3b anonymous:ee74c000 (int Main.compare(java.lang.Object, "
"java.lang.Object)+107)\n"
" #20 pc 006ad4d2 libartd.so (art_quick_invoke_stub+338)\n"
" #21 pc 00146ab5 libartd.so "
"(_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+885)\n"
@ -331,9 +331,9 @@ TEST_F(UnwindOfflineTest, jit_debug_x86) {
"20CodeItemDataAccessorEPNS_11ShadowFrameE+234)\n"
" #25 pc 00684362 libartd.so (artQuickToInterpreterBridge+1058)\n"
" #26 pc 006b35bd libartd.so (art_quick_to_interpreter_bridge+77)\n"
" #27 pc 0000fbdc anonymous:ee74c000 (int "
" #27 pc 0000fbdb anonymous:ee74c000 (int "
"java.util.Arrays.binarySearch0(java.lang.Object[], int, int, java.lang.Object, "
"java.util.Comparator)+332)\n"
"java.util.Comparator)+331)\n"
" #28 pc 006ad6a2 libartd.so (art_quick_invoke_static_stub+418)\n"
" #29 pc 00146acb libartd.so "
"(_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+907)\n"
@ -348,7 +348,7 @@ TEST_F(UnwindOfflineTest, jit_debug_x86) {
"20CodeItemDataAccessorEPNS_11ShadowFrameE+234)\n"
" #33 pc 00684362 libartd.so (artQuickToInterpreterBridge+1058)\n"
" #34 pc 006b35bd libartd.so (art_quick_to_interpreter_bridge+77)\n"
" #35 pc 0000f625 anonymous:ee74c000 (boolean Main.foo()+165)\n"
" #35 pc 0000f624 anonymous:ee74c000 (boolean Main.foo()+164)\n"
" #36 pc 006ad4d2 libartd.so (art_quick_invoke_stub+338)\n"
" #37 pc 00146ab5 libartd.so "
"(_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+885)\n"
@ -363,7 +363,7 @@ TEST_F(UnwindOfflineTest, jit_debug_x86) {
"20CodeItemDataAccessorEPNS_11ShadowFrameE+234)\n"
" #41 pc 00684362 libartd.so (artQuickToInterpreterBridge+1058)\n"
" #42 pc 006b35bd libartd.so (art_quick_to_interpreter_bridge+77)\n"
" #43 pc 0000eedc anonymous:ee74c000 (void Main.runPrimary()+60)\n"
" #43 pc 0000eedb anonymous:ee74c000 (void Main.runPrimary()+59)\n"
" #44 pc 006ad4d2 libartd.so (art_quick_invoke_stub+338)\n"
" #45 pc 00146ab5 libartd.so "
"(_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+885)\n"
@ -378,7 +378,7 @@ TEST_F(UnwindOfflineTest, jit_debug_x86) {
"20CodeItemDataAccessorEPNS_11ShadowFrameE+234)\n"
" #49 pc 00684362 libartd.so (artQuickToInterpreterBridge+1058)\n"
" #50 pc 006b35bd libartd.so (art_quick_to_interpreter_bridge+77)\n"
" #51 pc 0000ac22 anonymous:ee74c000 (void Main.main(java.lang.String[])+98)\n"
" #51 pc 0000ac21 anonymous:ee74c000 (void Main.main(java.lang.String[])+97)\n"
" #52 pc 006ad6a2 libartd.so (art_quick_invoke_static_stub+418)\n"
" #53 pc 00146acb libartd.so "
"(_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+907)\n"
@ -420,7 +420,7 @@ TEST_F(UnwindOfflineTest, jit_debug_x86) {
EXPECT_EQ(0xffeb52a0U, unwinder.frames()[1].sp);
EXPECT_EQ(0xec6061a8U, unwinder.frames()[2].pc);
EXPECT_EQ(0xffeb5ce0U, unwinder.frames()[2].sp);
EXPECT_EQ(0xee75be81U, unwinder.frames()[3].pc);
EXPECT_EQ(0xee75be80U, unwinder.frames()[3].pc);
EXPECT_EQ(0xffeb5d30U, unwinder.frames()[3].sp);
EXPECT_EQ(0xf728e4d2U, unwinder.frames()[4].pc);
EXPECT_EQ(0xffeb5d60U, unwinder.frames()[4].sp);
@ -436,7 +436,7 @@ TEST_F(UnwindOfflineTest, jit_debug_x86) {
EXPECT_EQ(0xffeb5fb0U, unwinder.frames()[9].sp);
EXPECT_EQ(0xf72945bdU, unwinder.frames()[10].pc);
EXPECT_EQ(0xffeb6110U, unwinder.frames()[10].sp);
EXPECT_EQ(0xee75be04U, unwinder.frames()[11].pc);
EXPECT_EQ(0xee75be03U, unwinder.frames()[11].pc);
EXPECT_EQ(0xffeb6160U, unwinder.frames()[11].sp);
EXPECT_EQ(0xf728e4d2U, unwinder.frames()[12].pc);
EXPECT_EQ(0xffeb6180U, unwinder.frames()[12].sp);
@ -452,7 +452,7 @@ TEST_F(UnwindOfflineTest, jit_debug_x86) {
EXPECT_EQ(0xffeb63e0U, unwinder.frames()[17].sp);
EXPECT_EQ(0xf72945bdU, unwinder.frames()[18].pc);
EXPECT_EQ(0xffeb6530U, unwinder.frames()[18].sp);
EXPECT_EQ(0xee75bd3cU, unwinder.frames()[19].pc);
EXPECT_EQ(0xee75bd3bU, unwinder.frames()[19].pc);
EXPECT_EQ(0xffeb6580U, unwinder.frames()[19].sp);
EXPECT_EQ(0xf728e4d2U, unwinder.frames()[20].pc);
EXPECT_EQ(0xffeb65b0U, unwinder.frames()[20].sp);
@ -468,7 +468,7 @@ TEST_F(UnwindOfflineTest, jit_debug_x86) {
EXPECT_EQ(0xffeb6810U, unwinder.frames()[25].sp);
EXPECT_EQ(0xf72945bdU, unwinder.frames()[26].pc);
EXPECT_EQ(0xffeb6960U, unwinder.frames()[26].sp);
EXPECT_EQ(0xee75bbdcU, unwinder.frames()[27].pc);
EXPECT_EQ(0xee75bbdbU, unwinder.frames()[27].pc);
EXPECT_EQ(0xffeb69b0U, unwinder.frames()[27].sp);
EXPECT_EQ(0xf728e6a2U, unwinder.frames()[28].pc);
EXPECT_EQ(0xffeb69f0U, unwinder.frames()[28].sp);
@ -484,7 +484,7 @@ TEST_F(UnwindOfflineTest, jit_debug_x86) {
EXPECT_EQ(0xffeb6c50U, unwinder.frames()[33].sp);
EXPECT_EQ(0xf72945bdU, unwinder.frames()[34].pc);
EXPECT_EQ(0xffeb6dd0U, unwinder.frames()[34].sp);
EXPECT_EQ(0xee75b625U, unwinder.frames()[35].pc);
EXPECT_EQ(0xee75b624U, unwinder.frames()[35].pc);
EXPECT_EQ(0xffeb6e20U, unwinder.frames()[35].sp);
EXPECT_EQ(0xf728e4d2U, unwinder.frames()[36].pc);
EXPECT_EQ(0xffeb6e50U, unwinder.frames()[36].sp);
@ -500,7 +500,7 @@ TEST_F(UnwindOfflineTest, jit_debug_x86) {
EXPECT_EQ(0xffeb70a0U, unwinder.frames()[41].sp);
EXPECT_EQ(0xf72945bdU, unwinder.frames()[42].pc);
EXPECT_EQ(0xffeb71f0U, unwinder.frames()[42].sp);
EXPECT_EQ(0xee75aedcU, unwinder.frames()[43].pc);
EXPECT_EQ(0xee75aedbU, unwinder.frames()[43].pc);
EXPECT_EQ(0xffeb7240U, unwinder.frames()[43].sp);
EXPECT_EQ(0xf728e4d2U, unwinder.frames()[44].pc);
EXPECT_EQ(0xffeb72a0U, unwinder.frames()[44].sp);
@ -516,7 +516,7 @@ TEST_F(UnwindOfflineTest, jit_debug_x86) {
EXPECT_EQ(0xffeb74f0U, unwinder.frames()[49].sp);
EXPECT_EQ(0xf72945bdU, unwinder.frames()[50].pc);
EXPECT_EQ(0xffeb7680U, unwinder.frames()[50].sp);
EXPECT_EQ(0xee756c22U, unwinder.frames()[51].pc);
EXPECT_EQ(0xee756c21U, unwinder.frames()[51].pc);
EXPECT_EQ(0xffeb76d0U, unwinder.frames()[51].sp);
EXPECT_EQ(0xf728e6a2U, unwinder.frames()[52].pc);
EXPECT_EQ(0xffeb76f0U, unwinder.frames()[52].sp);