[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>
This commit is contained in:
Dragan Mladjenovic 2017-03-06 08:54:45 +01:00 committed by Mark Mentovai
parent 7ec3caf6c7
commit 796a6c9baf
3 changed files with 1 additions and 7 deletions

View file

@ -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;
}

View file

@ -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"

View file

@ -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"