Commit c36863be authored by Andrew Grieve's avatar Andrew Grieve Committed by Commit Bot

Supersize: Create aliases for inline symbols

If a symbol was found in multiple object files, we would previously have
changed its object path to be the common ancestor of all paths it
appeared in. This is a problem because it would cause queries based on
path to not find these symbols.

On the flip side, we were creating string literal aliases for every
path a string literal appeared in. For small strings such as "", or
"\n", this would lead to an unreasonable number of aliases.

This changes supersize to first create symbols for all paths, and then
collapse groups with a large number of aliases into a single symbol with
ancestor paths.

Before this change:
.text: 48998 symbols have shared ownership (1553806 bytes)
.rodata: 541 symbols have shared ownership (285728 bytes)

After:
.text: 1586 symbols have shared ownership (48252 bytes)
.rodata: 141 symbols have shared ownership (2828 bytes)

This increases the symbol count 702115->912322 and the file size
9.67mb->10.39mb.

This increases the runtime on my machine from ~40s -> ~42s.

Bug: 776032
Change-Id: I457361762b1f241f114b52464812e6035e881538
Reviewed-on: https://chromium-review.googlesource.com/726460
Commit-Queue: agrieve <agrieve@chromium.org>
Reviewed-by: default avatarSamuel Huang <huangs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#510205}
parent 8706ae03
...@@ -72,13 +72,12 @@ between milestones. ...@@ -72,13 +72,12 @@ between milestones.
1. A list of symbols, including name, address, size, 1. A list of symbols, including name, address, size,
padding (caused by alignment), and associated `.o` / `.cc` files. padding (caused by alignment), and associated `.o` / `.cc` files.
#### How are Symbols Collected? #### How are Symbols Collected?
1. Symbol list is Extracted from linker `.map` file. 1. Symbol list is Extracted from linker `.map` file.
* Map files contain some unique pieces of information, such as * Map files contain some unique pieces of information compared to `nm` output,
`** merge strings` entries, and the odd unnamed symbol (which map at least such as `** merge strings` entries, and some unnamed symbols (which
lists a `.o` path). although unnamed, contain the `.o` path).
1. `.o` files are mapped to `.cc` files by parsing `.ninja` files. 1. `.o` files are mapped to `.cc` files by parsing `.ninja` files.
* This means that `.h` files are never listed as sources. No information about * This means that `.h` files are never listed as sources. No information about
inlined symbols is gathered. inlined symbols is gathered.
...@@ -87,8 +86,15 @@ between milestones. ...@@ -87,8 +86,15 @@ between milestones.
* Aliases are created by identical code folding (linker optimization). * Aliases are created by identical code folding (linker optimization).
* Aliases have the same address and size, but report their `.pss` as * Aliases have the same address and size, but report their `.pss` as
`.size / .num_aliases`. `.size / .num_aliases`.
1. Paths for shared symbols (those found in multiple `.o` files) are collected 1. `** merge strings` symbols are further broken down into individual string
by running `nm` on every `.o` file. literal symbols. This is done by reading string literals from `.o` files, and
then searching for them within the `** merge strings` sections.
1. "Shared symbols" are those that are owned by multiple `.o` files. These include
inline functions defined in `.h` files, and string literals that are de-duped
at link-time. Shared symbols are normally represented using one symbol alias
per path, but are sometimes collapsed into a single symbol where the path is
set to `{shared}/$SYMBOL_COUNT`. This collapsing is done only for symbols owned
by a large number of paths.
#### What Other Processing Happens? #### What Other Processing Happens?
......
...@@ -30,6 +30,18 @@ import nm ...@@ -30,6 +30,18 @@ import nm
import paths import paths
# Effect of _MAX_SAME_NAME_ALIAS_COUNT (as of Oct 2017, with min_pss = max):
# 1: shared .text symbols = 1772874 bytes, file size = 9.43MiB (645476 symbols).
# 2: shared .text symbols = 1065654 bytes, file size = 9.58MiB (669952 symbols).
# 6: shared .text symbols = 464058 bytes, file size = 10.11MiB (782693 symbols).
# 10: shared .text symbols = 365648 bytes, file size =10.24MiB (813758 symbols).
# 20: shared .text symbols = 86202 bytes, file size = 10.38MiB (854548 symbols).
# 40: shared .text symbols = 48424 bytes, file size = 10.50MiB (890396 symbols).
# 50: shared .text symbols = 41860 bytes, file size = 10.54MiB (902304 symbols).
# max: shared .text symbols = 0 bytes, file size = 11.10MiB (1235449 symbols).
_MAX_SAME_NAME_ALIAS_COUNT = 40 # 50kb is basically negligable.
def _OpenMaybeGz(path, mode=None): def _OpenMaybeGz(path, mode=None):
"""Calls `gzip.open()` if |path| ends in ".gz", otherwise calls `open()`.""" """Calls `gzip.open()` if |path| ends in ".gz", otherwise calls `open()`."""
if path.endswith('.gz'): if path.endswith('.gz'):
...@@ -181,76 +193,133 @@ def _NormalizeSourcePath(path): ...@@ -181,76 +193,133 @@ def _NormalizeSourcePath(path):
return True, path return True, path
def _SourcePathForObjectPath(object_path, source_mapper): def _ExtractSourcePathsAndNormalizeObjectPaths(raw_symbols, source_mapper):
"""Returns (is_generated, normalized_path)""" """Fills in the |source_path| attribute and normalizes |object_path|."""
# We don't have source info for prebuilt .a files. if source_mapper:
if not os.path.isabs(object_path) and not object_path.startswith('..'): logging.info('Looking up source paths from ninja files')
source_path = source_mapper.FindSourceForPath(object_path) for symbol in raw_symbols:
if source_path: object_path = symbol.object_path
return _NormalizeSourcePath(source_path) if object_path:
return False, '' # We don't have source info for prebuilt .a files.
if not os.path.isabs(object_path) and not object_path.startswith('..'):
source_path = source_mapper.FindSourceForPath(object_path)
def _ExtractSourcePaths(raw_symbols, source_mapper): if source_path:
"""Fills in the |source_path| attribute.""" symbol.generated_source, symbol.source_path = (
for symbol in raw_symbols: _NormalizeSourcePath(source_path))
object_path = symbol.object_path symbol.object_path = _NormalizeObjectPath(object_path)
if object_path and not symbol.source_path: assert source_mapper.unmatched_paths_count == 0, (
symbol.generated_source, symbol.source_path = ( 'One or more source file paths could not be found. Likely caused by '
_SourcePathForObjectPath(object_path, source_mapper)) '.ninja files being generated at a different time than the .map file.')
else:
logging.info('Normalizing object paths')
for symbol in raw_symbols:
if symbol.object_path:
symbol.object_path = _NormalizeObjectPath(symbol.object_path)
def _ComputeAncestorPath(path_list): def _ComputeAncestorPath(path_list, symbol_count):
"""Returns the common ancestor of the given paths.""" """Returns the common ancestor of the given paths."""
# Ignore missing paths. if not path_list:
path_list = [p for p in path_list if p] return ''
prefix = os.path.commonprefix(path_list) prefix = os.path.commonprefix(path_list)
# Put the path count as a subdirectory to allow for better grouping when # Check if all paths were the same.
# path-based breakdowns.
if not prefix:
if len(path_list) < 2:
return ''
return os.path.join('{shared}', str(len(path_list)))
if prefix == path_list[0]: if prefix == path_list[0]:
return prefix return prefix
assert len(path_list) > 1, 'path_list: ' + repr(path_list)
return os.path.join(os.path.dirname(prefix), '{shared}', str(len(path_list)))
# Put in buckets to cut down on the number of unique paths.
if symbol_count >= 100:
symbol_count_str = '100+'
elif symbol_count >= 50:
symbol_count_str = '50-99'
elif symbol_count >= 20:
symbol_count_str = '20-49'
elif symbol_count >= 10:
symbol_count_str = '10-19'
else:
symbol_count_str = str(symbol_count)
# This must normalize object paths at the same time because normalization # Put the path count as a subdirectory so that grouping by path will show
# needs to occur before finding common ancestor. # "{shared}" as a bucket, and the symbol counts as leafs.
def _ComputeAncestorPathsAndNormalizeObjectPaths( if not prefix:
raw_symbols, object_paths_by_name, source_mapper): return os.path.join('{shared}', symbol_count_str)
return os.path.join(os.path.dirname(prefix), '{shared}', symbol_count_str)
def _CompactLargeAliasesIntoSharedSymbols(raw_symbols):
"""Converts symbols with large number of aliases into single symbols.
The merged symbol's path fields are changed to common-ancestor paths in
the form: common/dir/{shared}/$SYMBOL_COUNT
Assumes aliases differ only by path (not by name).
"""
num_raw_symbols = len(raw_symbols)
num_shared_symbols = 0
src_cursor = 0
dst_cursor = 0
while src_cursor < num_raw_symbols:
symbol = raw_symbols[src_cursor]
raw_symbols[dst_cursor] = symbol
dst_cursor += 1
aliases = symbol.aliases
if aliases and len(aliases) > _MAX_SAME_NAME_ALIAS_COUNT:
symbol.source_path = _ComputeAncestorPath(
[s.source_path for s in aliases if s.source_path], len(aliases))
symbol.object_path = _ComputeAncestorPath(
[s.object_path for s in aliases if s.object_path], len(aliases))
symbol.generated_source = all(s.generated_source for s in aliases)
symbol.aliases = None
num_shared_symbols += 1
src_cursor += len(aliases)
else:
src_cursor += 1
raw_symbols[dst_cursor:] = []
num_removed = src_cursor - dst_cursor
logging.debug('Converted %d aliases into %d shared-path symbols',
num_removed, num_shared_symbols)
def _ConnectNmAliases(raw_symbols):
"""Ensures |aliases| is set correctly for all symbols."""
prev_sym = raw_symbols[0]
for sym in raw_symbols[1:]:
# Don't merge bss symbols.
if sym.address > 0 and prev_sym.address == sym.address:
# Don't merge padding-only symbols (** symbol gaps).
if prev_sym.size > 0:
# Don't merge if already merged.
if prev_sym.aliases is None or prev_sym.aliases is not sym.aliases:
if prev_sym.aliases:
prev_sym.aliases.append(sym)
else:
prev_sym.aliases = [prev_sym, sym]
sym.aliases = prev_sym.aliases
prev_sym = sym
def _AssignNmAliasPathsAndCreatePathAliases(raw_symbols, object_paths_by_name):
num_found_paths = 0 num_found_paths = 0
num_unknown_names = 0 num_unknown_names = 0
num_path_mismatches = 0 num_path_mismatches = 0
num_unmatched_aliases = 0 num_aliases_created = 0
ret = []
for symbol in raw_symbols: for symbol in raw_symbols:
ret.append(symbol)
full_name = symbol.full_name full_name = symbol.full_name
if (symbol.IsBss() or if (symbol.IsBss() or
not full_name or not full_name or
full_name[0] in '*.' or # e.g. ** merge symbols, .Lswitch.table full_name[0] in '*.' or # e.g. ** merge symbols, .Lswitch.table
full_name == 'startup'): full_name == 'startup'):
symbol.object_path = _NormalizeObjectPath(symbol.object_path)
continue continue
object_paths = object_paths_by_name.get(full_name) object_paths = object_paths_by_name.get(full_name)
if object_paths: if object_paths:
num_found_paths += 1 num_found_paths += 1
else: else:
if not symbol.object_path and symbol.aliases:
# Happens when aliases are from object files where all symbols were
# pruned or de-duped as aliases. Since we are only scanning .o files
# referenced by included symbols, such files are missed.
# TODO(agrieve): This could be fixed by retrieving linker inputs from
# build.ninja, or by looking for paths within the .map file's
# discarded sections.
num_unmatched_aliases += 1
continue
if num_unknown_names < 10: if num_unknown_names < 10:
logging.warning('Symbol not found in any .o files: %r', symbol) logging.warning('Symbol not found in any .o files: %r', symbol)
num_unknown_names += 1 num_unknown_names += 1
symbol.object_path = _NormalizeObjectPath(symbol.object_path)
continue continue
if symbol.object_path and symbol.object_path not in object_paths: if symbol.object_path and symbol.object_path not in object_paths:
...@@ -258,21 +327,30 @@ def _ComputeAncestorPathsAndNormalizeObjectPaths( ...@@ -258,21 +327,30 @@ def _ComputeAncestorPathsAndNormalizeObjectPaths(
logging.warning('Symbol path reported by .map not found by nm.') logging.warning('Symbol path reported by .map not found by nm.')
logging.warning('sym=%r', symbol) logging.warning('sym=%r', symbol)
logging.warning('paths=%r', object_paths) logging.warning('paths=%r', object_paths)
object_paths.append(symbol.object_path)
object_paths.sort()
num_path_mismatches += 1 num_path_mismatches += 1
if source_mapper: symbol.object_path = object_paths[0]
tups = [
_SourcePathForObjectPath(p, source_mapper) for p in object_paths]
symbol.source_path = _ComputeAncestorPath(t[1] for t in tups)
symbol.generated_source = all(t[0] for t in tups)
object_paths = [_NormalizeObjectPath(p) for p in object_paths] if len(object_paths) > 1:
symbol.object_path = _ComputeAncestorPath(object_paths) # Create one symbol for each object_path.
aliases = symbol.aliases or [symbol]
symbol.aliases = aliases
num_aliases_created += len(object_paths) - 1
for object_path in object_paths[1:]:
new_sym = models.Symbol(
symbol.section_name, symbol.size, address=symbol.address,
full_name=full_name, object_path=object_path, aliases=aliases)
aliases.append(new_sym)
ret.append(new_sym)
logging.debug('Cross-referenced %d symbols with nm output. ' logging.debug('Cross-referenced %d symbols with nm output. '
'num_unknown_names=%d num_path_mismatches=%d ' 'num_unknown_names=%d num_path_mismatches=%d '
'num_unused_aliases=%d', num_found_paths, num_unknown_names, 'num_aliases_created=%d',
num_path_mismatches, num_unmatched_aliases) num_found_paths, num_unknown_names, num_path_mismatches,
num_aliases_created)
return ret
def _DiscoverMissedObjectPaths(raw_symbols, elf_object_paths): def _DiscoverMissedObjectPaths(raw_symbols, elf_object_paths):
...@@ -291,8 +369,7 @@ def _DiscoverMissedObjectPaths(raw_symbols, elf_object_paths): ...@@ -291,8 +369,7 @@ def _DiscoverMissedObjectPaths(raw_symbols, elf_object_paths):
def _CreateMergeStringsReplacements(merge_string_syms, def _CreateMergeStringsReplacements(merge_string_syms,
list_of_positions_by_object_path, list_of_positions_by_object_path):
source_mapper):
"""Creates replacement symbols for |merge_syms|.""" """Creates replacement symbols for |merge_syms|."""
ret = [] ret = []
NAME_PREFIX = models.STRING_LITERAL_NAME_PREFIX NAME_PREFIX = models.STRING_LITERAL_NAME_PREFIX
...@@ -307,12 +384,9 @@ def _CreateMergeStringsReplacements(merge_string_syms, ...@@ -307,12 +384,9 @@ def _CreateMergeStringsReplacements(merge_string_syms,
for object_path, positions in positions_by_object_path.iteritems(): for object_path, positions in positions_by_object_path.iteritems():
for offset, size in positions: for offset, size in positions:
address = merge_sym_address + offset address = merge_sym_address + offset
symbol = models.Symbol('.rodata', size, address, symbol = models.Symbol(
NAME_PREFIX + name_suffix, '.rodata', size, address, NAME_PREFIX + name_suffix,
object_path=_NormalizeObjectPath(object_path)) object_path=object_path)
if source_mapper:
symbol.generated_source, symbol.source_path = (
_SourcePathForObjectPath(object_path, source_mapper))
new_symbols.append(symbol) new_symbols.append(symbol)
logging.debug('Created %d string literal symbols', sum(len(x) for x in ret)) logging.debug('Created %d string literal symbols', sum(len(x) for x in ret))
...@@ -408,7 +482,8 @@ def _CalculatePadding(raw_symbols): ...@@ -408,7 +482,8 @@ def _CalculatePadding(raw_symbols):
'%r\nprev symbol: %r' % (symbol, prev_symbol)) '%r\nprev symbol: %r' % (symbol, prev_symbol))
def _AddSymbolAliases(raw_symbols, aliases_by_address): def _AddNmAliases(raw_symbols, names_by_address):
"""Adds symbols that were removed by identical code folding."""
# Step 1: Create list of (index_of_symbol, name_list). # Step 1: Create list of (index_of_symbol, name_list).
logging.debug('Creating alias list') logging.debug('Creating alias list')
replacements = [] replacements = []
...@@ -417,7 +492,7 @@ def _AddSymbolAliases(raw_symbols, aliases_by_address): ...@@ -417,7 +492,7 @@ def _AddSymbolAliases(raw_symbols, aliases_by_address):
# Don't alias padding-only symbols (e.g. ** symbol gap) # Don't alias padding-only symbols (e.g. ** symbol gap)
if s.size_without_padding == 0: if s.size_without_padding == 0:
continue continue
name_list = aliases_by_address.get(s.address) name_list = names_by_address.get(s.address)
if name_list: if name_list:
if s.full_name not in name_list: if s.full_name not in name_list:
logging.warning('Name missing from aliases: %s %s', s.full_name, logging.warning('Name missing from aliases: %s %s', s.full_name,
...@@ -427,15 +502,12 @@ def _AddSymbolAliases(raw_symbols, aliases_by_address): ...@@ -427,15 +502,12 @@ def _AddSymbolAliases(raw_symbols, aliases_by_address):
num_new_symbols += len(name_list) - 1 num_new_symbols += len(name_list) - 1
if float(num_new_symbols) / len(raw_symbols) < .05: if float(num_new_symbols) / len(raw_symbols) < .05:
# TODO(agrieve): Figure out if there's a way to get alias information from
# clang-compiled nm.
logging.warning('Number of aliases is oddly low (%.0f%%). It should ' logging.warning('Number of aliases is oddly low (%.0f%%). It should '
'usually be around 25%%. Ensure --tool-prefix is correct. ' 'usually be around 25%%. Ensure --tool-prefix is correct. ',
'Ignore this if you compiled with clang.',
float(num_new_symbols) / len(raw_symbols) * 100) float(num_new_symbols) / len(raw_symbols) * 100)
# Step 2: Create new symbols as siblings to each existing one. # Step 2: Create new symbols as siblings to each existing one.
logging.debug('Creating %d aliases', num_new_symbols) logging.debug('Creating %d new symbols from nm output', num_new_symbols)
src_cursor_end = len(raw_symbols) src_cursor_end = len(raw_symbols)
raw_symbols += [None] * num_new_symbols raw_symbols += [None] * num_new_symbols
dst_cursor_end = len(raw_symbols) dst_cursor_end = len(raw_symbols)
...@@ -449,15 +521,14 @@ def _AddSymbolAliases(raw_symbols, aliases_by_address): ...@@ -449,15 +521,14 @@ def _AddSymbolAliases(raw_symbols, aliases_by_address):
sym = raw_symbols[src_index] sym = raw_symbols[src_index]
src_cursor_end -= 1 src_cursor_end -= 1
# Create aliases (does not bother reusing the existing symbol). # Create symbols (does not bother reusing the existing symbol).
aliases = [None] * len(name_list)
for i, full_name in enumerate(name_list): for i, full_name in enumerate(name_list):
aliases[i] = models.Symbol( dst_cursor_end -= 1
sym.section_name, sym.size, address=sym.address, full_name=full_name, # Do not set |aliases| in order to avoid being pruned by
aliases=aliases) # _CompactLargeAliasesIntoSharedSymbols(), which assumes aliases differ
# only by path. The field will be set afterwards by _ConnectNmAliases().
dst_cursor_end -= len(aliases) raw_symbols[dst_cursor_end] = models.Symbol(
raw_symbols[dst_cursor_end:dst_cursor_end + len(aliases)] = aliases sym.section_name, sym.size, address=sym.address, full_name=full_name)
assert dst_cursor_end == src_cursor_end assert dst_cursor_end == src_cursor_end
...@@ -572,6 +643,7 @@ def CreateSizeInfo(map_path, elf_path, tool_prefix, output_directory, ...@@ -572,6 +643,7 @@ def CreateSizeInfo(map_path, elf_path, tool_prefix, output_directory,
missed_object_paths = _DiscoverMissedObjectPaths( missed_object_paths = _DiscoverMissedObjectPaths(
raw_symbols, elf_object_paths) raw_symbols, elf_object_paths)
bulk_analyzer.AnalyzePaths(missed_object_paths) bulk_analyzer.AnalyzePaths(missed_object_paths)
bulk_analyzer.SortPaths()
if track_string_literals: if track_string_literals:
merge_string_syms = [ merge_string_syms = [
s for s in raw_symbols if s.full_name == '** merge strings'] s for s in raw_symbols if s.full_name == '** merge strings']
...@@ -581,13 +653,6 @@ def CreateSizeInfo(map_path, elf_path, tool_prefix, output_directory, ...@@ -581,13 +653,6 @@ def CreateSizeInfo(map_path, elf_path, tool_prefix, output_directory,
string_positions = [(s.address, s.size) for s in merge_string_syms] string_positions = [(s.address, s.size) for s in merge_string_syms]
bulk_analyzer.AnalyzeStringLiterals(elf_path, string_positions) bulk_analyzer.AnalyzeStringLiterals(elf_path, string_positions)
if source_mapper:
logging.info('Looking up source paths from ninja files')
_ExtractSourcePaths(raw_symbols, source_mapper)
assert source_mapper.unmatched_paths_count == 0, (
'One or more source file paths could not be found. Likely caused by '
'.ninja files being generated at a different time than the .map file.')
logging.info('Stripping linker prefixes from symbol names') logging.info('Stripping linker prefixes from symbol names')
_StripLinkerAddedSymbolPrefixes(raw_symbols) _StripLinkerAddedSymbolPrefixes(raw_symbols)
# Map file for some reason doesn't unmangle all names. # Map file for some reason doesn't unmangle all names.
...@@ -595,10 +660,11 @@ def CreateSizeInfo(map_path, elf_path, tool_prefix, output_directory, ...@@ -595,10 +660,11 @@ def CreateSizeInfo(map_path, elf_path, tool_prefix, output_directory,
_UnmangleRemainingSymbols(raw_symbols, tool_prefix) _UnmangleRemainingSymbols(raw_symbols, tool_prefix)
if elf_path: if elf_path:
logging.info('Adding aliased symbols, as reported by nm') logging.info(
'Adding symbols removed by identical code folding (as reported by nm)')
# This normally does not block (it's finished by this time). # This normally does not block (it's finished by this time).
aliases_by_address = elf_nm_result.get() names_by_address = elf_nm_result.get()
_AddSymbolAliases(raw_symbols, aliases_by_address) _AddNmAliases(raw_symbols, names_by_address)
if output_directory: if output_directory:
object_paths_by_name = bulk_analyzer.GetSymbolNames() object_paths_by_name = bulk_analyzer.GetSymbolNames()
...@@ -607,10 +673,9 @@ def CreateSizeInfo(map_path, elf_path, tool_prefix, output_directory, ...@@ -607,10 +673,9 @@ def CreateSizeInfo(map_path, elf_path, tool_prefix, output_directory,
len(elf_object_paths) + len(missed_object_paths)) len(elf_object_paths) + len(missed_object_paths))
# For aliases, this provides path information where there wasn't any. # For aliases, this provides path information where there wasn't any.
logging.info('Computing ancestor paths for inline functions and ' logging.info('Creating aliases for symbols shared by multiple paths')
'normalizing object paths') raw_symbols = _AssignNmAliasPathsAndCreatePathAliases(
_ComputeAncestorPathsAndNormalizeObjectPaths( raw_symbols, object_paths_by_name)
raw_symbols, object_paths_by_name, source_mapper)
if track_string_literals: if track_string_literals:
logging.info('Waiting for string literal extraction to complete.') logging.info('Waiting for string literal extraction to complete.')
...@@ -620,19 +685,22 @@ def CreateSizeInfo(map_path, elf_path, tool_prefix, output_directory, ...@@ -620,19 +685,22 @@ def CreateSizeInfo(map_path, elf_path, tool_prefix, output_directory,
if track_string_literals: if track_string_literals:
logging.info('Deconstructing ** merge strings into literals') logging.info('Deconstructing ** merge strings into literals')
replacements = _CreateMergeStringsReplacements(merge_string_syms, replacements = _CreateMergeStringsReplacements(merge_string_syms,
list_of_positions_by_object_path, source_mapper) list_of_positions_by_object_path)
for merge_sym, literal_syms in itertools.izip( for merge_sym, literal_syms in itertools.izip(
merge_string_syms, replacements): merge_string_syms, replacements):
# Don't replace if no literals were found. # Don't replace if no literals were found.
if literal_syms: if literal_syms:
# Re-find the symbols since aliases cause their indices to change. # Re-find the symbols since aliases cause their indices to change.
idx = raw_symbols.index(merge_sym) idx = raw_symbols.index(merge_sym)
# This assignment is a bit slow (causes array to be shifted), but
# is fast enough since len(merge_string_syms) < 10.
raw_symbols[idx:idx + 1] = literal_syms raw_symbols[idx:idx + 1] = literal_syms
if not elf_path or not output_directory: _ExtractSourcePathsAndNormalizeObjectPaths(raw_symbols, source_mapper)
logging.info('Normalizing object paths.') logging.info('Converting excessive aliases into shared-path symbols')
for symbol in raw_symbols: _CompactLargeAliasesIntoSharedSymbols(raw_symbols)
symbol.object_path = _NormalizeObjectPath(symbol.object_path) logging.debug('Connecting nm aliases')
_ConnectNmAliases(raw_symbols)
# Padding not really required, but it is useful to check for large padding and # Padding not really required, but it is useful to check for large padding and
# log a warning. # log a warning.
...@@ -836,4 +904,5 @@ def Run(args, parser): ...@@ -836,4 +904,5 @@ def Run(args, parser):
'\n '.join(describe.DescribeMetadata(size_info.metadata))) '\n '.join(describe.DescribeMetadata(size_info.metadata)))
logging.info('Saving result to %s', args.size_file) logging.info('Saving result to %s', args.size_file)
file_format.SaveSizeInfo(size_info, args.size_file) file_format.SaveSizeInfo(size_info, args.size_file)
logging.info('Done. File size is %d bytes.', os.path.getsize(args.size_file)) size_in_mb = os.path.getsize(args.size_file) / 1024.0 / 1024.0
logging.info('Done. File size is %.2fMiB.', size_in_mb)
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
import cStringIO import cStringIO
import calendar import calendar
import collections
import datetime import datetime
import gzip import gzip
import json import json
...@@ -43,13 +42,13 @@ def _SaveSizeInfoToFile(size_info, file_obj): ...@@ -43,13 +42,13 @@ def _SaveSizeInfoToFile(size_info, file_obj):
_LogSize(file_obj, 'header') # For libchrome: 570 bytes. _LogSize(file_obj, 'header') # For libchrome: 570 bytes.
# Store a single copy of all paths and have them referenced by index. # Store a single copy of all paths and have them referenced by index.
# Using an OrderedDict makes the indices more repetitive (better compression). unique_path_tuples = sorted(set(
path_tuples = collections.OrderedDict.fromkeys( (s.object_path, s.source_path) for s in size_info.raw_symbols))
(s.object_path, s.source_path) for s in size_info.raw_symbols) path_tuples = dict.fromkeys(unique_path_tuples)
for i, key in enumerate(path_tuples): for i, tup in enumerate(unique_path_tuples):
path_tuples[key] = i path_tuples[tup] = i
file_obj.write('%d\n' % len(path_tuples)) file_obj.write('%d\n' % len(unique_path_tuples))
file_obj.writelines('%s\t%s\n' % pair for pair in path_tuples) file_obj.writelines('%s\t%s\n' % pair for pair in unique_path_tuples)
_LogSize(file_obj, 'paths') # For libchrome, adds 200kb. _LogSize(file_obj, 'paths') # For libchrome, adds 200kb.
# Symbol counts by section. # Symbol counts by section.
......
...@@ -218,8 +218,8 @@ class IntegrationTest(unittest.TestCase): ...@@ -218,8 +218,8 @@ class IntegrationTest(unittest.TestCase):
size_info2 = self._CloneSizeInfo() size_info2 = self._CloneSizeInfo()
# Removing 1 alias should not change the size. # Removing 1 alias should not change the size.
a1, _, _ = ( a1, _, _, _ = (
size_info2.raw_symbols.Filter(lambda s: s.num_aliases == 3)[0].aliases) size_info2.raw_symbols.Filter(lambda s: s.num_aliases == 4)[0].aliases)
size_info2.raw_symbols -= [a1] size_info2.raw_symbols -= [a1]
a1.aliases.remove(a1) a1.aliases.remove(a1)
d = diff.Diff(size_info1, size_info2) d = diff.Diff(size_info1, size_info2)
...@@ -239,8 +239,8 @@ class IntegrationTest(unittest.TestCase): ...@@ -239,8 +239,8 @@ class IntegrationTest(unittest.TestCase):
size_info2 = self._CloneSizeInfo() size_info2 = self._CloneSizeInfo()
# Removing 2 aliases should not change the size. # Removing 2 aliases should not change the size.
a1, a2, _ = ( a1, _, a2, _ = (
size_info2.raw_symbols.Filter(lambda s: s.num_aliases == 3)[0].aliases) size_info2.raw_symbols.Filter(lambda s: s.num_aliases == 4)[0].aliases)
size_info2.raw_symbols -= [a1, a2] size_info2.raw_symbols -= [a1, a2]
a1.aliases.remove(a1) a1.aliases.remove(a1)
a1.aliases.remove(a2) a1.aliases.remove(a2)
...@@ -255,22 +255,22 @@ class IntegrationTest(unittest.TestCase): ...@@ -255,22 +255,22 @@ class IntegrationTest(unittest.TestCase):
self.assertEquals((0, 2, 0), _DiffCounts(d.raw_symbols)) self.assertEquals((0, 2, 0), _DiffCounts(d.raw_symbols))
self.assertEquals((1, 1, 0), _DiffCounts(d.symbols.GroupedByFullName())) self.assertEquals((1, 1, 0), _DiffCounts(d.symbols.GroupedByFullName()))
def test_Diff_Aliases3(self): def test_Diff_Aliases4(self):
size_info1 = self._CloneSizeInfo() size_info1 = self._CloneSizeInfo()
size_info2 = self._CloneSizeInfo() size_info2 = self._CloneSizeInfo()
# Removing all 3 aliases should change the size. # Removing all 4 aliases should change the size.
a1, a2, a3 = ( a1, a2, a3, a4 = (
size_info2.raw_symbols.Filter(lambda s: s.num_aliases == 3)[0].aliases) size_info2.raw_symbols.Filter(lambda s: s.num_aliases == 4)[0].aliases)
size_info2.raw_symbols -= [a1, a2, a3] size_info2.raw_symbols -= [a1, a2, a3, a4]
d = diff.Diff(size_info1, size_info2) d = diff.Diff(size_info1, size_info2)
self.assertEquals((0, 0, 3), _DiffCounts(d.raw_symbols)) self.assertEquals((0, 0, 4), _DiffCounts(d.raw_symbols))
self.assertEquals((1, 0, 2), _DiffCounts(d.symbols.GroupedByFullName())) self.assertEquals((1, 0, 2), _DiffCounts(d.symbols.GroupedByFullName()))
# Adding all 3 aliases should change size. # Adding all 4 aliases should change size.
d = diff.Diff(size_info2, size_info1) d = diff.Diff(size_info2, size_info1)
self.assertEquals(d.raw_symbols.pss, a1.size) self.assertEquals(d.raw_symbols.pss, a1.size)
self.assertEquals((0, 3, 0), _DiffCounts(d.raw_symbols)) self.assertEquals((0, 4, 0), _DiffCounts(d.raw_symbols))
self.assertEquals((1, 2, 0), _DiffCounts(d.symbols.GroupedByFullName())) self.assertEquals((1, 2, 0), _DiffCounts(d.symbols.GroupedByFullName()))
def test_Diff_Clustering(self): def test_Diff_Clustering(self):
......
...@@ -31,6 +31,7 @@ BulkObjectFileAnalyzer: ...@@ -31,6 +31,7 @@ BulkObjectFileAnalyzer:
alias for _BulkObjectFileAnalyzerWorker. alias for _BulkObjectFileAnalyzerWorker.
* AnalyzePaths: Run "nm" on all .o files to collect symbol names that exist * AnalyzePaths: Run "nm" on all .o files to collect symbol names that exist
within each. within each.
* SortPaths: Sort results of AnalyzePaths().
* AnalyzeStringLiterals: Must be run after AnalyzePaths() has completed. * AnalyzeStringLiterals: Must be run after AnalyzePaths() has completed.
Extracts string literals from .o files, and then locates them within the Extracts string literals from .o files, and then locates them within the
"** merge strings" sections within an ELF's .rodata section. "** merge strings" sections within an ELF's .rodata section.
...@@ -58,9 +59,10 @@ import threading ...@@ -58,9 +59,10 @@ import threading
import concurrent import concurrent
_MSG_ANALYZE_PATHS = 1 _MSG_ANALYZE_PATHS = 1
_MSG_ANALYZE_STRINGS = 2 _MSG_SORT_PATHS = 2
_MSG_GET_SYMBOL_NAMES = 3 _MSG_ANALYZE_STRINGS = 3
_MSG_GET_STRINGS = 4 _MSG_GET_SYMBOL_NAMES = 4
_MSG_GET_STRINGS = 5
_active_pids = None _active_pids = None
...@@ -128,7 +130,8 @@ def _IsRelevantObjectFileName(name): ...@@ -128,7 +130,8 @@ def _IsRelevantObjectFileName(name):
def CollectAliasesByAddress(elf_path, tool_prefix): def CollectAliasesByAddress(elf_path, tool_prefix):
"""Runs nm on |elf_path| and returns a dict of address->[names]""" """Runs nm on |elf_path| and returns a dict of address->[names]"""
names_by_address = collections.defaultdict(list) # Constructors often show up twice, so use sets to ensure no duplicates.
names_by_address = collections.defaultdict(set)
# About 60mb of output, but piping takes ~30s, and loading it into RAM # About 60mb of output, but piping takes ~30s, and loading it into RAM
# directly takes 3s. # directly takes 3s.
...@@ -151,17 +154,12 @@ def CollectAliasesByAddress(elf_path, tool_prefix): ...@@ -151,17 +154,12 @@ def CollectAliasesByAddress(elf_path, tool_prefix):
address = int(address_str, 16) address = int(address_str, 16)
if not address: if not address:
continue continue
# Constructors often show up twice. names_by_address[address].add(name)
name_list = names_by_address[address]
if name not in name_list:
name_list.append(name)
# Since this is run in a separate process, minimize data passing by returning # Since this is run in a separate process, minimize data passing by returning
# only aliased symbols. # only aliased symbols.
names_by_address = {k: v for k, v in names_by_address.iteritems() # Also: Sort to ensure stable ordering.
if len(v) > 1} return {k: sorted(v) for k, v in names_by_address.iteritems() if len(v) > 1}
return names_by_address
def _CollectAliasesByAddressAsyncHelper(elf_path, tool_prefix): def _CollectAliasesByAddressAsyncHelper(elf_path, tool_prefix):
...@@ -350,9 +348,17 @@ def _ExtractArchivePath(path): ...@@ -350,9 +348,17 @@ def _ExtractArchivePath(path):
return None return None
def _IterStringLiterals(path, addresses, string_sections_by_path): def _IterStringLiterals(path, addresses, obj_sections):
"""Yields all string literals (including \0) for the given object path.
Args:
path: Object file path.
addresses: List of string offsets encoded as hex strings.
obj_sections: List of contents of .rodata.str sections read from the given
object file.
"""
next_offsets = sorted(int(a, 16) for a in addresses) next_offsets = sorted(int(a, 16) for a in addresses)
obj_sections = string_sections_by_path.get(path)
if not obj_sections: if not obj_sections:
# Happens when there is an address for a symbol which is not actually a # Happens when there is an address for a symbol which is not actually a
# string literal, or when string_sections_by_path is missing an entry. # string literal, or when string_sections_by_path is missing an entry.
...@@ -410,7 +416,7 @@ def _ResolveStringPieces(encoded_string_addresses_by_path, string_data, ...@@ -410,7 +416,7 @@ def _ResolveStringPieces(encoded_string_addresses_by_path, string_data,
# least for ascii strings). # least for ascii strings).
for path, object_addresses in string_addresses_by_path.iteritems(): for path, object_addresses in string_addresses_by_path.iteritems():
for value in _IterStringLiterals( for value in _IterStringLiterals(
path, object_addresses, string_sections_by_path): path, object_addresses, string_sections_by_path.get(path)):
first_match = -1 first_match = -1
first_match_dict = None first_match_dict = None
for target_dict, data in itertools.izip(ret, string_data): for target_dict, data in itertools.izip(ret, string_data):
...@@ -530,6 +536,10 @@ class _BulkObjectFileAnalyzerWorker(object): ...@@ -530,6 +536,10 @@ class _BulkObjectFileAnalyzerWorker(object):
self._encoded_string_addresses_by_path_chunks.append(encoded_strs) self._encoded_string_addresses_by_path_chunks.append(encoded_strs)
logging.debug('worker: AnalyzePaths() completed.') logging.debug('worker: AnalyzePaths() completed.')
def SortPaths(self):
for paths in self._paths_by_name.itervalues():
paths.sort()
def AnalyzeStringLiterals(self, elf_path, elf_string_positions): def AnalyzeStringLiterals(self, elf_path, elf_string_positions):
logging.debug('worker: AnalyzeStringLiterals() started.') logging.debug('worker: AnalyzeStringLiterals() started.')
# Read string_data from elf_path, to be shared by forked processes. # Read string_data from elf_path, to be shared by forked processes.
...@@ -612,6 +622,9 @@ class _BulkObjectFileAnalyzerMaster(object): ...@@ -612,6 +622,9 @@ class _BulkObjectFileAnalyzerMaster(object):
payload = '\x01'.join(paths) payload = '\x01'.join(paths)
self._pipe.send((_MSG_ANALYZE_PATHS, payload)) self._pipe.send((_MSG_ANALYZE_PATHS, payload))
def SortPaths(self):
self._pipe.send((_MSG_SORT_PATHS,))
def AnalyzeStringLiterals(self, elf_path, string_positions): def AnalyzeStringLiterals(self, elf_path, string_positions):
self._pipe.send((_MSG_ANALYZE_STRINGS, elf_path, string_positions)) self._pipe.send((_MSG_ANALYZE_STRINGS, elf_path, string_positions))
...@@ -669,6 +682,10 @@ class _BulkObjectFileAnalyzerSlave(object): ...@@ -669,6 +682,10 @@ class _BulkObjectFileAnalyzerSlave(object):
'Cannot call AnalyzePaths() after AnalyzeStringLiterals()s.') 'Cannot call AnalyzePaths() after AnalyzeStringLiterals()s.')
paths = message[1].split('\x01') paths = message[1].split('\x01')
self._job_queue.put(lambda: self._worker_analyzer.AnalyzePaths(paths)) self._job_queue.put(lambda: self._worker_analyzer.AnalyzePaths(paths))
elif message[0] == _MSG_SORT_PATHS:
assert self._allow_analyze_paths, (
'Cannot call SortPaths() after AnalyzeStringLiterals()s.')
self._job_queue.put(self._worker_analyzer.SortPaths)
elif message[0] == _MSG_ANALYZE_STRINGS: elif message[0] == _MSG_ANALYZE_STRINGS:
self._WaitForAnalyzePathJobs() self._WaitForAnalyzePathJobs()
elf_path, string_positions = message[1:] elf_path, string_positions = message[1:]
...@@ -726,6 +743,7 @@ def main(): ...@@ -726,6 +743,7 @@ def main():
# Pass individually to test multiple calls. # Pass individually to test multiple calls.
for path in args.objects: for path in args.objects:
bulk_analyzer.AnalyzePaths([path]) bulk_analyzer.AnalyzePaths([path])
bulk_analyzer.SortPaths()
names_to_paths = bulk_analyzer.GetSymbolNames() names_to_paths = bulk_analyzer.GetSymbolNames()
print('Found {} names'.format(len(names_to_paths))) print('Found {} names'.format(len(names_to_paths)))
......
...@@ -6,11 +6,11 @@ git_revision=abc123 ...@@ -6,11 +6,11 @@ git_revision=abc123
gn_args=var1=true var2="foo" gn_args=var1=true var2="foo"
map_file_name=../test.map map_file_name=../test.map
tool_prefix=tools/binary_size/libsupersize/testdata/mock_toolchain/ tool_prefix=tools/binary_size/libsupersize/testdata/mock_toolchain/
Section .text: has 100.0% of 35900712 bytes accounted for from 18 symbols. 0 bytes are unaccounted for. Section .text: has 100.0% of 35900712 bytes accounted for from 19 symbols. 0 bytes are unaccounted for.
* Padding accounts for 48 bytes (0.0%) * Padding accounts for 48 bytes (0.0%)
* 3 placeholders (symbols that start with **) account for 35830760 bytes (99.8%) * 3 placeholders (symbols that start with **) account for 35830760 bytes (99.8%)
* Contains 5 aliases, mapped to 2 unique addresses (60 bytes) * Contains 6 aliases, mapped to 2 unique addresses (60 bytes)
* 1 symbols have shared ownership (12 bytes) * 0 symbols have shared ownership
Section .rodata: has 100.0% of 5927652 bytes accounted for from 12 symbols. 0 bytes are unaccounted for. Section .rodata: has 100.0% of 5927652 bytes accounted for from 12 symbols. 0 bytes are unaccounted for.
* Padding accounts for 675996 bytes (11.4%) * Padding accounts for 675996 bytes (11.4%)
* 4 placeholders (symbols that start with **) account for 5251503 bytes (88.6%) * 4 placeholders (symbols that start with **) account for 5251503 bytes (88.6%)
...@@ -42,9 +42,10 @@ Section .bss: has 40.3% of 524520 bytes accounted for from 6 symbols. 775936 byt ...@@ -42,9 +42,10 @@ Section .bss: has 40.3% of 524520 bytes accounted for from 6 symbols. 775936 byt
.text@28f1e0(size_without_padding=69120,padding=4,full_name=foo_bar,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={unlikely,gen},num_aliases=1) .text@28f1e0(size_without_padding=69120,padding=4,full_name=foo_bar,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={unlikely,gen},num_aliases=1)
.text@2a0000(size_without_padding=16,padding=32,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=,source_path=,flags={},num_aliases=2) .text@2a0000(size_without_padding=16,padding=32,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=,source_path=,flags={},num_aliases=2)
.text@2a0000(size_without_padding=16,padding=32,full_name=BazAlias(bool),object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=2) .text@2a0000(size_without_padding=16,padding=32,full_name=BazAlias(bool),object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=2)
.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/{shared}/2,source_path=third_party/{shared}/2,flags={clone},num_aliases=3) .text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={clone},num_aliases=4)
.text@2a0010(size_without_padding=12,padding=0,full_name=FooAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=3) .text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen,clone},num_aliases=4)
.text@2a0010(size_without_padding=12,padding=0,full_name=BarAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=3) .text@2a0010(size_without_padding=12,padding=0,full_name=FooAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=4)
.text@2a0010(size_without_padding=12,padding=0,full_name=BarAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=4)
.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1) .text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1)
.text@2a1000(size_without_padding=0,padding=4040,full_name=** symbol gap 1,object_path=,source_path=,flags={},num_aliases=1) .text@2a1000(size_without_padding=0,padding=4040,full_name=** symbol gap 1,object_path=,source_path=,flags={},num_aliases=1)
.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,clone},num_aliases=1) .text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,clone},num_aliases=1)
......
...@@ -79,10 +79,10 @@ Section Sizes (Total=95.6mb (100233874 bytes)): ...@@ -79,10 +79,10 @@ Section Sizes (Total=95.6mb (100233874 bytes)):
.symtab: 16.4mb (17166112 bytes) (17.1%) .symtab: 16.4mb (17166112 bytes) (17.1%)
.text: 34.2mb (35900712 bytes) (35.8%) .text: 34.2mb (35900712 bytes) (35.8%)
Showing 47 symbols (44 unique) with total pss: 43785380 bytes Showing 48 symbols (44 unique) with total pss: 43785380 bytes
Histogram of symbols based on PSS: Histogram of symbols based on PSS:
[2,4): 1 [16,32): 10 [128,256): 2 [131072,262144): 2 [1048576,2097152): 2 [2,4): 5 [16,32): 10 [128,256): 2 [131072,262144): 2 [1048576,2097152): 2
[4,8): 9 [32,64): 9 [256,512): 1 [262144,524288): 1 [2097152,4194304): 1 [4,8): 6 [32,64): 9 [256,512): 1 [262144,524288): 1 [2097152,4194304): 1
[8,16): 3 [64,128): 1 [65536,131072): 2 [524288,1048576): 2 [33554432,67108864): 1 [8,16): 3 [64,128): 1 [65536,131072): 2 [524288,1048576): 2 [33554432,67108864): 1
.text=34.2mb .rodata=5.65mb .data.rel.ro=1.02mb .data=99.4kb .bss=512kb total=41.8mb .text=34.2mb .rodata=5.65mb .data.rel.ro=1.02mb .data=99.4kb .bss=512kb total=41.8mb
Number of unique paths: 9 Number of unique paths: 9
...@@ -112,74 +112,76 @@ Index | Running Total | Section@Address | PSS | Path ...@@ -112,74 +112,76 @@ Index | Running Total | Section@Address | PSS | Path
blink::ContiguousContainerBase::shrinkToFit (num_aliases=2) blink::ContiguousContainerBase::shrinkToFit (num_aliases=2)
10) 35900578 (82.0%) t@0x2a0000 24 (size=48) third_party/icu/ucnv_ext.c 10) 35900578 (82.0%) t@0x2a0000 24 (size=48) third_party/icu/ucnv_ext.c
BazAlias (num_aliases=2) BazAlias (num_aliases=2)
11) 35900582 (82.0%) t@0x2a0010 4 (size=12) third_party/{shared}/2 11) 35900581 (82.0%) t@0x2a0010 3 (size=12) third_party/paint.cc
blink::ContiguousContainerBase::shrinkToFit (num_aliases=3) blink::ContiguousContainerBase::shrinkToFit (num_aliases=4)
12) 35900586 (82.0%) t@0x2a0010 4 (size=12) third_party/fft_float.cc 12) 35900584 (82.0%) t@0x2a0010 3 (size=12) third_party/icu/ucnv_ext.c
FooAlias (num_aliases=3) blink::ContiguousContainerBase::shrinkToFit (num_aliases=4)
13) 35900590 (82.0%) t@0x2a0010 4 (size=12) third_party/fft_float.cc 13) 35900587 (82.0%) t@0x2a0010 3 (size=12) third_party/fft_float.cc
BarAlias (num_aliases=3) FooAlias (num_aliases=4)
14) 35900618 (82.0%) t@0x2a0020 28 third_party/container.c 14) 35900590 (82.0%) t@0x2a0010 3 (size=12) third_party/fft_float.cc
BarAlias (num_aliases=4)
15) 35900618 (82.0%) t@0x2a0020 28 third_party/container.c
blink::ContiguousContainerBase::ContiguousContainerBase blink::ContiguousContainerBase::ContiguousContainerBase
15) 35900712 (82.0%) t@0x2a1000 94 third_party/container.c 16) 35900712 (82.0%) t@0x2a1000 94 third_party/container.c
blink::PaintChunker::releasePaintChunks blink::PaintChunker::releasePaintChunks
16) 35900714 (82.0%) r@0x266e600 2.5 (size=5) base/page_allocator.cc 17) 35900714 (82.0%) r@0x266e600 2.5 (size=5) base/page_allocator.cc
string literal 0 (num_aliases=2) string literal 0 (num_aliases=2)
17) 35900733 (82.0%) r@Group 18 third_party/icu/ucnv_ext.c 18) 35900733 (82.0%) r@Group 18 third_party/icu/ucnv_ext.c
string literal 0 (count=2) string literal 0 (count=2)
18) 35900776 (82.0%) r@0x266e630 43 {no path} 19) 35900776 (82.0%) r@0x266e630 43 {no path}
** merge strings ** merge strings
19) 37866121 (86.5%) r@0x284d600 1965345 {no path} 20) 37866121 (86.5%) r@0x284d600 1965345 {no path}
** merge constants ** merge constants
20) 41152236 (94.0%) r@Group 3286115 {no path} 21) 41152236 (94.0%) r@Group 3286115 {no path}
** symbol gaps (count=2) ** symbol gaps (count=2)
21) 41152244 (94.0%) r@0x284e364 8 base/page_allocator.cc 22) 41152244 (94.0%) r@0x284e364 8 base/page_allocator.cc
22) 41152288 (94.0%) r@0x284e370 44 base/page_allocator.cc 23) 41152288 (94.0%) r@0x284e370 44 base/page_allocator.cc
Name Name
23) 41152320 (94.0%) r@0x284e398 32 third_party/container.c 24) 41152320 (94.0%) r@0x284e398 32 third_party/container.c
chrome::mojom::FilePatcher::Name_ chrome::mojom::FilePatcher::Name_
24) 41828360 (95.5%) r@0x28f3450 676040 third_party/paint.cc 25) 41828360 (95.5%) r@0x28f3450 676040 third_party/paint.cc
kAnimationFrameTimeHistogramClassPath kAnimationFrameTimeHistogramClassPath
25) 41828364 (95.5%) r@0x28f3480 4 third_party/paint.cc 26) 41828364 (95.5%) r@0x28f3480 4 third_party/paint.cc
blink::CSSValueKeywordsHash::findValueImpl::value_word_list blink::CSSValueKeywordsHash::findValueImpl::value_word_list
26) 41828420 (95.5%) R@0x2c176f0 56 third_party/icu/ucnv_ext.c 27) 41828420 (95.5%) R@0x2c176f0 56 third_party/icu/ucnv_ext.c
ChromeMainDelegate [vtable] ChromeMainDelegate [vtable]
27) 41828444 (95.5%) R@0x2c17728 24 third_party/icu/ucnv_ext.c 28) 41828444 (95.5%) R@0x2c17728 24 third_party/icu/ucnv_ext.c
chrome::mojom::FieldTrialRecorder [vtable] chrome::mojom::FieldTrialRecorder [vtable]
28) 42618348 (97.3%) R@0x2c17740 789904 third_party/container.c 29) 42618348 (97.3%) R@0x2c17740 789904 third_party/container.c
chrome::mojom::FieldTrialRecorderProxy [vtable] chrome::mojom::FieldTrialRecorderProxy [vtable]
29) 42618380 (97.3%) R@0x2cd84e0 32 third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o 30) 42618380 (97.3%) R@0x2cd84e0 32 third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o
.Lswitch.table.45 .Lswitch.table.45
30) 42618388 (97.3%) R@0x2cd84f0 8 third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libport_android_jni.a_jni_utils.o 31) 42618388 (97.3%) R@0x2cd84f0 8 third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libport_android_jni.a_jni_utils.o
kSystemClassPrefixes kSystemClassPrefixes
31) 42618444 (97.3%) R@0x2cd8500 56 third_party/paint.cc 32) 42618444 (97.3%) R@0x2cd8500 56 third_party/paint.cc
ChromeMainDelegateAndroid [vtable] ChromeMainDelegateAndroid [vtable]
32) 42618468 (97.3%) R@0x2cd8538 24 base/page_allocator.cc 33) 42618468 (97.3%) R@0x2cd8538 24 base/page_allocator.cc
mojo::MessageReceiver [vtable] mojo::MessageReceiver [vtable]
33) 42618480 (97.3%) R@0x2cd8550 12 base/page_allocator.cc 34) 42618480 (97.3%) R@0x2cd8550 12 base/page_allocator.cc
kMethodsAnimationFrameTimeHistogram kMethodsAnimationFrameTimeHistogram
34) 43683612 (99.8%) R@0x2ddc608 1065132 {no path} 35) 43683612 (99.8%) R@0x2ddc608 1065132 {no path}
** symbol gap 0 (end of section) ** symbol gap 0 (end of section)
35) 43683616 (99.8%) d@0x2de7000 4 base/page_allocator.cc 36) 43683616 (99.8%) d@0x2de7000 4 base/page_allocator.cc
google::protobuf::internal::pLinuxKernelCmpxchg google::protobuf::internal::pLinuxKernelCmpxchg
36) 43683620 (99.8%) d@0x2de7004 4 third_party/container.c 37) 43683620 (99.8%) d@0x2de7004 4 third_party/container.c
google::protobuf::internal::pLinuxKernelMemoryBarrier google::protobuf::internal::pLinuxKernelMemoryBarrier
37) 43683772 (99.8%) d@0x2de7008 152 third_party/container.c 38) 43683772 (99.8%) d@0x2de7008 152 third_party/container.c
base::android::kBaseRegisteredMethods base::android::kBaseRegisteredMethods
38) 43683776 (99.8%) d@0x2de70a0 4 third_party/container.c 39) 43683776 (99.8%) d@0x2de70a0 4 third_party/container.c
base::android::g_renderer_histogram_code base::android::g_renderer_histogram_code
39) 43683780 (99.8%) d@0x2de70a4 4 third_party/container.c 40) 43683780 (99.8%) d@0x2de70a4 4 third_party/container.c
base::android::g_library_version_number base::android::g_library_version_number
40) 43785380 (100.0%) d@0x2dffd88 101600 {no path} 41) 43785380 (100.0%) d@0x2dffd88 101600 {no path}
** symbol gap 0 (end of section) ** symbol gap 0 (end of section)
41) 43785380 (100.0%) b@0x0 262144 third_party/fft_float.cc 42) 43785380 (100.0%) b@0x0 262144 third_party/fft_float.cc
ff_cos_131072 ff_cos_131072
42) 43785380 (100.0%) b@0x0 131072 third_party/fft_fixed.cc 43) 43785380 (100.0%) b@0x0 131072 third_party/fft_fixed.cc
ff_cos_131072_fixed ff_cos_131072_fixed
43) 43785380 (100.0%) b@0x0 131072 third_party/fft_float.cc 44) 43785380 (100.0%) b@0x0 131072 third_party/fft_float.cc
ff_cos_65536 ff_cos_65536
44) 43785380 (100.0%) b@0x2dffda0 28 third_party/icu/ucnv_ext.c 45) 43785380 (100.0%) b@0x2dffda0 28 third_party/icu/ucnv_ext.c
g_chrome_content_browser_client g_chrome_content_browser_client
45) 43785380 (100.0%) b@0x2dffe80 200 third_party/icu/ucnv_ext.c 46) 43785380 (100.0%) b@0x2dffe80 200 third_party/icu/ucnv_ext.c
SaveHistogram::atomic_histogram_pointer SaveHistogram::atomic_histogram_pointer
46) 43785380 (100.0%) b@0x2dffe84 4 third_party/icu/ucnv_ext.c 47) 43785380 (100.0%) b@0x2dffe84 4 third_party/icu/ucnv_ext.c
g_AnimationFrameTimeHistogram_clazz g_AnimationFrameTimeHistogram_clazz
...@@ -21,9 +21,10 @@ GroupCount,Address,SizeWithoutPadding,Padding,NumAliases,PSS,Section,Name ...@@ -21,9 +21,10 @@ GroupCount,Address,SizeWithoutPadding,Padding,NumAliases,PSS,Section,Name
,0x28f1e0,69120,4,1,69124.0,t,foo_bar ,0x28f1e0,69120,4,1,69124.0,t,foo_bar
,0x2a0000,16,32,2,24.0,t,blink::ContiguousContainerBase::shrinkToFit ,0x2a0000,16,32,2,24.0,t,blink::ContiguousContainerBase::shrinkToFit
,0x2a0000,16,32,2,24.0,t,BazAlias ,0x2a0000,16,32,2,24.0,t,BazAlias
,0x2a0010,12,0,3,4.0,t,blink::ContiguousContainerBase::shrinkToFit ,0x2a0010,12,0,4,3.0,t,blink::ContiguousContainerBase::shrinkToFit
,0x2a0010,12,0,3,4.0,t,FooAlias ,0x2a0010,12,0,4,3.0,t,blink::ContiguousContainerBase::shrinkToFit
,0x2a0010,12,0,3,4.0,t,BarAlias ,0x2a0010,12,0,4,3.0,t,FooAlias
,0x2a0010,12,0,4,3.0,t,BarAlias
,0x2a0020,24,4,1,28.0,t,blink::ContiguousContainerBase::ContiguousContainerBase ,0x2a0020,24,4,1,28.0,t,blink::ContiguousContainerBase::ContiguousContainerBase
,0x2a1000,94,0,1,94.0,t,blink::PaintChunker::releasePaintChunks ,0x2a1000,94,0,1,94.0,t,blink::PaintChunker::releasePaintChunks
,0x266e600,5,0,2,2.5,r,string literal 0 ,0x266e600,5,0,2,2.5,r,string literal 0
......
...@@ -18,14 +18,14 @@ Section Sizes (Total=0 bytes (0 bytes)): ...@@ -18,14 +18,14 @@ Section Sizes (Total=0 bytes (0 bytes)):
.rodata: 0 bytes (0 bytes) (0.0%) .rodata: 0 bytes (0 bytes) (0.0%)
.text: 0 bytes (0 bytes) (0.0%) .text: 0 bytes (0 bytes) (0.0%)
0 symbols added (+), 0 changed (~), 0 removed (-), 47 unchanged (not shown) 0 symbols added (+), 0 changed (~), 0 removed (-), 48 unchanged (not shown)
Of changed symbols, 0 grew, 0 shrank Of changed symbols, 0 grew, 0 shrank
Number of unique symbols 47 -> 47 (+0) Number of unique symbols 47 -> 47 (+0)
0 paths added, 0 removed, 0 changed 0 paths added, 0 removed, 0 changed
Showing 0 symbols (aliases not grouped for diffs) with total pss: 0 bytes Showing 0 symbols (aliases not grouped for diffs) with total pss: 0 bytes
Histogram of symbols based on PSS: Histogram of symbols based on PSS:
{0}: 47 {0}: 48
.text=0 bytes .rodata=0 bytes .data.rel.ro=0 bytes .data=0 bytes .bss=0 bytes total=0 bytes .text=0 bytes .rodata=0 bytes .data.rel.ro=0 bytes .data=0 bytes .bss=0 bytes total=0 bytes
Number of unique paths: 0 Number of unique paths: 0
......
...@@ -40,11 +40,11 @@ Other section sizes: ...@@ -40,11 +40,11 @@ Other section sizes:
.rel.plt: 2.75kb (2816 bytes) .rel.plt: 2.75kb (2816 bytes)
.shstrtab: 436 bytes (436 bytes) .shstrtab: 436 bytes (436 bytes)
Section .text: has 100.0% of 35900712 bytes accounted for from 18 symbols. 0 bytes are unaccounted for. Section .text: has 100.0% of 35900712 bytes accounted for from 19 symbols. 0 bytes are unaccounted for.
* Padding accounts for 48 bytes (0.0%) * Padding accounts for 48 bytes (0.0%)
* 3 placeholders (symbols that start with **) account for 35830760 bytes (99.8%) * 3 placeholders (symbols that start with **) account for 35830760 bytes (99.8%)
* Contains 5 aliases, mapped to 2 unique addresses (60 bytes) * Contains 6 aliases, mapped to 2 unique addresses (60 bytes)
* 1 symbols have shared ownership (12 bytes) * 0 symbols have shared ownership
Section .rodata: has 100.0% of 5927652 bytes accounted for from 12 symbols. 0 bytes are unaccounted for. Section .rodata: has 100.0% of 5927652 bytes accounted for from 12 symbols. 0 bytes are unaccounted for.
* Padding accounts for 675996 bytes (11.4%) * Padding accounts for 675996 bytes (11.4%)
* 4 placeholders (symbols that start with **) account for 5251503 bytes (88.6%) * 4 placeholders (symbols that start with **) account for 5251503 bytes (88.6%)
...@@ -66,10 +66,10 @@ Section .bss: has 40.3% of 524520 bytes accounted for from 6 symbols. 775936 byt ...@@ -66,10 +66,10 @@ Section .bss: has 40.3% of 524520 bytes accounted for from 6 symbols. 775936 byt
* Contains 0 aliases * Contains 0 aliases
* 0 symbols have shared ownership * 0 symbols have shared ownership
Showing 51 symbols (47 unique) with total pss: 43785380 bytes Showing 52 symbols (47 unique) with total pss: 43785380 bytes
Histogram of symbols based on PSS: Histogram of symbols based on PSS:
[2,4): 3 [16,32): 10 [128,256): 2 [4096,8192): 1 [262144,524288): 1 [2097152,4194304): 1 [2,4): 7 [16,32): 10 [128,256): 2 [4096,8192): 1 [262144,524288): 1 [2097152,4194304): 1
[4,8): 9 [32,64): 9 [256,512): 1 [65536,131072): 2 [524288,1048576): 2 [33554432,67108864): 1 [4,8): 6 [32,64): 9 [256,512): 1 [65536,131072): 2 [524288,1048576): 2 [33554432,67108864): 1
[8,16): 3 [64,128): 1 [2048,4096): 1 [131072,262144): 2 [1048576,2097152): 2 [8,16): 3 [64,128): 1 [2048,4096): 1 [131072,262144): 2 [1048576,2097152): 2
.text=34.2mb .rodata=5.65mb .data.rel.ro=1.02mb .data=99.4kb .bss=512kb total=41.8mb .text=34.2mb .rodata=5.65mb .data.rel.ro=1.02mb .data=99.4kb .bss=512kb total=41.8mb
Number of unique paths: 9 Number of unique paths: 9
...@@ -115,136 +115,140 @@ Index | Running Total | Section@Address | ... ...@@ -115,136 +115,140 @@ Index | Running Total | Section@Address | ...
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={gen} name=BazAlias flags={gen} name=BazAlias
full_name=BazAlias(bool) full_name=BazAlias(bool)
11) 75540 (0.2%) t@0x2a0010 pss=4 (size=12) padding=0 num_aliases=3 11) 75539 (0.2%) t@0x2a0010 pss=3 (size=12) padding=0 num_aliases=4
source_path=third_party/{shared}/2 object_path=third_party/{shared}/2 source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o
flags={clone} name=blink::ContiguousContainerBase::shrinkToFit flags={clone} name=blink::ContiguousContainerBase::shrinkToFit
full_name=blink::ContiguousContainerBase::shrinkToFit() full_name=blink::ContiguousContainerBase::shrinkToFit()
12) 75544 (0.2%) t@0x2a0010 pss=4 (size=12) padding=0 num_aliases=3 12) 75542 (0.2%) t@0x2a0010 pss=3 (size=12) padding=0 num_aliases=4
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={gen,clone} name=blink::ContiguousContainerBase::shrinkToFit
full_name=blink::ContiguousContainerBase::shrinkToFit()
13) 75545 (0.2%) t@0x2a0010 pss=3 (size=12) padding=0 num_aliases=4
source_path=third_party/fft_float.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o source_path=third_party/fft_float.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o
flags={} name=FooAlias flags={} name=FooAlias
full_name=FooAlias() full_name=FooAlias()
13) 75548 (0.2%) t@0x2a0010 pss=4 (size=12) padding=0 num_aliases=3 14) 75548 (0.2%) t@0x2a0010 pss=3 (size=12) padding=0 num_aliases=4
source_path=third_party/fft_float.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o source_path=third_party/fft_float.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o
flags={} name=BarAlias flags={} name=BarAlias
full_name=BarAlias() full_name=BarAlias()
14) 75576 (0.2%) t@0x2a0020 pss=28 padding=4 num_aliases=1 15) 75576 (0.2%) t@0x2a0020 pss=28 padding=4 num_aliases=1
source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o
flags={} name=blink::ContiguousContainerBase::ContiguousContainerBase flags={} name=blink::ContiguousContainerBase::ContiguousContainerBase
full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&) full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&)
15) 79616 (0.2%) t@0x2a1000 pss=4040 padding=4040 num_aliases=1 16) 79616 (0.2%) t@0x2a1000 pss=4040 padding=4040 num_aliases=1
source_path= object_path= source_path= object_path=
flags={} name=** symbol gap 1 flags={} name=** symbol gap 1
16) 79710 (0.2%) t@0x2a1000 pss=94 padding=0 num_aliases=1 17) 79710 (0.2%) t@0x2a1000 pss=94 padding=0 num_aliases=1
source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o
flags={anon,clone} name=blink::PaintChunker::releasePaintChunks flags={anon,clone} name=blink::PaintChunker::releasePaintChunks
full_name=blink::PaintChunker::releasePaintChunks() full_name=blink::PaintChunker::releasePaintChunks()
17) 35900712 (82.0%) t@0x24ca628 pss=35821002 padding=35821002 num_aliases=1 18) 35900712 (82.0%) t@0x24ca628 pss=35821002 padding=35821002 num_aliases=1
source_path= object_path= source_path= object_path=
flags={} name=** symbol gap 2 (end of section) flags={} name=** symbol gap 2 (end of section)
18) 35900714 (82.0%) r@0x266e600 pss=2.5 (size=5) padding=0 num_aliases=2 19) 35900714 (82.0%) r@0x266e600 pss=2.5 (size=5) padding=0 num_aliases=2
source_path=base/page_allocator.cc object_path=base/base/page_allocator.o source_path=base/page_allocator.cc object_path=base/base/page_allocator.o
flags={} name=string literal 0 flags={} name=string literal 0
19) 35900717 (82.0%) r@0x266e600 pss=2.5 (size=5) padding=0 num_aliases=2 20) 35900717 (82.0%) r@0x266e600 pss=2.5 (size=5) padding=0 num_aliases=2
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={gen} name=string literal 0 flags={gen} name=string literal 0
20) 35900733 (82.0%) r@0x266e605 pss=16 padding=0 num_aliases=1 21) 35900733 (82.0%) r@0x266e605 pss=16 padding=0 num_aliases=1
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={gen} name=string literal 0 flags={gen} name=string literal 0
21) 35900776 (82.0%) r@0x266e630 pss=43 padding=27 num_aliases=1 22) 35900776 (82.0%) r@0x266e630 pss=43 padding=27 num_aliases=1
source_path= object_path= source_path= object_path=
flags={} name=** merge strings flags={} name=** merge strings
22) 37866121 (86.5%) r@0x284d600 pss=1965345 padding=1961920 num_aliases=1 23) 37866121 (86.5%) r@0x284d600 pss=1965345 padding=1961920 num_aliases=1
source_path= object_path= source_path= object_path=
flags={} name=** merge constants flags={} name=** merge constants
23) 37866124 (86.5%) r@0x284e364 pss=3 padding=3 num_aliases=1 24) 37866124 (86.5%) r@0x284e364 pss=3 padding=3 num_aliases=1
source_path= object_path= source_path= object_path=
flags={} name=** symbol gap 0 flags={} name=** symbol gap 0
24) 37866132 (86.5%) r@0x284e364 pss=8 padding=0 num_aliases=1 25) 37866132 (86.5%) r@0x284e364 pss=8 padding=0 num_aliases=1
source_path=base/page_allocator.cc object_path=base/base/page_allocator.o source_path=base/page_allocator.cc object_path=base/base/page_allocator.o
25) 37866176 (86.5%) r@0x284e370 pss=44 padding=4 num_aliases=1 26) 37866176 (86.5%) r@0x284e370 pss=44 padding=4 num_aliases=1
source_path=base/page_allocator.cc object_path=base/base/page_allocator.o source_path=base/page_allocator.cc object_path=base/base/page_allocator.o
flags={} name=Name flags={} name=Name
26) 37866208 (86.5%) r@0x284e398 pss=32 padding=0 num_aliases=1 27) 37866208 (86.5%) r@0x284e398 pss=32 padding=0 num_aliases=1
source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o
flags={} name=chrome::mojom::FilePatcher::Name_ flags={} name=chrome::mojom::FilePatcher::Name_
27) 38542248 (88.0%) r@0x28f3450 pss=676040 padding=675992 num_aliases=1 28) 38542248 (88.0%) r@0x28f3450 pss=676040 padding=675992 num_aliases=1
source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o
flags={anon} name=kAnimationFrameTimeHistogramClassPath flags={anon} name=kAnimationFrameTimeHistogramClassPath
28) 38542252 (88.0%) r@0x28f3480 pss=4 padding=0 num_aliases=1 29) 38542252 (88.0%) r@0x28f3480 pss=4 padding=0 num_aliases=1
source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o
flags={anon} name=blink::CSSValueKeywordsHash::findValueImpl::value_word_list flags={anon} name=blink::CSSValueKeywordsHash::findValueImpl::value_word_list
full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list
29) 41828364 (95.5%) r@0x2c158e4 pss=3286112 padding=3286112 num_aliases=1 30) 41828364 (95.5%) r@0x2c158e4 pss=3286112 padding=3286112 num_aliases=1
source_path= object_path= source_path= object_path=
flags={} name=** symbol gap 1 (end of section) flags={} name=** symbol gap 1 (end of section)
30) 41828420 (95.5%) R@0x2c176f0 pss=56 padding=0 num_aliases=1 31) 41828420 (95.5%) R@0x2c176f0 pss=56 padding=0 num_aliases=1
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={gen} name=ChromeMainDelegate [vtable] flags={gen} name=ChromeMainDelegate [vtable]
31) 41828444 (95.5%) R@0x2c17728 pss=24 padding=0 num_aliases=1 32) 41828444 (95.5%) R@0x2c17728 pss=24 padding=0 num_aliases=1
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={gen} name=chrome::mojom::FieldTrialRecorder [vtable] flags={gen} name=chrome::mojom::FieldTrialRecorder [vtable]
32) 42618348 (97.3%) R@0x2c17740 pss=789904 padding=0 num_aliases=1 33) 42618348 (97.3%) R@0x2c17740 pss=789904 padding=0 num_aliases=1
source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o
flags={} name=chrome::mojom::FieldTrialRecorderProxy [vtable] flags={} name=chrome::mojom::FieldTrialRecorderProxy [vtable]
33) 42618380 (97.3%) R@0x2cd84e0 pss=32 padding=16 num_aliases=1 34) 42618380 (97.3%) R@0x2cd84e0 pss=32 padding=16 num_aliases=1
source_path= object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o source_path= object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o
flags={} name=.Lswitch.table.45 flags={} name=.Lswitch.table.45
34) 42618388 (97.3%) R@0x2cd84f0 pss=8 padding=0 num_aliases=1 35) 42618388 (97.3%) R@0x2cd84f0 pss=8 padding=0 num_aliases=1
source_path= object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libport_android_jni.a_jni_utils.o source_path= object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libport_android_jni.a_jni_utils.o
flags={anon} name=kSystemClassPrefixes flags={anon} name=kSystemClassPrefixes
35) 42618444 (97.3%) R@0x2cd8500 pss=56 padding=0 num_aliases=1 36) 42618444 (97.3%) R@0x2cd8500 pss=56 padding=0 num_aliases=1
source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o
flags={} name=ChromeMainDelegateAndroid [vtable] flags={} name=ChromeMainDelegateAndroid [vtable]
36) 42618468 (97.3%) R@0x2cd8538 pss=24 padding=0 num_aliases=1 37) 42618468 (97.3%) R@0x2cd8538 pss=24 padding=0 num_aliases=1
source_path=base/page_allocator.cc object_path=base/base/page_allocator.o source_path=base/page_allocator.cc object_path=base/base/page_allocator.o
flags={} name=mojo::MessageReceiver [vtable] flags={} name=mojo::MessageReceiver [vtable]
37) 42618480 (97.3%) R@0x2cd8550 pss=12 padding=0 num_aliases=1 38) 42618480 (97.3%) R@0x2cd8550 pss=12 padding=0 num_aliases=1
source_path=base/page_allocator.cc object_path=base/base/page_allocator.o source_path=base/page_allocator.cc object_path=base/base/page_allocator.o
flags={} name=kMethodsAnimationFrameTimeHistogram flags={} name=kMethodsAnimationFrameTimeHistogram
38) 43683612 (99.8%) R@0x2ddc608 pss=1065132 padding=1065132 num_aliases=1 39) 43683612 (99.8%) R@0x2ddc608 pss=1065132 padding=1065132 num_aliases=1
source_path= object_path= source_path= object_path=
flags={} name=** symbol gap 0 (end of section) flags={} name=** symbol gap 0 (end of section)
39) 43683616 (99.8%) d@0x2de7000 pss=4 padding=0 num_aliases=1 40) 43683616 (99.8%) d@0x2de7000 pss=4 padding=0 num_aliases=1
source_path=base/page_allocator.cc object_path=base/base/page_allocator.o source_path=base/page_allocator.cc object_path=base/base/page_allocator.o
flags={} name=google::protobuf::internal::pLinuxKernelCmpxchg flags={} name=google::protobuf::internal::pLinuxKernelCmpxchg
40) 43683620 (99.8%) d@0x2de7004 pss=4 padding=0 num_aliases=1 41) 43683620 (99.8%) d@0x2de7004 pss=4 padding=0 num_aliases=1
source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o
flags={} name=google::protobuf::internal::pLinuxKernelMemoryBarrier flags={} name=google::protobuf::internal::pLinuxKernelMemoryBarrier
41) 43683772 (99.8%) d@0x2de7008 pss=152 padding=0 num_aliases=1 42) 43683772 (99.8%) d@0x2de7008 pss=152 padding=0 num_aliases=1
source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o
flags={rel} name=base::android::kBaseRegisteredMethods flags={rel} name=base::android::kBaseRegisteredMethods
42) 43683776 (99.8%) d@0x2de70a0 pss=4 padding=0 num_aliases=1 43) 43683776 (99.8%) d@0x2de70a0 pss=4 padding=0 num_aliases=1
source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o
flags={anon} name=base::android::g_renderer_histogram_code flags={anon} name=base::android::g_renderer_histogram_code
43) 43683780 (99.8%) d@0x2de70a4 pss=4 padding=0 num_aliases=1 44) 43683780 (99.8%) d@0x2de70a4 pss=4 padding=0 num_aliases=1
source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o
flags={anon,rel.loc} name=base::android::g_library_version_number flags={anon,rel.loc} name=base::android::g_library_version_number
44) 43785380 (100.0%) d@0x2dffd88 pss=101600 padding=101600 num_aliases=1 45) 43785380 (100.0%) d@0x2dffd88 pss=101600 padding=101600 num_aliases=1
source_path= object_path= source_path= object_path=
flags={} name=** symbol gap 0 (end of section) flags={} name=** symbol gap 0 (end of section)
45) 43785380 (100.0%) b@0x0 pss=262144 padding=0 num_aliases=1 46) 43785380 (100.0%) b@0x0 pss=262144 padding=0 num_aliases=1
source_path=third_party/fft_float.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o source_path=third_party/fft_float.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o
flags={} name=ff_cos_131072 flags={} name=ff_cos_131072
46) 43785380 (100.0%) b@0x0 pss=131072 padding=0 num_aliases=1 47) 43785380 (100.0%) b@0x0 pss=131072 padding=0 num_aliases=1
source_path=third_party/fft_fixed.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_fixed.o source_path=third_party/fft_fixed.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_fixed.o
flags={} name=ff_cos_131072_fixed flags={} name=ff_cos_131072_fixed
47) 43785380 (100.0%) b@0x0 pss=131072 padding=0 num_aliases=1 48) 43785380 (100.0%) b@0x0 pss=131072 padding=0 num_aliases=1
source_path=third_party/fft_float.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o source_path=third_party/fft_float.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o
flags={} name=ff_cos_65536 flags={} name=ff_cos_65536
48) 43785380 (100.0%) b@0x2dffda0 pss=28 padding=0 num_aliases=1 49) 43785380 (100.0%) b@0x2dffda0 pss=28 padding=0 num_aliases=1
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={gen} name=g_chrome_content_browser_client flags={gen} name=g_chrome_content_browser_client
49) 43785380 (100.0%) b@0x2dffe80 pss=200 padding=196 num_aliases=1 50) 43785380 (100.0%) b@0x2dffe80 pss=200 padding=196 num_aliases=1
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={gen} name=SaveHistogram::atomic_histogram_pointer flags={gen} name=SaveHistogram::atomic_histogram_pointer
full_name=SaveHistogram(_JNIEnv*, base::android::JavaParamRef<_jobject*> const&, base::android::JavaParamRef<_jstring*> const&, base::android::JavaParamRef<_jlongArray*> const&, int)::atomic_histogram_pointer full_name=SaveHistogram(_JNIEnv*, base::android::JavaParamRef<_jobject*> const&, base::android::JavaParamRef<_jstring*> const&, base::android::JavaParamRef<_jlongArray*> const&, int)::atomic_histogram_pointer
50) 43785380 (100.0%) b@0x2dffe84 pss=4 padding=0 num_aliases=1 51) 43785380 (100.0%) b@0x2dffe84 pss=4 padding=0 num_aliases=1
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={anon,gen} name=g_AnimationFrameTimeHistogram_clazz flags={anon,gen} name=g_AnimationFrameTimeHistogram_clazz
Showing 47 symbols (44 unique) with total pss: 43785380 bytes Showing 48 symbols (44 unique) with total pss: 43785380 bytes
Histogram of symbols based on PSS: Histogram of symbols based on PSS:
[2,4): 1 [16,32): 10 [128,256): 2 [131072,262144): 2 [1048576,2097152): 2 [2,4): 5 [16,32): 10 [128,256): 2 [131072,262144): 2 [1048576,2097152): 2
[4,8): 9 [32,64): 9 [256,512): 1 [262144,524288): 1 [2097152,4194304): 1 [4,8): 6 [32,64): 9 [256,512): 1 [262144,524288): 1 [2097152,4194304): 1
[8,16): 3 [64,128): 1 [65536,131072): 2 [524288,1048576): 2 [33554432,67108864): 1 [8,16): 3 [64,128): 1 [65536,131072): 2 [524288,1048576): 2 [33554432,67108864): 1
.text=34.2mb .rodata=5.65mb .data.rel.ro=1.02mb .data=99.4kb .bss=512kb total=41.8mb .text=34.2mb .rodata=5.65mb .data.rel.ro=1.02mb .data=99.4kb .bss=512kb total=41.8mb
Number of unique paths: 9 Number of unique paths: 9
...@@ -299,30 +303,34 @@ Index | Running Total | Section@Address | ... ...@@ -299,30 +303,34 @@ Index | Running Total | Section@Address | ...
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={gen} name=BazAlias flags={gen} name=BazAlias
full_name=BazAlias(bool) full_name=BazAlias(bool)
11) 35900582 (82.0%) t@0x2a0010 pss=4 (size=12) padding=0 num_aliases=3 11) 35900581 (82.0%) t@0x2a0010 pss=3 (size=12) padding=0 num_aliases=4
source_path=third_party/{shared}/2 object_path=third_party/{shared}/2 source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o
flags={clone} name=blink::ContiguousContainerBase::shrinkToFit flags={clone} name=blink::ContiguousContainerBase::shrinkToFit
full_name=blink::ContiguousContainerBase::shrinkToFit() full_name=blink::ContiguousContainerBase::shrinkToFit()
12) 35900586 (82.0%) t@0x2a0010 pss=4 (size=12) padding=0 num_aliases=3 12) 35900584 (82.0%) t@0x2a0010 pss=3 (size=12) padding=0 num_aliases=4
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={gen,clone} name=blink::ContiguousContainerBase::shrinkToFit
full_name=blink::ContiguousContainerBase::shrinkToFit()
13) 35900587 (82.0%) t@0x2a0010 pss=3 (size=12) padding=0 num_aliases=4
source_path=third_party/fft_float.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o source_path=third_party/fft_float.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o
flags={} name=FooAlias flags={} name=FooAlias
full_name=FooAlias() full_name=FooAlias()
13) 35900590 (82.0%) t@0x2a0010 pss=4 (size=12) padding=0 num_aliases=3 14) 35900590 (82.0%) t@0x2a0010 pss=3 (size=12) padding=0 num_aliases=4
source_path=third_party/fft_float.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o source_path=third_party/fft_float.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o
flags={} name=BarAlias flags={} name=BarAlias
full_name=BarAlias() full_name=BarAlias()
14) 35900618 (82.0%) t@0x2a0020 pss=28 padding=4 num_aliases=1 15) 35900618 (82.0%) t@0x2a0020 pss=28 padding=4 num_aliases=1
source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o
flags={} name=blink::ContiguousContainerBase::ContiguousContainerBase flags={} name=blink::ContiguousContainerBase::ContiguousContainerBase
full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&) full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&)
15) 35900712 (82.0%) t@0x2a1000 pss=94 padding=0 num_aliases=1 16) 35900712 (82.0%) t@0x2a1000 pss=94 padding=0 num_aliases=1
source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o
flags={anon,clone} name=blink::PaintChunker::releasePaintChunks flags={anon,clone} name=blink::PaintChunker::releasePaintChunks
full_name=blink::PaintChunker::releasePaintChunks() full_name=blink::PaintChunker::releasePaintChunks()
16) 35900714 (82.0%) r@0x266e600 pss=2.5 (size=5) padding=0 num_aliases=2 17) 35900714 (82.0%) r@0x266e600 pss=2.5 (size=5) padding=0 num_aliases=2
source_path=base/page_allocator.cc object_path=base/base/page_allocator.o source_path=base/page_allocator.cc object_path=base/base/page_allocator.o
flags={} name=string literal 0 flags={} name=string literal 0
17) 35900733 (82.0%) r@Group pss=18 padding=0 count=2 18) 35900733 (82.0%) r@Group pss=18 padding=0 count=2
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={gen} name=string literal 0 flags={gen} name=string literal 0
full_name=string literals full_name=string literals
...@@ -332,13 +340,13 @@ Index | Running Total | Section@Address | ... ...@@ -332,13 +340,13 @@ Index | Running Total | Section@Address | ...
> 1) 18 (100.0%) r@0x266e605 pss=16 padding=0 num_aliases=1 > 1) 18 (100.0%) r@0x266e605 pss=16 padding=0 num_aliases=1
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={gen} name=string literal 0 flags={gen} name=string literal 0
18) 35900776 (82.0%) r@0x266e630 pss=43 padding=27 num_aliases=1 19) 35900776 (82.0%) r@0x266e630 pss=43 padding=27 num_aliases=1
source_path= object_path= source_path= object_path=
flags={} name=** merge strings flags={} name=** merge strings
19) 37866121 (86.5%) r@0x284d600 pss=1965345 padding=1961920 num_aliases=1 20) 37866121 (86.5%) r@0x284d600 pss=1965345 padding=1961920 num_aliases=1
source_path= object_path= source_path= object_path=
flags={} name=** merge constants flags={} name=** merge constants
20) 41152236 (94.0%) r@Group pss=3286115 padding=3286115 count=2 21) 41152236 (94.0%) r@Group pss=3286115 padding=3286115 count=2
source_path= object_path= source_path= object_path=
flags={} name=** symbol gaps flags={} name=** symbol gaps
> 0) 3 (0.0%) r@0x284e364 pss=3 padding=3 num_aliases=1 > 0) 3 (0.0%) r@0x284e364 pss=3 padding=3 num_aliases=1
...@@ -347,82 +355,82 @@ Index | Running Total | Section@Address | ... ...@@ -347,82 +355,82 @@ Index | Running Total | Section@Address | ...
> 1) 3286115 (100.0%) r@0x2c158e4 pss=3286112 padding=3286112 num_aliases=1 > 1) 3286115 (100.0%) r@0x2c158e4 pss=3286112 padding=3286112 num_aliases=1
source_path= object_path= source_path= object_path=
flags={} name=** symbol gap 1 (end of section) flags={} name=** symbol gap 1 (end of section)
21) 41152244 (94.0%) r@0x284e364 pss=8 padding=0 num_aliases=1 22) 41152244 (94.0%) r@0x284e364 pss=8 padding=0 num_aliases=1
source_path=base/page_allocator.cc object_path=base/base/page_allocator.o source_path=base/page_allocator.cc object_path=base/base/page_allocator.o
22) 41152288 (94.0%) r@0x284e370 pss=44 padding=4 num_aliases=1 23) 41152288 (94.0%) r@0x284e370 pss=44 padding=4 num_aliases=1
source_path=base/page_allocator.cc object_path=base/base/page_allocator.o source_path=base/page_allocator.cc object_path=base/base/page_allocator.o
flags={} name=Name flags={} name=Name
23) 41152320 (94.0%) r@0x284e398 pss=32 padding=0 num_aliases=1 24) 41152320 (94.0%) r@0x284e398 pss=32 padding=0 num_aliases=1
source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o
flags={} name=chrome::mojom::FilePatcher::Name_ flags={} name=chrome::mojom::FilePatcher::Name_
24) 41828360 (95.5%) r@0x28f3450 pss=676040 padding=675992 num_aliases=1 25) 41828360 (95.5%) r@0x28f3450 pss=676040 padding=675992 num_aliases=1
source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o
flags={anon} name=kAnimationFrameTimeHistogramClassPath flags={anon} name=kAnimationFrameTimeHistogramClassPath
25) 41828364 (95.5%) r@0x28f3480 pss=4 padding=0 num_aliases=1 26) 41828364 (95.5%) r@0x28f3480 pss=4 padding=0 num_aliases=1
source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o
flags={anon} name=blink::CSSValueKeywordsHash::findValueImpl::value_word_list flags={anon} name=blink::CSSValueKeywordsHash::findValueImpl::value_word_list
full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list
26) 41828420 (95.5%) R@0x2c176f0 pss=56 padding=0 num_aliases=1 27) 41828420 (95.5%) R@0x2c176f0 pss=56 padding=0 num_aliases=1
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={gen} name=ChromeMainDelegate [vtable] flags={gen} name=ChromeMainDelegate [vtable]
27) 41828444 (95.5%) R@0x2c17728 pss=24 padding=0 num_aliases=1 28) 41828444 (95.5%) R@0x2c17728 pss=24 padding=0 num_aliases=1
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={gen} name=chrome::mojom::FieldTrialRecorder [vtable] flags={gen} name=chrome::mojom::FieldTrialRecorder [vtable]
28) 42618348 (97.3%) R@0x2c17740 pss=789904 padding=0 num_aliases=1 29) 42618348 (97.3%) R@0x2c17740 pss=789904 padding=0 num_aliases=1
source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o
flags={} name=chrome::mojom::FieldTrialRecorderProxy [vtable] flags={} name=chrome::mojom::FieldTrialRecorderProxy [vtable]
29) 42618380 (97.3%) R@0x2cd84e0 pss=32 padding=16 num_aliases=1 30) 42618380 (97.3%) R@0x2cd84e0 pss=32 padding=16 num_aliases=1
source_path= object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o source_path= object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o
flags={} name=.Lswitch.table.45 flags={} name=.Lswitch.table.45
30) 42618388 (97.3%) R@0x2cd84f0 pss=8 padding=0 num_aliases=1 31) 42618388 (97.3%) R@0x2cd84f0 pss=8 padding=0 num_aliases=1
source_path= object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libport_android_jni.a_jni_utils.o source_path= object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libport_android_jni.a_jni_utils.o
flags={anon} name=kSystemClassPrefixes flags={anon} name=kSystemClassPrefixes
31) 42618444 (97.3%) R@0x2cd8500 pss=56 padding=0 num_aliases=1 32) 42618444 (97.3%) R@0x2cd8500 pss=56 padding=0 num_aliases=1
source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o source_path=third_party/paint.cc object_path=third_party/WebKit.a/PaintChunker.o
flags={} name=ChromeMainDelegateAndroid [vtable] flags={} name=ChromeMainDelegateAndroid [vtable]
32) 42618468 (97.3%) R@0x2cd8538 pss=24 padding=0 num_aliases=1 33) 42618468 (97.3%) R@0x2cd8538 pss=24 padding=0 num_aliases=1
source_path=base/page_allocator.cc object_path=base/base/page_allocator.o source_path=base/page_allocator.cc object_path=base/base/page_allocator.o
flags={} name=mojo::MessageReceiver [vtable] flags={} name=mojo::MessageReceiver [vtable]
33) 42618480 (97.3%) R@0x2cd8550 pss=12 padding=0 num_aliases=1 34) 42618480 (97.3%) R@0x2cd8550 pss=12 padding=0 num_aliases=1
source_path=base/page_allocator.cc object_path=base/base/page_allocator.o source_path=base/page_allocator.cc object_path=base/base/page_allocator.o
flags={} name=kMethodsAnimationFrameTimeHistogram flags={} name=kMethodsAnimationFrameTimeHistogram
34) 43683612 (99.8%) R@0x2ddc608 pss=1065132 padding=1065132 num_aliases=1 35) 43683612 (99.8%) R@0x2ddc608 pss=1065132 padding=1065132 num_aliases=1
source_path= object_path= source_path= object_path=
flags={} name=** symbol gap 0 (end of section) flags={} name=** symbol gap 0 (end of section)
35) 43683616 (99.8%) d@0x2de7000 pss=4 padding=0 num_aliases=1 36) 43683616 (99.8%) d@0x2de7000 pss=4 padding=0 num_aliases=1
source_path=base/page_allocator.cc object_path=base/base/page_allocator.o source_path=base/page_allocator.cc object_path=base/base/page_allocator.o
flags={} name=google::protobuf::internal::pLinuxKernelCmpxchg flags={} name=google::protobuf::internal::pLinuxKernelCmpxchg
36) 43683620 (99.8%) d@0x2de7004 pss=4 padding=0 num_aliases=1 37) 43683620 (99.8%) d@0x2de7004 pss=4 padding=0 num_aliases=1
source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o
flags={} name=google::protobuf::internal::pLinuxKernelMemoryBarrier flags={} name=google::protobuf::internal::pLinuxKernelMemoryBarrier
37) 43683772 (99.8%) d@0x2de7008 pss=152 padding=0 num_aliases=1 38) 43683772 (99.8%) d@0x2de7008 pss=152 padding=0 num_aliases=1
source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o
flags={rel} name=base::android::kBaseRegisteredMethods flags={rel} name=base::android::kBaseRegisteredMethods
38) 43683776 (99.8%) d@0x2de70a0 pss=4 padding=0 num_aliases=1 39) 43683776 (99.8%) d@0x2de70a0 pss=4 padding=0 num_aliases=1
source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o
flags={anon} name=base::android::g_renderer_histogram_code flags={anon} name=base::android::g_renderer_histogram_code
39) 43683780 (99.8%) d@0x2de70a4 pss=4 padding=0 num_aliases=1 40) 43683780 (99.8%) d@0x2de70a4 pss=4 padding=0 num_aliases=1
source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o
flags={anon,rel.loc} name=base::android::g_library_version_number flags={anon,rel.loc} name=base::android::g_library_version_number
40) 43785380 (100.0%) d@0x2dffd88 pss=101600 padding=101600 num_aliases=1 41) 43785380 (100.0%) d@0x2dffd88 pss=101600 padding=101600 num_aliases=1
source_path= object_path= source_path= object_path=
flags={} name=** symbol gap 0 (end of section) flags={} name=** symbol gap 0 (end of section)
41) 43785380 (100.0%) b@0x0 pss=262144 padding=0 num_aliases=1 42) 43785380 (100.0%) b@0x0 pss=262144 padding=0 num_aliases=1
source_path=third_party/fft_float.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o source_path=third_party/fft_float.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o
flags={} name=ff_cos_131072 flags={} name=ff_cos_131072
42) 43785380 (100.0%) b@0x0 pss=131072 padding=0 num_aliases=1 43) 43785380 (100.0%) b@0x0 pss=131072 padding=0 num_aliases=1
source_path=third_party/fft_fixed.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_fixed.o source_path=third_party/fft_fixed.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_fixed.o
flags={} name=ff_cos_131072_fixed flags={} name=ff_cos_131072_fixed
43) 43785380 (100.0%) b@0x0 pss=131072 padding=0 num_aliases=1 44) 43785380 (100.0%) b@0x0 pss=131072 padding=0 num_aliases=1
source_path=third_party/fft_float.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o source_path=third_party/fft_float.cc object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o
flags={} name=ff_cos_65536 flags={} name=ff_cos_65536
44) 43785380 (100.0%) b@0x2dffda0 pss=28 padding=0 num_aliases=1 45) 43785380 (100.0%) b@0x2dffda0 pss=28 padding=0 num_aliases=1
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={gen} name=g_chrome_content_browser_client flags={gen} name=g_chrome_content_browser_client
45) 43785380 (100.0%) b@0x2dffe80 pss=200 padding=196 num_aliases=1 46) 43785380 (100.0%) b@0x2dffe80 pss=200 padding=196 num_aliases=1
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={gen} name=SaveHistogram::atomic_histogram_pointer flags={gen} name=SaveHistogram::atomic_histogram_pointer
full_name=SaveHistogram(_JNIEnv*, base::android::JavaParamRef<_jobject*> const&, base::android::JavaParamRef<_jstring*> const&, base::android::JavaParamRef<_jlongArray*> const&, int)::atomic_histogram_pointer full_name=SaveHistogram(_JNIEnv*, base::android::JavaParamRef<_jobject*> const&, base::android::JavaParamRef<_jstring*> const&, base::android::JavaParamRef<_jlongArray*> const&, int)::atomic_histogram_pointer
46) 43785380 (100.0%) b@0x2dffe84 pss=4 padding=0 num_aliases=1 47) 43785380 (100.0%) b@0x2dffe84 pss=4 padding=0 num_aliases=1
source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o source_path=third_party/icu/ucnv_ext.c object_path=third_party/icu/icuuc/ucnv_ext.o
flags={anon,gen} name=g_AnimationFrameTimeHistogram_clazz flags={anon,gen} name=g_AnimationFrameTimeHistogram_clazz
GroupedByName() GroupedByName()
Showing 42 symbols (42 unique) with total pss: 43785380 bytes Showing 42 symbols (42 unique) with total pss: 43785380 bytes
Histogram of symbols based on PSS: Histogram of symbols based on PSS:
{0}: 6 [8,16): 3 [32,64): 7 [128,256): 1 [65536,131072): 1 [1048576,2097152): 2 {0}: 6 [8,16): 3 [64,128): 2 [65536,131072): 1 [33554432,67108864): 1
[4,8): 7 [16,32): 9 [64,128): 2 [256,512): 1 [524288,1048576): 2 [33554432,67108864): 1 [2,4): 2 [16,32): 9 [128,256): 1 [524288,1048576): 2
[4,8): 5 [32,64): 7 [256,512): 1 [1048576,2097152): 2
.text=34.2mb .rodata=5.65mb .data.rel.ro=1.02mb .data=99.4kb .bss=512kb total=41.8mb .text=34.2mb .rodata=5.65mb .data.rel.ro=1.02mb .data=99.4kb .bss=512kb total=41.8mb
Number of unique paths: 9 Number of unique paths: 9
...@@ -17,10 +18,10 @@ Index | Running Total | Section@Address | PSS | Path ...@@ -17,10 +18,10 @@ Index | Running Total | Section@Address | PSS | Path
5) 39117493 (89.3%) *@Group 448 ucnv_extMatchFromU (count=1) 5) 39117493 (89.3%) *@Group 448 ucnv_extMatchFromU (count=1)
6) 39117521 (89.3%) *@Group 28 _GLOBAL__sub_I_SkDeviceProfile.cpp (count=1) 6) 39117521 (89.3%) *@Group 28 _GLOBAL__sub_I_SkDeviceProfile.cpp (count=1)
7) 39186645 (89.5%) *@Group 69124 foo_bar (count=1) 7) 39186645 (89.5%) *@Group 69124 foo_bar (count=1)
8) 39186673 (89.5%) *@Group 28 blink::ContiguousContainerBase::shrinkToFit (count=2) 8) 39186675 (89.5%) *@Group 30 blink::ContiguousContainerBase::shrinkToFit (count=3)
9) 39186697 (89.5%) *@Group 24 BazAlias (count=1) 9) 39186699 (89.5%) *@Group 24 BazAlias (count=1)
10) 39186701 (89.5%) *@Group 4 FooAlias (count=1) 10) 39186702 (89.5%) *@Group 3 FooAlias (count=1)
11) 39186705 (89.5%) *@Group 4 BarAlias (count=1) 11) 39186705 (89.5%) *@Group 3 BarAlias (count=1)
12) 39186733 (89.5%) *@Group 28 blink::ContiguousContainerBase::ContiguousContainerBase (count=1) 12) 39186733 (89.5%) *@Group 28 blink::ContiguousContainerBase::ContiguousContainerBase (count=1)
13) 39186827 (89.5%) *@Group 94 blink::PaintChunker::releasePaintChunks (count=1) 13) 39186827 (89.5%) *@Group 94 blink::PaintChunker::releasePaintChunks (count=1)
14) 39186848 (89.5%) *@Group 21 string literal 0 (count=2) 14) 39186848 (89.5%) *@Group 21 string literal 0 (count=2)
...@@ -55,7 +56,7 @@ GroupedByName(depth=1) ...@@ -55,7 +56,7 @@ GroupedByName(depth=1)
Showing 34 symbols (34 unique) with total pss: 43785380 bytes Showing 34 symbols (34 unique) with total pss: 43785380 bytes
Histogram of symbols based on PSS: Histogram of symbols based on PSS:
{0}: 6 [8,16): 4 [32,64): 6 [128,256): 2 [65536,131072): 1 [1048576,2097152): 2 {0}: 6 [8,16): 4 [32,64): 6 [128,256): 2 [65536,131072): 1 [1048576,2097152): 2
[4,8): 2 [16,32): 6 [64,128): 1 [256,512): 1 [524288,1048576): 2 [33554432,67108864): 1 [2,4): 2 [16,32): 6 [64,128): 1 [256,512): 1 [524288,1048576): 2 [33554432,67108864): 1
.text=34.2mb .rodata=5.65mb .data.rel.ro=1.02mb .data=99.4kb .bss=512kb total=41.8mb .text=34.2mb .rodata=5.65mb .data.rel.ro=1.02mb .data=99.4kb .bss=512kb total=41.8mb
Number of unique paths: 9 Number of unique paths: 9
...@@ -70,10 +71,10 @@ Index | Running Total | Section@Address | PSS | Path ...@@ -70,10 +71,10 @@ Index | Running Total | Section@Address | PSS | Path
5) 39117493 (89.3%) *@Group 448 ucnv_extMatchFromU (count=1) 5) 39117493 (89.3%) *@Group 448 ucnv_extMatchFromU (count=1)
6) 39117521 (89.3%) *@Group 28 _GLOBAL__sub_I_SkDeviceProfile.cpp (count=1) 6) 39117521 (89.3%) *@Group 28 _GLOBAL__sub_I_SkDeviceProfile.cpp (count=1)
7) 39186645 (89.5%) *@Group 69124 foo_bar (count=1) 7) 39186645 (89.5%) *@Group 69124 foo_bar (count=1)
8) 39186799 (89.5%) *@Group 154 blink (count=5) 8) 39186801 (89.5%) *@Group 156 blink (count=6)
9) 39186823 (89.5%) *@Group 24 BazAlias (count=1) 9) 39186825 (89.5%) *@Group 24 BazAlias (count=1)
10) 39186827 (89.5%) *@Group 4 FooAlias (count=1) 10) 39186828 (89.5%) *@Group 3 FooAlias (count=1)
11) 39186831 (89.5%) *@Group 4 BarAlias (count=1) 11) 39186831 (89.5%) *@Group 3 BarAlias (count=1)
12) 39186852 (89.5%) *@Group 21 string literal 0 (count=2) 12) 39186852 (89.5%) *@Group 21 string literal 0 (count=2)
13) 39186895 (89.5%) *@Group 43 ** merge strings (count=1) 13) 39186895 (89.5%) *@Group 43 ** merge strings (count=1)
14) 41152240 (94.0%) *@Group 1965345 ** merge constants (count=1) 14) 41152240 (94.0%) *@Group 1965345 ** merge constants (count=1)
...@@ -99,8 +100,9 @@ Index | Running Total | Section@Address | PSS | Path ...@@ -99,8 +100,9 @@ Index | Running Total | Section@Address | PSS | Path
GroupedByName(depth=-1) GroupedByName(depth=-1)
Showing 37 symbols (37 unique) with total pss: 43785380 bytes Showing 37 symbols (37 unique) with total pss: 43785380 bytes
Histogram of symbols based on PSS: Histogram of symbols based on PSS:
{0}: 6 [8,16): 4 [32,64): 8 [128,256): 1 [65536,131072): 1 [1048576,2097152): 2 {0}: 6 [8,16): 4 [64,128): 2 [65536,131072): 1 [33554432,67108864): 1
[4,8): 3 [16,32): 6 [64,128): 2 [256,512): 1 [524288,1048576): 2 [33554432,67108864): 1 [2,4): 2 [16,32): 6 [128,256): 1 [524288,1048576): 2
[4,8): 1 [32,64): 8 [256,512): 1 [1048576,2097152): 2
.text=34.2mb .rodata=5.65mb .data.rel.ro=1.02mb .data=99.4kb .bss=512kb total=41.8mb .text=34.2mb .rodata=5.65mb .data.rel.ro=1.02mb .data=99.4kb .bss=512kb total=41.8mb
Number of unique paths: 9 Number of unique paths: 9
...@@ -115,10 +117,10 @@ Index | Running Total | Section@Address | PSS | Path ...@@ -115,10 +117,10 @@ Index | Running Total | Section@Address | PSS | Path
5) 39117493 (89.3%) *@Group 448 ucnv_extMatchFromU (count=1) 5) 39117493 (89.3%) *@Group 448 ucnv_extMatchFromU (count=1)
6) 39117521 (89.3%) *@Group 28 _GLOBAL__sub_I_SkDeviceProfile.cpp (count=1) 6) 39117521 (89.3%) *@Group 28 _GLOBAL__sub_I_SkDeviceProfile.cpp (count=1)
7) 39186645 (89.5%) *@Group 69124 foo_bar (count=1) 7) 39186645 (89.5%) *@Group 69124 foo_bar (count=1)
8) 39186701 (89.5%) *@Group 56 blink::ContiguousContainerBase (count=3) 8) 39186703 (89.5%) *@Group 58 blink::ContiguousContainerBase (count=4)
9) 39186725 (89.5%) *@Group 24 BazAlias (count=1) 9) 39186727 (89.5%) *@Group 24 BazAlias (count=1)
10) 39186729 (89.5%) *@Group 4 FooAlias (count=1) 10) 39186730 (89.5%) *@Group 3 FooAlias (count=1)
11) 39186733 (89.5%) *@Group 4 BarAlias (count=1) 11) 39186733 (89.5%) *@Group 3 BarAlias (count=1)
12) 39186827 (89.5%) *@Group 94 blink::PaintChunker (count=1) 12) 39186827 (89.5%) *@Group 94 blink::PaintChunker (count=1)
13) 39186848 (89.5%) *@Group 21 string literal 0 (count=2) 13) 39186848 (89.5%) *@Group 21 string literal 0 (count=2)
14) 39186891 (89.5%) *@Group 43 ** merge strings (count=1) 14) 39186891 (89.5%) *@Group 43 ** merge strings (count=1)
...@@ -147,9 +149,9 @@ Index | Running Total | Section@Address | PSS | Path ...@@ -147,9 +149,9 @@ Index | Running Total | Section@Address | PSS | Path
GroupedByName(depth=1, min_count=2) GroupedByName(depth=1, min_count=2)
Showing 34 symbols (33 unique) with total pss: 43785380 bytes Showing 34 symbols (33 unique) with total pss: 43785380 bytes
Histogram of symbols based on PSS: Histogram of symbols based on PSS:
[4,8): 3 [32,64): 6 [256,512): 1 [262144,524288): 1 [33554432,67108864): 1 [2,4): 2 [16,32): 7 [128,256): 3 [131072,262144): 2 [1048576,2097152): 2
[8,16): 4 [64,128): 1 [65536,131072): 1 [524288,1048576): 2 [4,8): 1 [32,64): 6 [256,512): 1 [262144,524288): 1 [33554432,67108864): 1
[16,32): 7 [128,256): 3 [131072,262144): 2 [1048576,2097152): 2 [8,16): 4 [64,128): 1 [65536,131072): 1 [524288,1048576): 2
.text=34.2mb .rodata=5.65mb .data.rel.ro=1.02mb .data=99.4kb .bss=512kb total=41.8mb .text=34.2mb .rodata=5.65mb .data.rel.ro=1.02mb .data=99.4kb .bss=512kb total=41.8mb
Number of unique paths: 9 Number of unique paths: 9
...@@ -172,14 +174,14 @@ Index | Running Total | Section@Address | PSS | Path ...@@ -172,14 +174,14 @@ Index | Running Total | Section@Address | PSS | Path
_GLOBAL__sub_I_SkDeviceProfile.cpp _GLOBAL__sub_I_SkDeviceProfile.cpp
7) 39186645 (89.5%) t@0x28f1e0 69124 third_party/icu/ucnv_ext.c 7) 39186645 (89.5%) t@0x28f1e0 69124 third_party/icu/ucnv_ext.c
foo_bar foo_bar
8) 39186799 (89.5%) *@Group 154 {no path} 8) 39186801 (89.5%) *@Group 156 {no path}
blink (count=5) blink (count=6)
9) 39186823 (89.5%) t@0x2a0000 24 (size=48) third_party/icu/ucnv_ext.c 9) 39186825 (89.5%) t@0x2a0000 24 (size=48) third_party/icu/ucnv_ext.c
BazAlias (num_aliases=2) BazAlias (num_aliases=2)
10) 39186827 (89.5%) t@0x2a0010 4 (size=12) third_party/fft_float.cc 10) 39186828 (89.5%) t@0x2a0010 3 (size=12) third_party/fft_float.cc
FooAlias (num_aliases=3) FooAlias (num_aliases=4)
11) 39186831 (89.5%) t@0x2a0010 4 (size=12) third_party/fft_float.cc 11) 39186831 (89.5%) t@0x2a0010 3 (size=12) third_party/fft_float.cc
BarAlias (num_aliases=3) BarAlias (num_aliases=4)
12) 39186852 (89.5%) *@Group 21 {no path} 12) 39186852 (89.5%) *@Group 21 {no path}
string literal 0 (count=2) string literal 0 (count=2)
13) 39186895 (89.5%) r@0x266e630 43 {no path} 13) 39186895 (89.5%) r@0x266e630 43 {no path}
......
...@@ -64,7 +64,6 @@ _OBJECT_OUTPUTS = { ...@@ -64,7 +64,6 @@ _OBJECT_OUTPUTS = {
'01010101 t _GLOBAL__sub_I_page_allocator.cc', '01010101 t _GLOBAL__sub_I_page_allocator.cc',
'01010101 t _GLOBAL__sub_I_bbr_sender.cc', '01010101 t _GLOBAL__sub_I_bbr_sender.cc',
'01010101 t _GLOBAL__sub_I_pacing_sender.cc', '01010101 t _GLOBAL__sub_I_pacing_sender.cc',
'01010101 t _GLOBAL__sub_I_bbr_sender.cc',
'00000000 r .L.str', '00000000 r .L.str',
'01010101 t extFromUUseMapping(aj, int)', '01010101 t extFromUUseMapping(aj, int)',
'01010101 t extFromUUseMapping(signed char, unsigned int, int)', '01010101 t extFromUUseMapping(signed char, unsigned int, int)',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment