aboutsummaryrefslogtreecommitdiff
path: root/src/internal
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2021-04-15 16:18:30 -0400
committerAustin Clements <austin@google.com>2021-04-16 22:45:02 +0000
commit14dbd6e7762662f8bec95d537281f09ad3d508e4 (patch)
tree1fa45fe0263285ab507ca0856851f0c92a7c70b2 /src/internal
parent94817890c221b8abdbb24f52e92e5a7882c3f870 (diff)
downloadgo-14dbd6e7762662f8bec95d537281f09ad3d508e4.tar.gz
go-14dbd6e7762662f8bec95d537281f09ad3d508e4.zip
internal/buildcfg: make regabi an alias for regabi sub-experiments
Currently, specifying GOEXPERIMENT=regabi will turn on all regabi sub-experiments, but GOEXPERIMENT=noregabi won't turn anything off. Regabi also isn't a "real" experiment in the sense that nothing in the code base should depend on it as an experiment flag (it should depend on the appropriate sub-experiments). Hence, drop Regabi from goexperiment.Flags and make "regabi" in GOEXPERIMENT be a real alias for all of the sub-flags, so regabi will turn on all of the sub-flags and noregabi will turn off all of the sub-flags. This way, once we enable the sub-experiments in the baseline configuration, it will be easy to turn off with "noregabi". For #40724. Change-Id: I0fb95be42f756d412e729a396be607d629ae2bab Reviewed-on: https://go-review.googlesource.com/c/go/+/310609 Trust: Austin Clements <austin@google.com> Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Russ Cox <rsc@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/internal')
-rw-r--r--src/internal/buildcfg/exp.go31
-rw-r--r--src/internal/goexperiment/flags.go7
2 files changed, 21 insertions, 17 deletions
diff --git a/src/internal/buildcfg/exp.go b/src/internal/buildcfg/exp.go
index dc0adb0963..6eaf2bd7c2 100644
--- a/src/internal/buildcfg/exp.go
+++ b/src/internal/buildcfg/exp.go
@@ -45,12 +45,25 @@ func parseExperiments() goexperiment.Flags {
if env != "" {
// Create a map of known experiment names.
- names := make(map[string]reflect.Value)
+ names := make(map[string]func(bool))
rv := reflect.ValueOf(&flags).Elem()
rt := rv.Type()
for i := 0; i < rt.NumField(); i++ {
field := rv.Field(i)
- names[strings.ToLower(rt.Field(i).Name)] = field
+ names[strings.ToLower(rt.Field(i).Name)] = field.SetBool
+ }
+
+ // "regabi" is an alias for all working regabi
+ // subexperiments, and not an experiment itself. Doing
+ // this as an alias make both "regabi" and "noregabi"
+ // do the right thing.
+ names["regabi"] = func(v bool) {
+ flags.RegabiWrappers = v
+ flags.RegabiG = v
+ flags.RegabiReflect = v
+ flags.RegabiDefer = v
+ // Not ready yet:
+ //flags.RegabiArgs = v
}
// Parse names.
@@ -69,33 +82,23 @@ func parseExperiments() goexperiment.Flags {
if strings.HasPrefix(f, "no") {
f, val = f[2:], false
}
- field, ok := names[f]
+ set, ok := names[f]
if !ok {
fmt.Printf("unknown experiment %s\n", f)
os.Exit(2)
}
- field.SetBool(val)
+ set(val)
}
}
// regabi is only supported on amd64.
if GOARCH != "amd64" {
- flags.Regabi = false
flags.RegabiWrappers = false
flags.RegabiG = false
flags.RegabiReflect = false
flags.RegabiDefer = false
flags.RegabiArgs = false
}
- // Setting regabi sets working sub-experiments.
- if flags.Regabi {
- flags.RegabiWrappers = true
- flags.RegabiG = true
- flags.RegabiReflect = true
- flags.RegabiDefer = true
- // Not ready yet:
- //flags.RegabiArgs = true
- }
// Check regabi dependencies.
if flags.RegabiG && !flags.RegabiWrappers {
panic("GOEXPERIMENT regabig requires regabiwrappers")
diff --git a/src/internal/goexperiment/flags.go b/src/internal/goexperiment/flags.go
index e77734caa4..cd4c178818 100644
--- a/src/internal/goexperiment/flags.go
+++ b/src/internal/goexperiment/flags.go
@@ -60,9 +60,10 @@ type Flags struct {
StaticLockRanking bool
// Regabi is split into several sub-experiments that can be
- // enabled individually. GOEXPERIMENT=regabi implies the
- // subset that are currently "working". Not all combinations work.
- Regabi bool
+ // enabled individually. Not all combinations work.
+ // The "regabi" GOEXPERIMENT is an alias for all "working"
+ // subexperiments.
+
// RegabiWrappers enables ABI wrappers for calling between
// ABI0 and ABIInternal functions. Without this, the ABIs are
// assumed to be identical so cross-ABI calls are direct.