]> Cypherpunks.ru repositories - gostls13.git/commit
cmd/compile/internal/staticinit: make staticopy safe
authorMatthew Dempsky <mdempsky@google.com>
Thu, 24 Mar 2022 19:27:39 +0000 (12:27 -0700)
committerGopher Robot <gobot@golang.org>
Mon, 11 Sep 2023 20:12:05 +0000 (20:12 +0000)
commitafa3f8e104744ea2350b0eb87474866ef27e04f2
tree2e8923033f8bb59c38423197db0a1cc4c2752135
parent1cdabf0c8b1297a1b82fda975f9313f69b77b262
cmd/compile/internal/staticinit: make staticopy safe

Currently, cmd/compile optimizes `var a = true; var b = a` into `var a
= true; var b = true`. But this may not be safe if we need to
initialize any other global variables between `a` and `b`, and the
initialization involves calling a user-defined function that reassigns
`a`.

This CL changes staticinit to keep track of the initialization
expressions that we've seen so far, and to stop applying the
staticcopy optimization once we've seen an initialization expression
that might have modified another global variable within this package.

To help identify affected initializers, this CL adds a -d=staticcopy
flag to warn when a staticcopy is suppressed and turned into a dynamic
copy.

Currently, `go build -gcflags=all=-d=staticcopy std` reports only four
instances:

```
encoding/xml/xml.go:1600:5: skipping static copy of HTMLEntity+0 with map[string]string{...}
encoding/xml/xml.go:1869:5: skipping static copy of HTMLAutoClose+0 with []string{...}
net/net.go:661:5: skipping static copy of .stmp_31+0 with poll.ErrNetClosing
net/http/transport.go:2566:5: skipping static copy of errRequestCanceled+0 with ~R0
```

Fixes #51913.

Change-Id: Iab41cf6f84c44f7f960e4e62c28a8aeaade4fbcf
Reviewed-on: https://go-review.googlesource.com/c/go/+/395541
Auto-Submit: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: David Chase <drchase@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Heschi Kreinick <heschi@google.com>
src/cmd/compile/internal/base/debug.go
src/cmd/compile/internal/ir/func.go
src/cmd/compile/internal/staticinit/sched.go
src/cmd/compile/internal/walk/expr.go
src/cmd/compile/internal/walk/order.go
test/fixedbugs/issue51913.go [new file with mode: 0644]