#!/usr/bin/env python
# Copyright (c) 2013 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.
"""Reduces result of 'readelf -wL' to just a list of starting addresses.
It lists up all addresses where the corresponding source files change. The
list is sorted in ascending order. See tests/reduce_debugline_test.py for
examples.
This script assumes that the result of 'readelf -wL' ends with an empty line.
Note: the option '-wL' has the same meaning with '--debug-dump=decodedline'.
"""
import re
import sys
_FILENAME_PATTERN = re.compile('(CU: |)(.+)\:')
def reduce_decoded_debugline(input_file):
filename = ''
starting_dict = {}
started = False
for line in input_file:
line = line.strip()
unpacked = line.split(None, 2)
if len(unpacked) == 3 and unpacked[2].startswith('0x'):
if not started and filename:
started = True
starting_dict[int(unpacked[2], 16)] = filename
else:
started = False
if line.endswith(':'):
matched = _FILENAME_PATTERN.match(line)
if matched:
filename = matched.group(2)
starting_list = []
prev_filename = ''
for address in sorted(starting_dict):
curr_filename = starting_dict[address]
if prev_filename != curr_filename:
starting_list.append((address, starting_dict[address]))
prev_filename = curr_filename
return starting_list
def main():
if len(sys.argv) != 1:
print >> sys.stderr, 'Unsupported arguments'
return 1
starting_list = reduce_decoded_debugline(sys.stdin)
bits64 = starting_list[-1][0] > 0xffffffff
for address, filename in starting_list:
if bits64:
print '%016x %s' % (address, filename)
else:
print '%08x %s' % (address, filename)
if __name__ == '__main__':
sys.exit(main())