gitee.com/ks-custle/core-gm@v0.0.0-20230922171213-b83bdd97b62c/internal/goexperiment/flags.go (about) 1 // Copyright 2021 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package goexperiment implements support for toolchain experiments. 6 // 7 // Toolchain experiments are controlled by the GOEXPERIMENT 8 // environment variable. GOEXPERIMENT is a comma-separated list of 9 // experiment names. GOEXPERIMENT can be set at make.bash time, which 10 // sets the default experiments for binaries built with the tool 11 // chain; or it can be set at build time. GOEXPERIMENT can also be set 12 // to "none", which disables any experiments that were enabled at 13 // make.bash time. 14 // 15 // Experiments are exposed to the build in the following ways: 16 // 17 // - Build tag goexperiment.x is set if experiment x (lower case) is 18 // enabled. 19 // 20 // - For each experiment x (in camel case), this package contains a 21 // boolean constant x and an integer constant xInt. 22 // 23 // - In runtime assembly, the macro GOEXPERIMENT_x is defined if 24 // experiment x (lower case) is enabled. 25 // 26 // In the toolchain, the set of experiments enabled for the current 27 // build should be accessed via objabi.Experiment. 28 // 29 // The set of experiments is included in the output of runtime.Version() 30 // and "go version <binary>" if it differs from the default experiments. 31 // 32 // For the set of experiments supported by the current toolchain, see 33 // "go doc goexperiment.Flags". 34 // 35 // Note that this package defines the set of experiments (in Flags) 36 // and records the experiments that were enabled when the package 37 // was compiled (as boolean and integer constants). 38 // 39 // Note especially that this package does not itself change behavior 40 // at run time based on the GOEXPERIMENT variable. 41 // The code used in builds to interpret the GOEXPERIMENT variable 42 // is in the separate package internal/buildcfg. 43 package goexperiment 44 45 //go:generate go run mkconsts.go 46 47 // Flags is the set of experiments that can be enabled or disabled in 48 // the current toolchain. 49 // 50 // When specified in the GOEXPERIMENT environment variable or as build 51 // tags, experiments use the strings.ToLower of their field name. 52 // 53 // For the baseline experimental configuration, see 54 // objabi.experimentBaseline. 55 // 56 // If you change this struct definition, run "go generate". 57 type Flags struct { 58 FieldTrack bool 59 PreemptibleLoops bool 60 StaticLockRanking bool 61 62 // Regabi is split into several sub-experiments that can be 63 // enabled individually. Not all combinations work. 64 // The "regabi" GOEXPERIMENT is an alias for all "working" 65 // subexperiments. 66 67 // RegabiWrappers enables ABI wrappers for calling between 68 // ABI0 and ABIInternal functions. Without this, the ABIs are 69 // assumed to be identical so cross-ABI calls are direct. 70 RegabiWrappers bool 71 // RegabiG enables dedicated G and zero registers in 72 // ABIInternal. 73 // 74 // Requires wrappers because it makes the ABIs incompatible. 75 RegabiG bool 76 // RegabiReflect enables the register-passing paths in 77 // reflection calls. This is also gated by intArgRegs in 78 // reflect and runtime (which are disabled by default) so it 79 // can be used in targeted tests. 80 RegabiReflect bool 81 // RegabiDefer enables desugaring defer and go calls 82 // into argument-less closures. 83 RegabiDefer bool 84 // RegabiArgs enables register arguments/results in all 85 // compiled Go functions. 86 // 87 // Requires wrappers (to do ABI translation), g (because 88 // runtime assembly that's been ported to ABIInternal uses the 89 // G register), reflect (so reflection calls use registers), 90 // and defer (because the runtime doesn't support passing 91 // register arguments to defer/go). 92 RegabiArgs bool 93 }