| Index: tools/binary_size/libsupersize/linker_map_parser.py
|
| diff --git a/tools/binary_size/libsupersize/linker_map_parser.py b/tools/binary_size/libsupersize/linker_map_parser.py
|
| index c88827c90f94473920440b7357f7c0eea0a9b43b..9bdf9b2b096e3d2cea5dc9c6ebfb31268ac8ac43 100644
|
| --- a/tools/binary_size/libsupersize/linker_map_parser.py
|
| +++ b/tools/binary_size/libsupersize/linker_map_parser.py
|
| @@ -35,16 +35,22 @@ class MapFileParser(object):
|
| A tuple of (section_sizes, symbols).
|
| """
|
| self._lines = iter(lines)
|
| - logging.info('Parsing common symbols')
|
| - self._common_symbols = self._ParseCommonSymbols()
|
| - logging.debug('.bss common entries: %d', len(self._common_symbols))
|
| - logging.info('Parsing section symbols')
|
| - self._ParseSections()
|
| + logging.debug('Scanning for Header')
|
| +
|
| + while True:
|
| + line = self._SkipToLineWithPrefix('Common symbol', 'Memory map')
|
| + if line.startswith('Common symbol'):
|
| + self._common_symbols = self._ParseCommonSymbols()
|
| + logging.debug('.bss common entries: %d', len(self._common_symbols))
|
| + continue
|
| + elif line.startswith('Memory map'):
|
| + self._ParseSections()
|
| + break
|
| return self._section_sizes, self._symbols
|
|
|
| - def _SkipToLineWithPrefix(self, prefix):
|
| + def _SkipToLineWithPrefix(self, prefix, prefix2=None):
|
| for l in self._lines:
|
| - if l.startswith(prefix):
|
| + if l.startswith(prefix) or (prefix2 and l.startswith(prefix2)):
|
| return l
|
|
|
| def _ParsePossiblyWrappedParts(self, line, count):
|
| @@ -65,7 +71,6 @@ class MapFileParser(object):
|
| # ff_cos_131072_fixed
|
| # 0x20000 obj/third_party/<snip>
|
| ret = []
|
| - self._SkipToLineWithPrefix('Common symbol')
|
| next(self._lines) # Skip past blank line
|
|
|
| name, size_str, path = None, None, None
|
| @@ -105,7 +110,6 @@ class MapFileParser(object):
|
| # ** merge constants
|
| # 0x0255fb00 0x8
|
| # ** common 0x02db5700 0x13ab48
|
| - self._SkipToLineWithPrefix('Memory map')
|
| syms = self._symbols
|
| symbol_gap_count = 0
|
| while True:
|
| @@ -118,15 +122,18 @@ class MapFileParser(object):
|
| parts = self._ParsePossiblyWrappedParts(line, 3)
|
| if not parts:
|
| break
|
| - section_name, address, size_str = parts
|
| - self._section_sizes[section_name] = int(size_str[2:], 16)
|
| + section_name, section_address_str, section_size_str = parts
|
| + section_address = int(section_address_str[2:], 16)
|
| + section_size = int(section_size_str[2:], 16)
|
| + self._section_sizes[section_name] = section_size
|
| if (section_name in ('.bss', '.rodata', '.text') or
|
| section_name.startswith('.data')):
|
| logging.info('Parsing %s', section_name)
|
| if section_name == '.bss':
|
| + # Common symbols have no address.
|
| syms.extend(self._common_symbols)
|
| prefix_len = len(section_name) + 1 # + 1 for the trailing .
|
| - merge_symbol_start_address = 0
|
| + merge_symbol_start_address = section_address
|
| sym_count_at_start = len(syms)
|
| line = next(self._lines)
|
| # Parse section symbols.
|
| @@ -202,21 +209,32 @@ class MapFileParser(object):
|
| # Finish off active address gap / merge section.
|
| if merge_symbol_start_address:
|
| merge_size = address - merge_symbol_start_address
|
| - logging.debug('Merge symbol of size %d found at:\n %r',
|
| - merge_size, syms[-1])
|
| - # Set size=0 so that it will show up as padding.
|
| - sym = models.Symbol(
|
| - section_name, 0,
|
| - address=address,
|
| - name='** symbol gap %d' % symbol_gap_count,
|
| - object_path=path)
|
| - symbol_gap_count += 1
|
| - syms.append(sym)
|
| merge_symbol_start_address = 0
|
| + if merge_size > 0:
|
| + # merge_size == 0 for the initial symbol generally.
|
| + logging.debug('Merge symbol of size %d found at:\n %r',
|
| + merge_size, syms[-1])
|
| + # Set size=0 so that it will show up as padding.
|
| + sym = models.Symbol(
|
| + section_name, 0,
|
| + address=address,
|
| + name='** symbol gap %d' % symbol_gap_count,
|
| + object_path=path)
|
| + symbol_gap_count += 1
|
| + syms.append(sym)
|
|
|
| sym = models.Symbol(section_name, size, address=address,
|
| name=name or mangled_name, object_path=path)
|
| syms.append(sym)
|
| + section_end_address = section_address + section_size
|
| + if section_name != '.bss' and (
|
| + syms[-1].end_address < section_end_address):
|
| + # Set size=0 so that it will show up as padding.
|
| + sym = models.Symbol(
|
| + section_name, 0,
|
| + address=section_end_address,
|
| + name='** symbol gap %d (end of section)' % symbol_gap_count)
|
| + syms.append(sym)
|
| logging.debug('Symbol count for %s: %d', section_name,
|
| len(syms) - sym_count_at_start)
|
| except:
|
|
|