]> Cypherpunks repositories - gostls13.git/commitdiff
internal/buildcfg: make regabi an alias for regabi sub-experiments
authorAustin Clements <austin@google.com>
Thu, 15 Apr 2021 20:18:30 +0000 (16:18 -0400)
committerAustin Clements <austin@google.com>
Fri, 16 Apr 2021 22:45:02 +0000 (22:45 +0000)
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>
src/internal/buildcfg/exp.go
src/internal/goexperiment/flags.go

index dc0adb0963175f8c6a3866cd556bb98154d2ed1c..6eaf2bd7c2578a68667c9d5036400d548ff15d10 100644 (file)
@@ -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")
index e77734caa4cba7442ad16deddc843eec33c03194..cd4c178818495f165b20ec2caebdecf8cbe6cc13 100644 (file)
@@ -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.