aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/objabi
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2021-03-15 15:43:45 -0400
committerAustin Clements <austin@google.com>2021-03-18 16:51:20 +0000
commit06ca809410649e24c1a3a079a0a859bae2d4613a (patch)
tree51c0dff0a7733cd1ae0114c5772f421027894a5b /src/cmd/internal/objabi
parentb7cb92ad12e6e988ad73313773e1ca229a333005 (diff)
downloadgo-06ca809410649e24c1a3a079a0a859bae2d4613a.tar.xz
cmd/internal/objabi: centralize GOEXPERIMENT parsing
objabi parses GOEXPERIMENT, but most of the consumers look at the raw GOEXPERIMENT string that objabi gets from the environment. Centralize this logic by only exposing the parsed GOEXPERIMENT value from objabi. This sets us up for the next few changes. It also has the nice but mostly useless property that the order of experiment names will be canonicalized in build cache hashes. After this, the only remaining place that looks at raw GOEXPERIMENT is cmd/dist, which we'll fix in the next CL. For #40724. Change-Id: Idb150f848e17c184fae91372ca8b361591472f51 Reviewed-on: https://go-review.googlesource.com/c/go/+/302049 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> Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/cmd/internal/objabi')
-rw-r--r--src/cmd/internal/objabi/flag.go2
-rw-r--r--src/cmd/internal/objabi/util.go68
2 files changed, 45 insertions, 25 deletions
diff --git a/src/cmd/internal/objabi/flag.go b/src/cmd/internal/objabi/flag.go
index 3fd73f3c57..25b0185f64 100644
--- a/src/cmd/internal/objabi/flag.go
+++ b/src/cmd/internal/objabi/flag.go
@@ -95,7 +95,7 @@ func (versionFlag) Set(s string) error {
// to distinguish go1.10.2 with an experiment
// from go1.10.2 without an experiment.
p := Expstring()
- if p == DefaultExpstring() {
+ if p == defaultExpstring {
p = ""
}
sep := ""
diff --git a/src/cmd/internal/objabi/util.go b/src/cmd/internal/objabi/util.go
index de8e6de4e6..81e2b28600 100644
--- a/src/cmd/internal/objabi/util.go
+++ b/src/cmd/internal/objabi/util.go
@@ -21,18 +21,23 @@ func envOr(key, value string) string {
var (
defaultGOROOT string // set by linker
- GOROOT = envOr("GOROOT", defaultGOROOT)
- GOARCH = envOr("GOARCH", defaultGOARCH)
- GOOS = envOr("GOOS", defaultGOOS)
- GOEXPERIMENT = envOr("GOEXPERIMENT", defaultGOEXPERIMENT)
- GO386 = envOr("GO386", defaultGO386)
- GOARM = goarm()
- GOMIPS = gomips()
- GOMIPS64 = gomips64()
- GOPPC64 = goppc64()
- GOWASM = gowasm()
- GO_LDSO = defaultGO_LDSO
- Version = version
+ GOROOT = envOr("GOROOT", defaultGOROOT)
+ GOARCH = envOr("GOARCH", defaultGOARCH)
+ GOOS = envOr("GOOS", defaultGOOS)
+ GO386 = envOr("GO386", defaultGO386)
+ GOARM = goarm()
+ GOMIPS = gomips()
+ GOMIPS64 = gomips64()
+ GOPPC64 = goppc64()
+ GOWASM = gowasm()
+ GO_LDSO = defaultGO_LDSO
+ Version = version
+
+ // GOEXPERIMENT is a comma-separated list of enabled
+ // experiments. This is derived from the GOEXPERIMENT
+ // environment variable if set, or the value of GOEXPERIMENT
+ // when make.bash was run if not.
+ GOEXPERIMENT string // Set by package init
)
const (
@@ -125,7 +130,12 @@ func Getgoextlinkenabled() string {
}
func init() {
- for _, f := range strings.Split(GOEXPERIMENT, ",") {
+ // Capture "default" experiments.
+ defaultExpstring = Expstring()
+
+ goexperiment := envOr("GOEXPERIMENT", defaultGOEXPERIMENT)
+
+ for _, f := range strings.Split(goexperiment, ",") {
if f != "" {
addexp(f)
}
@@ -135,6 +145,9 @@ func init() {
if GOARCH != "amd64" {
Regabi_enabled = 0
}
+
+ // Set GOEXPERIMENT to the parsed and canonicalized set of experiments.
+ GOEXPERIMENT = expList()
}
// Note: must agree with runtime.framepointer_enabled.
@@ -171,7 +184,6 @@ var (
// Toolchain experiments.
// These are controlled by the GOEXPERIMENT environment
// variable recorded when the toolchain is built.
-// This list is also known to cmd/gc.
var exper = []struct {
name string
val *int
@@ -182,21 +194,29 @@ var exper = []struct {
{"regabi", &Regabi_enabled},
}
-var defaultExpstring = Expstring()
-
-func DefaultExpstring() string {
- return defaultExpstring
-}
+var defaultExpstring string
-func Expstring() string {
- buf := "X"
+// expList returns the list of enabled GOEXPERIMENTS as a
+// commas-separated list.
+func expList() string {
+ buf := ""
for i := range exper {
if *exper[i].val != 0 {
buf += "," + exper[i].name
}
}
- if buf == "X" {
- buf += ",none"
+ if len(buf) == 0 {
+ return ""
+ }
+ return buf[1:]
+}
+
+// Expstring returns the GOEXPERIMENT string that should appear in Go
+// version signatures. This always starts with "X:".
+func Expstring() string {
+ list := expList()
+ if list == "" {
+ return "X:none"
}
- return "X:" + buf[2:]
+ return "X:" + list
}