1
- # typed: true # rubocop:todo Sorbet/StrictSigil
1
+ # typed: strict
2
2
# frozen_string_literal: true
3
3
4
4
require "utils/popen"
@@ -9,23 +9,24 @@ module Hardware
9
9
class CPU
10
10
INTEL_32BIT_ARCHS = [ :i386 ] . freeze
11
11
INTEL_64BIT_ARCHS = [ :x86_64 ] . freeze
12
- INTEL_ARCHS = ( INTEL_32BIT_ARCHS + INTEL_64BIT_ARCHS ) . freeze
12
+ INTEL_ARCHS = T . let ( ( INTEL_32BIT_ARCHS + INTEL_64BIT_ARCHS ) . freeze , T :: Array [ Symbol ] )
13
13
PPC_32BIT_ARCHS = [ :ppc , :ppc32 , :ppc7400 , :ppc7450 , :ppc970 ] . freeze
14
14
PPC_64BIT_ARCHS = [ :ppc64 , :ppc64le , :ppc970 ] . freeze
15
- PPC_ARCHS = ( PPC_32BIT_ARCHS + PPC_64BIT_ARCHS ) . freeze
15
+ PPC_ARCHS = T . let ( ( PPC_32BIT_ARCHS + PPC_64BIT_ARCHS ) . freeze , T :: Array [ Symbol ] )
16
16
ARM_64BIT_ARCHS = [ :arm64 , :aarch64 ] . freeze
17
17
ARM_ARCHS = ARM_64BIT_ARCHS
18
- ALL_ARCHS = [
18
+ ALL_ARCHS = T . let ( [
19
19
*INTEL_ARCHS ,
20
20
*PPC_ARCHS ,
21
21
*ARM_ARCHS ,
22
- ] . freeze
22
+ ] . freeze , T :: Array [ Symbol ] )
23
23
24
24
INTEL_64BIT_OLDEST_CPU = :core2
25
25
26
26
class << self
27
+ sig { returns ( T ::Hash [ Symbol , String ] ) }
27
28
def optimization_flags
28
- @optimization_flags ||= {
29
+ @optimization_flags ||= T . let ( {
29
30
native : arch_flag ( "native" ) ,
30
31
ivybridge : "-march=ivybridge" ,
31
32
sandybridge : "-march=sandybridge" ,
@@ -38,7 +39,7 @@ def optimization_flags
38
39
armv8 : "-march=armv8-a" ,
39
40
ppc64 : "-mcpu=powerpc64" ,
40
41
ppc64le : "-mcpu=powerpc64le" ,
41
- } . freeze
42
+ } . freeze , T . nilable ( T :: Hash [ Symbol , String ] ) )
42
43
end
43
44
alias generic_optimization_flags optimization_flags
44
45
@@ -70,6 +71,7 @@ def arch_64_bit
70
71
end
71
72
end
72
73
74
+ sig { returns ( Symbol ) }
73
75
def arch
74
76
case bits
75
77
when 32
@@ -96,50 +98,59 @@ def family
96
98
:dunno
97
99
end
98
100
101
+ sig { returns ( Integer ) }
99
102
def cores
100
103
return @cores if @cores
101
104
102
105
@cores = Utils . popen_read ( "getconf" , "_NPROCESSORS_ONLN" ) . chomp . to_i
103
- @cores = 1 unless $CHILD_STATUS. success?
106
+ @cores = T . let ( 1 , T . nilable ( Integer ) ) unless $CHILD_STATUS. success?
104
107
@cores
105
108
end
106
109
110
+ sig { returns ( T . nilable ( Integer ) ) }
107
111
def bits
108
- @bits ||= case RUBY_PLATFORM
112
+ @bits ||= T . let ( case RUBY_PLATFORM
109
113
when /x86_64/ , /ppc64|powerpc64/ , /aarch64|arm64/ then 64
110
114
when /i\d 86/ , /ppc/ , /arm/ then 32
111
- end
115
+ end , T . nilable ( Integer ) )
112
116
end
113
117
114
118
sig { returns ( T ::Boolean ) }
115
119
def sse4?
116
120
RUBY_PLATFORM . to_s . include? ( "x86_64" )
117
121
end
118
122
123
+ sig { returns ( T ::Boolean ) }
119
124
def is_32_bit?
120
125
bits == 32
121
126
end
122
127
128
+ sig { returns ( T ::Boolean ) }
123
129
def is_64_bit?
124
130
bits == 64
125
131
end
126
132
133
+ sig { returns ( T ::Boolean ) }
127
134
def intel?
128
135
type == :intel
129
136
end
130
137
138
+ sig { returns ( T ::Boolean ) }
131
139
def ppc?
132
140
type == :ppc
133
141
end
134
142
143
+ sig { returns ( T ::Boolean ) }
135
144
def ppc32?
136
145
ppc? && is_32_bit?
137
146
end
138
147
148
+ sig { returns ( T ::Boolean ) }
139
149
def ppc64le?
140
150
ppc? && is_64_bit? && little_endian?
141
151
end
142
152
153
+ sig { returns ( T ::Boolean ) }
143
154
def ppc64?
144
155
ppc? && is_64_bit? && big_endian?
145
156
end
@@ -152,26 +163,32 @@ def arm?
152
163
type == :arm
153
164
end
154
165
166
+ sig { returns ( T ::Boolean ) }
155
167
def little_endian?
156
168
!big_endian?
157
169
end
158
170
171
+ sig { returns ( T ::Boolean ) }
159
172
def big_endian?
160
173
[ 1 ] . pack ( "I" ) == [ 1 ] . pack ( "N" )
161
174
end
162
175
176
+ sig { returns ( FalseClass ) }
163
177
def virtualized?
164
178
false
165
179
end
166
180
181
+ sig { returns ( T ::Array [ Symbol ] ) }
167
182
def features
168
183
[ ]
169
184
end
170
185
186
+ sig { params ( name : Symbol ) . returns ( T ::Boolean ) }
171
187
def feature? ( name )
172
188
features . include? ( name )
173
189
end
174
190
191
+ sig { params ( arch : T . any ( String , Symbol ) ) . returns ( String ) }
175
192
def arch_flag ( arch )
176
193
return "-mcpu=#{ arch } " if ppc?
177
194
@@ -186,6 +203,7 @@ def in_rosetta2?
186
203
end
187
204
188
205
class << self
206
+ sig { returns ( String ) }
189
207
def cores_as_words
190
208
case Hardware ::CPU . cores
191
209
when 1 then "single"
@@ -195,7 +213,7 @@ def cores_as_words
195
213
when 8 then "octa"
196
214
when 12 then "dodeca"
197
215
else
198
- Hardware ::CPU . cores
216
+ Hardware ::CPU . cores . to_s
199
217
end
200
218
end
201
219
@@ -231,12 +249,12 @@ def rustflags_target_cpu(arch)
231
249
# Rust already defaults to the oldest supported cpu for each target-triplet
232
250
# so it's safe to ignore generic archs such as :armv6 here.
233
251
# Rust defaults to apple-m1 since Rust 1.71 for aarch64-apple-darwin.
234
- @target_cpu ||= case arch
252
+ @target_cpu ||= T . let ( case arch
235
253
when :core
236
254
:prescott
237
255
when :native , :ivybridge , :sandybridge , :westmere , :nehalem , :core2
238
256
arch
239
- end
257
+ end , T . nilable ( Symbol ) )
240
258
return if @target_cpu . blank?
241
259
242
260
"--codegen target-cpu=#{ @target_cpu } "
0 commit comments