| Index: tools/binary_size/libsupersize/console.py
|
| diff --git a/tools/binary_size/libsupersize/console.py b/tools/binary_size/libsupersize/console.py
|
| index 40a8746a186fa1efcc2038d0f7d398bb1c7073ba..f898399489c5045711982576f1bce4a77545eecb 100644
|
| --- a/tools/binary_size/libsupersize/console.py
|
| +++ b/tools/binary_size/libsupersize/console.py
|
| @@ -22,6 +22,7 @@ import file_format
|
| import match_util
|
| import models
|
| import paths
|
| +import precanned_queries
|
|
|
|
|
| # Number of lines before using less for Print().
|
| @@ -68,7 +69,9 @@ class _Session(object):
|
| def __init__(self, size_infos, lazy_paths):
|
| self._variables = {
|
| 'Print': self._PrintFunc,
|
| - 'Diff': diff.Diff,
|
| + 'Diff': self._DiffFunc,
|
| + 'CategorizeByChromeComponent': self._CategorizeByChromeComponentFunc,
|
| + 'CategorizeGenerated': self._CategorizeGeneratedFunc,
|
| 'Disassemble': self._DisassembleFunc,
|
| 'ExpandRegex': match_util.ExpandRegexIdentifierPlaceholder,
|
| 'ShowExamples': self._ShowExamplesFunc,
|
| @@ -82,21 +85,58 @@ class _Session(object):
|
| for i, size_info in enumerate(size_infos):
|
| self._variables['size_info%d' % (i + 1)] = size_info
|
|
|
| - def _PrintFunc(self, obj, verbose=False, recursive=False, use_pager=None,
|
| + def _DiffFunc(before=None, after=None, cluster=True):
|
| + """Diffs two SizeInfo objects. Returns a SizeInfoDiff.
|
| +
|
| + Args:
|
| + before: Defaults to first size_infos[0].
|
| + after: Defaults to second size_infos[1].
|
| + cluster: When True, calls SymbolGroup.Cluster() after diffing. This
|
| + generally reduces noise.
|
| + """
|
| + before = before if before is not None else self._size_infos[0]
|
| + after = after if after is not None else self._size_infos[1]
|
| + return diff.Diff(before, after, cluster=cluster)
|
| +
|
| + def _PrintFunc(self, obj=None, verbose=False, recursive=False, use_pager=None,
|
| to_file=None):
|
| """Prints out the given Symbol / SymbolGroup / SymbolDiff / SizeInfo.
|
|
|
| Args:
|
| - obj: The object to be printed.
|
| + obj: The object to be printed. Defaults to size_infos[-1].
|
| verbose: Show more detailed output.
|
| recursive: Print children of nested SymbolGroups.
|
| use_pager: Pipe output through `less`. Ignored when |obj| is a Symbol.
|
| default is to automatically pipe when output is long.
|
| to_file: Rather than print to stdio, write to the given file.
|
| """
|
| + obj = obj if obj is not None else self._size_infos[-1]
|
| lines = describe.GenerateLines(obj, verbose=verbose, recursive=recursive)
|
| _WriteToStream(lines, use_pager=use_pager, to_file=to_file)
|
|
|
| + def _CategorizeByChromeComponentFunc(self, arg=None):
|
| + """Groups symbols by component using predefined queries.
|
| +
|
| + Args:
|
| + arg: A SizeInfo or SymbolGroup. Defaults to the size_infos[-1].
|
| + """
|
| + arg = arg if arg is not None else self._size_infos[-1]
|
| + if isinstance(arg, models.SizeInfo):
|
| + arg = arg.symbols
|
| + return precanned_queries.CategorizeByChromeComponent(arg)
|
| +
|
| + def _CategorizeGeneratedFunc(self, arg=None):
|
| + """Categorizes symbols from generated sources.
|
| +
|
| + Args:
|
| + arg: A SizeInfo or SymbolGroup. Defaults to the size_infos[-1].
|
| + """
|
| + arg = arg if arg is not None else self._size_infos[-1]
|
| + if isinstance(arg, models.SizeInfo):
|
| + arg = arg.symbols
|
| + return precanned_queries.CategorizeGenerated(arg)
|
| +
|
| +
|
| def _ElfPathForSymbol(self, symbol):
|
| size_info = None
|
| for size_info in self._size_infos:
|
| @@ -140,6 +180,7 @@ class _Session(object):
|
| proc.kill()
|
|
|
| def _ShowExamplesFunc(self):
|
| + print self._CreateBanner()
|
| print '\n'.join([
|
| '# Show pydoc for main types:',
|
| 'import models',
|
| @@ -150,12 +191,12 @@ class _Session(object):
|
| '',
|
| '# Show two levels of .text, grouped by first two subdirectories',
|
| 'text_syms = size_info.symbols.WhereInSection("t")',
|
| - 'by_path = text_syms.GroupBySourcePath(depth=2)',
|
| + 'by_path = text_syms.GroupByPath(depth=2)',
|
| 'Print(by_path.WhereBiggerThan(1024))',
|
| '',
|
| '# Show all non-vtable generated symbols',
|
| - 'generated_syms = size_info.symbols.WhereIsGenerated()',
|
| - 'Print(generated_syms.WhereNameMatches(r"vtable").Inverted())',
|
| + 'generated_syms = size_info.symbols.WhereGeneratedByToolchain()',
|
| + 'Print(generated_syms.WhereNameMatches(r"vtable").Inverted().Sorted())',
|
| '',
|
| '# Show all symbols that have "print" in their name or path, except',
|
| '# those within components/.',
|
| @@ -167,6 +208,10 @@ class _Session(object):
|
| '# Diff two .size files and save result to a file:',
|
| 'Print(Diff(size_info1, size_info2), to_file="output.txt")',
|
| '',
|
| + '# View per-component breakdowns, then inspect the "other" subgroup.',
|
| + 'c = GroupByChromeComponent()',
|
| + 'Print(c)',
|
| + 'Print(c[-1].GroupByPath(depth=2))',
|
| ])
|
|
|
| def _CreateBanner(self):
|
| @@ -185,7 +230,9 @@ class _Session(object):
|
| '',
|
| 'SizeInfo: %s' % ', '.join(symbol_info_keys),
|
| 'Symbol: %s' % ', '.join(symbol_keys),
|
| + '',
|
| 'SymbolGroup (extends Symbol): %s' % ', '.join(symbol_group_keys),
|
| + '',
|
| 'SymbolDiff (extends SymbolGroup): %s' % ', '.join(symbol_diff_keys),
|
| '',
|
| 'Functions: %s' % ', '.join('%s()' % f for f in functions),
|
|
|