1
0
mirror of https://github.com/golang/go synced 2024-11-23 00:00:07 -07:00

cmd/compile: escape "go" wrapper closure everywhere

For go statement, the wrapper closure needs to esacpe because it
runs asynchronously. Currently, it is not allowed for closures to
escape in the runtime. We have worked around this in the runtime,
so it doesn't "go" any function with arguments and so doesn't
need wrapping. If it ever does, it is not that we can have the
closure not escape, which may lead to miscompilation. Instead,
make the closure escape (which will fail the compilation). In the
future we may allow go'd closure to escape in the runtime.

Change-Id: I5bbe47b524371d2270c242f6c275013cd52abfc1
Reviewed-on: https://go-review.googlesource.com/c/go/+/312889
Trust: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
This commit is contained in:
Cherry Zhang 2021-04-22 20:36:05 -04:00
parent cfac62a1cc
commit 1b0a031680

View File

@ -1582,10 +1582,8 @@ func (o *orderState) wrapGoDefer(n *ir.GoDeferStmt) {
// (needs heap allocation). // (needs heap allocation).
cloEscapes := func() bool { cloEscapes := func() bool {
if n.Op() == ir.OGO { if n.Op() == ir.OGO {
// For "go", assume that all closures escape (with an // For "go", assume that all closures escape.
// exception for the runtime, which doesn't permit return true
// heap-allocated closures).
return base.Ctxt.Pkgpath != "runtime"
} }
// For defer, just use whatever result escape analysis // For defer, just use whatever result escape analysis
// has determined for the defer. // has determined for the defer.