@@ -74,7 +74,8 @@ def flatten(*args):
74
74
yield x
75
75
76
76
77
- def read_sizes (sizes , file_name , function_details , group_by_prefix ):
77
+ def read_sizes (sect_sizes , seg_sizes , file_name , function_details ,
78
+ group_by_prefix ):
78
79
# Check if multiple architectures are supported by the object file.
79
80
# Prefer arm64 if available.
80
81
architectures = subprocess .check_output (
@@ -110,13 +111,16 @@ def read_sizes(sizes, file_name, function_details, group_by_prefix):
110
111
content = subprocess .check_output (
111
112
flatten (["otool" , arch_params , "-l" , file_name ])).split ("\n " )
112
113
114
+ seg_name = None
113
115
sect_name = None
114
116
curr_func = None
115
117
start_addr = None
116
118
end_addr = None
117
119
118
120
section_pattern = re .compile (r' +sectname ([\S]+)' )
119
- size_pattern = re .compile (r' +size ([\da-fx]+)' )
121
+ seg_pattern = re .compile (r' +segname ([\S]+)' )
122
+ sect_size_pattern = re .compile (r' +size ([\da-fx]+)' )
123
+ seg_size_pattern = re .compile (r' +filesize ([\da-fx]+)' )
120
124
asmline_pattern = re .compile (r'^([0-9a-fA-F]+)\s' )
121
125
label_pattern = re .compile (r'^((\-*\[[^\]]*\])|[^\/\s]+):$' )
122
126
@@ -131,24 +135,31 @@ def read_sizes(sizes, file_name, function_details, group_by_prefix):
131
135
sect_name = None
132
136
else :
133
137
label_match = label_pattern .match (line )
134
- size_match = size_pattern .match (line )
138
+ sect_size_match = sect_size_pattern .match (line )
135
139
section_match = section_pattern .match (line )
140
+ seg_match = seg_pattern .match (line )
141
+ seg_size_match = seg_size_pattern .match (line )
136
142
if label_match :
137
143
func_name = label_match .group (1 )
138
- add_function (sizes , curr_func , start_addr ,
144
+ add_function (sect_sizes , curr_func , start_addr ,
139
145
end_addr , group_by_prefix )
140
146
curr_func = func_name
141
147
start_addr = None
142
148
end_addr = None
143
- elif size_match and sect_name and group_by_prefix :
144
- size = int (size_match .group (1 ), 16 )
145
- sizes [sect_name ] += size
149
+ elif sect_size_match and sect_name and group_by_prefix :
150
+ size = int (sect_size_match .group (1 ), 16 )
151
+ sect_sizes [sect_name ] += size
146
152
elif section_match :
147
153
sect_name = section_match .group (1 )
148
154
if sect_name == "__textcoal_nt" :
149
155
sect_name = "__text"
156
+ elif seg_match :
157
+ seg_name = seg_match .group (1 )
158
+ elif seg_size_match and seg_name and group_by_prefix :
159
+ seg_size = int (seg_size_match .group (1 ), 16 )
160
+ seg_sizes [seg_name ] += seg_size
150
161
151
- add_function (sizes , curr_func , start_addr , end_addr , group_by_prefix )
162
+ add_function (sect_sizes , curr_func , start_addr , end_addr , group_by_prefix )
152
163
153
164
154
165
def compare_sizes (old_sizes , new_sizes , name_key , title , total_size_key = "" ,
@@ -190,15 +201,19 @@ def compare_sizes(old_sizes, new_sizes, name_key, title, total_size_key="",
190
201
(title , name_key , old_size , new_size , perc ))
191
202
192
203
193
- def compare_sizes_of_file (old_files , new_files , all_sections , list_categories ,
194
- csv = None ):
195
- old_sizes = collections .defaultdict (int )
196
- new_sizes = collections .defaultdict (int )
204
+ def compare_sizes_of_file (old_files , new_files , all_sections , all_segments ,
205
+ list_categories , csv = None ):
206
+ old_sect_sizes = collections .defaultdict (int )
207
+ new_sect_sizes = collections .defaultdict (int )
208
+ old_seg_sizes = collections .defaultdict (int )
209
+ new_seg_sizes = collections .defaultdict (int )
197
210
198
211
for old_file in old_files :
199
- read_sizes (old_sizes , old_file , list_categories , True )
212
+ read_sizes (old_sect_sizes , old_seg_sizes , old_file , list_categories ,
213
+ True )
200
214
for new_file in new_files :
201
- read_sizes (new_sizes , new_file , list_categories , True )
215
+ read_sizes (new_sect_sizes , new_seg_sizes ,
216
+ new_file , list_categories , True )
202
217
203
218
if len (old_files ) == 1 and len (new_files ) == 1 :
204
219
old_base = os .path .basename (old_files [0 ])
@@ -209,33 +224,50 @@ def compare_sizes_of_file(old_files, new_files, all_sections, list_categories,
209
224
else :
210
225
title = "old-new"
211
226
212
- compare_sizes (old_sizes , new_sizes , "__text" , title , "" , csv = csv )
227
+ compare_sizes (old_sect_sizes , new_sect_sizes , "__text" , title , "" , csv = csv )
213
228
214
229
if list_categories :
215
230
for cat in categories :
216
231
cat_name = cat [0 ]
217
- compare_sizes (old_sizes , new_sizes , cat_name , "" , "__text" ,
232
+ compare_sizes (old_sect_sizes , new_sect_sizes , cat_name , "" , "__text" ,
218
233
csv = csv )
219
234
220
235
if all_sections :
221
236
section_title = " section"
222
237
223
- compare_sizes (old_sizes , new_sizes , "__textcoal_nt" , section_title ,
224
- csv = csv )
225
- compare_sizes (old_sizes , new_sizes , "__stubs" , section_title , csv = csv )
226
- compare_sizes (old_sizes , new_sizes , "__const" , section_title , csv = csv )
227
- compare_sizes (old_sizes , new_sizes , "__cstring" , section_title ,
238
+ compare_sizes (old_sect_sizes , new_sect_sizes ,
239
+ "__textcoal_nt" , section_title , csv = csv )
240
+ compare_sizes (old_sect_sizes , new_sect_sizes ,
241
+ "__stubs" , section_title , csv = csv )
242
+ compare_sizes (old_sect_sizes , new_sect_sizes ,
243
+ "__const" , section_title , csv = csv )
244
+ compare_sizes (old_sect_sizes , new_sect_sizes ,
245
+ "__cstring" , section_title , csv = csv )
246
+ compare_sizes (old_sect_sizes , new_sect_sizes ,
247
+ "__objc_methname" , section_title , csv = csv )
248
+ compare_sizes (old_sect_sizes , new_sect_sizes ,
249
+ "__const" , section_title , csv = csv )
250
+ compare_sizes (old_sect_sizes , new_sect_sizes ,
251
+ "__objc_const" , section_title , csv = csv )
252
+ compare_sizes (old_sect_sizes , new_sect_sizes ,
253
+ "__data" , section_title , csv = csv )
254
+ compare_sizes (old_sect_sizes , new_sect_sizes ,
255
+ "__swift5_proto" , section_title , csv = csv )
256
+ compare_sizes (old_sect_sizes , new_sect_sizes ,
257
+ "__common" , section_title , csv = csv )
258
+ compare_sizes (old_sect_sizes , new_sect_sizes ,
259
+ "__bss" , section_title , csv = csv )
260
+
261
+ if all_segments :
262
+ segment_title = " segment"
263
+ compare_sizes (old_seg_sizes , new_seg_sizes , "__TEXT" , segment_title ,
228
264
csv = csv )
229
- compare_sizes (old_sizes , new_sizes , "__objc_methname " , section_title ,
265
+ compare_sizes (old_seg_sizes , new_seg_sizes , "__DATA " , segment_title ,
230
266
csv = csv )
231
- compare_sizes (old_sizes , new_sizes , "__const" , section_title , csv = csv )
232
- compare_sizes (old_sizes , new_sizes , "__objc_const" , section_title ,
267
+ compare_sizes (old_seg_sizes , new_seg_sizes , "__LLVM_COV" , segment_title ,
233
268
csv = csv )
234
- compare_sizes (old_sizes , new_sizes , "__data" , section_title , csv = csv )
235
- compare_sizes (old_sizes , new_sizes , "__swift5_proto" , section_title ,
269
+ compare_sizes (old_seg_sizes , new_seg_sizes , "__LINKEDIT" , segment_title ,
236
270
csv = csv )
237
- compare_sizes (old_sizes , new_sizes , "__common" , section_title , csv = csv )
238
- compare_sizes (old_sizes , new_sizes , "__bss" , section_title , csv = csv )
239
271
240
272
241
273
def list_function_sizes (size_array ):
@@ -249,9 +281,9 @@ def compare_function_sizes(old_files, new_files, csv=None):
249
281
old_sizes = collections .defaultdict (int )
250
282
new_sizes = collections .defaultdict (int )
251
283
for name in old_files :
252
- read_sizes (old_sizes , name , True , False )
284
+ read_sizes (old_sizes , [], name , True , False )
253
285
for name in new_files :
254
- read_sizes (new_sizes , name , True , False )
286
+ read_sizes (new_sizes , [], name , True , False )
255
287
256
288
only_in_file1 = []
257
289
only_in_file2 = []
0 commit comments