]> Cypherpunks repositories - gostls13.git/commit
runtime: on a signal, set traceback address to a deferreturn call
authorKeith Randall <keithr@alum.mit.edu>
Tue, 11 Sep 2018 22:14:28 +0000 (15:14 -0700)
committerKeith Randall <khr@golang.org>
Wed, 3 Oct 2018 19:54:23 +0000 (19:54 +0000)
commit9dac0a8132d7db5225b27bdd8faeb3158e624159
treef2d0d9f80bc5f7101fc06c1d13d719fbd663533b
parent9a8372f8bd5a39d2476bfa9247407b51f9193b9e
runtime: on a signal, set traceback address to a deferreturn call

When a function triggers a signal (like a segfault which translates to
a nil pointer exception) during execution, a sigpanic handler is just
below it on the stack.  The function itself did not stop at a
safepoint, so we have to figure out what safepoint we should use to
scan its stack frame.

Previously we used the site of the most recent defer to get the live
variables at the signal site. That answer is not quite correct, as
explained in #27518. Instead, use the site of a deferreturn call.
It has all the right variables marked as live (no args, all the return
values, except those that escape to the heap, in which case the
corresponding PAUTOHEAP variables will be live instead).

This CL requires stack objects, so that all the local variables
and args referenced by the deferred closures keep the right variables alive.

Fixes #27518

Change-Id: Id45d8a8666759986c203181090b962e2981e48ca
Reviewed-on: https://go-review.googlesource.com/c/134637
Reviewed-by: Austin Clements <austin@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/internal/objabi/funcid.go
src/cmd/link/internal/ld/pcln.go
src/runtime/runtime2.go
src/runtime/symtab.go
src/runtime/traceback.go
test/fixedbugs/issue27518a.go [new file with mode: 0644]
test/fixedbugs/issue27518b.go [new file with mode: 0644]