]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile: escape "go" wrapper closure everywhere
authorCherry Zhang <cherryyz@google.com>
Fri, 23 Apr 2021 00:36:05 +0000 (20:36 -0400)
committerCherry Zhang <cherryyz@google.com>
Fri, 23 Apr 2021 02:29:37 +0000 (02:29 +0000)
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>
src/cmd/compile/internal/walk/order.go

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