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.
1. A list of symbols, including name, address, size,
padding (caused by alignment), and associated `.o` / `.cc` files.
#### How are Symbols Collected?
1. Symbol list is Extracted from linker `.map` file.
* Map files contain some unique pieces of information, such as
`** merge strings` entries, and the odd unnamed symbol (which map at least
lists a `.o` path).
* Map files contain some unique pieces of information compared to `nm` output,
such as `** merge strings` entries, and some unnamed symbols (which
although unnamed, contain the `.o` path).
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
inlined symbols is gathered.
......@@ -87,8 +86,15 @@ between milestones.
* Aliases are created by identical code folding (linker optimization).
* Aliases have the same address and size, but report their `.pss` as
`.size / .num_aliases`.
1. Paths for shared symbols (those found in multiple `.o` files) are collected
by running `nm` on every `.o` file.
1. `** merge strings` symbols are further broken down into individual string
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?
......
This diff is collapsed.
......@@ -6,7 +6,6 @@
import cStringIO
import calendar
import collections
import datetime
import gzip
import json
......@@ -43,13 +42,13 @@ def _SaveSizeInfoToFile(size_info, file_obj):
_LogSize(file_obj, 'header') # For libchrome: 570 bytes.
# Store a single copy of all paths and have them referenced by index.
# Using an OrderedDict makes the indices more repetitive (better compression).
path_tuples = collections.OrderedDict.fromkeys(
(s.object_path, s.source_path) for s in size_info.raw_symbols)
for i, key in enumerate(path_tuples):
path_tuples[key] = i
file_obj.write('%d\n' % len(path_tuples))
file_obj.writelines('%s\t%s\n' % pair for pair in path_tuples)
unique_path_tuples = sorted(set(
(s.object_path, s.source_path) for s in size_info.raw_symbols))
path_tuples = dict.fromkeys(unique_path_tuples)
for i, tup in enumerate(unique_path_tuples):
path_tuples[tup] = i
file_obj.write('%d\n' % len(unique_path_tuples))
file_obj.writelines('%s\t%s\n' % pair for pair in unique_path_tuples)
_LogSize(file_obj, 'paths') # For libchrome, adds 200kb.
# Symbol counts by section.
......
......@@ -218,8 +218,8 @@ class IntegrationTest(unittest.TestCase):
size_info2 = self._CloneSizeInfo()
# Removing 1 alias should not change the size.
a1, _, _ = (
size_info2.raw_symbols.Filter(lambda s: s.num_aliases == 3)[0].aliases)
a1, _, _, _ = (
size_info2.raw_symbols.Filter(lambda s: s.num_aliases == 4)[0].aliases)
size_info2.raw_symbols -= [a1]
a1.aliases.remove(a1)
d = diff.Diff(size_info1, size_info2)
......@@ -239,8 +239,8 @@ class IntegrationTest(unittest.TestCase):
size_info2 = self._CloneSizeInfo()
# Removing 2 aliases should not change the size.
a1, a2, _ = (
size_info2.raw_symbols.Filter(lambda s: s.num_aliases == 3)[0].aliases)
a1, _, a2, _ = (
size_info2.raw_symbols.Filter(lambda s: s.num_aliases == 4)[0].aliases)
size_info2.raw_symbols -= [a1, a2]
a1.aliases.remove(a1)
a1.aliases.remove(a2)
......@@ -255,22 +255,22 @@ class IntegrationTest(unittest.TestCase):
self.assertEquals((0, 2, 0), _DiffCounts(d.raw_symbols))
self.assertEquals((1, 1, 0), _DiffCounts(d.symbols.GroupedByFullName()))
def test_Diff_Aliases3(self):
def test_Diff_Aliases4(self):
size_info1 = self._CloneSizeInfo()
size_info2 = self._CloneSizeInfo()
# Removing all 3 aliases should change the size.
a1, a2, a3 = (
size_info2.raw_symbols.Filter(lambda s: s.num_aliases == 3)[0].aliases)
size_info2.raw_symbols -= [a1, a2, a3]
# Removing all 4 aliases should change the size.
a1, a2, a3, a4 = (
size_info2.raw_symbols.Filter(lambda s: s.num_aliases == 4)[0].aliases)
size_info2.raw_symbols -= [a1, a2, a3, a4]
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()))
# Adding all 3 aliases should change size.
# Adding all 4 aliases should change size.
d = diff.Diff(size_info2, size_info1)
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()))
def test_Diff_Clustering(self):
......
......@@ -31,6 +31,7 @@ BulkObjectFileAnalyzer:
alias for _BulkObjectFileAnalyzerWorker.
* AnalyzePaths: Run "nm" on all .o files to collect symbol names that exist
within each.
* SortPaths: Sort results of AnalyzePaths().
* AnalyzeStringLiterals: Must be run after AnalyzePaths() has completed.
Extracts string literals from .o files, and then locates them within the
"** merge strings" sections within an ELF's .rodata section.
......@@ -58,9 +59,10 @@ import threading
import concurrent
_MSG_ANALYZE_PATHS = 1
_MSG_ANALYZE_STRINGS = 2
_MSG_GET_SYMBOL_NAMES = 3
_MSG_GET_STRINGS = 4
_MSG_SORT_PATHS = 2
_MSG_ANALYZE_STRINGS = 3
_MSG_GET_SYMBOL_NAMES = 4
_MSG_GET_STRINGS = 5
_active_pids = None
......@@ -128,7 +130,8 @@ def _IsRelevantObjectFileName(name):
def CollectAliasesByAddress(elf_path, tool_prefix):
"""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
# directly takes 3s.
......@@ -151,17 +154,12 @@ def CollectAliasesByAddress(elf_path, tool_prefix):
address = int(address_str, 16)
if not address:
continue
# Constructors often show up twice.
name_list = names_by_address[address]
if name not in name_list:
name_list.append(name)
names_by_address[address].add(name)
# Since this is run in a separate process, minimize data passing by returning
# only aliased symbols.
names_by_address = {k: v for k, v in names_by_address.iteritems()
if len(v) > 1}
return names_by_address
# Also: Sort to ensure stable ordering.
return {k: sorted(v) for k, v in names_by_address.iteritems() if len(v) > 1}
def _CollectAliasesByAddressAsyncHelper(elf_path, tool_prefix):
......@@ -350,9 +348,17 @@ def _ExtractArchivePath(path):
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)
obj_sections = string_sections_by_path.get(path)
if not obj_sections:
# 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.
......@@ -410,7 +416,7 @@ def _ResolveStringPieces(encoded_string_addresses_by_path, string_data,
# least for ascii strings).
for path, object_addresses in string_addresses_by_path.iteritems():
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_dict = None
for target_dict, data in itertools.izip(ret, string_data):
......@@ -530,6 +536,10 @@ class _BulkObjectFileAnalyzerWorker(object):
self._encoded_string_addresses_by_path_chunks.append(encoded_strs)
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):
logging.debug('worker: AnalyzeStringLiterals() started.')
# Read string_data from elf_path, to be shared by forked processes.
......@@ -612,6 +622,9 @@ class _BulkObjectFileAnalyzerMaster(object):
payload = '\x01'.join(paths)
self._pipe.send((_MSG_ANALYZE_PATHS, payload))
def SortPaths(self):
self._pipe.send((_MSG_SORT_PATHS,))
def AnalyzeStringLiterals(self, elf_path, string_positions):
self._pipe.send((_MSG_ANALYZE_STRINGS, elf_path, string_positions))
......@@ -669,6 +682,10 @@ class _BulkObjectFileAnalyzerSlave(object):
'Cannot call AnalyzePaths() after AnalyzeStringLiterals()s.')
paths = message[1].split('\x01')
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:
self._WaitForAnalyzePathJobs()
elf_path, string_positions = message[1:]
......@@ -726,6 +743,7 @@ def main():
# Pass individually to test multiple calls.
for path in args.objects:
bulk_analyzer.AnalyzePaths([path])
bulk_analyzer.SortPaths()
names_to_paths = bulk_analyzer.GetSymbolNames()
print('Found {} names'.format(len(names_to_paths)))
......
......@@ -6,11 +6,11 @@ git_revision=abc123
gn_args=var1=true var2="foo"
map_file_name=../test.map
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%)
* 3 placeholders (symbols that start with **) account for 35830760 bytes (99.8%)
* Contains 5 aliases, mapped to 2 unique addresses (60 bytes)
* 1 symbols have shared ownership (12 bytes)
* Contains 6 aliases, mapped to 2 unique addresses (60 bytes)
* 0 symbols have shared ownership
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%)
* 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
.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=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=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=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=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=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=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@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)
......
......@@ -79,10 +79,10 @@ Section Sizes (Total=95.6mb (100233874 bytes)):
.symtab: 16.4mb (17166112 bytes) (17.1%)
.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:
[2,4): 1 [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
[2,4): 5 [16,32): 10 [128,256): 2 [131072,262144): 2 [1048576,2097152): 2
[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
.text=34.2mb .rodata=5.65mb .data.rel.ro=1.02mb .data=99.4kb .bss=512kb total=41.8mb
Number of unique paths: 9
......@@ -112,74 +112,76 @@ Index | Running Total | Section@Address | PSS | Path
blink::ContiguousContainerBase::shrinkToFit (num_aliases=2)
10) 35900578 (82.0%) t@0x2a0000 24 (size=48) third_party/icu/ucnv_ext.c
BazAlias (num_aliases=2)
11) 35900582 (82.0%) t@0x2a0010 4 (size=12) third_party/{shared}/2
blink::ContiguousContainerBase::shrinkToFit (num_aliases=3)
12) 35900586 (82.0%) t@0x2a0010 4 (size=12) third_party/fft_float.cc
FooAlias (num_aliases=3)
13) 35900590 (82.0%) t@0x2a0010 4 (size=12) third_party/fft_float.cc
BarAlias (num_aliases=3)
14) 35900618 (82.0%) t@0x2a0020 28 third_party/container.c
11) 35900581 (82.0%) t@0x2a0010 3 (size=12) third_party/paint.cc
blink::ContiguousContainerBase::shrinkToFit (num_aliases=4)
12) 35900584 (82.0%) t@0x2a0010 3 (size=12) third_party/icu/ucnv_ext.c
blink::ContiguousContainerBase::shrinkToFit (num_aliases=4)
13) 35900587 (82.0%) t@0x2a0010 3 (size=12) third_party/fft_float.cc
FooAlias (num_aliases=4)
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
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
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)
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)
18) 35900776 (82.0%) r@0x266e630 43 {no path}
19) 35900776 (82.0%) r@0x266e630 43 {no path}
** merge strings
19) 37866121 (86.5%) r@0x284d600 1965345 {no path}
20) 37866121 (86.5%) r@0x284d600 1965345 {no path}
** merge constants
20) 41152236 (94.0%) r@Group 3286115 {no path}
21) 41152236 (94.0%) r@Group 3286115 {no path}
** symbol gaps (count=2)
21) 41152244 (94.0%) r@0x284e364 8 base/page_allocator.cc
22) 41152288 (94.0%) r@0x284e370 44 base/page_allocator.cc
22) 41152244 (94.0%) r@0x284e364 8 base/page_allocator.cc
23) 41152288 (94.0%) r@0x284e370 44 base/page_allocator.cc
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_
24) 41828360 (95.5%) r@0x28f3450 676040 third_party/paint.cc
25) 41828360 (95.5%) r@0x28f3450 676040 third_party/paint.cc
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
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]
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]
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]
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
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
31) 42618444 (97.3%) R@0x2cd8500 56 third_party/paint.cc
32) 42618444 (97.3%) R@0x2cd8500 56 third_party/paint.cc
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]
33) 42618480 (97.3%) R@0x2cd8550 12 base/page_allocator.cc
34) 42618480 (97.3%) R@0x2cd8550 12 base/page_allocator.cc
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)
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
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
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
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
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
40) 43785380 (100.0%) d@0x2dffd88 101600 {no path}
41) 43785380 (100.0%) d@0x2dffd88 101600 {no path}
** 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
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
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
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
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
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
......@@ -21,9 +21,10 @@ GroupCount,Address,SizeWithoutPadding,Padding,NumAliases,PSS,Section,Name
,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,BazAlias
,0x2a0010,12,0,3,4.0,t,blink::ContiguousContainerBase::shrinkToFit
,0x2a0010,12,0,3,4.0,t,FooAlias
,0x2a0010,12,0,3,4.0,t,BarAlias
,0x2a0010,12,0,4,3.0,t,blink::ContiguousContainerBase::shrinkToFit
,0x2a0010,12,0,4,3.0,t,blink::ContiguousContainerBase::shrinkToFit
,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
,0x2a1000,94,0,1,94.0,t,blink::PaintChunker::releasePaintChunks
,0x266e600,5,0,2,2.5,r,string literal 0
......
......@@ -18,14 +18,14 @@ Section Sizes (Total=0 bytes (0 bytes)):
.rodata: 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
Number of unique symbols 47 -> 47 (+0)
0 paths added, 0 removed, 0 changed
Showing 0 symbols (aliases not grouped for diffs) with total pss: 0 bytes
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
Number of unique paths: 0
......
GroupedByName()
Showing 42 symbols (42 unique) with total pss: 43785380 bytes
Histogram of symbols based on PSS:
{0}: 6 [8,16): 3 [32,64): 7 [128,256): 1 [65536,131072): 1 [1048576,2097152): 2
[4,8): 7 [16,32): 9 [64,128): 2 [256,512): 1 [524288,1048576): 2 [33554432,67108864): 1
{0}: 6 [8,16): 3 [64,128): 2 [65536,131072): 1 [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
Number of unique paths: 9
......@@ -17,10 +18,10 @@ Index | Running Total | Section@Address | PSS | Path
5) 39117493 (89.3%) *@Group 448 ucnv_extMatchFromU (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)
8) 39186673 (89.5%) *@Group 28 blink::ContiguousContainerBase::shrinkToFit (count=2)
9) 39186697 (89.5%) *@Group 24 BazAlias (count=1)
10) 39186701 (89.5%) *@Group 4 FooAlias (count=1)
11) 39186705 (89.5%) *@Group 4 BarAlias (count=1)
8) 39186675 (89.5%) *@Group 30 blink::ContiguousContainerBase::shrinkToFit (count=3)
9) 39186699 (89.5%) *@Group 24 BazAlias (count=1)
10) 39186702 (89.5%) *@Group 3 FooAlias (count=1)
11) 39186705 (89.5%) *@Group 3 BarAlias (count=1)
12) 39186733 (89.5%) *@Group 28 blink::ContiguousContainerBase::ContiguousContainerBase (count=1)
13) 39186827 (89.5%) *@Group 94 blink::PaintChunker::releasePaintChunks (count=1)
14) 39186848 (89.5%) *@Group 21 string literal 0 (count=2)
......@@ -55,7 +56,7 @@ GroupedByName(depth=1)
Showing 34 symbols (34 unique) with total pss: 43785380 bytes
Histogram of symbols based on PSS:
{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
Number of unique paths: 9
......@@ -70,10 +71,10 @@ Index | Running Total | Section@Address | PSS | Path
5) 39117493 (89.3%) *@Group 448 ucnv_extMatchFromU (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)
8) 39186799 (89.5%) *@Group 154 blink (count=5)
9) 39186823 (89.5%) *@Group 24 BazAlias (count=1)
10) 39186827 (89.5%) *@Group 4 FooAlias (count=1)
11) 39186831 (89.5%) *@Group 4 BarAlias (count=1)
8) 39186801 (89.5%) *@Group 156 blink (count=6)
9) 39186825 (89.5%) *@Group 24 BazAlias (count=1)
10) 39186828 (89.5%) *@Group 3 FooAlias (count=1)
11) 39186831 (89.5%) *@Group 3 BarAlias (count=1)
12) 39186852 (89.5%) *@Group 21 string literal 0 (count=2)
13) 39186895 (89.5%) *@Group 43 ** merge strings (count=1)
14) 41152240 (94.0%) *@Group 1965345 ** merge constants (count=1)
......@@ -99,8 +100,9 @@ Index | Running Total | Section@Address | PSS | Path
GroupedByName(depth=-1)
Showing 37 symbols (37 unique) with total pss: 43785380 bytes
Histogram of symbols based on PSS:
{0}: 6 [8,16): 4 [32,64): 8 [128,256): 1 [65536,131072): 1 [1048576,2097152): 2
[4,8): 3 [16,32): 6 [64,128): 2 [256,512): 1 [524288,1048576): 2 [33554432,67108864): 1
{0}: 6 [8,16): 4 [64,128): 2 [65536,131072): 1 [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
Number of unique paths: 9
......@@ -115,10 +117,10 @@ Index | Running Total | Section@Address | PSS | Path
5) 39117493 (89.3%) *@Group 448 ucnv_extMatchFromU (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)
8) 39186701 (89.5%) *@Group 56 blink::ContiguousContainerBase (count=3)
9) 39186725 (89.5%) *@Group 24 BazAlias (count=1)
10) 39186729 (89.5%) *@Group 4 FooAlias (count=1)
11) 39186733 (89.5%) *@Group 4 BarAlias (count=1)
8) 39186703 (89.5%) *@Group 58 blink::ContiguousContainerBase (count=4)
9) 39186727 (89.5%) *@Group 24 BazAlias (count=1)
10) 39186730 (89.5%) *@Group 3 FooAlias (count=1)
11) 39186733 (89.5%) *@Group 3 BarAlias (count=1)
12) 39186827 (89.5%) *@Group 94 blink::PaintChunker (count=1)
13) 39186848 (89.5%) *@Group 21 string literal 0 (count=2)
14) 39186891 (89.5%) *@Group 43 ** merge strings (count=1)
......@@ -147,9 +149,9 @@ Index | Running Total | Section@Address | PSS | Path
GroupedByName(depth=1, min_count=2)
Showing 34 symbols (33 unique) with total pss: 43785380 bytes
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
[4,8): 1 [32,64): 6 [256,512): 1 [262144,524288): 1 [33554432,67108864): 1
[8,16): 4 [64,128): 1 [65536,131072): 1 [524288,1048576): 2
[16,32): 7 [128,256): 3 [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
Number of unique paths: 9
......@@ -172,14 +174,14 @@ Index | Running Total | Section@Address | PSS | Path
_GLOBAL__sub_I_SkDeviceProfile.cpp
7) 39186645 (89.5%) t@0x28f1e0 69124 third_party/icu/ucnv_ext.c
foo_bar
8) 39186799 (89.5%) *@Group 154 {no path}
blink (count=5)
9) 39186823 (89.5%) t@0x2a0000 24 (size=48) third_party/icu/ucnv_ext.c
8) 39186801 (89.5%) *@Group 156 {no path}
blink (count=6)
9) 39186825 (89.5%) t@0x2a0000 24 (size=48) third_party/icu/ucnv_ext.c
BazAlias (num_aliases=2)
10) 39186827 (89.5%) t@0x2a0010 4 (size=12) third_party/fft_float.cc
FooAlias (num_aliases=3)
11) 39186831 (89.5%) t@0x2a0010 4 (size=12) third_party/fft_float.cc
BarAlias (num_aliases=3)
10) 39186828 (89.5%) t@0x2a0010 3 (size=12) third_party/fft_float.cc
FooAlias (num_aliases=4)
11) 39186831 (89.5%) t@0x2a0010 3 (size=12) third_party/fft_float.cc
BarAlias (num_aliases=4)
12) 39186852 (89.5%) *@Group 21 {no path}
string literal 0 (count=2)
13) 39186895 (89.5%) r@0x266e630 43 {no path}
......
......@@ -64,7 +64,6 @@ _OBJECT_OUTPUTS = {
'01010101 t _GLOBAL__sub_I_page_allocator.cc',
'01010101 t _GLOBAL__sub_I_bbr_sender.cc',
'01010101 t _GLOBAL__sub_I_pacing_sender.cc',
'01010101 t _GLOBAL__sub_I_bbr_sender.cc',
'00000000 r .L.str',
'01010101 t extFromUUseMapping(aj, 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