Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Unified Diff: tools/binary_size/libsupersize/cluster_symbols.py

Issue 2885073002: supersize: Move [clone] from name -> flags & rewrite Cluster() (Closed)
Patch Set: review comment Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/binary_size/libsupersize/canned_queries.py ('k') | tools/binary_size/libsupersize/console.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/binary_size/libsupersize/cluster_symbols.py
diff --git a/tools/binary_size/libsupersize/cluster_symbols.py b/tools/binary_size/libsupersize/cluster_symbols.py
deleted file mode 100644
index 61f654177deeb701c4131af0396702bbb8a6c6c5..0000000000000000000000000000000000000000
--- a/tools/binary_size/libsupersize/cluster_symbols.py
+++ /dev/null
@@ -1,127 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Logic for clustering similar symbols."""
-
-import collections
-import logging
-import re
-
-import function_signature
-
-
-def _StripCloneSuffix(name):
- # Multiple attributes could exist, so search from left-to-right.
- idx = name.find(' [clone ')
- if idx != -1:
- return name[:idx]
- return name
-
-
-# Refer to models.SymbolGroup.Clustered() for pydoc
-# TODO(agrieve): This logic should likely be combined with
-# SymbolGroup.GroupedBy(), as it conceptually does the same thing.
-# One could also thing of this as GroupedByFullName().
-def ClusterSymbols(symbols):
- # http://unix.stackexchange.com/questions/223013/function-symbol-gets-part-suffix-after-compilation
- # Example name suffixes:
- # [clone .part.322] # GCC
- # [clone .isra.322] # GCC
- # [clone .constprop.1064] # GCC
- # [clone .11064] # clang
-
- # Step 1: Create name map, find clones, collect star syms into replacements.
- logging.debug('Creating name -> symbol map')
- clone_indices = []
- indices_by_full_name = {}
- # (section_name, full_name_no_attr) -> [(index, sym),...]
- replacements_by_tup = collections.defaultdict(list)
- for i, symbol in enumerate(symbols):
- name = symbol.full_name
- if not name:
- continue
- if name.startswith('*'):
- # "symbol gap 3" -> "symbol gaps"
- name = re.sub(r'\s+\d+( \(.*\))?$', 's', name)
- replacements_by_tup[(symbol.section_name, name)].append((i, symbol))
- elif name.endswith(']') and ' [clone ' in name:
- clone_indices.append(i)
- else:
- indices_by_full_name[name] = i
-
- # Step 2: Collect same-named clone symbols.
- logging.debug('Grouping all clones')
- group_names_by_index = {}
- for i in clone_indices:
- symbol = symbols[i]
- stripped_full_name = _StripCloneSuffix(symbol.full_name)
- name_tup = (symbol.section_name, stripped_full_name)
- replacement_list = replacements_by_tup[name_tup]
-
- if not replacement_list:
- # First occurance, check for non-clone symbol.
- non_clone_idx = indices_by_full_name.get(stripped_full_name)
- if non_clone_idx is not None:
- non_clone_symbol = symbols[non_clone_idx]
- replacement_list.append((non_clone_idx, non_clone_symbol))
- group_names_by_index[non_clone_idx] = stripped_full_name
-
- replacement_list.append((i, symbol))
- group_names_by_index[i] = stripped_full_name
-
- # Step 3: Undo clustering when length=1.
- # Removing these groups means Diff() logic must know about [clone] suffix.
- to_clear = []
- for name_tup, replacement_list in replacements_by_tup.iteritems():
- if len(replacement_list) == 1:
- to_clear.append(name_tup)
- for name_tup in to_clear:
- del replacements_by_tup[name_tup]
-
- # Step 4: Replace first symbol from each cluster with a SymbolGroup.
- before_symbol_count = sum(len(x) for x in replacements_by_tup.itervalues())
- logging.debug('Creating %d symbol groups from %d symbols. %d clones had only '
- 'one symbol.', len(replacements_by_tup), before_symbol_count,
- len(to_clear))
-
- len_delta = len(replacements_by_tup) - before_symbol_count
- grouped_symbols = [None] * (len(symbols) + len_delta)
- dest_index = 0
- src_index = 0
- seen_tups = set()
- index_and_name_tups = []
- for name_tup, replacement_list in replacements_by_tup.iteritems():
- for symbol_tup in replacement_list:
- index_and_name_tups.append((symbol_tup[0], name_tup))
-
- index_and_name_tups.sort(key=lambda tup: tup[0])
- for index, name_tup in index_and_name_tups:
- count = index - src_index
- grouped_symbols[dest_index:dest_index + count] = (
- symbols[src_index:src_index + count])
- src_index = index + 1
- dest_index += count
- if name_tup not in seen_tups:
- seen_tups.add(name_tup)
- group_symbols = [tup[1] for tup in replacements_by_tup[name_tup]]
- section_name, stripped_full_name = name_tup
- if stripped_full_name.startswith('*'):
- stripped_template_name = stripped_full_name
- stripped_name = stripped_full_name
- else:
- stripped_template_name = _StripCloneSuffix(
- group_symbols[0].template_name)
- stripped_name = _StripCloneSuffix(group_symbols[0].name)
- cluster = symbols._CreateTransformed(
- group_symbols, full_name=stripped_full_name,
- template_name=stripped_template_name, name=stripped_name,
- section_name=section_name)
- function_signature.InternSameNames(cluster)
- grouped_symbols[dest_index] = cluster
- dest_index += 1
-
- assert len(grouped_symbols[dest_index:None]) == len(symbols[src_index:None])
- grouped_symbols[dest_index:None] = symbols[src_index:None]
- logging.debug('Finished clustering symbols.')
- return grouped_symbols
« no previous file with comments | « tools/binary_size/libsupersize/canned_queries.py ('k') | tools/binary_size/libsupersize/console.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698