]> Cypherpunks.ru repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile: skip types2 GC test during bootstrapping
authorMatthew Dempsky <mdempsky@google.com>
Thu, 17 Jun 2021 22:36:23 +0000 (15:36 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Thu, 17 Jun 2021 23:14:04 +0000 (23:14 +0000)
Unified includes a check to make sure that types2 memory has been
garbage collected, but it relies on precise finalization, which we
provide (for dynamically allocated objects, at least) but isn't
guaranteed by the Go spec. In particular, Go 1.4 doesn't provide this.

The check is strictly unnecessary and only exists to make sure we
don't regress and start holding onto types2 memory accidentally. So
just disable the check during bootstrap builds.

Change-Id: Ie54fe53b2edba02c0b0b1e5ae39d81be8a0ace8d
Reviewed-on: https://go-review.googlesource.com/c/go/+/329269
Trust: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/cmd/compile/internal/base/bootstrap_false.go [new file with mode: 0644]
src/cmd/compile/internal/base/bootstrap_true.go [new file with mode: 0644]
src/cmd/compile/internal/noder/unified.go

diff --git a/src/cmd/compile/internal/base/bootstrap_false.go b/src/cmd/compile/internal/base/bootstrap_false.go
new file mode 100644 (file)
index 0000000..de86644
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !compiler_bootstrap
+
+package base
+
+// CompilerBootstrap reports whether the current compiler binary was
+// built with -tags=compiler_bootstrap.
+const CompilerBootstrap = false
diff --git a/src/cmd/compile/internal/base/bootstrap_true.go b/src/cmd/compile/internal/base/bootstrap_true.go
new file mode 100644 (file)
index 0000000..81a17e1
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build compiler_bootstrap
+
+package base
+
+// CompilerBootstrap reports whether the current compiler binary was
+// built with -tags=compiler_bootstrap.
+const CompilerBootstrap = true
index 9a41ea9dfe4910db2d85c0ac6483fd35f86ea637..96c0916493591b2c1c896413037a5b70f6908e34 100644 (file)
@@ -161,6 +161,16 @@ func writePkgStub(noders []*noder) string {
 
 // freePackage ensures the given package is garbage collected.
 func freePackage(pkg *types2.Package) {
+       // The GC test below relies on a precise GC that runs finalizers as
+       // soon as objects are unreachable. Our implementation provides
+       // this, but other/older implementations may not (e.g., Go 1.4 does
+       // not because of #22350). To avoid imposing unnecessary
+       // restrictions on the GOROOT_BOOTSTRAP toolchain, we skip the test
+       // during bootstrapping.
+       if base.CompilerBootstrap {
+               return
+       }
+
        // Set a finalizer on pkg so we can detect if/when it's collected.
        done := make(chan struct{})
        runtime.SetFinalizer(pkg, func(*types2.Package) { close(done) })