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 == "ppc64le" || goarch == "arm64" || 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 func FuzzSupported(goos, goarch string) bool {
63 switch goos {
64 case "darwin", "freebsd", "linux", "windows":
65 return true
66 default:
67 return false
68 }
69 }
70
71
72
73 func FuzzInstrumented(goos, goarch string) bool {
74 switch goarch {
75 case "amd64", "arm64":
76
77 return FuzzSupported(goos, goarch)
78 default:
79 return false
80 }
81 }
82
83
84
85 func MustLinkExternal(goos, goarch string, withCgo bool) bool {
86 if withCgo {
87 switch goarch {
88 case "loong64", "mips", "mipsle", "mips64", "mips64le":
89
90
91 return true
92 case "arm64":
93 if goos == "windows" {
94
95 return true
96 }
97 case "ppc64":
98
99
100 if goos == "aix" || goos == "linux" {
101 return true
102 }
103 }
104
105 switch goos {
106 case "android":
107 return true
108 case "dragonfly":
109
110
111
112 return true
113 }
114 }
115
116 switch goos {
117 case "android":
118 if goarch != "arm64" {
119 return true
120 }
121 case "ios":
122 if goarch == "arm64" {
123 return true
124 }
125 }
126 return false
127 }
128
129
130
131
132 func BuildModeSupported(compiler, buildmode, goos, goarch string) bool {
133 if compiler == "gccgo" {
134 return true
135 }
136
137 if _, ok := distInfo[OSArch{goos, goarch}]; !ok {
138 return false
139 }
140
141 platform := goos + "/" + goarch
142 switch buildmode {
143 case "archive":
144 return true
145
146 case "c-archive":
147 switch goos {
148 case "aix", "darwin", "ios", "windows":
149 return true
150 case "linux":
151 switch goarch {
152 case "386", "amd64", "arm", "armbe", "arm64", "arm64be", "loong64", "ppc64le", "riscv64", "s390x":
153
154
155 return true
156 default:
157
158
159
160
161
162
163 return false
164 }
165 case "freebsd":
166 return goarch == "amd64"
167 }
168 return false
169
170 case "c-shared":
171 switch platform {
172 case "linux/amd64", "linux/arm", "linux/arm64", "linux/loong64", "linux/386", "linux/ppc64le", "linux/riscv64", "linux/s390x",
173 "android/amd64", "android/arm", "android/arm64", "android/386",
174 "freebsd/amd64",
175 "darwin/amd64", "darwin/arm64",
176 "windows/amd64", "windows/386", "windows/arm64",
177 "wasip1/wasm":
178 return true
179 }
180 return false
181
182 case "default":
183 return true
184
185 case "exe":
186 return true
187
188 case "pie":
189 switch platform {
190 case "linux/386", "linux/amd64", "linux/arm", "linux/arm64", "linux/loong64", "linux/ppc64le", "linux/riscv64", "linux/s390x",
191 "android/amd64", "android/arm", "android/arm64", "android/386",
192 "freebsd/amd64",
193 "darwin/amd64", "darwin/arm64",
194 "ios/amd64", "ios/arm64",
195 "aix/ppc64",
196 "openbsd/arm64",
197 "windows/386", "windows/amd64", "windows/arm", "windows/arm64":
198 return true
199 }
200 return false
201
202 case "shared":
203 switch platform {
204 case "linux/386", "linux/amd64", "linux/arm", "linux/arm64", "linux/ppc64le", "linux/s390x":
205 return true
206 }
207 return false
208
209 case "plugin":
210 switch platform {
211 case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/loong64", "linux/s390x", "linux/ppc64le",
212 "android/amd64", "android/386",
213 "darwin/amd64", "darwin/arm64",
214 "freebsd/amd64":
215 return true
216 }
217 return false
218
219 default:
220 return false
221 }
222 }
223
224 func InternalLinkPIESupported(goos, goarch string) bool {
225 switch goos + "/" + goarch {
226 case "android/arm64",
227 "darwin/amd64", "darwin/arm64",
228 "linux/amd64", "linux/arm64", "linux/ppc64le",
229 "windows/386", "windows/amd64", "windows/arm", "windows/arm64":
230 return true
231 }
232 return false
233 }
234
235
236
237
238 func DefaultPIE(goos, goarch string, isRace bool) bool {
239 switch goos {
240 case "android", "ios":
241 return true
242 case "windows":
243 if isRace {
244
245
246 return false
247 }
248 return true
249 case "darwin":
250 return true
251 }
252 return false
253 }
254
255
256
257 func ExecutableHasDWARF(goos, goarch string) bool {
258 switch goos {
259 case "plan9", "ios":
260 return false
261 }
262 return true
263 }
264
265
266
267 type osArchInfo struct {
268 CgoSupported bool
269 FirstClass bool
270 Broken bool
271 }
272
273
274 func CgoSupported(goos, goarch string) bool {
275 return distInfo[OSArch{goos, goarch}].CgoSupported
276 }
277
278
279
280 func FirstClass(goos, goarch string) bool {
281 return distInfo[OSArch{goos, goarch}].FirstClass
282 }
283
284
285
286 func Broken(goos, goarch string) bool {
287 return distInfo[OSArch{goos, goarch}].Broken
288 }
289
View as plain text