| Index: tools/binary_size/libsupersize/models.py
|
| diff --git a/tools/binary_size/libsupersize/models.py b/tools/binary_size/libsupersize/models.py
|
| index c2784232a852d8ea72b32b1edc0a46c405815d95..1d19a0e32971c43963723197ad72ab8b71ff425b 100644
|
| --- a/tools/binary_size/libsupersize/models.py
|
| +++ b/tools/binary_size/libsupersize/models.py
|
| @@ -29,6 +29,7 @@ import logging
|
| import os
|
| import re
|
|
|
| +import cluster_symbols
|
| import match_util
|
|
|
|
|
| @@ -68,28 +69,28 @@ class SizeInfo(object):
|
|
|
| Fields:
|
| section_sizes: A dict of section_name -> size.
|
| - raw_symbols: A flat list of all symbols.
|
| - symbols: A SymbolGroup containing raw_symbols, but with some Symbols grouped
|
| - into sub-SymbolGroups.
|
| + symbols: A SymbolGroup containing all symbols, sorted by address.
|
| metadata: A dict.
|
| """
|
| __slots__ = (
|
| 'section_sizes',
|
| - 'raw_symbols',
|
| 'symbols',
|
| 'metadata',
|
| )
|
|
|
| """Root size information."""
|
| - def __init__(self, section_sizes, raw_symbols, grouped_symbols=None,
|
| - metadata=None):
|
| + def __init__(self, section_sizes, symbols, metadata=None):
|
| self.section_sizes = section_sizes # E.g. {'.text': 0}
|
| - # List of symbols sorted by address per-section.
|
| - self.raw_symbols = raw_symbols
|
| - # Root SymbolGroup. Cloned symbols grouped together within sub-SymbolGroups.
|
| - self.symbols = grouped_symbols
|
| + self.symbols = symbols
|
| self.metadata = metadata or {}
|
|
|
| + def Cluster(self):
|
| + """Returns a new SizeInfo with some symbols moved into subgroups.
|
| +
|
| + See SymbolGroup.Cluster() for more details.
|
| + """
|
| + return SizeInfo(self.section_sizes, self.symbols.Cluster(), self.metadata)
|
| +
|
|
|
| class SizeInfoDiff(object):
|
| """What you get when you Diff() two SizeInfo objects.
|
| @@ -378,11 +379,24 @@ class SymbolGroup(BaseSymbol):
|
| return True
|
|
|
| def _CreateTransformed(self, symbols, filtered_symbols=None, name=None,
|
| - section_name=None, is_sorted=None):
|
| + full_name=None, section_name=None, is_sorted=None):
|
| if is_sorted is None:
|
| is_sorted = self.is_sorted
|
| return SymbolGroup(symbols, filtered_symbols=filtered_symbols, name=name,
|
| - section_name=section_name, is_sorted=is_sorted)
|
| + full_name=full_name, section_name=section_name,
|
| + is_sorted=is_sorted)
|
| +
|
| + def Cluster(self):
|
| + """Returns a new SymbolGroup with some symbols moved into subgroups.
|
| +
|
| + Subgroups include:
|
| + * Symbols that have [clone] in their name (created during inlining).
|
| + * Star symbols (such as "** merge strings", and "** symbol gap")
|
| +
|
| + To view created groups:
|
| + Print(clustered.Filter(lambda s: s.IsGroup()), recursive=True)
|
| + """
|
| + return self._CreateTransformed(cluster_symbols.ClusterSymbols(self))
|
|
|
| def Sorted(self, cmp_func=None, key=None, reverse=False):
|
| # Default to sorting by abs(size) then name.
|
| @@ -627,18 +641,42 @@ class SymbolDiff(SymbolGroup):
|
| self.unchanged_count, self.size)
|
|
|
| def _CreateTransformed(self, symbols, filtered_symbols=None, name=None,
|
| - section_name=None, is_sorted=None):
|
| - ret = SymbolDiff.__new__(SymbolDiff)
|
| - # Printing sorts, so fast-path the same symbols case.
|
| + full_name=None, section_name=None, is_sorted=None):
|
| + # Printing sorts, so short-circuit the same symbols case.
|
| if len(symbols) == len(self._symbols):
|
| - ret._added_ids = self._added_ids
|
| - ret._removed_ids = self._removed_ids
|
| + new_added_ids = self._added_ids
|
| + new_removed_ids = self._removed_ids
|
| else:
|
| - ret._added_ids = set(id(s) for s in symbols if self.IsAdded(s))
|
| - ret._removed_ids = set(id(s) for s in symbols if self.IsRemoved(s))
|
| + old_added_ids = self._added_ids
|
| + old_removed_ids = self._removed_ids
|
| +
|
| + def get_status(sym):
|
| + obj_id = id(sym)
|
| + if obj_id in old_added_ids:
|
| + return 0
|
| + if obj_id in old_removed_ids:
|
| + return 1
|
| + if sym.IsGroup():
|
| + first_status = get_status(sym[0])
|
| + if all(get_status(s) == first_status for s in sym[1:]):
|
| + return first_status
|
| + return 2
|
| +
|
| + new_added_ids = set()
|
| + new_removed_ids = set()
|
| + for sym in symbols:
|
| + status = get_status(sym)
|
| + if status == 0:
|
| + new_added_ids.add(id(sym))
|
| + elif status == 1:
|
| + new_removed_ids.add(id(sym))
|
| +
|
| + ret = SymbolDiff.__new__(SymbolDiff)
|
| + ret._added_ids = new_added_ids
|
| + ret._removed_ids = new_removed_ids
|
| super(SymbolDiff, ret).__init__(
|
| symbols, filtered_symbols=filtered_symbols, name=name,
|
| - section_name=section_name, is_sorted=is_sorted)
|
| + full_name=full_name, section_name=section_name, is_sorted=is_sorted)
|
| return ret
|
|
|
| @property
|
|
|