Commit 5955250e authored by Matthew Cary's avatar Matthew Cary Committed by Commit Bot

Orderfile: Use linker start of text for offset base.

The instrumentation code outputs offsets relative to the start of text
as defined by a special symbol (linker_script_start_of_text). This
currently corresponds to the first symbol appearing in text, which
also happens to be the first SymbolInfo produced by
symbol_extractor. To protect against changes to the symbol_extractor
this change uses the special symbol for the dump offset base rather
than the lowest SymbolInfo offset seen.

Bug: 893981
Change-Id: Ia3d265ae56e6a3b7362abf177c9cbe8d2eda36fb
Reviewed-on: https://chromium-review.googlesource.com/c/1325989Reviewed-by: default avatarEgor Pasko <pasko@chromium.org>
Commit-Queue: Matthew Cary <mattcary@chromium.org>
Cr-Commit-Position: refs/heads/master@{#606454}
parent 96395f60
...@@ -49,6 +49,7 @@ class SymbolOffsetProcessor(object): ...@@ -49,6 +49,7 @@ class SymbolOffsetProcessor(object):
higher-level operations can be done in different orders without the caller higher-level operations can be done in different orders without the caller
managing all the state. managing all the state.
""" """
START_OF_TEXT_SYMBOL = 'linker_script_start_of_text'
def __init__(self, binary_filename): def __init__(self, binary_filename):
self._binary_filename = binary_filename self._binary_filename = binary_filename
...@@ -147,7 +148,8 @@ class SymbolOffsetProcessor(object): ...@@ -147,7 +148,8 @@ class SymbolOffsetProcessor(object):
symbols.append(self.OffsetToPrimaryMap()[o - 1].name) symbols.append(self.OffsetToPrimaryMap()[o - 1].name)
else: else:
not_found += 1 not_found += 1
logging.warning('%d offsets do not have matching symbol', not_found) if not_found:
logging.warning('%d offsets do not have matching symbol', not_found)
return symbols return symbols
def OffsetsPrimarySize(self, offsets): def OffsetsPrimarySize(self, offsets):
...@@ -234,7 +236,7 @@ class SymbolOffsetProcessor(object): ...@@ -234,7 +236,7 @@ class SymbolOffsetProcessor(object):
for i in items: for i in items:
dump_offset = get(i) dump_offset = get(i)
idx = dump_offset / 4 idx = dump_offset / 4
assert idx < len(dump_offset_to_symbol_info), ( assert dump_offset >= 0 and idx < len(dump_offset_to_symbol_info), (
'Dump offset out of binary range') 'Dump offset out of binary range')
symbol_info = dump_offset_to_symbol_info[idx] symbol_info = dump_offset_to_symbol_info[idx]
if symbol_info is None: if symbol_info is None:
...@@ -254,12 +256,17 @@ class SymbolOffsetProcessor(object): ...@@ -254,12 +256,17 @@ class SymbolOffsetProcessor(object):
section, maps it to a symbol, or None. section, maps it to a symbol, or None.
""" """
if self._offset_to_symbol_info is None: if self._offset_to_symbol_info is None:
min_offset = min(s.offset for s in self.SymbolInfos()) start_syms = [s for s in self.SymbolInfos()
if s.name == self.START_OF_TEXT_SYMBOL]
assert len(start_syms) == 1, 'Can\'t find unique start of text symbol'
start_of_text = start_syms[0].offset
max_offset = max(s.offset + s.size for s in self.SymbolInfos()) max_offset = max(s.offset + s.size for s in self.SymbolInfos())
text_length_words = (max_offset - min_offset) / 4 text_length_words = (max_offset - start_of_text) / 4
self._offset_to_symbol_info = [None for _ in xrange(text_length_words)] self._offset_to_symbol_info = [None for _ in xrange(text_length_words)]
for s in self.SymbolInfos(): for s in self.SymbolInfos():
offset = s.offset - min_offset offset = s.offset - start_of_text
if offset < 0:
continue
for i in range(offset / 4, (offset + s.size) / 4): for i in range(offset / 4, (offset + s.size) / 4):
self._offset_to_symbol_info[i] = s self._offset_to_symbol_info[i] = s
return self._offset_to_symbol_info return self._offset_to_symbol_info
......
...@@ -16,9 +16,10 @@ from test_utils import (ProfileFile, ...@@ -16,9 +16,10 @@ from test_utils import (ProfileFile,
TestProfileManager) TestProfileManager)
class ProcessProfilesTestCase(unittest.TestCase): class ProcessProfilesTestCase(unittest.TestCase):
START_SYMBOL = process_profiles.SymbolOffsetProcessor.START_OF_TEXT_SYMBOL
def setUp(self): def setUp(self):
self.symbol_0 = SimpleTestSymbol('0', 0, 0) self.symbol_0 = SimpleTestSymbol(self.START_SYMBOL, 0, 0)
self.symbol_1 = SimpleTestSymbol('1', 8, 16) self.symbol_1 = SimpleTestSymbol('1', 8, 16)
self.symbol_2 = SimpleTestSymbol('2', 32, 8) self.symbol_2 = SimpleTestSymbol('2', 32, 8)
self.symbol_3 = SimpleTestSymbol('3', 40, 12) self.symbol_3 = SimpleTestSymbol('3', 40, 12)
...@@ -39,6 +40,18 @@ class ProcessProfilesTestCase(unittest.TestCase): ...@@ -39,6 +40,18 @@ class ProcessProfilesTestCase(unittest.TestCase):
offset_to_symbol_info = processor._GetDumpOffsetToSymbolInfo() offset_to_symbol_info = processor._GetDumpOffsetToSymbolInfo()
self.assertListEqual(self.offset_to_symbol_info, offset_to_symbol_info) self.assertListEqual(self.offset_to_symbol_info, offset_to_symbol_info)
def testSymbolsBeforeStart(self):
self.symbol_infos = [SimpleTestSymbol(s.name, s.offset + 8, s.size)
for s in self.symbol_infos]
self.symbol_infos.append(SimpleTestSymbol('early', 0, 4))
processor = TestSymbolOffsetProcessor(self.symbol_infos)
offset_to_symbol_info = processor._GetDumpOffsetToSymbolInfo()
# The 'early' symbol should be omitted.
self.assertEqual(([None, None] + [self.symbol_infos[1]] * 4 +
[None] * 2 + [self.symbol_infos[2]] * 2 +
[self.symbol_infos[3]] * 3),
offset_to_symbol_info)
def testGetReachedOffsetsFromDump(self): def testGetReachedOffsetsFromDump(self):
processor = TestSymbolOffsetProcessor(self.symbol_infos) processor = TestSymbolOffsetProcessor(self.symbol_infos)
# 2 hits for symbol_1, 0 for symbol_2, 1 for symbol_3 # 2 hits for symbol_1, 0 for symbol_2, 1 for symbol_3
...@@ -60,7 +73,7 @@ class ProcessProfilesTestCase(unittest.TestCase): ...@@ -60,7 +73,7 @@ class ProcessProfilesTestCase(unittest.TestCase):
def testGetOrderedSymbols(self): def testGetOrderedSymbols(self):
processor = TestSymbolOffsetProcessor(self.symbol_infos) processor = TestSymbolOffsetProcessor(self.symbol_infos)
self.assertListEqual(['1', '3', '0'], self.assertListEqual(['1', '3', self.START_SYMBOL],
processor.GetOrderedSymbols([8, 41, 6, 0])) processor.GetOrderedSymbols([8, 41, 6, 0]))
def testOffsetToSymbolsMap(self): def testOffsetToSymbolsMap(self):
......
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