Index: tools/binary_size/libsupersize/diff.py |
diff --git a/tools/binary_size/libsupersize/diff.py b/tools/binary_size/libsupersize/diff.py |
index 178a06a8eb4d0a6556f2b7eea4f82e6d93a4f257..c79207df3e8ccc773bdff11f53336772fa26ee10 100644 |
--- a/tools/binary_size/libsupersize/diff.py |
+++ b/tools/binary_size/libsupersize/diff.py |
@@ -4,10 +4,41 @@ |
"""Logic for diffing two SizeInfo objects.""" |
import collections |
+import re |
import models |
+def _SymbolKey(symbol): |
+ """Returns a tuple that can be used to see if two Symbol are the same. |
+ |
+ Keys are not guaranteed to be unique within a SymbolGroup. When multiple |
+ symbols have the same key, they will be matched up in order of appearance. |
+ We do this because the numbering of these generated symbols is not stable. |
+ |
+ Examples of symbols with shared keys: |
+ "** merge strings" |
+ "** symbol gap 3", "** symbol gap 5" |
+ "foo() [clone ##]" |
+ "CSWTCH.61", "CSWTCH.62" |
+ "._468", "._467" |
+ ".L__unnamed_1193", ".L__unnamed_712" |
+ """ |
+ name = symbol.full_name or symbol.name |
+ clone_idx = name.find(' [clone ') |
+ if clone_idx != -1: |
+ name = name[:clone_idx] |
+ if name.startswith('*'): |
+ # "symbol gap 3 (bar)" -> "symbol gaps" |
+ name = re.sub(r'\s+\d+( \(.*\))?$', 's', name) |
+ |
+ if '.' not in name: |
+ return (symbol.section_name, name) |
+ # Compiler or Linker generated symbol. |
+ name = re.sub(r'[.0-9]', '', name) # Strip out all numbers and dots. |
+ return (symbol.section_name, name, symbol.object_path) |
+ |
+ |
def _CloneSymbol(sym, size): |
"""Returns a copy of |sym| with an updated |size|. |
@@ -101,7 +132,7 @@ def _NegateAndClone(before_symbols, matched_before_aliases, |
def _DiffSymbolGroups(before, after): |
before_symbols_by_key = collections.defaultdict(list) |
for s in before: |
- before_symbols_by_key[s._Key()].append(s) |
+ before_symbols_by_key[_SymbolKey(s)].append(s) |
similar = [] |
diffed_symbol_by_after_aliases = {} |
@@ -113,7 +144,7 @@ def _DiffSymbolGroups(before, after): |
# Step 1: Create all delta symbols and record unmatched symbols. |
for after_sym in after: |
- matching_syms = before_symbols_by_key.get(after_sym._Key()) |
+ matching_syms = before_symbols_by_key.get(_SymbolKey(after_sym)) |
if matching_syms: |
before_sym = matching_syms.pop(0) |
if before_sym.IsGroup() and after_sym.IsGroup(): |