Skip to content

Commit ed17e9d

Browse files
authored
Merge pull request swiftlang#31796 from meg-gupta/scriptchanges
Add option to cmpcodesize.py to list segment sizes
2 parents e293330 + 0b7368d commit ed17e9d

File tree

3 files changed

+72
-31
lines changed

3 files changed

+72
-31
lines changed

benchmark/scripts/run_smoke_bench

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ def report_code_size(opt_level, old_dir, new_dir, platform, output_file):
272272
old_lines = ""
273273
new_lines = ""
274274
for oldfile in files:
275+
new_dir = os.path.join(new_dir, '')
275276
newfile = oldfile.replace(old_dir, new_dir, 1)
276277
if os.path.isfile(newfile):
277278
oldsize = get_codesize(oldfile)

utils/cmpcodesize/cmpcodesize/compare.py

Lines changed: 62 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ def flatten(*args):
7474
yield x
7575

7676

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):
7879
# Check if multiple architectures are supported by the object file.
7980
# Prefer arm64 if available.
8081
architectures = subprocess.check_output(
@@ -110,13 +111,16 @@ def read_sizes(sizes, file_name, function_details, group_by_prefix):
110111
content = subprocess.check_output(
111112
flatten(["otool", arch_params, "-l", file_name])).split("\n")
112113

114+
seg_name = None
113115
sect_name = None
114116
curr_func = None
115117
start_addr = None
116118
end_addr = None
117119

118120
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]+)')
120124
asmline_pattern = re.compile(r'^([0-9a-fA-F]+)\s')
121125
label_pattern = re.compile(r'^((\-*\[[^\]]*\])|[^\/\s]+):$')
122126

@@ -131,24 +135,31 @@ def read_sizes(sizes, file_name, function_details, group_by_prefix):
131135
sect_name = None
132136
else:
133137
label_match = label_pattern.match(line)
134-
size_match = size_pattern.match(line)
138+
sect_size_match = sect_size_pattern.match(line)
135139
section_match = section_pattern.match(line)
140+
seg_match = seg_pattern.match(line)
141+
seg_size_match = seg_size_pattern.match(line)
136142
if label_match:
137143
func_name = label_match.group(1)
138-
add_function(sizes, curr_func, start_addr,
144+
add_function(sect_sizes, curr_func, start_addr,
139145
end_addr, group_by_prefix)
140146
curr_func = func_name
141147
start_addr = None
142148
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
146152
elif section_match:
147153
sect_name = section_match.group(1)
148154
if sect_name == "__textcoal_nt":
149155
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
150161

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)
152163

153164

154165
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="",
190201
(title, name_key, old_size, new_size, perc))
191202

192203

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)
197210

198211
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)
200214
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)
202217

203218
if len(old_files) == 1 and len(new_files) == 1:
204219
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,
209224
else:
210225
title = "old-new"
211226

212-
compare_sizes(old_sizes, new_sizes, "__text", title, "", csv=csv)
227+
compare_sizes(old_sect_sizes, new_sect_sizes, "__text", title, "", csv=csv)
213228

214229
if list_categories:
215230
for cat in categories:
216231
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",
218233
csv=csv)
219234

220235
if all_sections:
221236
section_title = " section"
222237

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,
228264
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,
230266
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,
233268
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,
236270
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)
239271

240272

241273
def list_function_sizes(size_array):
@@ -249,9 +281,9 @@ def compare_function_sizes(old_files, new_files, csv=None):
249281
old_sizes = collections.defaultdict(int)
250282
new_sizes = collections.defaultdict(int)
251283
for name in old_files:
252-
read_sizes(old_sizes, name, True, False)
284+
read_sizes(old_sizes, [], name, True, False)
253285
for name in new_files:
254-
read_sizes(new_sizes, name, True, False)
286+
read_sizes(new_sizes, [], name, True, False)
255287

256288
only_in_file1 = []
257289
only_in_file2 = []

utils/cmpcodesize/cmpcodesize/main.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@ def main():
8282
action='store_true',
8383
dest='all_sections',
8484
default=False)
85+
parser.add_argument('-z', '--additional-segments',
86+
help='Show sizes of additional segments.',
87+
action='store_true',
88+
dest='all_segments',
89+
default=False)
8590
parser.add_argument('-c', '--category',
8691
help='Show functions by category.',
8792
action='store_true',
@@ -138,9 +143,10 @@ def main():
138143
# exclusivity among options, not among groups of options, so
139144
# we detect this case manually.
140145
assert (not parsed_arguments.all_sections and
146+
not parsed_arguments.all_segments and
141147
not parsed_arguments.list_categories), \
142148
'Incorrect usage: --list cannot be specified in conjunction ' + \
143-
'with --additional-sections or --category.'
149+
'with --additional-sections or --additional-segments or --category.'
144150
# A file must be specified when using --list.
145151
assert parsed_arguments.files, \
146152
'Incorrect usage: Must specify between one and two files when ' + \
@@ -219,6 +225,7 @@ def main():
219225
if parsed_arguments.sum_sizes:
220226
compare_sizes_of_file(old_files, new_files,
221227
parsed_arguments.all_sections,
228+
parsed_arguments.all_segments,
222229
parsed_arguments.list_categories,
223230
csv=csv_out)
224231
else:
@@ -231,6 +238,7 @@ def main():
231238
for old_file, new_file in zip(old_files, new_files):
232239
compare_sizes_of_file([old_file], [new_file],
233240
parsed_arguments.all_sections,
241+
parsed_arguments.all_segments,
234242
parsed_arguments.list_categories,
235243
csv=csv_out)
236244

0 commit comments

Comments
 (0)