Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Side by Side Diff: tools/binary_size/describe.py

Issue 2802293002: //tools/binary_size: Add object file count to Print() (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | tools/binary_size/file_format.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2017 The Chromium Authors. All rights reserved. 1 # Copyright 2017 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 """Methods for converting model objects to human-readable formats.""" 4 """Methods for converting model objects to human-readable formats."""
5 5
6 import datetime 6 import datetime
7 import itertools 7 import itertools
8 import time 8 import time
9 9
10 import models 10 import models
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 total_size = group.size 93 total_size = group.size
94 yield 'Showing {:,} symbols with total size: {} bytes'.format( 94 yield 'Showing {:,} symbols with total size: {} bytes'.format(
95 len(group), total_size) 95 len(group), total_size)
96 code_syms = group.WhereInSection('t') 96 code_syms = group.WhereInSection('t')
97 code_size = code_syms.size 97 code_size = code_syms.size
98 ro_size = code_syms.Inverted().WhereInSection('r').size 98 ro_size = code_syms.Inverted().WhereInSection('r').size
99 yield '.text={:<10} .rodata={:<10} other={:<10} total={}'.format( 99 yield '.text={:<10} .rodata={:<10} other={:<10} total={}'.format(
100 _PrettySize(code_size), _PrettySize(ro_size), 100 _PrettySize(code_size), _PrettySize(ro_size),
101 _PrettySize(total_size - code_size - ro_size), 101 _PrettySize(total_size - code_size - ro_size),
102 _PrettySize(total_size)) 102 _PrettySize(total_size))
103 unique_paths = set(s.object_path for s in group)
104 yield 'Number of object files: {}'.format(len(unique_paths))
105 yield ''
103 yield 'First columns are: running total, type, size' 106 yield 'First columns are: running total, type, size'
104 107
105 running_total = 0 108 running_total = 0
106 prefix = '' 109 prefix = ''
107 sorted_syms = group if group.is_sorted else group.Sorted() 110 sorted_syms = group if group.is_sorted else group.Sorted()
108 111
109 prefix = '' 112 prefix = ''
110 for s in sorted_syms: 113 for s in sorted_syms:
111 if group.IsBss() or not s.IsBss(): 114 if group.IsBss() or not s.IsBss():
112 running_total += s.size 115 running_total += s.size
113 for l in self._DescribeSymbol(s): 116 for l in self._DescribeSymbol(s):
114 if l[:4].isspace(): 117 if l[:4].isspace():
115 yield '{} {}'.format(' ' * (8 + len(prefix)), l) 118 yield '{} {}'.format(' ' * (8 + len(prefix)), l)
116 else: 119 else:
117 if prefix_func: 120 if prefix_func:
118 prefix = prefix_func(s) 121 prefix = prefix_func(s)
119 yield '{}{:8} {}'.format(prefix, running_total, l) 122 yield '{}{:8} {}'.format(prefix, running_total, l)
120 123
121 def _DescribeSymbolDiff(self, diff): 124 def _DescribeSymbolDiff(self, diff):
122 template = ('{} symbols added (+), {} changed (~), {} removed (-), ' 125 header_template = ('{} symbols added (+), {} changed (~), {} removed (-), '
123 '{} unchanged ({})') 126 '{} unchanged ({})')
124 unchanged_msg = '=' if self.verbose else 'not shown' 127 unchanged_msg = '=' if self.verbose else 'not shown'
125 header_str = (template.format( 128 symbol_delta_desc = [header_template.format(
126 diff.added_count, diff.changed_count, diff.removed_count, 129 diff.added_count, diff.changed_count, diff.removed_count,
127 diff.unchanged_count, unchanged_msg)) 130 diff.unchanged_count, unchanged_msg)]
131
132 similar_paths = set()
133 added_paths = set()
134 removed_paths = set()
135 for s in diff:
136 if diff.IsAdded(s):
137 added_paths.add(s.object_path)
138 elif diff.IsRemoved(s):
139 removed_paths.add(s.object_path)
140 else:
141 similar_paths.add(s.object_path)
142 added_paths.difference_update(similar_paths)
143 removed_paths.difference_update(similar_paths)
144 path_delta_desc = ['{} object files added, {} removed'.format(
145 len(added_paths), len(removed_paths))]
146 if self.verbose and len(added_paths):
147 path_delta_desc.append('Added files:')
148 path_delta_desc.extend(' ' + p for p in sorted(added_paths))
149 if self.verbose and len(removed_paths):
150 path_delta_desc.append('Removed files:')
151 path_delta_desc.extend(' ' + p for p in sorted(removed_paths))
128 152
129 def prefix_func(sym): 153 def prefix_func(sym):
130 if diff.IsAdded(sym): 154 if diff.IsAdded(sym):
131 return '+ ' 155 return '+ '
132 if diff.IsRemoved(sym): 156 if diff.IsRemoved(sym):
133 return '- ' 157 return '- '
134 if sym.size: 158 if sym.size:
135 return '~ ' 159 return '~ '
136 return '= ' 160 return '= '
137 161
138 diff = diff if self.verbose else diff.WhereNotUnchanged() 162 diff = diff if self.verbose else diff.WhereNotUnchanged()
139 group_desc = self._DescribeSymbolGroup(diff, prefix_func=prefix_func) 163 group_desc = self._DescribeSymbolGroup(diff, prefix_func=prefix_func)
140 return itertools.chain((header_str,), group_desc) 164 return itertools.chain(symbol_delta_desc, path_delta_desc, ('',),
165 group_desc)
141 166
142 def _DescribeSizeInfoDiff(self, diff): 167 def _DescribeSizeInfoDiff(self, diff):
143 common_metadata = {k: v for k, v in diff.old_metadata.iteritems() 168 common_metadata = {k: v for k, v in diff.old_metadata.iteritems()
144 if diff.new_metadata[k] == v} 169 if diff.new_metadata[k] == v}
145 old_metadata = {k: v for k, v in diff.old_metadata.iteritems() 170 old_metadata = {k: v for k, v in diff.old_metadata.iteritems()
146 if k not in common_metadata} 171 if k not in common_metadata}
147 new_metadata = {k: v for k, v in diff.new_metadata.iteritems() 172 new_metadata = {k: v for k, v in diff.new_metadata.iteritems()
148 if k not in common_metadata} 173 if k not in common_metadata}
149 metadata_desc = itertools.chain( 174 metadata_desc = itertools.chain(
150 ('Common Metadata:',), 175 ('Common Metadata:',),
151 (' %s' % line for line in DescribeMetadata(common_metadata)), 176 (' %s' % line for line in DescribeMetadata(common_metadata)),
152 ('Old Metadata:',), 177 ('Old Metadata:',),
153 (' %s' % line for line in DescribeMetadata(old_metadata)), 178 (' %s' % line for line in DescribeMetadata(old_metadata)),
154 ('New Metadata:',), 179 ('New Metadata:',),
155 (' %s' % line for line in DescribeMetadata(new_metadata))) 180 (' %s' % line for line in DescribeMetadata(new_metadata)))
156 section_desc = self._DescribeSectionSizes(diff.section_sizes) 181 section_desc = self._DescribeSectionSizes(diff.section_sizes)
157 group_desc = self.GenerateLines(diff.symbols) 182 group_desc = self.GenerateLines(diff.symbols)
158 return itertools.chain(metadata_desc, section_desc, ('',), group_desc) 183 return itertools.chain(metadata_desc, section_desc, ('',), group_desc)
159 184
160 def _DescribeSizeInfo(self, size_info): 185 def _DescribeSizeInfo(self, size_info):
161 metadata_desc = itertools.chain( 186 metadata_desc = itertools.chain(
162 ('Metadata:',), 187 ('Metadata:',),
163 (' %s' % line for line in DescribeMetadata(size_info.metadata))) 188 (' %s' % line for line in DescribeMetadata(size_info.metadata)))
164 section_desc = self._DescribeSectionSizes(size_info.section_sizes) 189 section_desc = self._DescribeSectionSizes(size_info.section_sizes)
190 coverage_desc = ()
191 if self.verbose:
192 coverage_desc = itertools.chain(
193 ('',), DescribeSizeInfoCoverage(size_info))
165 group_desc = self.GenerateLines(size_info.symbols) 194 group_desc = self.GenerateLines(size_info.symbols)
166 return itertools.chain(metadata_desc, section_desc, ('',), group_desc) 195 return itertools.chain(metadata_desc, section_desc, coverage_desc, ('',),
196 group_desc)
167 197
168 def GenerateLines(self, obj): 198 def GenerateLines(self, obj):
169 if isinstance(obj, models.SizeInfoDiff): 199 if isinstance(obj, models.SizeInfoDiff):
170 return self._DescribeSizeInfoDiff(obj) 200 return self._DescribeSizeInfoDiff(obj)
171 if isinstance(obj, models.SizeInfo): 201 if isinstance(obj, models.SizeInfo):
172 return self._DescribeSizeInfo(obj) 202 return self._DescribeSizeInfo(obj)
173 if isinstance(obj, models.SymbolDiff): 203 if isinstance(obj, models.SymbolDiff):
174 return self._DescribeSymbolDiff(obj) 204 return self._DescribeSymbolDiff(obj)
175 if isinstance(obj, models.SymbolGroup): 205 if isinstance(obj, models.SymbolGroup):
176 return self._DescribeSymbolGroup(obj) 206 return self._DescribeSymbolGroup(obj)
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 265
236 266
237 def GenerateLines(obj, verbose=False): 267 def GenerateLines(obj, verbose=False):
238 return Describer(verbose).GenerateLines(obj) 268 return Describer(verbose).GenerateLines(obj)
239 269
240 270
241 def WriteLines(lines, func): 271 def WriteLines(lines, func):
242 for l in lines: 272 for l in lines:
243 func(l) 273 func(l)
244 func('\n') 274 func('\n')
OLDNEW
« no previous file with comments | « no previous file | tools/binary_size/file_format.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698