From 6dbc28ece3ab7cadd0087b4dc31ba9a2986545f0 Mon Sep 17 00:00:00 2001 From: Christopher Ferris Date: Wed, 28 Mar 2018 15:12:49 -0700 Subject: [PATCH] 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 --- libunwindstack/RegsArm.cpp | 14 ++- libunwindstack/RegsArm64.cpp | 4 +- libunwindstack/RegsMips.cpp | 4 +- libunwindstack/RegsMips64.cpp | 4 +- libunwindstack/RegsX86.cpp | 4 +- libunwindstack/RegsX86_64.cpp | 4 +- libunwindstack/tests/RegsTest.cpp | 119 +++++++++++---------- libunwindstack/tests/UnwindOfflineTest.cpp | 32 +++--- 8 files changed, 99 insertions(+), 86 deletions(-) diff --git a/libunwindstack/RegsArm.cpp b/libunwindstack/RegsArm.cpp index e2a9cb01f..27cab4384 100644 --- a/libunwindstack/RegsArm.cpp +++ b/libunwindstack/RegsArm.cpp @@ -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) { diff --git a/libunwindstack/RegsArm64.cpp b/libunwindstack/RegsArm64.cpp index fe24c802c..4a2a6c4db 100644 --- a/libunwindstack/RegsArm64.cpp +++ b/libunwindstack/RegsArm64.cpp @@ -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; diff --git a/libunwindstack/RegsMips.cpp b/libunwindstack/RegsMips.cpp index 0b10e2169..c87e69b90 100644 --- a/libunwindstack/RegsMips.cpp +++ b/libunwindstack/RegsMips.cpp @@ -51,8 +51,8 @@ void RegsMips::set_sp(uint64_t sp) { regs_[MIPS_REG_SP] = static_cast(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 diff --git a/libunwindstack/RegsMips64.cpp b/libunwindstack/RegsMips64.cpp index 8848e3bab..236a9223b 100644 --- a/libunwindstack/RegsMips64.cpp +++ b/libunwindstack/RegsMips64.cpp @@ -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 diff --git a/libunwindstack/RegsX86.cpp b/libunwindstack/RegsX86.cpp index bb95a13f2..f7e06145e 100644 --- a/libunwindstack/RegsX86.cpp +++ b/libunwindstack/RegsX86.cpp @@ -50,8 +50,8 @@ void RegsX86::set_sp(uint64_t sp) { regs_[X86_REG_SP] = static_cast(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; diff --git a/libunwindstack/RegsX86_64.cpp b/libunwindstack/RegsX86_64.cpp index e57e2bca1..7d6ad86cf 100644 --- a/libunwindstack/RegsX86_64.cpp +++ b/libunwindstack/RegsX86_64.cpp @@ -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; diff --git a/libunwindstack/tests/RegsTest.cpp b/libunwindstack/tests/RegsTest.cpp index 3e80733bf..d15823e1c 100644 --- a/libunwindstack/tests/RegsTest.cpp +++ b/libunwindstack/tests/RegsTest.cpp @@ -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) { diff --git a/libunwindstack/tests/UnwindOfflineTest.cpp b/libunwindstack/tests/UnwindOfflineTest.cpp index 6c242a5ab..2b8f0c265 100644 --- a/libunwindstack/tests/UnwindOfflineTest.cpp +++ b/libunwindstack/tests/UnwindOfflineTest.cpp @@ -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);