internal/goexperiment: consolidate experiment-enabled constants

Currently, we have boolean and integral constants for GOEXPERIMENTs in
various places. Consolidate these into automatically generated
constants in the internal/goexperiment package.

Change-Id: I42a49aba2a3b4c722fedea23a613162cd8a67bee
Reviewed-on: https://go-review.googlesource.com/c/go/+/307818
Trust: Austin Clements <austin@google.com>
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
Austin Clements 2021-04-06 13:35:48 -04:00
parent 6304b401e4
commit b675e52e95
31 changed files with 267 additions and 82 deletions

View file

@ -6,6 +6,7 @@ package runtime
import (
"internal/abi"
"internal/goexperiment"
"runtime/internal/atomic"
"runtime/internal/sys"
"unsafe"
@ -228,7 +229,7 @@ func deferproc(siz int32, fn *funcval) { // arguments of fn follow fn
throw("defer on system stack")
}
if experimentRegabiDefer && siz != 0 {
if goexperiment.RegabiDefer && siz != 0 {
// TODO: Make deferproc just take a func().
throw("defer with non-empty frame")
}
@ -285,7 +286,7 @@ func deferprocStack(d *_defer) {
// go code on the system stack can't defer
throw("defer on system stack")
}
if experimentRegabiDefer && d.siz != 0 {
if goexperiment.RegabiDefer && d.siz != 0 {
throw("defer with non-empty frame")
}
// siz and fn are already set.
@ -387,8 +388,8 @@ func deferArgs(d *_defer) unsafe.Pointer {
// that experiment, we should change the type of d.fn.
//go:nosplit
func deferFunc(d *_defer) func() {
if !experimentRegabiDefer {
throw("requires experimentRegabiDefer")
if !goexperiment.RegabiDefer {
throw("requires GOEXPERIMENT=regabidefer")
}
var fn func()
*(**funcval)(unsafe.Pointer(&fn)) = d.fn
@ -648,7 +649,7 @@ func Goexit() {
addOneOpenDeferFrame(gp, 0, nil)
}
} else {
if experimentRegabiDefer {
if goexperiment.RegabiDefer {
// Save the pc/sp in deferCallSave(), so we can "recover" back to this
// loop if necessary.
deferCallSave(&p, deferFunc(d))
@ -850,7 +851,7 @@ func runOpenDeferFrame(gp *g, d *_defer) bool {
argWidth, fd = readvarintUnsafe(fd)
closureOffset, fd = readvarintUnsafe(fd)
nArgs, fd = readvarintUnsafe(fd)
if experimentRegabiDefer && argWidth != 0 {
if goexperiment.RegabiDefer && argWidth != 0 {
throw("defer with non-empty frame")
}
if deferBits&(1<<i) == 0 {
@ -878,7 +879,7 @@ func runOpenDeferFrame(gp *g, d *_defer) bool {
deferBits = deferBits &^ (1 << i)
*(*uint8)(unsafe.Pointer(d.varp - uintptr(deferBitsOffset))) = deferBits
p := d._panic
if experimentRegabiDefer {
if goexperiment.RegabiDefer {
deferCallSave(p, deferFunc(d))
} else {
reflectcallSave(p, unsafe.Pointer(closure), deferArgs, argWidth)
@ -906,8 +907,8 @@ func runOpenDeferFrame(gp *g, d *_defer) bool {
// This is marked as a wrapper by the compiler so it doesn't appear in
// tracebacks.
func reflectcallSave(p *_panic, fn, arg unsafe.Pointer, argsize uint32) {
if experimentRegabiDefer {
throw("not allowed with experimentRegabiDefer")
if goexperiment.RegabiDefer {
throw("not allowed with GOEXPERIMENT=regabidefer")
}
if p != nil {
p.argp = unsafe.Pointer(getargp(0))
@ -932,8 +933,8 @@ func reflectcallSave(p *_panic, fn, arg unsafe.Pointer, argsize uint32) {
// This is marked as a wrapper by the compiler so it doesn't appear in
// tracebacks.
func deferCallSave(p *_panic, fn func()) {
if !experimentRegabiDefer {
throw("only allowed with experimentRegabiDefer")
if !goexperiment.RegabiDefer {
throw("only allowed with GOEXPERIMENT=regabidefer")
}
if p != nil {
p.argp = unsafe.Pointer(getargp(0))
@ -1035,7 +1036,7 @@ func gopanic(e interface{}) {
} else {
p.argp = unsafe.Pointer(getargp(0))
if experimentRegabiDefer {
if goexperiment.RegabiDefer {
fn := deferFunc(d)
fn()
} else {