1
2
3
4
5
6
7 package platform
8
9
10 type OSArch struct {
11 GOOS, GOARCH string
12 }
13
14 func (p OSArch) String() string {
15 return p.GOOS + "/" + p.GOARCH
16 }
17
18
19
20
21
22
23 func RaceDetectorSupported(goos, goarch string) bool {
24 switch goos {
25 case "linux":
26 return goarch == "amd64" || goarch == "arm64" || goarch == "loong64" || goarch == "ppc64le" || goarch == "riscv64" || goarch == "s390x"
27 case "darwin":
28 return goarch == "amd64" || goarch == "arm64"
29 case "freebsd", "netbsd", "windows":
30 return goarch == "amd64"
31 default:
32 return false
33 }
34 }
35
36
37
38 func MSanSupported(goos, goarch string) bool {
39 switch goos {
40 case "linux":
41 return goarch == "amd64" || goarch == "arm64" || goarch == "loong64"
42 case "freebsd":
43 return goarch == "amd64"
44 default:
45 return false
46 }
47 }
48
49
50
51 func ASanSupported(goos, goarch string) bool {
52 switch goos {
53 case "linux":
54 return goarch == "arm64" || goarch == "amd64" || goarch == "loong64" || goarch == "riscv64" || goarch == "ppc64le"
55 default:
56 return false
57 }
58 }
59
60
61
62
63
64 func FIPS140Supported(goos, goarch string) bool {
65
66 switch {
67 case goarch == "wasm",
68 goos == "windows" && goarch == "386",
69 goos == "openbsd",
70 goos == "aix":
71 return false
72 }
73 return true
74 }
75
76
77
78 func FuzzSupported(goos, goarch string) bool {
79 switch goos {
80 case "darwin", "freebsd", "linux", "openbsd", "windows":
81 return true
82 default:
83 return false
84 }
85 }
86
87
88
89 func FuzzInstrumented(goos, goarch string) bool {
90 switch goarch {
91 case "amd64", "arm64", "loong64":
92
93 return FuzzSupported(goos, goarch)
94 default:
95 return false
96 }
97 }
98
99
100
101 func MustLinkExternal(goos, goarch string, withCgo bool) bool {
102 if withCgo {
103 switch goarch {
104 case "mips", "mipsle", "mips64", "mips64le":
105
106
107 return true
108 case "ppc64":
109
110
111 if goos == "aix" {
112 return true
113 }
114 }
115
116 switch goos {
117 case "android":
118 return true
119 case "dragonfly":
120
121
122
123 return true
124 }
125 }
126
127 switch goos {
128 case "android":
129 if goarch != "arm64" {
130 return true
131 }
132 case "ios":
133 if goarch == "arm64" {
134 return true
135 }
136 }
137 return false
138 }
139
140
141
142
143 func BuildModeSupported(compiler, buildmode, goos, goarch string) bool {
144 if compiler == "gccgo" {
145 return true
146 }
147
148 if _, ok := distInfo[OSArch{goos, goarch}]; !ok {
149 return false
150 }
151
152 platform := goos + "/" + goarch
153 switch buildmode {
154 case "archive":
155 return true
156
157 case "c-archive":
158 switch goos {
159 case "aix", "darwin", "ios", "windows":
160 return true
161 case "linux":
162 switch goarch {
163 case "386", "amd64", "arm", "armbe", "arm64", "arm64be", "loong64", "ppc64", "ppc64le", "riscv64", "s390x":
164 return true
165 default:
166
167
168
169
170
171
172 return false
173 }
174 case "freebsd":
175 return goarch == "amd64"
176 }
177 return false
178
179 case "c-shared":
180 switch platform {
181 case "linux/amd64", "linux/arm", "linux/arm64", "linux/loong64", "linux/386", "linux/ppc64", "linux/ppc64le", "linux/riscv64", "linux/s390x",
182 "android/amd64", "android/arm", "android/arm64", "android/386",
183 "freebsd/amd64",
184 "darwin/amd64", "darwin/arm64",
185 "windows/amd64", "windows/386", "windows/arm64",
186 "wasip1/wasm":
187 return true
188 }
189 return false
190
191 case "default":
192 return true
193
194 case "exe":
195 return true
196
197 case "pie":
198 switch platform {
199 case "linux/386", "linux/amd64", "linux/arm", "linux/arm64", "linux/loong64", "linux/ppc64", "linux/ppc64le", "linux/riscv64", "linux/s390x",
200 "android/amd64", "android/arm", "android/arm64", "android/386",
201 "freebsd/amd64",
202 "darwin/amd64", "darwin/arm64",
203 "ios/amd64", "ios/arm64",
204 "aix/ppc64",
205 "openbsd/arm64",
206 "windows/386", "windows/amd64", "windows/arm64":
207 return true
208 }
209 return false
210
211 case "shared":
212 switch platform {
213 case "linux/386", "linux/amd64", "linux/arm", "linux/arm64", "linux/ppc64", "linux/ppc64le", "linux/s390x":
214 return true
215 }
216 return false
217
218 case "plugin":
219 switch platform {
220 case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/loong64", "linux/riscv64", "linux/s390x", "linux/ppc64", "linux/ppc64le",
221 "android/amd64", "android/386",
222 "darwin/amd64", "darwin/arm64",
223 "freebsd/amd64":
224 return true
225 }
226 return false
227
228 default:
229 return false
230 }
231 }
232
233 func InternalLinkPIESupported(goos, goarch string) bool {
234 switch goos + "/" + goarch {
235 case "android/arm64",
236 "darwin/amd64", "darwin/arm64",
237 "linux/amd64", "linux/arm64", "linux/loong64", "linux/ppc64", "linux/ppc64le", "linux/s390x",
238 "windows/386", "windows/amd64", "windows/arm64":
239 return true
240 }
241 return false
242 }
243
244
245
246
247 func DefaultPIE(goos, goarch string, isRace bool) bool {
248 switch goos {
249 case "android", "ios":
250 return true
251 case "windows":
252 if isRace {
253
254
255 return false
256 }
257 return true
258 case "darwin":
259 return true
260 }
261 return false
262 }
263
264
265
266 func ExecutableHasDWARF(goos, goarch string) bool {
267 switch goos {
268 case "plan9", "ios":
269 return false
270 }
271 return true
272 }
273
274
275
276 type osArchInfo struct {
277 CgoSupported bool
278 FirstClass bool
279 Broken bool
280 }
281
282
283 func CgoSupported(goos, goarch string) bool {
284 return distInfo[OSArch{goos, goarch}].CgoSupported
285 }
286
287
288
289 func FirstClass(goos, goarch string) bool {
290 return distInfo[OSArch{goos, goarch}].FirstClass
291 }
292
293
294
295 func Broken(goos, goarch string) bool {
296 return distInfo[OSArch{goos, goarch}].Broken
297 }
298
View as plain text