Chromium Code Reviews| 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 19 matching lines...) Expand all Loading... | |
| 30 | 30 |
| 31 | 31 |
| 32 def _FormatPss(pss): | 32 def _FormatPss(pss): |
| 33 # Shows a decimal for small numbers to make it clear that a shared symbol has | 33 # Shows a decimal for small numbers to make it clear that a shared symbol has |
| 34 # a non-zero pss. | 34 # a non-zero pss. |
| 35 if pss > 10: | 35 if pss > 10: |
| 36 return str(int(pss)) | 36 return str(int(pss)) |
| 37 ret = str(round(pss, 1)) | 37 ret = str(round(pss, 1)) |
| 38 if ret.endswith('.0'): | 38 if ret.endswith('.0'): |
| 39 ret = ret[:-2] | 39 ret = ret[:-2] |
| 40 if ret == '0' and pss: | |
| 41 ret = '~0' | |
|
estevenson
2017/05/16 15:11:07
nit: won't this actually only return ~0 for 0 < ps
agrieve
2017/05/16 15:22:31
Fixed commit msg.
| |
| 40 return ret | 42 return ret |
| 41 | 43 |
| 42 | 44 |
| 43 def _DiffPrefix(diff, sym): | 45 def _DiffPrefix(diff, sym): |
| 44 if diff.IsAdded(sym): | 46 if diff.IsAdded(sym): |
| 45 return '+ ' | 47 return '+ ' |
| 46 if diff.IsRemoved(sym): | 48 if diff.IsRemoved(sym): |
| 47 return '- ' | 49 return '- ' |
| 48 if sym.size: | 50 if sym.size: |
| 49 return '~ ' | 51 return '~ ' |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 155 unique_paths = set() | 157 unique_paths = set() |
| 156 for s in group.IterLeafSymbols(): | 158 for s in group.IterLeafSymbols(): |
| 157 if s.section == 't': | 159 if s.section == 't': |
| 158 code_size += s.pss | 160 code_size += s.pss |
| 159 elif s.section == 'r': | 161 elif s.section == 'r': |
| 160 ro_size += s.pss | 162 ro_size += s.pss |
| 161 elif s.section == 'd': | 163 elif s.section == 'd': |
| 162 data_size += s.pss | 164 data_size += s.pss |
| 163 elif s.section == 'b': | 165 elif s.section == 'b': |
| 164 bss_size += s.pss | 166 bss_size += s.pss |
| 165 unique_paths.add(s.object_path) | 167 # Ignore paths like foo/{shared}/2 |
| 168 if '{' not in s.object_path: | |
| 169 unique_paths.add(s.object_path) | |
| 166 header_desc = [ | 170 header_desc = [ |
| 167 'Showing {:,} symbols ({:,} unique) with total pss: {} bytes'.format( | 171 'Showing {:,} symbols ({:,} unique) with total pss: {} bytes'.format( |
| 168 len(group), group.CountUniqueSymbols(), int(total_size)), | 172 len(group), group.CountUniqueSymbols(), int(total_size)), |
| 169 '.text={:<10} .rodata={:<10} .data*={:<10} .bss={:<10} total={}'.format( | 173 '.text={:<10} .rodata={:<10} .data*={:<10} .bss={:<10} total={}'.format( |
| 170 _PrettySize(int(code_size)), _PrettySize(int(ro_size)), | 174 _PrettySize(int(code_size)), _PrettySize(int(ro_size)), |
| 171 _PrettySize(int(data_size)), _PrettySize(int(bss_size)), | 175 _PrettySize(int(data_size)), _PrettySize(int(bss_size)), |
| 172 _PrettySize(int(total_size))), | 176 _PrettySize(int(total_size))), |
| 173 'Number of object files: {}'.format(len(unique_paths)), | 177 'Number of unique paths: {}'.format(len(unique_paths)), |
| 174 '', | 178 '', |
| 175 'Index, Running Total, Section@Address, PSS', | 179 'Index, Running Total, Section@Address, PSS', |
| 176 '-' * 60 | 180 '-' * 60 |
| 177 ] | 181 ] |
| 178 children_desc = self._DescribeSymbolGroupChildren(group) | 182 children_desc = self._DescribeSymbolGroupChildren(group) |
| 179 return itertools.chain(header_desc, children_desc) | 183 return itertools.chain(header_desc, children_desc) |
| 180 | 184 |
| 181 def _DescribeSymbolDiff(self, diff): | 185 def _DescribeSymbolDiff(self, diff): |
| 182 header_template = ('{} symbols added (+), {} changed (~), {} removed (-), ' | 186 header_template = ('{} symbols added (+), {} changed (~), {} removed (-), ' |
| 183 '{} unchanged ({})') | 187 '{} unchanged ({})') |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 332 | 336 |
| 333 def GenerateLines(obj, verbose=False, recursive=False): | 337 def GenerateLines(obj, verbose=False, recursive=False): |
| 334 """Returns an iterable of lines (without \n) that describes |obj|.""" | 338 """Returns an iterable of lines (without \n) that describes |obj|.""" |
| 335 return Describer(verbose=verbose, recursive=recursive).GenerateLines(obj) | 339 return Describer(verbose=verbose, recursive=recursive).GenerateLines(obj) |
| 336 | 340 |
| 337 | 341 |
| 338 def WriteLines(lines, func): | 342 def WriteLines(lines, func): |
| 339 for l in lines: | 343 for l in lines: |
| 340 func(l) | 344 func(l) |
| 341 func('\n') | 345 func('\n') |
| OLD | NEW |