From 796a6c9baf85bf3ee15bba8fdbf0c5355a609597 Mon Sep 17 00:00:00 2001 From: Dragan Mladjenovic Date: Mon, 6 Mar 2017 08:54:45 +0100 Subject: [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 --- src/processor/stackwalker_mips.cc | 2 +- src/processor/stackwalker_mips64_unittest.cc | 3 --- src/processor/stackwalker_mips_unittest.cc | 3 --- 3 files changed, 1 insertion(+), 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" -- cgit v1.2.1