123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- // Copyright 2015 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"
- "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", "amd64")
- GOOS = envOr("GOOS", "linux")
- GO386 = envOr("GO386", "")
- GOAMD64 = goamd64()
- GOARM = goarm()
- GOMIPS = gomips()
- GOMIPS64 = gomips64()
- GOPPC64 = goppc64()
- GOWASM = gowasm()
- GO_LDSO = ""
- Version = ""
- )
- const (
- ElfRelocOffset = 256
- MachoRelocOffset = 2048 // reserve enough space for ELF relocations
- Go115AMD64 = "alignedjumps" // Should be "alignedjumps" or "normaljumps"; this replaces environment variable introduced in CL 219357.
- )
- // TODO(1.16): assuming no issues in 1.15 release, remove this and related constant.
- func goamd64() string {
- return Go115AMD64
- }
- func goarm() int {
- switch v := envOr("GOARM", "7"); 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", "hardfloat"); 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", "hardfloat"); 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", "power8"); 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", "")
- }
- func init() {
- for _, f := range strings.Split("", ",") {
- if f != "" {
- addexp(f)
- }
- }
- // regabi is only supported on amd64.
- if GOARCH != "amd64" {
- Regabi_enabled = 0
- }
- }
- // Note: must agree with runtime.framepointer_enabled.
- var Framepointer_enabled = GOARCH == "amd64" || GOARCH == "arm64" && (GOOS == "linux" || GOOS == "darwin")
- func addexp(s string) {
- // Could do general integer parsing here, but the runtime copy doesn't yet.
- v := 1
- name := s
- if len(name) > 2 && name[:2] == "no" {
- v = 0
- name = name[2:]
- }
- for i := 0; i < len(exper); i++ {
- if exper[i].name == name {
- if exper[i].val != nil {
- *exper[i].val = v
- }
- return
- }
- }
- fmt.Printf("unknown experiment %s\n", s)
- os.Exit(2)
- }
- var (
- Fieldtrack_enabled int
- Preemptibleloops_enabled int
- Staticlockranking_enabled int
- Regabi_enabled int
- )
- // 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
- }{
- {"fieldtrack", &Fieldtrack_enabled},
- {"preemptibleloops", &Preemptibleloops_enabled},
- {"staticlockranking", &Staticlockranking_enabled},
- {"regabi", &Regabi_enabled},
- }
- var defaultExpstring = Expstring()
- func DefaultExpstring() string {
- return defaultExpstring
- }
- func Expstring() string {
- buf := "X"
- for i := range exper {
- if *exper[i].val != 0 {
- buf += "," + exper[i].name
- }
- }
- if buf == "X" {
- buf += ",none"
- }
- return "X:" + buf[2:]
- }
|