runtime: abort stack scan in cases that we cannot unwind the stack
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 19 Feb 2019 15:32:34 +0000 (15:32 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 19 Feb 2019 15:32:34 +0000 (15:32 +0000)
commit6bd37418a378bec4916ad70403375af00df91938
tree6cc264135130829edd8bf0fa234f727d4f929cc6
parent23c4471ee530a7a752ca8c7eff111aaa39e8d118
runtime: abort stack scan in cases that we cannot unwind the stack

    In signal-triggered stack scan, if the signal is delivered at
    certain bad time (e.g. in vdso, or in the middle of setcontext?),
    the unwinder may not be able to unwind the whole stack, while it
    still reports _URC_END_OF_STACK. So we cannot rely on _URC_END_OF_STACK
    to tell if it successfully scanned the stack. Instead, we check
    the last Go frame to see it actually reached the end of the stack.
    For Go-created stack, this is runtime.kickoff. For C-created
    stack, we need to record the outermost Go frame when it enters
    the Go side.

    Also we cannot unwind the stack if the signal is delivered in the
    middle of runtime.gogo, halfway through a goroutine switch, where
    the g and the stack don't match. Give up in this case as well.

    Reviewed-on: https://go-review.googlesource.com/c/159098

From-SVN: r269018
gcc/go/gofrontend/MERGE
libgo/go/runtime/cgo_gccgo.go
libgo/go/runtime/proc.go
libgo/go/runtime/runtime2.go
libgo/go/runtime/stubs.go
libgo/runtime/go-unwind.c