podman
203 строки · 4.1 Кб
1// Copyright 2015 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package objabi
6
7import (
8"fmt"
9"log"
10"os"
11"strings"
12)
13
14func envOr(key, value string) string {
15if x := os.Getenv(key); x != "" {
16return x
17}
18return value
19}
20
21var (
22defaultGOROOT string // set by linker
23
24GOROOT = envOr("GOROOT", defaultGOROOT)
25GOARCH = envOr("GOARCH", "amd64")
26GOOS = envOr("GOOS", "linux")
27GO386 = envOr("GO386", "")
28GOAMD64 = goamd64()
29GOARM = goarm()
30GOMIPS = gomips()
31GOMIPS64 = gomips64()
32GOPPC64 = goppc64()
33GOWASM = gowasm()
34GO_LDSO = ""
35Version = ""
36)
37
38const (
39ElfRelocOffset = 256
40MachoRelocOffset = 2048 // reserve enough space for ELF relocations
41Go115AMD64 = "alignedjumps" // Should be "alignedjumps" or "normaljumps"; this replaces environment variable introduced in CL 219357.
42)
43
44// TODO(1.16): assuming no issues in 1.15 release, remove this and related constant.
45func goamd64() string {
46return Go115AMD64
47}
48
49func goarm() int {
50switch v := envOr("GOARM", "7"); v {
51case "5":
52return 5
53case "6":
54return 6
55case "7":
56return 7
57}
58// Fail here, rather than validate at multiple call sites.
59log.Fatalf("Invalid GOARM value. Must be 5, 6, or 7.")
60panic("unreachable")
61}
62
63func gomips() string {
64switch v := envOr("GOMIPS", "hardfloat"); v {
65case "hardfloat", "softfloat":
66return v
67}
68log.Fatalf("Invalid GOMIPS value. Must be hardfloat or softfloat.")
69panic("unreachable")
70}
71
72func gomips64() string {
73switch v := envOr("GOMIPS64", "hardfloat"); v {
74case "hardfloat", "softfloat":
75return v
76}
77log.Fatalf("Invalid GOMIPS64 value. Must be hardfloat or softfloat.")
78panic("unreachable")
79}
80
81func goppc64() int {
82switch v := envOr("GOPPC64", "power8"); v {
83case "power8":
84return 8
85case "power9":
86return 9
87}
88log.Fatalf("Invalid GOPPC64 value. Must be power8 or power9.")
89panic("unreachable")
90}
91
92type gowasmFeatures struct {
93SignExt bool
94SatConv bool
95}
96
97func (f gowasmFeatures) String() string {
98var flags []string
99if f.SatConv {
100flags = append(flags, "satconv")
101}
102if f.SignExt {
103flags = append(flags, "signext")
104}
105return strings.Join(flags, ",")
106}
107
108func gowasm() (f gowasmFeatures) {
109for _, opt := range strings.Split(envOr("GOWASM", ""), ",") {
110switch opt {
111case "satconv":
112f.SatConv = true
113case "signext":
114f.SignExt = true
115case "":
116// ignore
117default:
118log.Fatalf("Invalid GOWASM value. No such feature: " + opt)
119}
120}
121return
122}
123
124func Getgoextlinkenabled() string {
125return envOr("GO_EXTLINK_ENABLED", "")
126}
127
128func init() {
129for _, f := range strings.Split("", ",") {
130if f != "" {
131addexp(f)
132}
133}
134
135// regabi is only supported on amd64.
136if GOARCH != "amd64" {
137Regabi_enabled = 0
138}
139}
140
141// Note: must agree with runtime.framepointer_enabled.
142var Framepointer_enabled = GOARCH == "amd64" || GOARCH == "arm64" && (GOOS == "linux" || GOOS == "darwin")
143
144func addexp(s string) {
145// Could do general integer parsing here, but the runtime copy doesn't yet.
146v := 1
147name := s
148if len(name) > 2 && name[:2] == "no" {
149v = 0
150name = name[2:]
151}
152for i := 0; i < len(exper); i++ {
153if exper[i].name == name {
154if exper[i].val != nil {
155*exper[i].val = v
156}
157return
158}
159}
160
161fmt.Printf("unknown experiment %s\n", s)
162os.Exit(2)
163}
164
165var (
166Fieldtrack_enabled int
167Preemptibleloops_enabled int
168Staticlockranking_enabled int
169Regabi_enabled int
170)
171
172// Toolchain experiments.
173// These are controlled by the GOEXPERIMENT environment
174// variable recorded when the toolchain is built.
175// This list is also known to cmd/gc.
176var exper = []struct {
177name string
178val *int
179}{
180{"fieldtrack", &Fieldtrack_enabled},
181{"preemptibleloops", &Preemptibleloops_enabled},
182{"staticlockranking", &Staticlockranking_enabled},
183{"regabi", &Regabi_enabled},
184}
185
186var defaultExpstring = Expstring()
187
188func DefaultExpstring() string {
189return defaultExpstring
190}
191
192func Expstring() string {
193buf := "X"
194for i := range exper {
195if *exper[i].val != 0 {
196buf += "," + exper[i].name
197}
198}
199if buf == "X" {
200buf += ",none"
201}
202return "X:" + buf[2:]
203}
204