// 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.package buildcfgimport ()// ExperimentFlags represents a set of GOEXPERIMENT flags relative to a baseline// (platform-default) experiment configuration.typeExperimentFlagsstruct {goexperiment.Flags baseline goexperiment.Flags}// Experiment contains the toolchain experiments enabled for the// current build.//// (This is not necessarily the set of experiments the compiler itself// was built with.)//// experimentBaseline specifies the experiment flags that are enabled by// default in the current toolchain. This is, in effect, the "control"// configuration and any variation from this is an experiment.varExperimentExperimentFlags = func() ExperimentFlags { , := ParseGOEXPERIMENT(GOOS, GOARCH, envOr("GOEXPERIMENT", defaultGOEXPERIMENT))if != nil {Error = returnExperimentFlags{} }return *}()// DefaultGOEXPERIMENT is the embedded default GOEXPERIMENT string.// It is not guaranteed to be canonical.constDefaultGOEXPERIMENT = defaultGOEXPERIMENT// FramePointerEnabled enables the use of platform conventions for// saving frame pointers.//// This used to be an experiment, but now it's always enabled on// platforms that support it.//// Note: must agree with runtime.framepointer_enabled.varFramePointerEnabled = GOARCH == "amd64" || GOARCH == "arm64"// ParseGOEXPERIMENT parses a (GOOS, GOARCH, GOEXPERIMENT)// configuration tuple and returns the enabled and baseline experiment// flag sets.//// TODO(mdempsky): Move to internal/goexperiment.func (, , string) (*ExperimentFlags, error) {// regabiSupported is set to true on platforms where register ABI is // supported and enabled by default. // regabiAlwaysOn is set to true on platforms where register ABI is // always on.var , boolswitch {case"amd64", "arm64", "loong64", "ppc64le", "ppc64", "riscv64": = true = true } := goexperiment.Flags{RegabiWrappers: ,RegabiArgs: ,CoverageRedesign: true, }// Start with the statically enabled set of experiments. := &ExperimentFlags{Flags: ,baseline: , }// Pick up any changes to the baseline configuration from the // GOEXPERIMENT environment. This can be set at make.bash time // and overridden at build time.if != "" {// Create a map of known experiment names. := make(map[string]func(bool)) := reflect.ValueOf(&.Flags).Elem() := .Type()for := 0; < .NumField(); ++ { := .Field() [strings.ToLower(.Field().Name)] = .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. ["regabi"] = func( bool) { .RegabiWrappers = .RegabiArgs = }// Parse names.for , := rangestrings.Split(, ",") {if == "" {continue }if == "none" {// GOEXPERIMENT=none disables all experiment flags. // This is used by cmd/dist, which doesn't know how // to build with any experiment flags. .Flags = goexperiment.Flags{}continue } := trueifstrings.HasPrefix(, "no") { , = [2:], false } , := []if ! {returnnil, fmt.Errorf("unknown GOEXPERIMENT %s", ) } () } }if { .RegabiWrappers = true .RegabiArgs = true }// regabi is only supported on amd64, arm64, loong64, riscv64, ppc64 and ppc64le.if ! { .RegabiWrappers = false .RegabiArgs = false }// Check regabi dependencies.if .RegabiArgs && !.RegabiWrappers {returnnil, fmt.Errorf("GOEXPERIMENT regabiargs requires regabiwrappers") }return , nil}// String returns the canonical GOEXPERIMENT string to enable this experiment// configuration. (Experiments in the same state as in the baseline are elided.)func ( *ExperimentFlags) () string {returnstrings.Join(expList(&.Flags, &.baseline, false), ",")}// expList returns the list of lower-cased experiment names for// experiments that differ from base. base may be nil to indicate no// experiments. If all is true, then include all experiment flags,// regardless of base.func expList(, *goexperiment.Flags, bool) []string {var []string := reflect.ValueOf().Elem()varreflect.Valueif != nil { = reflect.ValueOf().Elem() } := .Type()for := 0; < .NumField(); ++ { := strings.ToLower(.Field().Name) := .Field().Bool() := falseif != nil { = .Field().Bool() }if || != {if { = append(, ) } else { = append(, "no"+) } } }return}// Enabled returns a list of enabled experiments, as// lower-cased experiment names.func ( *ExperimentFlags) () []string {returnexpList(&.Flags, nil, false)}// All returns a list of all experiment settings.// Disabled experiments appear in the list prefixed by "no".func ( *ExperimentFlags) () []string {returnexpList(&.Flags, nil, true)}
The pages are generated with Goldsv0.7.0-preview. (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu.
PR and bug reports are welcome and can be submitted to the issue list.
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds.