| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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') |
| OLD | NEW |