]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: split n.Noescape() into separate uses
authorMatthew Dempsky <mdempsky@google.com>
Tue, 8 Oct 2019 21:21:17 +0000 (14:21 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 8 Oct 2019 23:53:55 +0000 (23:53 +0000)
n.Noescape() was overloaded for two uses: (1) to indicate a function
was annotated with //go:noescape, and (2) to indicate that certain
temporary allocations don't outlive the current statement.

The first use case is redundant with n.Func.Pragma&Noescape!=0, which
is the convention we use for checking other function-level pragmas.

The second use case is better served by renaming "Noescape" to
"Transient".

Passes toolstash-check.

Change-Id: I0f09d2d5767513894b7bf49da9cdabd04aa4a05e
Reviewed-on: https://go-review.googlesource.com/c/go/+/199822
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/compile/internal/gc/esc.go
src/cmd/compile/internal/gc/escape.go
src/cmd/compile/internal/gc/noder.go
src/cmd/compile/internal/gc/order.go
src/cmd/compile/internal/gc/syntax.go

index fb4550b3f5ebee0c71b09948b82d139b57d1cba3..0bb666dfaf1e3e731f52db4b6655af70030fa7c3 100644 (file)
@@ -369,7 +369,7 @@ func (e *Escape) paramTag(fn *Node, narg int, f *types.Field) string {
 
                // External functions are assumed unsafe, unless
                // //go:noescape is given before the declaration.
-               if fn.Noescape() {
+               if fn.Func.Pragma&Noescape != 0 {
                        if Debug['m'] != 0 && f.Sym != nil {
                                Warnl(f.Pos, "%v does not escape", name())
                        }
index 4555f6dcca6ec5c54eb938d714482d8e40bc06d0..3d41c83627858155ce9205ae6a0c0c48900d6efb 100644 (file)
@@ -1293,7 +1293,7 @@ func (e *Escape) finish(fns []*Node) {
                        }
                        n.Esc = EscNone
                        if loc.transient {
-                               n.SetNoescape(true)
+                               n.SetTransient(true)
                        }
                }
        }
index a4f834b5ab0fb7acb17f37947a2fc7b4c818c5b6..e3d6a6866f0e6293aeac1c730352af81359a3810 100644 (file)
@@ -495,7 +495,6 @@ func (p *noder) funcDecl(fun *syntax.FuncDecl) *Node {
 
        pragma := fun.Pragma
        f.Func.Pragma = fun.Pragma
-       f.SetNoescape(pragma&Noescape != 0)
        if pragma&Systemstack != 0 && pragma&Nosplit != 0 {
                yyerrorl(f.Pos, "go:nosplit and go:systemstack cannot be combined")
        }
@@ -507,7 +506,7 @@ func (p *noder) funcDecl(fun *syntax.FuncDecl) *Node {
        p.funcBody(f, fun.Body)
 
        if fun.Body != nil {
-               if f.Noescape() {
+               if f.Func.Pragma&Noescape != 0 {
                        yyerrorl(f.Pos, "can only use //go:noescape with external func implementations")
                }
        } else {
index 2ab87a2f7b0992d2effd56e04e9231b57c3ed925..ec07dcc15fe2b05dc3e42dbc2939f70f07d4bf5c 100644 (file)
@@ -1174,7 +1174,7 @@ func (o *Order) expr(n, lhs *Node) *Node {
                }
 
        case OCLOSURE:
-               if n.Noescape() && n.Func.Closure.Func.Cvars.Len() > 0 {
+               if n.Transient() && n.Func.Closure.Func.Cvars.Len() > 0 {
                        prealloc[n] = o.newTemp(closureType(n), false)
                }
 
@@ -1183,7 +1183,7 @@ func (o *Order) expr(n, lhs *Node) *Node {
                n.Right = o.expr(n.Right, nil)
                o.exprList(n.List)
                o.exprList(n.Rlist)
-               if n.Noescape() {
+               if n.Transient() {
                        var t *types.Type
                        switch n.Op {
                        case OSLICELIT:
@@ -1195,7 +1195,7 @@ func (o *Order) expr(n, lhs *Node) *Node {
                }
 
        case ODDDARG:
-               if n.Noescape() {
+               if n.Transient() {
                        // The ddd argument does not live beyond the call it is created for.
                        // Allocate a temporary that will be cleaned up when this statement
                        // completes. We could be more aggressive and try to arrange for it
index c1df046654f06c7b10a06aef8782bdd2fd512e88..08edef9496a65313787978b7dbc85c7ae42a83d1 100644 (file)
@@ -151,7 +151,7 @@ const (
        _, nodeDiag      // already printed error about this
        _, nodeColas     // OAS resulting from :=
        _, nodeNonNil    // guaranteed to be non-nil
-       _, nodeNoescape  // func arguments do not escape; TODO(rsc): move Noescape to Func struct (see CL 7360)
+       _, nodeTransient // storage can be reused immediately after this statement
        _, nodeBounded   // bounds check unnecessary
        _, nodeAddable   // addressable
        _, nodeHasCall   // expression contains a function call
@@ -179,7 +179,7 @@ func (n *Node) IsDDD() bool                 { return n.flags&nodeIsDDD != 0 }
 func (n *Node) Diag() bool                  { return n.flags&nodeDiag != 0 }
 func (n *Node) Colas() bool                 { return n.flags&nodeColas != 0 }
 func (n *Node) NonNil() bool                { return n.flags&nodeNonNil != 0 }
-func (n *Node) Noescape() bool              { return n.flags&nodeNoescape != 0 }
+func (n *Node) Transient() bool             { return n.flags&nodeTransient != 0 }
 func (n *Node) Bounded() bool               { return n.flags&nodeBounded != 0 }
 func (n *Node) Addable() bool               { return n.flags&nodeAddable != 0 }
 func (n *Node) HasCall() bool               { return n.flags&nodeHasCall != 0 }
@@ -206,7 +206,7 @@ func (n *Node) SetIsDDD(b bool)                 { n.flags.set(nodeIsDDD, b) }
 func (n *Node) SetDiag(b bool)                  { n.flags.set(nodeDiag, b) }
 func (n *Node) SetColas(b bool)                 { n.flags.set(nodeColas, b) }
 func (n *Node) SetNonNil(b bool)                { n.flags.set(nodeNonNil, b) }
-func (n *Node) SetNoescape(b bool)              { n.flags.set(nodeNoescape, b) }
+func (n *Node) SetTransient(b bool)             { n.flags.set(nodeTransient, b) }
 func (n *Node) SetBounded(b bool)               { n.flags.set(nodeBounded, b) }
 func (n *Node) SetAddable(b bool)               { n.flags.set(nodeAddable, b) }
 func (n *Node) SetHasCall(b bool)               { n.flags.set(nodeHasCall, b) }