Index: tools/binary_size/libsupersize/describe.py |
diff --git a/tools/binary_size/libsupersize/describe.py b/tools/binary_size/libsupersize/describe.py |
index 5dd831d6570b9863b87714756b60669a9d16ca30..1b284f061fadb9fee699af76eab18df7eb3e6a41 100644 |
--- a/tools/binary_size/libsupersize/describe.py |
+++ b/tools/binary_size/libsupersize/describe.py |
@@ -75,9 +75,9 @@ class Describer(object): |
address = hex(sym.address) |
if self.verbose: |
count_part = ' count=%d' % len(sym) if sym.IsGroup() else '' |
- yield '{}@{:<9s} size={} padding={} size_without_padding={}{}'.format( |
- sym.section, address, sym.size, sym.padding, sym.size_without_padding, |
- count_part) |
+ yield '{}@{:<9s} pss={} padding={} size_without_padding={}{}'.format( |
+ sym.section, address, int(sym.pss), sym.padding, |
+ sym.size_without_padding, count_part) |
yield ' source_path={} \tobject_path={}'.format( |
sym.source_path, sym.object_path) |
if sym.name: |
@@ -89,7 +89,7 @@ class Describer(object): |
sym.FlagsString(), sym.full_name) |
else: |
yield '{}@{:<9s} {:<7} {}'.format( |
- sym.section, address, sym.size, |
+ sym.section, address, int(sym.pss), |
sym.source_path or sym.object_path or '{no path}') |
if sym.name: |
count_part = ' (count=%d)' % len(sym) if sym.IsGroup() else '' |
@@ -104,7 +104,7 @@ class Describer(object): |
diff_prefix = '' |
for s in sorted_syms: |
if group.IsBss() or not s.IsBss(): |
- running_total += s.size |
+ running_total += s.pss |
for l in self._DescribeSymbol(s): |
if l[:4].isspace(): |
indent_size = 8 + len(indent_prefix) + len(diff_prefix) |
@@ -113,28 +113,28 @@ class Describer(object): |
if is_diff: |
diff_prefix = _DiffPrefix(group, s) |
yield '{}{}{:8} {}'.format(indent_prefix, diff_prefix, |
- running_total, l) |
+ int(running_total), l) |
if self.recursive and s.IsGroup(): |
for l in self._DescribeSymbolGroupChildren(s, indent=indent + 1): |
yield l |
def _DescribeSymbolGroup(self, group): |
- total_size = group.size |
+ total_size = group.pss |
code_syms = group.WhereInSection('t') |
- code_size = code_syms.size |
- ro_size = code_syms.Inverted().WhereInSection('r').size |
+ code_size = code_syms.pss |
+ ro_size = code_syms.Inverted().WhereInSection('r').pss |
unique_paths = set(s.object_path for s in group) |
header_desc = [ |
- 'Showing {:,} symbols with total size: {} bytes'.format( |
- len(group), total_size), |
+ 'Showing {:,} symbols with total pss: {} bytes'.format( |
+ len(group), int(total_size)), |
'.text={:<10} .rodata={:<10} other={:<10} total={}'.format( |
- _PrettySize(code_size), _PrettySize(ro_size), |
- _PrettySize(total_size - code_size - ro_size), |
- _PrettySize(total_size)), |
+ _PrettySize(int(code_size)), _PrettySize(int(ro_size)), |
+ _PrettySize(int(total_size - code_size - ro_size)), |
+ _PrettySize(int(total_size))), |
'Number of object files: {}'.format(len(unique_paths)), |
'', |
- 'First columns are: running total, type, size', |
+ 'First columns are: running total, address, pss', |
] |
children_desc = self._DescribeSymbolGroupChildren(group) |
return itertools.chain(header_desc, children_desc) |
@@ -230,28 +230,38 @@ def DescribeSizeInfoCoverage(size_info): |
models.SECTION_TO_SECTION_NAME[section]] |
def one_stat(group): |
- template = ('Section %s has %.1f%% of %d bytes accounted for from ' |
- '%d symbols. %d bytes are unaccounted for. Padding ' |
- 'accounts for %d bytes') |
+ template = ('Section {}: has {:.1%} of {} bytes accounted for from ' |
+ '{} symbols. {} bytes are unaccounted for.') |
actual_size = group.size |
- count = len(group) |
- padding = group.padding |
- size_percent = 100.0 * actual_size / expected_size |
- return (template % (section, size_percent, actual_size, count, |
- expected_size - actual_size, padding)) |
+ size_percent = float(actual_size) / expected_size |
+ return template.format(section, size_percent, actual_size, len(group), |
+ expected_size - actual_size) |
in_section = symbols.WhereInSection(section) |
yield one_stat(in_section) |
+ yield '* Padding accounts for {} bytes ({:.1%})'.format( |
+ in_section.padding, float(in_section.padding) / in_section.size) |
+ aliased_symbols = in_section.Filter(lambda s: s.aliases) |
+ if len(aliased_symbols): |
+ uniques = sum(1 for s in aliased_symbols.IterUniqueSymbols()) |
+ yield '* Contains {} aliases, mapped to {} addresses ({} bytes)'.format( |
+ len(aliased_symbols), uniques, aliased_symbols.size) |
+ inlined_symbols = in_section.WhereObjectPathMatches('{shared}') |
+ if len(inlined_symbols): |
+ yield '* {} symbols have shared ownership ({} bytes)'.format( |
+ len(inlined_symbols), inlined_symbols.size) |
star_syms = in_section.WhereNameMatches(r'^\*') |
attributed_syms = star_syms.Inverted().WhereHasAnyAttribution() |
anonymous_syms = attributed_syms.Inverted() |
if star_syms or anonymous_syms: |
- missing_size = star_syms.size + anonymous_syms.size |
- yield ('+ Without %d merge sections and %d anonymous entries (' |
- 'accounting for %d bytes):') % ( |
- len(star_syms), len(anonymous_syms), missing_size) |
- yield '+ ' + one_stat(attributed_syms) |
+ missing_size = star_syms.pss + anonymous_syms.pss |
+ anon_str = '' |
+ if len(anonymous_syms): |
+ anon_str = 'and {} anonymous entries '.format(len(anonymous_syms)) |
+ yield '* Without {} merge sections {}(accounting for {} bytes):'.format( |
+ len(star_syms), anon_str, int(missing_size)) |
+ yield ' * ' + one_stat(attributed_syms) |
def _UtcToLocal(utc): |
@@ -270,7 +280,7 @@ def DescribeMetadata(metadata): |
_UtcToLocal(timestamp_obj).strftime('%Y-%m-%d %H:%M:%S')) |
gn_args = display_dict.get(models.METADATA_GN_ARGS) |
if gn_args: |
- display_dict[models.METADATA_GN_ARGS] = '; '.join(gn_args) |
+ display_dict[models.METADATA_GN_ARGS] = ' '.join(gn_args) |
return sorted('%s=%s' % t for t in display_dict.iteritems()) |