cmd/internal/objabi: clarify initialization of Experiments

Currently objabi.Experiments is set via side-effect from an init
function, which makes their initialization process somewhat unclear
(indeed, I've messed this up before) and opens the possibility of
accessing them from another init function before it's initialized.

Originally, this init function set several variables, but at this
point it sets only objabi.Experiments, so switch to just using a
variable initializer to make the initialization process clear.

Change-Id: Id0d2ac76ae463824bbf37a9305e8643a275f1365
Reviewed-on: https://go-review.googlesource.com/c/go/+/307821
Trust: Austin Clements <austin@google.com>
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
Austin Clements 2021-04-06 16:31:40 -04:00
parent 5159c83641
commit 8752454ece

View file

@ -18,7 +18,7 @@ import (
// //
// (This is not necessarily the set of experiments the compiler itself // (This is not necessarily the set of experiments the compiler itself
// was built with.) // was built with.)
var Experiment goexperiment.Flags var Experiment goexperiment.Flags = parseExperiments()
// FramePointerEnabled enables the use of platform conventions for // FramePointerEnabled enables the use of platform conventions for
// saving frame pointers. // saving frame pointers.
@ -29,9 +29,9 @@ var Experiment goexperiment.Flags
// Note: must agree with runtime.framepointer_enabled. // Note: must agree with runtime.framepointer_enabled.
var FramePointerEnabled = GOARCH == "amd64" || GOARCH == "arm64" var FramePointerEnabled = GOARCH == "amd64" || GOARCH == "arm64"
func init() { func parseExperiments() goexperiment.Flags {
// Start with the baseline configuration. // Start with the statically enabled set of experiments.
Experiment = goexperiment.BaselineFlags flags := goexperiment.BaselineFlags
// Pick up any changes to the baseline configuration from the // Pick up any changes to the baseline configuration from the
// GOEXPERIMENT environment. This can be set at make.bash time // GOEXPERIMENT environment. This can be set at make.bash time
@ -41,7 +41,7 @@ func init() {
if env != "" { if env != "" {
// Create a map of known experiment names. // Create a map of known experiment names.
names := make(map[string]reflect.Value) names := make(map[string]reflect.Value)
rv := reflect.ValueOf(&Experiment).Elem() rv := reflect.ValueOf(&flags).Elem()
rt := rv.Type() rt := rv.Type()
for i := 0; i < rt.NumField(); i++ { for i := 0; i < rt.NumField(); i++ {
field := rv.Field(i) field := rv.Field(i)
@ -56,7 +56,7 @@ func init() {
if f == "none" { if f == "none" {
// GOEXPERIMENT=none restores the baseline configuration. // GOEXPERIMENT=none restores the baseline configuration.
// (This is useful for overriding make.bash-time settings.) // (This is useful for overriding make.bash-time settings.)
Experiment = goexperiment.BaselineFlags flags = goexperiment.BaselineFlags
continue continue
} }
val := true val := true
@ -74,29 +74,30 @@ func init() {
// regabi is only supported on amd64. // regabi is only supported on amd64.
if GOARCH != "amd64" { if GOARCH != "amd64" {
Experiment.Regabi = false flags.Regabi = false
Experiment.RegabiWrappers = false flags.RegabiWrappers = false
Experiment.RegabiG = false flags.RegabiG = false
Experiment.RegabiReflect = false flags.RegabiReflect = false
Experiment.RegabiDefer = false flags.RegabiDefer = false
Experiment.RegabiArgs = false flags.RegabiArgs = false
} }
// Setting regabi sets working sub-experiments. // Setting regabi sets working sub-experiments.
if Experiment.Regabi { if flags.Regabi {
Experiment.RegabiWrappers = true flags.RegabiWrappers = true
Experiment.RegabiG = true flags.RegabiG = true
Experiment.RegabiReflect = true flags.RegabiReflect = true
Experiment.RegabiDefer = true flags.RegabiDefer = true
// Not ready yet: // Not ready yet:
//Experiment.RegabiArgs = true //flags.RegabiArgs = true
} }
// Check regabi dependencies. // Check regabi dependencies.
if Experiment.RegabiG && !Experiment.RegabiWrappers { if flags.RegabiG && !flags.RegabiWrappers {
panic("GOEXPERIMENT regabig requires regabiwrappers") panic("GOEXPERIMENT regabig requires regabiwrappers")
} }
if Experiment.RegabiArgs && !(Experiment.RegabiWrappers && Experiment.RegabiG && Experiment.RegabiReflect && Experiment.RegabiDefer) { if flags.RegabiArgs && !(flags.RegabiWrappers && flags.RegabiG && flags.RegabiReflect && flags.RegabiDefer) {
panic("GOEXPERIMENT regabiargs requires regabiwrappers,regabig,regabireflect,regabidefer") panic("GOEXPERIMENT regabiargs requires regabiwrappers,regabig,regabireflect,regabidefer")
} }
return flags
} }
// expList returns the list of lower-cased experiment names for // expList returns the list of lower-cased experiment names for