This repository has been archived by the owner on Sep 7, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #12 from jeffwidman/bump-to-golang-1.17.0
Bump to `go` `1.17.0`
- Loading branch information
Showing
54 changed files
with
4,883 additions
and
1,330 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,136 @@ | ||
// 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 provides access to the build configuration | ||
// described by the current environment. It is for use by build tools | ||
// such as cmd/go or cmd/compile and for setting up go/build's Default context. | ||
// | ||
// Note that it does NOT provide access to the build configuration used to | ||
// build the currently-running binary. For that, use runtime.GOOS etc | ||
// as well as internal/goexperiment. | ||
package buildcfg | ||
|
||
import ( | ||
"fmt" | ||
"os" | ||
"path/filepath" | ||
"strings" | ||
) | ||
|
||
var ( | ||
defaultGOROOT string // set by linker | ||
|
||
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 | ||
) | ||
|
||
// Error is one of the errors found (if any) in the build configuration. | ||
var Error error | ||
|
||
// Check exits the program with a fatal error if Error is non-nil. | ||
func Check() { | ||
if Error != nil { | ||
fmt.Fprintf(os.Stderr, "%s: %v\n", filepath.Base(os.Args[0]), Error) | ||
os.Exit(2) | ||
} | ||
} | ||
|
||
func envOr(key, value string) string { | ||
if x := os.Getenv(key); x != "" { | ||
return x | ||
} | ||
return value | ||
} | ||
|
||
func goarm() int { | ||
def := defaultGOARM | ||
if GOOS == "android" && GOARCH == "arm" { | ||
// Android arm devices always support GOARM=7. | ||
def = "7" | ||
} | ||
switch v := envOr("GOARM", def); v { | ||
case "5": | ||
return 5 | ||
case "6": | ||
return 6 | ||
case "7": | ||
return 7 | ||
} | ||
Error = fmt.Errorf("invalid GOARM: must be 5, 6, 7") | ||
return int(def[0] - '0') | ||
} | ||
|
||
func gomips() string { | ||
switch v := envOr("GOMIPS", defaultGOMIPS); v { | ||
case "hardfloat", "softfloat": | ||
return v | ||
} | ||
Error = fmt.Errorf("invalid GOMIPS: must be hardfloat, softfloat") | ||
return defaultGOMIPS | ||
} | ||
|
||
func gomips64() string { | ||
switch v := envOr("GOMIPS64", defaultGOMIPS64); v { | ||
case "hardfloat", "softfloat": | ||
return v | ||
} | ||
Error = fmt.Errorf("invalid GOMIPS64: must be hardfloat, softfloat") | ||
return defaultGOMIPS64 | ||
} | ||
|
||
func goppc64() int { | ||
switch v := envOr("GOPPC64", defaultGOPPC64); v { | ||
case "power8": | ||
return 8 | ||
case "power9": | ||
return 9 | ||
} | ||
Error = fmt.Errorf("invalid GOPPC64: must be power8, power9") | ||
return int(defaultGOPPC64[len("power")] - '0') | ||
} | ||
|
||
type gowasmFeatures struct { | ||
SignExt bool | ||
SatConv bool | ||
} | ||
|
||
func (f gowasmFeatures) String() string { | ||
var flags []string | ||
if f.SatConv { | ||
flags = append(flags, "satconv") | ||
} | ||
if f.SignExt { | ||
flags = append(flags, "signext") | ||
} | ||
return strings.Join(flags, ",") | ||
} | ||
|
||
func gowasm() (f gowasmFeatures) { | ||
for _, opt := range strings.Split(envOr("GOWASM", ""), ",") { | ||
switch opt { | ||
case "satconv": | ||
f.SatConv = true | ||
case "signext": | ||
f.SignExt = true | ||
case "": | ||
// ignore | ||
default: | ||
Error = fmt.Errorf("invalid GOWASM: no such feature %q", opt) | ||
} | ||
} | ||
return | ||
} | ||
|
||
func Getgoextlinkenabled() string { | ||
return envOr("GO_EXTLINK_ENABLED", defaultGO_EXTLINK_ENABLED) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,189 @@ | ||
// 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 ( | ||
"fmt" | ||
"reflect" | ||
"strings" | ||
|
||
"github.com/dependabot/gomodules-extracted/_internal_/goexperiment" | ||
) | ||
|
||
// 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. | ||
var Experiment, experimentBaseline = func() (goexperiment.Flags, goexperiment.Flags) { | ||
flags, baseline, err := ParseGOEXPERIMENT(GOOS, GOARCH, envOr("GOEXPERIMENT", defaultGOEXPERIMENT)) | ||
if err != nil { | ||
Error = err | ||
} | ||
return flags, baseline | ||
}() | ||
|
||
const DefaultGOEXPERIMENT = 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. | ||
var FramePointerEnabled = 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 ParseGOEXPERIMENT(goos, goarch, goexp string) (flags, baseline goexperiment.Flags, err error) { | ||
regabiSupported := goarch == "amd64" && (goos == "android" || goos == "linux" || goos == "darwin" || goos == "windows") | ||
|
||
baseline = goexperiment.Flags{ | ||
RegabiWrappers: regabiSupported, | ||
RegabiG: regabiSupported, | ||
RegabiReflect: regabiSupported, | ||
RegabiDefer: regabiSupported, | ||
RegabiArgs: regabiSupported, | ||
} | ||
|
||
// Start with the statically enabled set of experiments. | ||
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 goexp != "" { | ||
// Create a map of known experiment names. | ||
names := make(map[string]func(bool)) | ||
rv := reflect.ValueOf(&flags).Elem() | ||
rt := rv.Type() | ||
for i := 0; i < rt.NumField(); i++ { | ||
field := rv.Field(i) | ||
names[strings.ToLower(rt.Field(i).Name)] = field.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. | ||
names["regabi"] = func(v bool) { | ||
flags.RegabiWrappers = v | ||
flags.RegabiG = v | ||
flags.RegabiReflect = v | ||
flags.RegabiDefer = v | ||
flags.RegabiArgs = v | ||
} | ||
|
||
// Parse names. | ||
for _, f := range strings.Split(goexp, ",") { | ||
if f == "" { | ||
continue | ||
} | ||
if f == "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 | ||
} | ||
val := true | ||
if strings.HasPrefix(f, "no") { | ||
f, val = f[2:], false | ||
} | ||
set, ok := names[f] | ||
if !ok { | ||
err = fmt.Errorf("unknown GOEXPERIMENT %s", f) | ||
return | ||
} | ||
set(val) | ||
} | ||
} | ||
|
||
// regabi is only supported on amd64. | ||
if goarch != "amd64" { | ||
flags.RegabiWrappers = false | ||
flags.RegabiG = false | ||
flags.RegabiReflect = false | ||
flags.RegabiDefer = false | ||
flags.RegabiArgs = false | ||
} | ||
// Check regabi dependencies. | ||
if flags.RegabiG && !flags.RegabiWrappers { | ||
err = fmt.Errorf("GOEXPERIMENT regabig requires regabiwrappers") | ||
} | ||
if flags.RegabiArgs && !(flags.RegabiWrappers && flags.RegabiG && flags.RegabiReflect && flags.RegabiDefer) { | ||
err = fmt.Errorf("GOEXPERIMENT regabiargs requires regabiwrappers,regabig,regabireflect,regabidefer") | ||
} | ||
return | ||
} | ||
|
||
// 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(exp, base *goexperiment.Flags, all bool) []string { | ||
var list []string | ||
rv := reflect.ValueOf(exp).Elem() | ||
var rBase reflect.Value | ||
if base != nil { | ||
rBase = reflect.ValueOf(base).Elem() | ||
} | ||
rt := rv.Type() | ||
for i := 0; i < rt.NumField(); i++ { | ||
name := strings.ToLower(rt.Field(i).Name) | ||
val := rv.Field(i).Bool() | ||
baseVal := false | ||
if base != nil { | ||
baseVal = rBase.Field(i).Bool() | ||
} | ||
if all || val != baseVal { | ||
if val { | ||
list = append(list, name) | ||
} else { | ||
list = append(list, "no"+name) | ||
} | ||
} | ||
} | ||
return list | ||
} | ||
|
||
// GOEXPERIMENT is a comma-separated list of enabled or disabled | ||
// experiments that differ from the baseline experiment configuration. | ||
// GOEXPERIMENT is exactly what a user would set on the command line | ||
// to get the set of enabled experiments. | ||
func GOEXPERIMENT() string { | ||
return strings.Join(expList(&Experiment, &experimentBaseline, false), ",") | ||
} | ||
|
||
// EnabledExperiments returns a list of enabled experiments, as | ||
// lower-cased experiment names. | ||
func EnabledExperiments() []string { | ||
return expList(&Experiment, nil, false) | ||
} | ||
|
||
// AllExperiments returns a list of all experiment settings. | ||
// Disabled experiments appear in the list prefixed by "no". | ||
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(goos, goarch, goexperiment string) { | ||
var err error | ||
Experiment, experimentBaseline, err = ParseGOEXPERIMENT(goos, goarch, goexperiment) | ||
if err != nil { | ||
Error = err | ||
} | ||
} |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -39,6 +39,7 @@ const KnownEnv = ` | |
GOCACHE | ||
GOENV | ||
GOEXE | ||
GOEXPERIMENT | ||
GOFLAGS | ||
GOGCCFLAGS | ||
GOHOSTARCH | ||
|
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Oops, something went wrong.