mirror of https://github.com/golang/go.git
cmd/go: add GOAMD64 environment variable
The variable represents the microarchitecture level for which to compile.
Valid values are v1 (default), v2, v3, v4.
Updates #45453
Change-Id: I095197fc9239d79f98896d7e745e2341354daca4
GitHub-Last-Rev: f83ed17204
GitHub-Pull-Request: golang/go#48359
Reviewed-on: https://go-review.googlesource.com/c/go/+/349595
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Bryan C. Mills <bcmills@google.com>
This commit is contained in:
parent
04f5116c98
commit
b1bedc0774
|
|
@ -32,6 +32,7 @@ var (
|
||||||
goos string
|
goos string
|
||||||
goarm string
|
goarm string
|
||||||
go386 string
|
go386 string
|
||||||
|
goamd64 string
|
||||||
gomips string
|
gomips string
|
||||||
gomips64 string
|
gomips64 string
|
||||||
goppc64 string
|
goppc64 string
|
||||||
|
|
@ -145,6 +146,12 @@ func xinit() {
|
||||||
}
|
}
|
||||||
go386 = b
|
go386 = b
|
||||||
|
|
||||||
|
b = os.Getenv("GOAMD64")
|
||||||
|
if b == "" {
|
||||||
|
b = "v1"
|
||||||
|
}
|
||||||
|
goamd64 = b
|
||||||
|
|
||||||
b = os.Getenv("GOMIPS")
|
b = os.Getenv("GOMIPS")
|
||||||
if b == "" {
|
if b == "" {
|
||||||
b = "hardfloat"
|
b = "hardfloat"
|
||||||
|
|
@ -217,6 +224,7 @@ func xinit() {
|
||||||
|
|
||||||
// For tools being invoked but also for os.ExpandEnv.
|
// For tools being invoked but also for os.ExpandEnv.
|
||||||
os.Setenv("GO386", go386)
|
os.Setenv("GO386", go386)
|
||||||
|
os.Setenv("GOAMD64", goamd64)
|
||||||
os.Setenv("GOARCH", goarch)
|
os.Setenv("GOARCH", goarch)
|
||||||
os.Setenv("GOARM", goarm)
|
os.Setenv("GOARM", goarm)
|
||||||
os.Setenv("GOHOSTARCH", gohostarch)
|
os.Setenv("GOHOSTARCH", gohostarch)
|
||||||
|
|
@ -1181,6 +1189,9 @@ func cmdenv() {
|
||||||
if goarch == "386" {
|
if goarch == "386" {
|
||||||
xprintf(format, "GO386", go386)
|
xprintf(format, "GO386", go386)
|
||||||
}
|
}
|
||||||
|
if goarch == "amd64" {
|
||||||
|
xprintf(format, "GOAMD64", goamd64)
|
||||||
|
}
|
||||||
if goarch == "mips" || goarch == "mipsle" {
|
if goarch == "mips" || goarch == "mipsle" {
|
||||||
xprintf(format, "GOMIPS", gomips)
|
xprintf(format, "GOMIPS", gomips)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,7 @@ func mkbuildcfg(file string) {
|
||||||
fmt.Fprintf(&buf, "import \"runtime\"\n")
|
fmt.Fprintf(&buf, "import \"runtime\"\n")
|
||||||
fmt.Fprintln(&buf)
|
fmt.Fprintln(&buf)
|
||||||
fmt.Fprintf(&buf, "const defaultGO386 = `%s`\n", go386)
|
fmt.Fprintf(&buf, "const defaultGO386 = `%s`\n", go386)
|
||||||
|
fmt.Fprintf(&buf, "const defaultGOAMD64 = `%s`\n", goamd64)
|
||||||
fmt.Fprintf(&buf, "const defaultGOARM = `%s`\n", goarm)
|
fmt.Fprintf(&buf, "const defaultGOARM = `%s`\n", goarm)
|
||||||
fmt.Fprintf(&buf, "const defaultGOMIPS = `%s`\n", gomips)
|
fmt.Fprintf(&buf, "const defaultGOMIPS = `%s`\n", gomips)
|
||||||
fmt.Fprintf(&buf, "const defaultGOMIPS64 = `%s`\n", gomips64)
|
fmt.Fprintf(&buf, "const defaultGOMIPS64 = `%s`\n", gomips64)
|
||||||
|
|
|
||||||
|
|
@ -1987,6 +1987,10 @@
|
||||||
// GO386
|
// GO386
|
||||||
// For GOARCH=386, how to implement floating point instructions.
|
// For GOARCH=386, how to implement floating point instructions.
|
||||||
// Valid values are sse2 (default), softfloat.
|
// Valid values are sse2 (default), softfloat.
|
||||||
|
// GOAMD64
|
||||||
|
// For GOARCH=GOAMD64, the microarchitecture level for which to compile.
|
||||||
|
// Valid values are v1 (default), v2, v3, v4.
|
||||||
|
// See https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels.
|
||||||
// GOMIPS
|
// GOMIPS
|
||||||
// For GOARCH=mips{,le}, whether to use floating point instructions.
|
// For GOARCH=mips{,le}, whether to use floating point instructions.
|
||||||
// Valid values are hardfloat (default), softfloat.
|
// Valid values are hardfloat (default), softfloat.
|
||||||
|
|
|
||||||
|
|
@ -263,6 +263,7 @@ var (
|
||||||
// Used in envcmd.MkEnv and build ID computations.
|
// Used in envcmd.MkEnv and build ID computations.
|
||||||
GOARM = envOr("GOARM", fmt.Sprint(buildcfg.GOARM))
|
GOARM = envOr("GOARM", fmt.Sprint(buildcfg.GOARM))
|
||||||
GO386 = envOr("GO386", buildcfg.GO386)
|
GO386 = envOr("GO386", buildcfg.GO386)
|
||||||
|
GOAMD64 = envOr("GOAMD64", fmt.Sprintf("%s%d", "v", buildcfg.GOAMD64))
|
||||||
GOMIPS = envOr("GOMIPS", buildcfg.GOMIPS)
|
GOMIPS = envOr("GOMIPS", buildcfg.GOMIPS)
|
||||||
GOMIPS64 = envOr("GOMIPS64", buildcfg.GOMIPS64)
|
GOMIPS64 = envOr("GOMIPS64", buildcfg.GOMIPS64)
|
||||||
GOPPC64 = envOr("GOPPC64", fmt.Sprintf("%s%d", "power", buildcfg.GOPPC64))
|
GOPPC64 = envOr("GOPPC64", fmt.Sprintf("%s%d", "power", buildcfg.GOPPC64))
|
||||||
|
|
@ -289,6 +290,8 @@ func GetArchEnv() (key, val string) {
|
||||||
return "GOARM", GOARM
|
return "GOARM", GOARM
|
||||||
case "386":
|
case "386":
|
||||||
return "GO386", GO386
|
return "GO386", GO386
|
||||||
|
case "amd64":
|
||||||
|
return "GOAMD64", GOAMD64
|
||||||
case "mips", "mipsle":
|
case "mips", "mipsle":
|
||||||
return "GOMIPS", GOMIPS
|
return "GOMIPS", GOMIPS
|
||||||
case "mips64", "mips64le":
|
case "mips64", "mips64le":
|
||||||
|
|
|
||||||
|
|
@ -592,6 +592,10 @@ Architecture-specific environment variables:
|
||||||
GO386
|
GO386
|
||||||
For GOARCH=386, how to implement floating point instructions.
|
For GOARCH=386, how to implement floating point instructions.
|
||||||
Valid values are sse2 (default), softfloat.
|
Valid values are sse2 (default), softfloat.
|
||||||
|
GOAMD64
|
||||||
|
For GOARCH=GOAMD64, the microarchitecture level for which to compile.
|
||||||
|
Valid values are v1 (default), v2, v3, v4.
|
||||||
|
See https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels.
|
||||||
GOMIPS
|
GOMIPS
|
||||||
For GOARCH=mips{,le}, whether to use floating point instructions.
|
For GOARCH=mips{,le}, whether to use floating point instructions.
|
||||||
Valid values are hardfloat (default), softfloat.
|
Valid values are hardfloat (default), softfloat.
|
||||||
|
|
|
||||||
|
|
@ -379,6 +379,11 @@ func asmArgs(a *Action, p *load.Package) []interface{} {
|
||||||
args = append(args, "-D", "GO386_"+cfg.GO386)
|
args = append(args, "-D", "GO386_"+cfg.GO386)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if cfg.Goarch == "amd64" {
|
||||||
|
// Define GOAMD64_value from cfg.GOAMD64.
|
||||||
|
args = append(args, "-D", "GOAMD64_"+cfg.GOAMD64)
|
||||||
|
}
|
||||||
|
|
||||||
if cfg.Goarch == "mips" || cfg.Goarch == "mipsle" {
|
if cfg.Goarch == "mips" || cfg.Goarch == "mipsle" {
|
||||||
// Define GOMIPS_value from cfg.GOMIPS.
|
// Define GOMIPS_value from cfg.GOMIPS.
|
||||||
args = append(args, "-D", "GOMIPS_"+cfg.GOMIPS)
|
args = append(args, "-D", "GOMIPS_"+cfg.GOMIPS)
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ var (
|
||||||
GOARCH = envOr("GOARCH", defaultGOARCH)
|
GOARCH = envOr("GOARCH", defaultGOARCH)
|
||||||
GOOS = envOr("GOOS", defaultGOOS)
|
GOOS = envOr("GOOS", defaultGOOS)
|
||||||
GO386 = envOr("GO386", defaultGO386)
|
GO386 = envOr("GO386", defaultGO386)
|
||||||
|
GOAMD64 = goamd64()
|
||||||
GOARM = goarm()
|
GOARM = goarm()
|
||||||
GOMIPS = gomips()
|
GOMIPS = gomips()
|
||||||
GOMIPS64 = gomips64()
|
GOMIPS64 = gomips64()
|
||||||
|
|
@ -52,6 +53,21 @@ func envOr(key, value string) string {
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func goamd64() int {
|
||||||
|
switch v := envOr("GOAMD64", defaultGOAMD64); v {
|
||||||
|
case "v1":
|
||||||
|
return 1
|
||||||
|
case "v2":
|
||||||
|
return 2
|
||||||
|
case "v3":
|
||||||
|
return 3
|
||||||
|
case "v4":
|
||||||
|
return 4
|
||||||
|
}
|
||||||
|
Error = fmt.Errorf("invalid GOAMD64: must be v1, v2, v3, v4")
|
||||||
|
return int(defaultGOAMD64[len("v")] - '0')
|
||||||
|
}
|
||||||
|
|
||||||
func goarm() int {
|
func goarm() int {
|
||||||
def := defaultGOARM
|
def := defaultGOARM
|
||||||
if GOOS == "android" && GOARCH == "arm" {
|
if GOOS == "android" && GOARCH == "arm" {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
// 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 buildcfg
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestConfigFlags(t *testing.T) {
|
||||||
|
os.Setenv("GOAMD64", "v1")
|
||||||
|
if goamd64() != 1 {
|
||||||
|
t.Errorf("Wrong parsing of GOAMD64=v1")
|
||||||
|
}
|
||||||
|
os.Setenv("GOAMD64", "v4")
|
||||||
|
if goamd64() != 4 {
|
||||||
|
t.Errorf("Wrong parsing of GOAMD64=v4")
|
||||||
|
}
|
||||||
|
os.Setenv("GOAMD64", "1")
|
||||||
|
if goamd64() != 1 {
|
||||||
|
t.Errorf("Wrong parsing of GOAMD64=1")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -33,6 +33,7 @@ const KnownEnv = `
|
||||||
GCCGO
|
GCCGO
|
||||||
GO111MODULE
|
GO111MODULE
|
||||||
GO386
|
GO386
|
||||||
|
GOAMD64
|
||||||
GOARCH
|
GOARCH
|
||||||
GOARM
|
GOARM
|
||||||
GOBIN
|
GOBIN
|
||||||
|
|
|
||||||
|
|
@ -1753,7 +1753,7 @@ var (
|
||||||
// are the supported variants.
|
// are the supported variants.
|
||||||
archVariants = map[string][]string{
|
archVariants = map[string][]string{
|
||||||
"386": {"GO386", "sse2", "softfloat"},
|
"386": {"GO386", "sse2", "softfloat"},
|
||||||
"amd64": {},
|
"amd64": {"GOAMD64", "v1", "v2", "v3", "v4"},
|
||||||
"arm": {"GOARM", "5", "6", "7"},
|
"arm": {"GOARM", "5", "6", "7"},
|
||||||
"arm64": {},
|
"arm64": {},
|
||||||
"mips": {"GOMIPS", "hardfloat", "softfloat"},
|
"mips": {"GOMIPS", "hardfloat", "softfloat"},
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue