Merge "Change the GetAdjustedRelPc to GetPcAdjustment."
This commit is contained in:
commit
cdf778f5d9
|
@ -35,26 +35,25 @@ ArchEnum RegsArm::Arch() {
|
|||
return ARCH_ARM;
|
||||
}
|
||||
|
||||
uint64_t RegsArm::GetAdjustedPc(uint64_t rel_pc, Elf* elf) {
|
||||
uint64_t RegsArm::GetPcAdjustment(uint64_t rel_pc, Elf* elf) {
|
||||
uint64_t load_bias = elf->GetLoadBias();
|
||||
if (rel_pc < load_bias) {
|
||||
return rel_pc;
|
||||
return 0;
|
||||
}
|
||||
uint64_t adjusted_rel_pc = rel_pc - load_bias;
|
||||
|
||||
if (adjusted_rel_pc < 5) {
|
||||
return rel_pc;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (adjusted_rel_pc & 1) {
|
||||
// This is a thumb instruction, it could be 2 or 4 bytes.
|
||||
uint32_t value;
|
||||
if (rel_pc < 5 || !elf->memory()->ReadFully(adjusted_rel_pc - 5, &value, sizeof(value)) ||
|
||||
if (!elf->memory()->ReadFully(adjusted_rel_pc - 5, &value, sizeof(value)) ||
|
||||
(value & 0xe000f000) != 0xe000f000) {
|
||||
return rel_pc - 2;
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
return rel_pc - 4;
|
||||
return 4;
|
||||
}
|
||||
|
||||
void RegsArm::SetFromRaw() {
|
||||
|
|
|
@ -35,15 +35,11 @@ ArchEnum RegsArm64::Arch() {
|
|||
return ARCH_ARM64;
|
||||
}
|
||||
|
||||
uint64_t RegsArm64::GetAdjustedPc(uint64_t rel_pc, Elf* elf) {
|
||||
if (!elf->valid()) {
|
||||
return rel_pc;
|
||||
uint64_t RegsArm64::GetPcAdjustment(uint64_t rel_pc, Elf* elf) {
|
||||
if (!elf->valid() || rel_pc < 4) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (rel_pc < 4) {
|
||||
return rel_pc;
|
||||
}
|
||||
return rel_pc - 4;
|
||||
return 4;
|
||||
}
|
||||
|
||||
void RegsArm64::SetFromRaw() {
|
||||
|
|
|
@ -35,16 +35,12 @@ ArchEnum RegsMips::Arch() {
|
|||
return ARCH_MIPS;
|
||||
}
|
||||
|
||||
uint64_t RegsMips::GetAdjustedPc(uint64_t rel_pc, Elf* elf) {
|
||||
if (!elf->valid()) {
|
||||
return rel_pc;
|
||||
uint64_t RegsMips::GetPcAdjustment(uint64_t rel_pc, Elf* elf) {
|
||||
if (!elf->valid() || rel_pc < 8) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// For now, just assuming no compact branches
|
||||
if (rel_pc < 8) {
|
||||
return rel_pc;
|
||||
}
|
||||
return rel_pc - 8;
|
||||
// For now, just assume no compact branches
|
||||
return 8;
|
||||
}
|
||||
|
||||
void RegsMips::SetFromRaw() {
|
||||
|
|
|
@ -36,16 +36,12 @@ ArchEnum RegsMips64::Arch() {
|
|||
return ARCH_MIPS64;
|
||||
}
|
||||
|
||||
uint64_t RegsMips64::GetAdjustedPc(uint64_t rel_pc, Elf* elf) {
|
||||
if (!elf->valid()) {
|
||||
return rel_pc;
|
||||
uint64_t RegsMips64::GetPcAdjustment(uint64_t rel_pc, Elf* elf) {
|
||||
if (!elf->valid() || rel_pc < 8) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// For now, just assuming no compact branches
|
||||
if (rel_pc < 8) {
|
||||
return rel_pc;
|
||||
}
|
||||
return rel_pc - 8;
|
||||
// For now, just assume no compact branches
|
||||
return 8;
|
||||
}
|
||||
|
||||
void RegsMips64::SetFromRaw() {
|
||||
|
|
|
@ -35,15 +35,11 @@ ArchEnum RegsX86::Arch() {
|
|||
return ARCH_X86;
|
||||
}
|
||||
|
||||
uint64_t RegsX86::GetAdjustedPc(uint64_t rel_pc, Elf* elf) {
|
||||
if (!elf->valid()) {
|
||||
return rel_pc;
|
||||
}
|
||||
|
||||
if (rel_pc == 0) {
|
||||
uint64_t RegsX86::GetPcAdjustment(uint64_t rel_pc, Elf* elf) {
|
||||
if (!elf->valid() || rel_pc == 0) {
|
||||
return 0;
|
||||
}
|
||||
return rel_pc - 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void RegsX86::SetFromRaw() {
|
||||
|
|
|
@ -35,16 +35,11 @@ ArchEnum RegsX86_64::Arch() {
|
|||
return ARCH_X86_64;
|
||||
}
|
||||
|
||||
uint64_t RegsX86_64::GetAdjustedPc(uint64_t rel_pc, Elf* elf) {
|
||||
if (!elf->valid()) {
|
||||
return rel_pc;
|
||||
}
|
||||
|
||||
if (rel_pc == 0) {
|
||||
uint64_t RegsX86_64::GetPcAdjustment(uint64_t rel_pc, Elf* elf) {
|
||||
if (!elf->valid() || rel_pc == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return rel_pc - 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void RegsX86_64::SetFromRaw() {
|
||||
|
|
|
@ -83,20 +83,20 @@ void Unwinder::FillInDexFrame() {
|
|||
#endif
|
||||
}
|
||||
|
||||
void Unwinder::FillInFrame(MapInfo* map_info, Elf* elf, uint64_t adjusted_rel_pc, uint64_t func_pc) {
|
||||
void Unwinder::FillInFrame(MapInfo* map_info, Elf* elf, uint64_t rel_pc, uint64_t func_pc,
|
||||
uint64_t pc_adjustment) {
|
||||
size_t frame_num = frames_.size();
|
||||
frames_.resize(frame_num + 1);
|
||||
FrameData* frame = &frames_.at(frame_num);
|
||||
frame->num = frame_num;
|
||||
frame->sp = regs_->sp();
|
||||
frame->rel_pc = adjusted_rel_pc;
|
||||
frame->rel_pc = rel_pc - pc_adjustment;
|
||||
frame->pc = regs_->pc() - pc_adjustment;
|
||||
|
||||
if (map_info == nullptr) {
|
||||
frame->pc = regs_->pc();
|
||||
return;
|
||||
}
|
||||
|
||||
frame->pc = map_info->start + adjusted_rel_pc - elf->GetLoadBias() - map_info->elf_offset;
|
||||
frame->map_name = map_info->name;
|
||||
frame->map_offset = map_info->offset;
|
||||
frame->map_start = map_info->start;
|
||||
|
@ -140,13 +140,12 @@ void Unwinder::Unwind(const std::vector<std::string>* initial_map_names_to_skip,
|
|||
|
||||
MapInfo* map_info = maps_->Find(regs_->pc());
|
||||
uint64_t rel_pc;
|
||||
uint64_t adjusted_pc;
|
||||
uint64_t adjusted_rel_pc;
|
||||
uint64_t pc_adjustment = 0;
|
||||
uint64_t step_pc;
|
||||
Elf* elf;
|
||||
if (map_info == nullptr) {
|
||||
rel_pc = regs_->pc();
|
||||
adjusted_rel_pc = rel_pc;
|
||||
adjusted_pc = rel_pc;
|
||||
step_pc = rel_pc;
|
||||
last_error_.code = ERROR_INVALID_MAP;
|
||||
} else {
|
||||
if (ShouldStop(map_suffixes_to_ignore, map_info->name)) {
|
||||
|
@ -155,21 +154,20 @@ void Unwinder::Unwind(const std::vector<std::string>* initial_map_names_to_skip,
|
|||
elf = map_info->GetElf(process_memory_, true);
|
||||
rel_pc = elf->GetRelPc(regs_->pc(), map_info);
|
||||
if (adjust_pc) {
|
||||
adjusted_pc = regs_->GetAdjustedPc(rel_pc, elf);
|
||||
pc_adjustment = regs_->GetPcAdjustment(rel_pc, elf);
|
||||
} else {
|
||||
adjusted_pc = rel_pc;
|
||||
pc_adjustment = 0;
|
||||
}
|
||||
adjusted_rel_pc = adjusted_pc;
|
||||
step_pc = rel_pc - pc_adjustment;
|
||||
|
||||
// If the pc is in an invalid elf file, try and get an Elf object
|
||||
// using the jit debug information.
|
||||
if (!elf->valid() && jit_debug_ != nullptr) {
|
||||
uint64_t adjusted_jit_pc = regs_->pc() - (rel_pc - adjusted_pc);
|
||||
uint64_t adjusted_jit_pc = regs_->pc() - pc_adjustment;
|
||||
Elf* jit_elf = jit_debug_->GetElf(maps_, adjusted_jit_pc);
|
||||
if (jit_elf != nullptr) {
|
||||
// The jit debug information requires a non relative adjusted pc.
|
||||
adjusted_pc = adjusted_jit_pc;
|
||||
adjusted_rel_pc = adjusted_pc - map_info->start;
|
||||
step_pc = adjusted_jit_pc;
|
||||
elf = jit_elf;
|
||||
}
|
||||
}
|
||||
|
@ -185,7 +183,7 @@ void Unwinder::Unwind(const std::vector<std::string>* initial_map_names_to_skip,
|
|||
regs_->set_dex_pc(0);
|
||||
}
|
||||
|
||||
FillInFrame(map_info, elf, adjusted_rel_pc, adjusted_pc);
|
||||
FillInFrame(map_info, elf, rel_pc, step_pc, pc_adjustment);
|
||||
|
||||
// Once a frame is added, stop skipping frames.
|
||||
initial_map_names_to_skip = nullptr;
|
||||
|
@ -213,8 +211,8 @@ void Unwinder::Unwind(const std::vector<std::string>* initial_map_names_to_skip,
|
|||
in_device_map = true;
|
||||
} else {
|
||||
bool finished;
|
||||
stepped = elf->Step(rel_pc, adjusted_pc, map_info->elf_offset, regs_,
|
||||
process_memory_.get(), &finished);
|
||||
stepped = elf->Step(rel_pc, step_pc, map_info->elf_offset, regs_, process_memory_.get(),
|
||||
&finished);
|
||||
elf->GetLastError(&last_error_);
|
||||
if (stepped && finished) {
|
||||
break;
|
||||
|
|
|
@ -60,7 +60,7 @@ class Regs {
|
|||
uint64_t dex_pc() { return dex_pc_; }
|
||||
void set_dex_pc(uint64_t dex_pc) { dex_pc_ = dex_pc; }
|
||||
|
||||
virtual uint64_t GetAdjustedPc(uint64_t rel_pc, Elf* elf) = 0;
|
||||
virtual uint64_t GetPcAdjustment(uint64_t rel_pc, Elf* elf) = 0;
|
||||
|
||||
virtual bool StepIfSignalHandler(uint64_t rel_pc, Elf* elf, Memory* process_memory) = 0;
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ class RegsArm : public RegsImpl<uint32_t> {
|
|||
|
||||
virtual ArchEnum Arch() override final;
|
||||
|
||||
uint64_t GetAdjustedPc(uint64_t rel_pc, Elf* elf) override;
|
||||
uint64_t GetPcAdjustment(uint64_t rel_pc, Elf* elf) override;
|
||||
|
||||
void SetFromRaw() override;
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ class RegsArm64 : public RegsImpl<uint64_t> {
|
|||
|
||||
virtual ArchEnum Arch() override final;
|
||||
|
||||
uint64_t GetAdjustedPc(uint64_t rel_pc, Elf* elf) override;
|
||||
uint64_t GetPcAdjustment(uint64_t rel_pc, Elf* elf) override;
|
||||
|
||||
void SetFromRaw() override;
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ class RegsMips : public RegsImpl<uint32_t> {
|
|||
|
||||
virtual ArchEnum Arch() override final;
|
||||
|
||||
uint64_t GetAdjustedPc(uint64_t rel_pc, Elf* elf) override;
|
||||
uint64_t GetPcAdjustment(uint64_t rel_pc, Elf* elf) override;
|
||||
|
||||
void SetFromRaw() override;
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ class RegsMips64 : public RegsImpl<uint64_t> {
|
|||
|
||||
virtual ArchEnum Arch() override final;
|
||||
|
||||
uint64_t GetAdjustedPc(uint64_t rel_pc, Elf* elf) override;
|
||||
uint64_t GetPcAdjustment(uint64_t rel_pc, Elf* elf) override;
|
||||
|
||||
void SetFromRaw() override;
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ class RegsX86 : public RegsImpl<uint32_t> {
|
|||
|
||||
virtual ArchEnum Arch() override final;
|
||||
|
||||
uint64_t GetAdjustedPc(uint64_t rel_pc, Elf* elf) override;
|
||||
uint64_t GetPcAdjustment(uint64_t rel_pc, Elf* elf) override;
|
||||
|
||||
void SetFromRaw() override;
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ class RegsX86_64 : public RegsImpl<uint64_t> {
|
|||
|
||||
virtual ArchEnum Arch() override final;
|
||||
|
||||
uint64_t GetAdjustedPc(uint64_t rel_pc, Elf* elf) override;
|
||||
uint64_t GetPcAdjustment(uint64_t rel_pc, Elf* elf) override;
|
||||
|
||||
void SetFromRaw() override;
|
||||
|
||||
|
|
|
@ -88,7 +88,8 @@ class Unwinder {
|
|||
|
||||
private:
|
||||
void FillInDexFrame();
|
||||
void FillInFrame(MapInfo* map_info, Elf* elf, uint64_t adjusted_rel_pc, uint64_t adjusted_pc);
|
||||
void FillInFrame(MapInfo* map_info, Elf* elf, uint64_t rel_pc, uint64_t func_pc,
|
||||
uint64_t pc_adjustment);
|
||||
|
||||
size_t max_frames_;
|
||||
Maps* maps_;
|
||||
|
|
|
@ -47,7 +47,7 @@ class RegsFake : public Regs {
|
|||
|
||||
bool Is32Bit() { return false; }
|
||||
|
||||
uint64_t GetAdjustedPc(uint64_t rel_pc, Elf*) override { return rel_pc - 2; }
|
||||
uint64_t GetPcAdjustment(uint64_t, Elf*) override { return 2; }
|
||||
|
||||
bool StepIfSignalHandler(uint64_t, Elf*, Memory*) override { return false; }
|
||||
|
||||
|
@ -77,7 +77,7 @@ class RegsImplFake : public RegsImpl<TypeParam> {
|
|||
|
||||
ArchEnum Arch() override { return ARCH_UNKNOWN; }
|
||||
|
||||
uint64_t GetAdjustedPc(uint64_t, Elf*) override { return 0; }
|
||||
uint64_t GetPcAdjustment(uint64_t, Elf*) override { return 0; }
|
||||
void SetFromRaw() override {}
|
||||
bool SetPcFromReturnAddress(Memory*) override { return false; }
|
||||
bool StepIfSignalHandler(uint64_t, Elf*, Memory*) override { return false; }
|
||||
|
|
|
@ -96,48 +96,48 @@ TEST_F(RegsTest, regs64) {
|
|||
|
||||
TEST_F(RegsTest, rel_pc) {
|
||||
RegsArm64 arm64;
|
||||
ASSERT_EQ(0xcU, arm64.GetAdjustedPc(0x10, elf_.get()));
|
||||
ASSERT_EQ(0x0U, arm64.GetAdjustedPc(0x4, elf_.get()));
|
||||
ASSERT_EQ(0x3U, arm64.GetAdjustedPc(0x3, elf_.get()));
|
||||
ASSERT_EQ(0x2U, arm64.GetAdjustedPc(0x2, elf_.get()));
|
||||
ASSERT_EQ(0x1U, arm64.GetAdjustedPc(0x1, elf_.get()));
|
||||
ASSERT_EQ(0x0U, arm64.GetAdjustedPc(0x0, elf_.get()));
|
||||
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()));
|
||||
|
||||
RegsX86 x86;
|
||||
ASSERT_EQ(0xffU, x86.GetAdjustedPc(0x100, elf_.get()));
|
||||
ASSERT_EQ(0x1U, x86.GetAdjustedPc(0x2, elf_.get()));
|
||||
ASSERT_EQ(0x0U, x86.GetAdjustedPc(0x1, elf_.get()));
|
||||
ASSERT_EQ(0x0U, x86.GetAdjustedPc(0x0, elf_.get()));
|
||||
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()));
|
||||
|
||||
RegsX86_64 x86_64;
|
||||
ASSERT_EQ(0xffU, x86_64.GetAdjustedPc(0x100, elf_.get()));
|
||||
ASSERT_EQ(0x1U, x86_64.GetAdjustedPc(0x2, elf_.get()));
|
||||
ASSERT_EQ(0x0U, x86_64.GetAdjustedPc(0x1, elf_.get()));
|
||||
ASSERT_EQ(0x0U, x86_64.GetAdjustedPc(0x0, elf_.get()));
|
||||
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()));
|
||||
|
||||
RegsMips mips;
|
||||
ASSERT_EQ(0x8U, mips.GetAdjustedPc(0x10, elf_.get()));
|
||||
ASSERT_EQ(0x0U, mips.GetAdjustedPc(0x8, elf_.get()));
|
||||
ASSERT_EQ(0x7U, mips.GetAdjustedPc(0x7, elf_.get()));
|
||||
ASSERT_EQ(0x6U, mips.GetAdjustedPc(0x6, elf_.get()));
|
||||
ASSERT_EQ(0x5U, mips.GetAdjustedPc(0x5, elf_.get()));
|
||||
ASSERT_EQ(0x4U, mips.GetAdjustedPc(0x4, elf_.get()));
|
||||
ASSERT_EQ(0x3U, mips.GetAdjustedPc(0x3, elf_.get()));
|
||||
ASSERT_EQ(0x2U, mips.GetAdjustedPc(0x2, elf_.get()));
|
||||
ASSERT_EQ(0x1U, mips.GetAdjustedPc(0x1, elf_.get()));
|
||||
ASSERT_EQ(0x0U, mips.GetAdjustedPc(0x0, elf_.get()));
|
||||
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()));
|
||||
|
||||
RegsMips64 mips64;
|
||||
ASSERT_EQ(0x8U, mips64.GetAdjustedPc(0x10, elf_.get()));
|
||||
ASSERT_EQ(0x0U, mips64.GetAdjustedPc(0x8, elf_.get()));
|
||||
ASSERT_EQ(0x7U, mips64.GetAdjustedPc(0x7, elf_.get()));
|
||||
ASSERT_EQ(0x6U, mips64.GetAdjustedPc(0x6, elf_.get()));
|
||||
ASSERT_EQ(0x5U, mips64.GetAdjustedPc(0x5, elf_.get()));
|
||||
ASSERT_EQ(0x4U, mips64.GetAdjustedPc(0x4, elf_.get()));
|
||||
ASSERT_EQ(0x3U, mips64.GetAdjustedPc(0x3, elf_.get()));
|
||||
ASSERT_EQ(0x2U, mips64.GetAdjustedPc(0x2, elf_.get()));
|
||||
ASSERT_EQ(0x1U, mips64.GetAdjustedPc(0x1, elf_.get()));
|
||||
ASSERT_EQ(0x0U, mips64.GetAdjustedPc(0x0, elf_.get()));
|
||||
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()));
|
||||
}
|
||||
|
||||
TEST_F(RegsTest, rel_pc_arm) {
|
||||
|
@ -145,34 +145,34 @@ TEST_F(RegsTest, rel_pc_arm) {
|
|||
|
||||
// Check fence posts.
|
||||
elf_->FakeSetLoadBias(0);
|
||||
ASSERT_EQ(3U, arm.GetAdjustedPc(0x5, elf_.get()));
|
||||
ASSERT_EQ(4U, arm.GetAdjustedPc(0x4, elf_.get()));
|
||||
ASSERT_EQ(3U, arm.GetAdjustedPc(0x3, elf_.get()));
|
||||
ASSERT_EQ(2U, arm.GetAdjustedPc(0x2, elf_.get()));
|
||||
ASSERT_EQ(1U, arm.GetAdjustedPc(0x1, elf_.get()));
|
||||
ASSERT_EQ(0U, arm.GetAdjustedPc(0x0, elf_.get()));
|
||||
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()));
|
||||
|
||||
elf_->FakeSetLoadBias(0x100);
|
||||
ASSERT_EQ(0xffU, arm.GetAdjustedPc(0xff, elf_.get()));
|
||||
ASSERT_EQ(0x103U, arm.GetAdjustedPc(0x105, elf_.get()));
|
||||
ASSERT_EQ(0x104U, arm.GetAdjustedPc(0x104, elf_.get()));
|
||||
ASSERT_EQ(0x103U, arm.GetAdjustedPc(0x103, elf_.get()));
|
||||
ASSERT_EQ(0x102U, arm.GetAdjustedPc(0x102, elf_.get()));
|
||||
ASSERT_EQ(0x101U, arm.GetAdjustedPc(0x101, elf_.get()));
|
||||
ASSERT_EQ(0x100U, arm.GetAdjustedPc(0x100, elf_.get()));
|
||||
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()));
|
||||
|
||||
// Check thumb instructions handling.
|
||||
elf_->FakeSetLoadBias(0);
|
||||
memory_->SetData32(0x2000, 0);
|
||||
ASSERT_EQ(0x2003U, arm.GetAdjustedPc(0x2005, elf_.get()));
|
||||
ASSERT_EQ(2U, arm.GetPcAdjustment(0x2005, elf_.get()));
|
||||
memory_->SetData32(0x2000, 0xe000f000);
|
||||
ASSERT_EQ(0x2001U, arm.GetAdjustedPc(0x2005, elf_.get()));
|
||||
ASSERT_EQ(4U, arm.GetPcAdjustment(0x2005, elf_.get()));
|
||||
|
||||
elf_->FakeSetLoadBias(0x400);
|
||||
memory_->SetData32(0x2100, 0);
|
||||
ASSERT_EQ(0x2503U, arm.GetAdjustedPc(0x2505, elf_.get()));
|
||||
ASSERT_EQ(2U, arm.GetPcAdjustment(0x2505, elf_.get()));
|
||||
memory_->SetData32(0x2100, 0xf111f111);
|
||||
ASSERT_EQ(0x2501U, arm.GetAdjustedPc(0x2505, elf_.get()));
|
||||
ASSERT_EQ(4U, arm.GetPcAdjustment(0x2505, elf_.get()));
|
||||
}
|
||||
|
||||
TEST_F(RegsTest, elf_invalid) {
|
||||
|
@ -188,27 +188,27 @@ TEST_F(RegsTest, elf_invalid) {
|
|||
|
||||
regs_arm.set_pc(0x1500);
|
||||
EXPECT_EQ(0x500U, invalid_elf->GetRelPc(regs_arm.pc(), &map_info));
|
||||
EXPECT_EQ(0x4fcU, regs_arm.GetAdjustedPc(0x500U, invalid_elf));
|
||||
EXPECT_EQ(4U, regs_arm.GetPcAdjustment(0x500U, invalid_elf));
|
||||
|
||||
regs_arm64.set_pc(0x1600);
|
||||
EXPECT_EQ(0x600U, invalid_elf->GetRelPc(regs_arm64.pc(), &map_info));
|
||||
EXPECT_EQ(0x600U, regs_arm64.GetAdjustedPc(0x600U, invalid_elf));
|
||||
EXPECT_EQ(0U, regs_arm64.GetPcAdjustment(0x600U, invalid_elf));
|
||||
|
||||
regs_x86.set_pc(0x1700);
|
||||
EXPECT_EQ(0x700U, invalid_elf->GetRelPc(regs_x86.pc(), &map_info));
|
||||
EXPECT_EQ(0x700U, regs_x86.GetAdjustedPc(0x700U, invalid_elf));
|
||||
EXPECT_EQ(0U, 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(0x800U, regs_x86_64.GetAdjustedPc(0x800U, invalid_elf));
|
||||
EXPECT_EQ(0U, 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(0x900U, regs_mips.GetAdjustedPc(0x900U, invalid_elf));
|
||||
EXPECT_EQ(0U, regs_mips.GetPcAdjustment(0x900U, invalid_elf));
|
||||
|
||||
regs_mips64.set_pc(0x1a00);
|
||||
EXPECT_EQ(0xa00U, invalid_elf->GetRelPc(regs_mips64.pc(), &map_info));
|
||||
EXPECT_EQ(0xa00U, regs_mips64.GetAdjustedPc(0xa00U, invalid_elf));
|
||||
EXPECT_EQ(0U, regs_mips64.GetPcAdjustment(0xa00U, invalid_elf));
|
||||
}
|
||||
|
||||
TEST_F(RegsTest, arm_set_from_raw) {
|
||||
|
|
|
@ -193,6 +193,14 @@ TEST_F(UnwindOfflineTest, pc_straddle_arm) {
|
|||
" #02 pc 00007441 libbase.so (_ZN7android4base10LogMessageD2Ev+748)\n"
|
||||
" #03 pc 00015147 /does/not/exist/libhidlbase.so\n",
|
||||
frame_info);
|
||||
EXPECT_EQ(0xf31ea9f8U, unwinder.frames()[0].pc);
|
||||
EXPECT_EQ(0xe9c866f8U, unwinder.frames()[0].sp);
|
||||
EXPECT_EQ(0xf2da0a1bU, unwinder.frames()[1].pc);
|
||||
EXPECT_EQ(0xe9c86728U, unwinder.frames()[1].sp);
|
||||
EXPECT_EQ(0xf2da1441U, unwinder.frames()[2].pc);
|
||||
EXPECT_EQ(0xe9c86730U, unwinder.frames()[2].sp);
|
||||
EXPECT_EQ(0xf3367147U, unwinder.frames()[3].pc);
|
||||
EXPECT_EQ(0xe9c86778U, unwinder.frames()[3].sp);
|
||||
}
|
||||
|
||||
TEST_F(UnwindOfflineTest, pc_in_gnu_debugdata_arm) {
|
||||
|
@ -209,6 +217,10 @@ TEST_F(UnwindOfflineTest, pc_in_gnu_debugdata_arm) {
|
|||
" #01 pc 0006dce5 libandroid_runtime.so "
|
||||
"(_ZN7android14AndroidRuntime19javaCreateThreadEtcEPFiPvES1_PKcijPS1_)\n",
|
||||
frame_info);
|
||||
EXPECT_EQ(0xf1f6dc49U, unwinder.frames()[0].pc);
|
||||
EXPECT_EQ(0xd8fe6930U, unwinder.frames()[0].sp);
|
||||
EXPECT_EQ(0xf1f6dce5U, unwinder.frames()[1].pc);
|
||||
EXPECT_EQ(0xd8fe6958U, unwinder.frames()[1].sp);
|
||||
}
|
||||
|
||||
TEST_F(UnwindOfflineTest, pc_straddle_arm64) {
|
||||
|
@ -229,6 +241,18 @@ TEST_F(UnwindOfflineTest, pc_straddle_arm64) {
|
|||
"(_ZN11unwindstack37UnwindTest_remote_through_signal_Test8TestBodyEv+32)\n"
|
||||
" #05 pc 0000000000455d70 libunwindstack_test (_ZN7testing4Test3RunEv+392)\n",
|
||||
frame_info);
|
||||
EXPECT_EQ(0x64d09d4fd8U, unwinder.frames()[0].pc);
|
||||
EXPECT_EQ(0x7fe0d84040U, unwinder.frames()[0].sp);
|
||||
EXPECT_EQ(0x64d09d5078U, unwinder.frames()[1].pc);
|
||||
EXPECT_EQ(0x7fe0d84070U, unwinder.frames()[1].sp);
|
||||
EXPECT_EQ(0x64d09d508cU, unwinder.frames()[2].pc);
|
||||
EXPECT_EQ(0x7fe0d84080U, unwinder.frames()[2].sp);
|
||||
EXPECT_EQ(0x64d09d88fcU, unwinder.frames()[3].pc);
|
||||
EXPECT_EQ(0x7fe0d84090U, unwinder.frames()[3].sp);
|
||||
EXPECT_EQ(0x64d09d88d8U, unwinder.frames()[4].pc);
|
||||
EXPECT_EQ(0x7fe0d840f0U, unwinder.frames()[4].sp);
|
||||
EXPECT_EQ(0x64d0a00d70U, unwinder.frames()[5].pc);
|
||||
EXPECT_EQ(0x7fe0d84110U, unwinder.frames()[5].sp);
|
||||
}
|
||||
|
||||
static void AddMemory(std::string file_name, MemoryOfflineParts* parts) {
|
||||
|
@ -390,6 +414,144 @@ TEST_F(UnwindOfflineTest, jit_debug_x86) {
|
|||
" #67 pc 00001a80 dalvikvm32 (main+1312)\n"
|
||||
" #68 pc 00018275 libc.so\n",
|
||||
frame_info);
|
||||
EXPECT_EQ(0xeb89bfb8U, unwinder.frames()[0].pc);
|
||||
EXPECT_EQ(0xffeb5280U, unwinder.frames()[0].sp);
|
||||
EXPECT_EQ(0xeb89af00U, unwinder.frames()[1].pc);
|
||||
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(0xffeb5d30U, unwinder.frames()[3].sp);
|
||||
EXPECT_EQ(0xf728e4d2U, unwinder.frames()[4].pc);
|
||||
EXPECT_EQ(0xffeb5d60U, unwinder.frames()[4].sp);
|
||||
EXPECT_EQ(0xf6d27ab5U, unwinder.frames()[5].pc);
|
||||
EXPECT_EQ(0xffeb5d80U, unwinder.frames()[5].sp);
|
||||
EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[6].pc);
|
||||
EXPECT_EQ(0xffeb5e20U, unwinder.frames()[6].sp);
|
||||
EXPECT_EQ(0xf6f73552U, unwinder.frames()[7].pc);
|
||||
EXPECT_EQ(0xffeb5ec0U, unwinder.frames()[7].sp);
|
||||
EXPECT_EQ(0xf6f7499aU, unwinder.frames()[8].pc);
|
||||
EXPECT_EQ(0xffeb5f40U, unwinder.frames()[8].sp);
|
||||
EXPECT_EQ(0xf7265362U, unwinder.frames()[9].pc);
|
||||
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(0xffeb6160U, unwinder.frames()[11].sp);
|
||||
EXPECT_EQ(0xf728e4d2U, unwinder.frames()[12].pc);
|
||||
EXPECT_EQ(0xffeb6180U, unwinder.frames()[12].sp);
|
||||
EXPECT_EQ(0xf6d27ab5U, unwinder.frames()[13].pc);
|
||||
EXPECT_EQ(0xffeb61b0U, unwinder.frames()[13].sp);
|
||||
EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[14].pc);
|
||||
EXPECT_EQ(0xffeb6250U, unwinder.frames()[14].sp);
|
||||
EXPECT_EQ(0xf6f73552U, unwinder.frames()[15].pc);
|
||||
EXPECT_EQ(0xffeb62f0U, unwinder.frames()[15].sp);
|
||||
EXPECT_EQ(0xf6f7499aU, unwinder.frames()[16].pc);
|
||||
EXPECT_EQ(0xffeb6370U, unwinder.frames()[16].sp);
|
||||
EXPECT_EQ(0xf7265362U, unwinder.frames()[17].pc);
|
||||
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(0xffeb6580U, unwinder.frames()[19].sp);
|
||||
EXPECT_EQ(0xf728e4d2U, unwinder.frames()[20].pc);
|
||||
EXPECT_EQ(0xffeb65b0U, unwinder.frames()[20].sp);
|
||||
EXPECT_EQ(0xf6d27ab5U, unwinder.frames()[21].pc);
|
||||
EXPECT_EQ(0xffeb65e0U, unwinder.frames()[21].sp);
|
||||
EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[22].pc);
|
||||
EXPECT_EQ(0xffeb6680U, unwinder.frames()[22].sp);
|
||||
EXPECT_EQ(0xf6f73552U, unwinder.frames()[23].pc);
|
||||
EXPECT_EQ(0xffeb6720U, unwinder.frames()[23].sp);
|
||||
EXPECT_EQ(0xf6f7499aU, unwinder.frames()[24].pc);
|
||||
EXPECT_EQ(0xffeb67a0U, unwinder.frames()[24].sp);
|
||||
EXPECT_EQ(0xf7265362U, unwinder.frames()[25].pc);
|
||||
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(0xffeb69b0U, unwinder.frames()[27].sp);
|
||||
EXPECT_EQ(0xf728e6a2U, unwinder.frames()[28].pc);
|
||||
EXPECT_EQ(0xffeb69f0U, unwinder.frames()[28].sp);
|
||||
EXPECT_EQ(0xf6d27acbU, unwinder.frames()[29].pc);
|
||||
EXPECT_EQ(0xffeb6a20U, unwinder.frames()[29].sp);
|
||||
EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[30].pc);
|
||||
EXPECT_EQ(0xffeb6ac0U, unwinder.frames()[30].sp);
|
||||
EXPECT_EQ(0xf6f73552U, unwinder.frames()[31].pc);
|
||||
EXPECT_EQ(0xffeb6b60U, unwinder.frames()[31].sp);
|
||||
EXPECT_EQ(0xf6f7499aU, unwinder.frames()[32].pc);
|
||||
EXPECT_EQ(0xffeb6be0U, unwinder.frames()[32].sp);
|
||||
EXPECT_EQ(0xf7265362U, unwinder.frames()[33].pc);
|
||||
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(0xffeb6e20U, unwinder.frames()[35].sp);
|
||||
EXPECT_EQ(0xf728e4d2U, unwinder.frames()[36].pc);
|
||||
EXPECT_EQ(0xffeb6e50U, unwinder.frames()[36].sp);
|
||||
EXPECT_EQ(0xf6d27ab5U, unwinder.frames()[37].pc);
|
||||
EXPECT_EQ(0xffeb6e70U, unwinder.frames()[37].sp);
|
||||
EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[38].pc);
|
||||
EXPECT_EQ(0xffeb6f10U, unwinder.frames()[38].sp);
|
||||
EXPECT_EQ(0xf6f73552U, unwinder.frames()[39].pc);
|
||||
EXPECT_EQ(0xffeb6fb0U, unwinder.frames()[39].sp);
|
||||
EXPECT_EQ(0xf6f7499aU, unwinder.frames()[40].pc);
|
||||
EXPECT_EQ(0xffeb7030U, unwinder.frames()[40].sp);
|
||||
EXPECT_EQ(0xf7265362U, unwinder.frames()[41].pc);
|
||||
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(0xffeb7240U, unwinder.frames()[43].sp);
|
||||
EXPECT_EQ(0xf728e4d2U, unwinder.frames()[44].pc);
|
||||
EXPECT_EQ(0xffeb72a0U, unwinder.frames()[44].sp);
|
||||
EXPECT_EQ(0xf6d27ab5U, unwinder.frames()[45].pc);
|
||||
EXPECT_EQ(0xffeb72c0U, unwinder.frames()[45].sp);
|
||||
EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[46].pc);
|
||||
EXPECT_EQ(0xffeb7360U, unwinder.frames()[46].sp);
|
||||
EXPECT_EQ(0xf6f73552U, unwinder.frames()[47].pc);
|
||||
EXPECT_EQ(0xffeb7400U, unwinder.frames()[47].sp);
|
||||
EXPECT_EQ(0xf6f7499aU, unwinder.frames()[48].pc);
|
||||
EXPECT_EQ(0xffeb7480U, unwinder.frames()[48].sp);
|
||||
EXPECT_EQ(0xf7265362U, unwinder.frames()[49].pc);
|
||||
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(0xffeb76d0U, unwinder.frames()[51].sp);
|
||||
EXPECT_EQ(0xf728e6a2U, unwinder.frames()[52].pc);
|
||||
EXPECT_EQ(0xffeb76f0U, unwinder.frames()[52].sp);
|
||||
EXPECT_EQ(0xf6d27acbU, unwinder.frames()[53].pc);
|
||||
EXPECT_EQ(0xffeb7710U, unwinder.frames()[53].sp);
|
||||
EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[54].pc);
|
||||
EXPECT_EQ(0xffeb77b0U, unwinder.frames()[54].sp);
|
||||
EXPECT_EQ(0xf6f73552U, unwinder.frames()[55].pc);
|
||||
EXPECT_EQ(0xffeb7850U, unwinder.frames()[55].sp);
|
||||
EXPECT_EQ(0xf6f7499aU, unwinder.frames()[56].pc);
|
||||
EXPECT_EQ(0xffeb78d0U, unwinder.frames()[56].sp);
|
||||
EXPECT_EQ(0xf7265362U, unwinder.frames()[57].pc);
|
||||
EXPECT_EQ(0xffeb7940U, unwinder.frames()[57].sp);
|
||||
EXPECT_EQ(0xf72945bdU, unwinder.frames()[58].pc);
|
||||
EXPECT_EQ(0xffeb7a80U, unwinder.frames()[58].sp);
|
||||
EXPECT_EQ(0xf728e6a2U, unwinder.frames()[59].pc);
|
||||
EXPECT_EQ(0xffeb7ad0U, unwinder.frames()[59].sp);
|
||||
EXPECT_EQ(0xf6d27acbU, unwinder.frames()[60].pc);
|
||||
EXPECT_EQ(0xffeb7af0U, unwinder.frames()[60].sp);
|
||||
EXPECT_EQ(0xf718bc95U, unwinder.frames()[61].pc);
|
||||
EXPECT_EQ(0xffeb7b90U, unwinder.frames()[61].sp);
|
||||
EXPECT_EQ(0xf718bb5aU, unwinder.frames()[62].pc);
|
||||
EXPECT_EQ(0xffeb7c50U, unwinder.frames()[62].sp);
|
||||
EXPECT_EQ(0xf706b3ddU, unwinder.frames()[63].pc);
|
||||
EXPECT_EQ(0xffeb7d10U, unwinder.frames()[63].sp);
|
||||
EXPECT_EQ(0xf6d6548cU, unwinder.frames()[64].pc);
|
||||
EXPECT_EQ(0xffeb7d70U, unwinder.frames()[64].sp);
|
||||
EXPECT_EQ(0xf6d5df06U, unwinder.frames()[65].pc);
|
||||
EXPECT_EQ(0xffeb7df0U, unwinder.frames()[65].sp);
|
||||
EXPECT_EQ(0x56574d8cU, unwinder.frames()[66].pc);
|
||||
EXPECT_EQ(0xffeb7e40U, unwinder.frames()[66].sp);
|
||||
EXPECT_EQ(0x56574a80U, unwinder.frames()[67].pc);
|
||||
EXPECT_EQ(0xffeb7e70U, unwinder.frames()[67].sp);
|
||||
EXPECT_EQ(0xf7363275U, unwinder.frames()[68].pc);
|
||||
EXPECT_EQ(0xffeb7ef0U, unwinder.frames()[68].sp);
|
||||
}
|
||||
|
||||
TEST_F(UnwindOfflineTest, jit_debug_arm) {
|
||||
|
@ -553,6 +715,158 @@ TEST_F(UnwindOfflineTest, jit_debug_arm) {
|
|||
" #74 pc 00001349 dalvikvm32 (main+896)\n"
|
||||
" #75 pc 000850c9 libc.so\n",
|
||||
frame_info);
|
||||
EXPECT_EQ(0xdfe66a5eU, unwinder.frames()[0].pc);
|
||||
EXPECT_EQ(0xff85d180U, unwinder.frames()[0].sp);
|
||||
EXPECT_EQ(0xe044712dU, unwinder.frames()[1].pc);
|
||||
EXPECT_EQ(0xff85d200U, unwinder.frames()[1].sp);
|
||||
EXPECT_EQ(0xe27a7cb1U, unwinder.frames()[2].pc);
|
||||
EXPECT_EQ(0xff85d290U, unwinder.frames()[2].sp);
|
||||
EXPECT_EQ(0xed75c175U, unwinder.frames()[3].pc);
|
||||
EXPECT_EQ(0xff85d2b0U, unwinder.frames()[3].sp);
|
||||
EXPECT_EQ(0xed761129U, unwinder.frames()[4].pc);
|
||||
EXPECT_EQ(0xff85d2e8U, unwinder.frames()[4].sp);
|
||||
EXPECT_EQ(0xed3b97a9U, unwinder.frames()[5].pc);
|
||||
EXPECT_EQ(0xff85d370U, unwinder.frames()[5].sp);
|
||||
EXPECT_EQ(0xed541833U, unwinder.frames()[6].pc);
|
||||
EXPECT_EQ(0xff85d3d8U, unwinder.frames()[6].sp);
|
||||
EXPECT_EQ(0xed528935U, unwinder.frames()[7].pc);
|
||||
EXPECT_EQ(0xff85d428U, unwinder.frames()[7].sp);
|
||||
EXPECT_EQ(0xed52971dU, unwinder.frames()[8].pc);
|
||||
EXPECT_EQ(0xff85d470U, unwinder.frames()[8].sp);
|
||||
EXPECT_EQ(0xed73c865U, unwinder.frames()[9].pc);
|
||||
EXPECT_EQ(0xff85d4b0U, unwinder.frames()[9].sp);
|
||||
EXPECT_EQ(0xed7606ffU, unwinder.frames()[10].pc);
|
||||
EXPECT_EQ(0xff85d5d0U, unwinder.frames()[10].sp);
|
||||
EXPECT_EQ(0xe27a7c31U, unwinder.frames()[11].pc);
|
||||
EXPECT_EQ(0xff85d640U, unwinder.frames()[11].sp);
|
||||
EXPECT_EQ(0xed75c175U, unwinder.frames()[12].pc);
|
||||
EXPECT_EQ(0xff85d660U, unwinder.frames()[12].sp);
|
||||
EXPECT_EQ(0xed761129U, unwinder.frames()[13].pc);
|
||||
EXPECT_EQ(0xff85d698U, unwinder.frames()[13].sp);
|
||||
EXPECT_EQ(0xed3b97a9U, unwinder.frames()[14].pc);
|
||||
EXPECT_EQ(0xff85d720U, unwinder.frames()[14].sp);
|
||||
EXPECT_EQ(0xed541833U, unwinder.frames()[15].pc);
|
||||
EXPECT_EQ(0xff85d788U, unwinder.frames()[15].sp);
|
||||
EXPECT_EQ(0xed528935U, unwinder.frames()[16].pc);
|
||||
EXPECT_EQ(0xff85d7d8U, unwinder.frames()[16].sp);
|
||||
EXPECT_EQ(0xed52971dU, unwinder.frames()[17].pc);
|
||||
EXPECT_EQ(0xff85d820U, unwinder.frames()[17].sp);
|
||||
EXPECT_EQ(0xed73c865U, unwinder.frames()[18].pc);
|
||||
EXPECT_EQ(0xff85d860U, unwinder.frames()[18].sp);
|
||||
EXPECT_EQ(0xed7606ffU, unwinder.frames()[19].pc);
|
||||
EXPECT_EQ(0xff85d970U, unwinder.frames()[19].sp);
|
||||
EXPECT_EQ(0xe27a7b77U, unwinder.frames()[20].pc);
|
||||
EXPECT_EQ(0xff85d9e0U, unwinder.frames()[20].sp);
|
||||
EXPECT_EQ(0xed75c175U, unwinder.frames()[21].pc);
|
||||
EXPECT_EQ(0xff85da10U, unwinder.frames()[21].sp);
|
||||
EXPECT_EQ(0xed761129U, unwinder.frames()[22].pc);
|
||||
EXPECT_EQ(0xff85da48U, unwinder.frames()[22].sp);
|
||||
EXPECT_EQ(0xed3b97a9U, unwinder.frames()[23].pc);
|
||||
EXPECT_EQ(0xff85dad0U, unwinder.frames()[23].sp);
|
||||
EXPECT_EQ(0xed541833U, unwinder.frames()[24].pc);
|
||||
EXPECT_EQ(0xff85db38U, unwinder.frames()[24].sp);
|
||||
EXPECT_EQ(0xed528935U, unwinder.frames()[25].pc);
|
||||
EXPECT_EQ(0xff85db88U, unwinder.frames()[25].sp);
|
||||
EXPECT_EQ(0xed52971dU, unwinder.frames()[26].pc);
|
||||
EXPECT_EQ(0xff85dbd0U, unwinder.frames()[26].sp);
|
||||
EXPECT_EQ(0xed73c865U, unwinder.frames()[27].pc);
|
||||
EXPECT_EQ(0xff85dc10U, unwinder.frames()[27].sp);
|
||||
EXPECT_EQ(0xed7606ffU, unwinder.frames()[28].pc);
|
||||
EXPECT_EQ(0xff85dd20U, unwinder.frames()[28].sp);
|
||||
EXPECT_EQ(0xe27a7a29U, unwinder.frames()[29].pc);
|
||||
EXPECT_EQ(0xff85dd90U, unwinder.frames()[29].sp);
|
||||
EXPECT_EQ(0xed75c175U, unwinder.frames()[30].pc);
|
||||
EXPECT_EQ(0xff85ddc0U, unwinder.frames()[30].sp);
|
||||
EXPECT_EQ(0xed76122fU, unwinder.frames()[31].pc);
|
||||
EXPECT_EQ(0xff85de08U, unwinder.frames()[31].sp);
|
||||
EXPECT_EQ(0xed3b97bbU, unwinder.frames()[32].pc);
|
||||
EXPECT_EQ(0xff85de90U, unwinder.frames()[32].sp);
|
||||
EXPECT_EQ(0xed541833U, unwinder.frames()[33].pc);
|
||||
EXPECT_EQ(0xff85def8U, unwinder.frames()[33].sp);
|
||||
EXPECT_EQ(0xed528935U, unwinder.frames()[34].pc);
|
||||
EXPECT_EQ(0xff85df48U, unwinder.frames()[34].sp);
|
||||
EXPECT_EQ(0xed52971dU, unwinder.frames()[35].pc);
|
||||
EXPECT_EQ(0xff85df90U, unwinder.frames()[35].sp);
|
||||
EXPECT_EQ(0xed73c865U, unwinder.frames()[36].pc);
|
||||
EXPECT_EQ(0xff85dfd0U, unwinder.frames()[36].sp);
|
||||
EXPECT_EQ(0xed7606ffU, unwinder.frames()[37].pc);
|
||||
EXPECT_EQ(0xff85e110U, unwinder.frames()[37].sp);
|
||||
EXPECT_EQ(0xe27a739bU, unwinder.frames()[38].pc);
|
||||
EXPECT_EQ(0xff85e180U, unwinder.frames()[38].sp);
|
||||
EXPECT_EQ(0xed75c175U, unwinder.frames()[39].pc);
|
||||
EXPECT_EQ(0xff85e1b0U, unwinder.frames()[39].sp);
|
||||
EXPECT_EQ(0xed761129U, unwinder.frames()[40].pc);
|
||||
EXPECT_EQ(0xff85e1e0U, unwinder.frames()[40].sp);
|
||||
EXPECT_EQ(0xed3b97a9U, unwinder.frames()[41].pc);
|
||||
EXPECT_EQ(0xff85e268U, unwinder.frames()[41].sp);
|
||||
EXPECT_EQ(0xed541833U, unwinder.frames()[42].pc);
|
||||
EXPECT_EQ(0xff85e2d0U, unwinder.frames()[42].sp);
|
||||
EXPECT_EQ(0xed528935U, unwinder.frames()[43].pc);
|
||||
EXPECT_EQ(0xff85e320U, unwinder.frames()[43].sp);
|
||||
EXPECT_EQ(0xed52971dU, unwinder.frames()[44].pc);
|
||||
EXPECT_EQ(0xff85e368U, unwinder.frames()[44].sp);
|
||||
EXPECT_EQ(0xed73c865U, unwinder.frames()[45].pc);
|
||||
EXPECT_EQ(0xff85e3a8U, unwinder.frames()[45].sp);
|
||||
EXPECT_EQ(0xed7606ffU, unwinder.frames()[46].pc);
|
||||
EXPECT_EQ(0xff85e4c0U, unwinder.frames()[46].sp);
|
||||
EXPECT_EQ(0xe27a6aa7U, unwinder.frames()[47].pc);
|
||||
EXPECT_EQ(0xff85e530U, unwinder.frames()[47].sp);
|
||||
EXPECT_EQ(0xed75c175U, unwinder.frames()[48].pc);
|
||||
EXPECT_EQ(0xff85e5a0U, unwinder.frames()[48].sp);
|
||||
EXPECT_EQ(0xed761129U, unwinder.frames()[49].pc);
|
||||
EXPECT_EQ(0xff85e5d8U, unwinder.frames()[49].sp);
|
||||
EXPECT_EQ(0xed3b97a9U, unwinder.frames()[50].pc);
|
||||
EXPECT_EQ(0xff85e660U, unwinder.frames()[50].sp);
|
||||
EXPECT_EQ(0xed541833U, unwinder.frames()[51].pc);
|
||||
EXPECT_EQ(0xff85e6c8U, unwinder.frames()[51].sp);
|
||||
EXPECT_EQ(0xed528935U, unwinder.frames()[52].pc);
|
||||
EXPECT_EQ(0xff85e718U, unwinder.frames()[52].sp);
|
||||
EXPECT_EQ(0xed52971dU, unwinder.frames()[53].pc);
|
||||
EXPECT_EQ(0xff85e760U, unwinder.frames()[53].sp);
|
||||
EXPECT_EQ(0xed73c865U, unwinder.frames()[54].pc);
|
||||
EXPECT_EQ(0xff85e7a0U, unwinder.frames()[54].sp);
|
||||
EXPECT_EQ(0xed7606ffU, unwinder.frames()[55].pc);
|
||||
EXPECT_EQ(0xff85e8f0U, unwinder.frames()[55].sp);
|
||||
EXPECT_EQ(0xe27a1a99U, unwinder.frames()[56].pc);
|
||||
EXPECT_EQ(0xff85e960U, unwinder.frames()[56].sp);
|
||||
EXPECT_EQ(0xed75c175U, unwinder.frames()[57].pc);
|
||||
EXPECT_EQ(0xff85e990U, unwinder.frames()[57].sp);
|
||||
EXPECT_EQ(0xed76122fU, unwinder.frames()[58].pc);
|
||||
EXPECT_EQ(0xff85e9c8U, unwinder.frames()[58].sp);
|
||||
EXPECT_EQ(0xed3b97bbU, unwinder.frames()[59].pc);
|
||||
EXPECT_EQ(0xff85ea50U, unwinder.frames()[59].sp);
|
||||
EXPECT_EQ(0xed541833U, unwinder.frames()[60].pc);
|
||||
EXPECT_EQ(0xff85eab8U, unwinder.frames()[60].sp);
|
||||
EXPECT_EQ(0xed528935U, unwinder.frames()[61].pc);
|
||||
EXPECT_EQ(0xff85eb08U, unwinder.frames()[61].sp);
|
||||
EXPECT_EQ(0xed52971dU, unwinder.frames()[62].pc);
|
||||
EXPECT_EQ(0xff85eb50U, unwinder.frames()[62].sp);
|
||||
EXPECT_EQ(0xed73c865U, unwinder.frames()[63].pc);
|
||||
EXPECT_EQ(0xff85eb90U, unwinder.frames()[63].sp);
|
||||
EXPECT_EQ(0xed7606ffU, unwinder.frames()[64].pc);
|
||||
EXPECT_EQ(0xff85ec90U, unwinder.frames()[64].sp);
|
||||
EXPECT_EQ(0xed75c175U, unwinder.frames()[65].pc);
|
||||
EXPECT_EQ(0xff85ed00U, unwinder.frames()[65].sp);
|
||||
EXPECT_EQ(0xed76122fU, unwinder.frames()[66].pc);
|
||||
EXPECT_EQ(0xff85ed38U, unwinder.frames()[66].sp);
|
||||
EXPECT_EQ(0xed3b97bbU, unwinder.frames()[67].pc);
|
||||
EXPECT_EQ(0xff85edc0U, unwinder.frames()[67].sp);
|
||||
EXPECT_EQ(0xed6ac92dU, unwinder.frames()[68].pc);
|
||||
EXPECT_EQ(0xff85ee28U, unwinder.frames()[68].sp);
|
||||
EXPECT_EQ(0xed6ac6c3U, unwinder.frames()[69].pc);
|
||||
EXPECT_EQ(0xff85eeb8U, unwinder.frames()[69].sp);
|
||||
EXPECT_EQ(0xed602411U, unwinder.frames()[70].pc);
|
||||
EXPECT_EQ(0xff85ef48U, unwinder.frames()[70].sp);
|
||||
EXPECT_EQ(0xed3e0a9fU, unwinder.frames()[71].pc);
|
||||
EXPECT_EQ(0xff85ef90U, unwinder.frames()[71].sp);
|
||||
EXPECT_EQ(0xed3db9b9U, unwinder.frames()[72].pc);
|
||||
EXPECT_EQ(0xff85f008U, unwinder.frames()[72].sp);
|
||||
EXPECT_EQ(0xab0d459fU, unwinder.frames()[73].pc);
|
||||
EXPECT_EQ(0xff85f038U, unwinder.frames()[73].sp);
|
||||
EXPECT_EQ(0xab0d4349U, unwinder.frames()[74].pc);
|
||||
EXPECT_EQ(0xff85f050U, unwinder.frames()[74].sp);
|
||||
EXPECT_EQ(0xedb0d0c9U, unwinder.frames()[75].pc);
|
||||
EXPECT_EQ(0xff85f0c0U, unwinder.frames()[75].sp);
|
||||
}
|
||||
|
||||
// The eh_frame_hdr data is present but set to zero fdes. This should
|
||||
|
@ -573,6 +887,16 @@ TEST_F(UnwindOfflineTest, bad_eh_frame_hdr_arm64) {
|
|||
" #03 pc 0000000000000590 waiter64\n"
|
||||
" #04 pc 00000000000a8e98 libc.so (__libc_init+88)\n",
|
||||
frame_info);
|
||||
EXPECT_EQ(0x60a9fdf550U, unwinder.frames()[0].pc);
|
||||
EXPECT_EQ(0x7fdd141990U, unwinder.frames()[0].sp);
|
||||
EXPECT_EQ(0x60a9fdf568U, unwinder.frames()[1].pc);
|
||||
EXPECT_EQ(0x7fdd1419a0U, unwinder.frames()[1].sp);
|
||||
EXPECT_EQ(0x60a9fdf57cU, unwinder.frames()[2].pc);
|
||||
EXPECT_EQ(0x7fdd1419b0U, unwinder.frames()[2].sp);
|
||||
EXPECT_EQ(0x60a9fdf590U, unwinder.frames()[3].pc);
|
||||
EXPECT_EQ(0x7fdd1419c0U, unwinder.frames()[3].sp);
|
||||
EXPECT_EQ(0x7542d68e98U, unwinder.frames()[4].pc);
|
||||
EXPECT_EQ(0x7fdd1419d0U, unwinder.frames()[4].sp);
|
||||
}
|
||||
|
||||
// The elf has bad eh_frame unwind information for the pcs. If eh_frame
|
||||
|
@ -592,6 +916,16 @@ TEST_F(UnwindOfflineTest, debug_frame_first_x86) {
|
|||
" #03 pc 000006f7 waiter (main+23)\n"
|
||||
" #04 pc 00018275 libc.so\n",
|
||||
frame_info);
|
||||
EXPECT_EQ(0x56598685U, unwinder.frames()[0].pc);
|
||||
EXPECT_EQ(0xffcf9e38U, unwinder.frames()[0].sp);
|
||||
EXPECT_EQ(0x565986b7U, unwinder.frames()[1].pc);
|
||||
EXPECT_EQ(0xffcf9e50U, unwinder.frames()[1].sp);
|
||||
EXPECT_EQ(0x565986d7U, unwinder.frames()[2].pc);
|
||||
EXPECT_EQ(0xffcf9e60U, unwinder.frames()[2].sp);
|
||||
EXPECT_EQ(0x565986f7U, unwinder.frames()[3].pc);
|
||||
EXPECT_EQ(0xffcf9e70U, unwinder.frames()[3].sp);
|
||||
EXPECT_EQ(0xf744a275U, unwinder.frames()[4].pc);
|
||||
EXPECT_EQ(0xffcf9e80U, unwinder.frames()[4].sp);
|
||||
}
|
||||
|
||||
// Make sure that a pc that is at the beginning of an fde unwinds correctly.
|
||||
|
@ -610,6 +944,16 @@ TEST_F(UnwindOfflineTest, eh_frame_hdr_begin_x86_64) {
|
|||
" #03 pc 00000000000013ed unwind_test64 (main+13)\n"
|
||||
" #04 pc 00000000000202b0 libc.so\n",
|
||||
frame_info);
|
||||
EXPECT_EQ(0x561550b17a80U, unwinder.frames()[0].pc);
|
||||
EXPECT_EQ(0x7ffcc8596ce8U, unwinder.frames()[0].sp);
|
||||
EXPECT_EQ(0x561550b17dd9U, unwinder.frames()[1].pc);
|
||||
EXPECT_EQ(0x7ffcc8596cf0U, unwinder.frames()[1].sp);
|
||||
EXPECT_EQ(0x561550b1821eU, unwinder.frames()[2].pc);
|
||||
EXPECT_EQ(0x7ffcc8596f40U, unwinder.frames()[2].sp);
|
||||
EXPECT_EQ(0x561550b183edU, unwinder.frames()[3].pc);
|
||||
EXPECT_EQ(0x7ffcc8597190U, unwinder.frames()[3].sp);
|
||||
EXPECT_EQ(0x7f4de62162b0U, unwinder.frames()[4].pc);
|
||||
EXPECT_EQ(0x7ffcc85971a0U, unwinder.frames()[4].sp);
|
||||
}
|
||||
|
||||
} // namespace unwindstack
|
||||
|
|
Loading…
Reference in New Issue