]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: explain and enforce that _panic values live on the stack
authorAustin Clements <austin@google.com>
Thu, 8 Mar 2018 22:48:22 +0000 (17:48 -0500)
committerAustin Clements <austin@google.com>
Thu, 8 Mar 2018 23:35:46 +0000 (23:35 +0000)
It's a bit mysterious that _defer.sp is a uintptr that gets
stack-adjusted explicitly while _panic.argp is an unsafe.Pointer that
doesn't, but turns out to be critically important when a deferred
function grows the stack before doing a recover.

Add a comment explaining that this works because _panic values live on
the stack. Enforce this by marking _panic go:notinheap.

Change-Id: I9ca49e84ee1f86d881552c55dccd0662b530836b
Reviewed-on: https://go-review.googlesource.com/99735
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/runtime/runtime2.go

index 3db791cb4af7ea5e67cab733c5502f6fe3b58ca4..e6808ac0235487fb5f8ea3647ec512a272f395b1 100644 (file)
@@ -710,7 +710,17 @@ type _defer struct {
        link    *_defer
 }
 
-// panics
+// A _panic holds information about an active panic.
+//
+// This is marked go:notinheap because _panic values must only ever
+// live on the stack.
+//
+// The argp and link fields are stack pointers, but don't need special
+// handling during stack growth: because they are pointer-typed and
+// _panic values only live on the stack, regular stack pointer
+// adjustment takes care of them.
+//
+//go:notinheap
 type _panic struct {
        argp      unsafe.Pointer // pointer to arguments of deferred call run during panic; cannot move - known to liblink
        arg       interface{}    // argument to panic