]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: update ToolTags based on GOARCH value
authorIan Lance Taylor <iant@golang.org>
Mon, 21 Jun 2021 21:48:54 +0000 (14:48 -0700)
committerIan Lance Taylor <iant@golang.org>
Tue, 22 Jun 2021 16:59:10 +0000 (16:59 +0000)
The build.Context ToolTags value is set based on the set of enabled
experiments, which in turn depends on GOARCH. Before this CL the set
of experiments was being set based on GOARCH in the environment.
That is normally fine, but fails with cmd/go when somebody has run
"go env -w GOARCH=val"; in that case cmd/go changes its GOARCH value
after initialization. The new GOARCH value was affect the set of
enabled experiments, which can affect the ToolTags value. With this
CL, we update ToolTags in cmd/go based on the GOARCH value it is using.

This is a pretty ugly fix. We should do something cleaner for 1.18.

Fixes #46815

Change-Id: Ie9416781a168248813c3da8afdc257acdd3fef7e
Reviewed-on: https://go-review.googlesource.com/c/go/+/329930
Trust: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/go/internal/cfg/cfg.go
src/cmd/go/testdata/script/env_cross_build.txt [new file with mode: 0644]
src/internal/buildcfg/exp.go

index b47eb812b59ea54d6911fa687ba01fbf6469bcb6..fc6989097ee94268760b7ca78eab610606eac219 100644 (file)
@@ -77,6 +77,14 @@ func defaultContext() build.Context {
        ctxt.GOOS = envOr("GOOS", ctxt.GOOS)
        ctxt.GOARCH = envOr("GOARCH", ctxt.GOARCH)
 
+       // The experiments flags are based on GOARCH, so they may
+       // need to change.  TODO: This should be cleaned up.
+       buildcfg.UpdateExperiments(ctxt.GOARCH)
+       ctxt.ToolTags = nil
+       for _, exp := range buildcfg.EnabledExperiments() {
+               ctxt.ToolTags = append(ctxt.ToolTags, "goexperiment."+exp)
+       }
+
        // The go/build rule for whether cgo is enabled is:
        //      1. If $CGO_ENABLED is set, respect it.
        //      2. Otherwise, if this is a cross-compile, disable cgo.
diff --git a/src/cmd/go/testdata/script/env_cross_build.txt b/src/cmd/go/testdata/script/env_cross_build.txt
new file mode 100644 (file)
index 0000000..3feeba6
--- /dev/null
@@ -0,0 +1,29 @@
+# Test that the corect default GOEXPERIMENT is used when cross
+# building with GOENV (#46815).
+
+# Unset variables set by the TestScript harness. Users typically won't
+# explicitly configure these, and #46815 doesn't repro if they are.
+env GOOS=
+env GOARCH=
+env GOEXPERIMENT=
+
+env GOENV=windows-amd64
+go build internal/abi
+
+env GOENV=ios-arm64
+go build internal/abi
+
+env GOENV=linux-mips
+go build internal/abi
+
+-- windows-amd64 --
+GOOS=windows
+GOARCH=amd64
+
+-- ios-arm64 --
+GOOS=ios
+GOARCH=arm64
+
+-- linux-mips --
+GOOS=linux
+GOARCH=mips
index 2435a79dcec8c614f11ee5026425cfe6127399c0..640aa1934db55ae1f136a90de153fc598da50be2 100644 (file)
@@ -18,7 +18,7 @@ import (
 //
 // (This is not necessarily the set of experiments the compiler itself
 // was built with.)
-var Experiment goexperiment.Flags = parseExperiments()
+var Experiment goexperiment.Flags = parseExperiments(GOARCH)
 
 var regabiSupported = GOARCH == "amd64" && (GOOS == "android" || GOOS == "linux" || GOOS == "darwin" || GOOS == "windows")
 
@@ -42,7 +42,7 @@ var experimentBaseline = goexperiment.Flags{
 // Note: must agree with runtime.framepointer_enabled.
 var FramePointerEnabled = GOARCH == "amd64" || GOARCH == "arm64"
 
-func parseExperiments() goexperiment.Flags {
+func parseExperiments(goarch string) goexperiment.Flags {
        // Start with the statically enabled set of experiments.
        flags := experimentBaseline
 
@@ -99,7 +99,7 @@ func parseExperiments() goexperiment.Flags {
        }
 
        // regabi is only supported on amd64.
-       if GOARCH != "amd64" {
+       if goarch != "amd64" {
                flags.RegabiWrappers = false
                flags.RegabiG = false
                flags.RegabiReflect = false
@@ -165,3 +165,10 @@ func EnabledExperiments() []string {
 func AllExperiments() []string {
        return expList(&Experiment, nil, true)
 }
+
+// UpdateExperiments updates the Experiment global based on a new GOARCH value.
+// This is only required for cmd/go, which can change GOARCH after
+// program startup due to use of "go env -w".
+func UpdateExperiments(goarch string) {
+       Experiment = parseExperiments(goarch)
+}