diff options
author | Dragan Mladjenovic <Dragan.Mladjenovic@imgtec.com> | 2017-03-06 08:54:45 +0100 |
---|---|---|
committer | Mark Mentovai <mark@chromium.org> | 2017-03-16 15:59:05 +0000 |
commit | 796a6c9baf85bf3ee15bba8fdbf0c5355a609597 (patch) | |
tree | dcc9a73c733107b5697649fa65151286562ed8ee /src/processor | |
parent | Fix Windows client ExceptionHandlerTest tests (diff) | |
download | breakpad-796a6c9baf85bf3ee15bba8fdbf0c5355a609597.tar.xz |
[MIPS]: Don't terminate stackwalk when $sp value doesn't change between frames
Currently on MIPS we accidentally terminate stackwalk if $sp value doesn't change between frames
which results in incomplete callchain terminated at the point of first tailcall encountered.
Change-Id: I8f1ed1df958d8f0a9eb11fd7800062184d8f1ee2
Reviewed-on: https://chromium-review.googlesource.com/449755
Reviewed-by: Mark Mentovai <mark@chromium.org>
Diffstat (limited to 'src/processor')
-rw-r--r-- | src/processor/stackwalker_mips.cc | 2 | ||||
-rw-r--r-- | src/processor/stackwalker_mips64_unittest.cc | 3 | ||||
-rw-r--r-- | src/processor/stackwalker_mips_unittest.cc | 3 |
3 files changed, 1 insertions, 7 deletions
diff --git a/src/processor/stackwalker_mips.cc b/src/processor/stackwalker_mips.cc index a3df84c4..9a81b46e 100644 --- a/src/processor/stackwalker_mips.cc +++ b/src/processor/stackwalker_mips.cc @@ -280,7 +280,7 @@ StackFrame* StackwalkerMIPS::GetCallerFrame(const CallStack* stack, // If the new stack pointer is at a lower address than the old, then // that's clearly incorrect. Treat this as end-of-stack to enforce // progress and avoid infinite loops. - if (new_frame->context.iregs[MD_CONTEXT_MIPS_REG_SP] <= + if (new_frame->context.iregs[MD_CONTEXT_MIPS_REG_SP] < last_frame->context.iregs[MD_CONTEXT_MIPS_REG_SP]) { return NULL; } diff --git a/src/processor/stackwalker_mips64_unittest.cc b/src/processor/stackwalker_mips64_unittest.cc index 531f546f..2a9784bf 100644 --- a/src/processor/stackwalker_mips64_unittest.cc +++ b/src/processor/stackwalker_mips64_unittest.cc @@ -533,9 +533,6 @@ struct CFIFixture: public StackwalkerMIPSFixture { // The calling function. "FUNC 5000 1000 0 epictetus\n" - // Initially, nothing has been pushed on the stack, - // and the return address is still in the $ra register. - "STACK CFI INIT 5000 1000 .cfa: $sp .ra: $ra\n" // Mark it as end of stack. "STACK CFI INIT 5000 8 .cfa: $sp 0 + .ra: $ra\n" diff --git a/src/processor/stackwalker_mips_unittest.cc b/src/processor/stackwalker_mips_unittest.cc index 5398c2b3..a172f17b 100644 --- a/src/processor/stackwalker_mips_unittest.cc +++ b/src/processor/stackwalker_mips_unittest.cc @@ -525,9 +525,6 @@ struct CFIFixture: public StackwalkerMIPSFixture { // The calling function. "FUNC 5000 1000 0 epictetus\n" - // Initially, nothing has been pushed on the stack, - // and the return address is still in the $ra register. - "STACK CFI INIT 5000 1000 .cfa: $sp .ra: $ra\n" // Mark it as end of stack. "STACK CFI INIT 5000 8 .cfa: $sp 0 + .ra: $ra\n" |