aboutsummaryrefslogtreecommitdiff
path: root/src/processor
diff options
context:
space:
mode:
authorDragan Mladjenovic <Dragan.Mladjenovic@imgtec.com>2017-03-06 08:54:45 +0100
committerMark Mentovai <mark@chromium.org>2017-03-16 15:59:05 +0000
commit796a6c9baf85bf3ee15bba8fdbf0c5355a609597 (patch)
treedcc9a73c733107b5697649fa65151286562ed8ee /src/processor
parentFix Windows client ExceptionHandlerTest tests (diff)
downloadbreakpad-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.cc2
-rw-r--r--src/processor/stackwalker_mips64_unittest.cc3
-rw-r--r--src/processor/stackwalker_mips_unittest.cc3
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"