aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/objabi
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/internal/objabi')
-rw-r--r--src/cmd/internal/objabi/exp.go151
-rw-r--r--src/cmd/internal/objabi/flag.go9
-rw-r--r--src/cmd/internal/objabi/line.go5
-rw-r--r--src/cmd/internal/objabi/stack.go4
-rw-r--r--src/cmd/internal/objabi/util.go111
5 files changed, 13 insertions, 267 deletions
diff --git a/src/cmd/internal/objabi/exp.go b/src/cmd/internal/objabi/exp.go
deleted file mode 100644
index 3371c6c8f8..0000000000
--- a/src/cmd/internal/objabi/exp.go
+++ /dev/null
@@ -1,151 +0,0 @@
-// 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 objabi
-
-import (
- "fmt"
- "os"
- "reflect"
- "strings"
-
- "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.)
-var Experiment goexperiment.Flags = parseExperiments()
-
-// 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 experimentBaseline goexperiment.Flags
-
-// 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"
-
-func parseExperiments() goexperiment.Flags {
- // Start with the statically enabled set of experiments.
- flags := experimentBaseline
-
- // 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.
- env := envOr("GOEXPERIMENT", defaultGOEXPERIMENT)
-
- if env != "" {
- // Create a map of known experiment names.
- names := make(map[string]reflect.Value)
- 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
- }
-
- // Parse names.
- for _, f := range strings.Split(env, ",") {
- 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
- }
- field, ok := names[f]
- if !ok {
- fmt.Printf("unknown experiment %s\n", f)
- os.Exit(2)
- }
- field.SetBool(val)
- }
- }
-
- // regabi is only supported on amd64.
- if GOARCH != "amd64" {
- flags.Regabi = false
- flags.RegabiWrappers = false
- flags.RegabiG = false
- flags.RegabiReflect = false
- flags.RegabiDefer = false
- flags.RegabiArgs = false
- }
- // Setting regabi sets working sub-experiments.
- if flags.Regabi {
- flags.RegabiWrappers = true
- flags.RegabiG = true
- flags.RegabiReflect = true
- flags.RegabiDefer = true
- // Not ready yet:
- //flags.RegabiArgs = true
- }
- // Check regabi dependencies.
- if flags.RegabiG && !flags.RegabiWrappers {
- panic("GOEXPERIMENT regabig requires regabiwrappers")
- }
- if flags.RegabiArgs && !(flags.RegabiWrappers && flags.RegabiG && flags.RegabiReflect && flags.RegabiDefer) {
- panic("GOEXPERIMENT regabiargs requires regabiwrappers,regabig,regabireflect,regabidefer")
- }
- return flags
-}
-
-// 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)
-}
diff --git a/src/cmd/internal/objabi/flag.go b/src/cmd/internal/objabi/flag.go
index 9fcab4cc85..e41fc570b0 100644
--- a/src/cmd/internal/objabi/flag.go
+++ b/src/cmd/internal/objabi/flag.go
@@ -8,6 +8,7 @@ import (
"bytes"
"flag"
"fmt"
+ "internal/buildcfg"
"io"
"io/ioutil"
"log"
@@ -96,11 +97,11 @@ func (versionFlag) Set(s string) error {
if s == "goexperiment" {
// test/run.go uses this to discover the full set of
// experiment tags. Report everything.
- p = " X:" + strings.Join(expList(&Experiment, nil, true), ",")
+ p = " X:" + strings.Join(buildcfg.AllExperiments(), ",")
} else {
// If the enabled experiments differ from the defaults,
// include that difference.
- if goexperiment := GOEXPERIMENT(); goexperiment != "" {
+ if goexperiment := buildcfg.GOEXPERIMENT(); goexperiment != "" {
p = " X:" + goexperiment
}
}
@@ -111,12 +112,12 @@ func (versionFlag) Set(s string) error {
// build ID of the binary, so that if the compiler is changed and
// rebuilt, we notice and rebuild all packages.
if s == "full" {
- if strings.HasPrefix(Version, "devel") {
+ if strings.HasPrefix(buildcfg.Version, "devel") {
p += " buildID=" + buildID
}
}
- fmt.Printf("%s version %s%s\n", name, Version, p)
+ fmt.Printf("%s version %s%s\n", name, buildcfg.Version, p)
os.Exit(0)
return nil
}
diff --git a/src/cmd/internal/objabi/line.go b/src/cmd/internal/objabi/line.go
index 0733b65138..0b1e0bb181 100644
--- a/src/cmd/internal/objabi/line.go
+++ b/src/cmd/internal/objabi/line.go
@@ -5,6 +5,7 @@
package objabi
import (
+ "internal/buildcfg"
"os"
"path/filepath"
"strings"
@@ -38,8 +39,8 @@ func AbsFile(dir, file, rewrites string) string {
}
abs, rewritten := ApplyRewrites(abs, rewrites)
- if !rewritten && hasPathPrefix(abs, GOROOT) {
- abs = "$GOROOT" + abs[len(GOROOT):]
+ if !rewritten && hasPathPrefix(abs, buildcfg.GOROOT) {
+ abs = "$GOROOT" + abs[len(buildcfg.GOROOT):]
}
if abs == "" {
diff --git a/src/cmd/internal/objabi/stack.go b/src/cmd/internal/objabi/stack.go
index 1f531176cc..0c82a7c6dd 100644
--- a/src/cmd/internal/objabi/stack.go
+++ b/src/cmd/internal/objabi/stack.go
@@ -4,6 +4,8 @@
package objabi
+import "internal/buildcfg"
+
// For the linkers. Must match Go definitions.
const (
@@ -22,7 +24,7 @@ var StackLimit = StackGuard - StackSystem - StackSmall
// builds that have larger stack frames or for specific targets.
func stackGuardMultiplier() int {
// On AIX, a larger stack is needed for syscalls.
- if GOOS == "aix" {
+ if buildcfg.GOOS == "aix" {
return 2
}
return stackGuardMultiplierDefault
diff --git a/src/cmd/internal/objabi/util.go b/src/cmd/internal/objabi/util.go
index 5a7a74cfde..63640950d9 100644
--- a/src/cmd/internal/objabi/util.go
+++ b/src/cmd/internal/objabi/util.go
@@ -6,32 +6,9 @@ package objabi
import (
"fmt"
- "log"
- "os"
"strings"
-)
-
-func envOr(key, value string) string {
- if x := os.Getenv(key); x != "" {
- return x
- }
- return value
-}
-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
+ "internal/buildcfg"
)
const (
@@ -39,94 +16,10 @@ const (
MachoRelocOffset = 2048 // reserve enough space for ELF relocations
)
-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
- }
- // Fail here, rather than validate at multiple call sites.
- log.Fatalf("Invalid GOARM value. Must be 5, 6, or 7.")
- panic("unreachable")
-}
-
-func gomips() string {
- switch v := envOr("GOMIPS", defaultGOMIPS); v {
- case "hardfloat", "softfloat":
- return v
- }
- log.Fatalf("Invalid GOMIPS value. Must be hardfloat or softfloat.")
- panic("unreachable")
-}
-
-func gomips64() string {
- switch v := envOr("GOMIPS64", defaultGOMIPS64); v {
- case "hardfloat", "softfloat":
- return v
- }
- log.Fatalf("Invalid GOMIPS64 value. Must be hardfloat or softfloat.")
- panic("unreachable")
-}
-
-func goppc64() int {
- switch v := envOr("GOPPC64", defaultGOPPC64); v {
- case "power8":
- return 8
- case "power9":
- return 9
- }
- log.Fatalf("Invalid GOPPC64 value. Must be power8 or power9.")
- panic("unreachable")
-}
-
-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:
- log.Fatalf("Invalid GOWASM value. No such feature: " + opt)
- }
- }
- return
-}
-
-func Getgoextlinkenabled() string {
- return envOr("GO_EXTLINK_ENABLED", defaultGO_EXTLINK_ENABLED)
-}
-
// HeaderString returns the toolchain configuration string written in
// Go object headers. This string ensures we don't attempt to import
// or link object files that are incompatible with each other. This
// string always starts with "go object ".
func HeaderString() string {
- return fmt.Sprintf("go object %s %s %s X:%s\n", GOOS, GOARCH, Version, strings.Join(EnabledExperiments(), ","))
+ return fmt.Sprintf("go object %s %s %s X:%s\n", buildcfg.GOOS, buildcfg.GOARCH, buildcfg.Version, strings.Join(buildcfg.EnabledExperiments(), ","))
}