blob: 586175e88e113d67d6794391da05d69135961075 [file] [log] [blame]
#!/usr/bin/env python3.8
# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""
This script will
1. Read the ~/.fuchsia/debug/symbol-index to load the symbol lookup paths.
2. Extract build ids from *.in files under the same directory.
3. For each build id, locate the symbol file and copy it to //prebuilt/test_data/symbolizer/symbols.
To make it simpler, this script takes no argument, supports only build_id directories and hard-codes
all paths.
"""
import os
import sys
class SymbolIndex:
_SYMBOL_INDEX = os.path.expanduser('~/.fuchsia/debug/symbol-index')
def __init__(self):
self._build_id_dirs = []
with open(self._SYMBOL_INDEX) as f:
for line in f:
symbol_path = line.strip().split('\t')[0]
if os.path.isdir(symbol_path):
self._build_id_dirs.append(symbol_path)
def lookup(self, build_id):
if len(build_id) < 2:
return
for build_id_dir in self._build_id_dirs:
path = build_id_dir + '/' + build_id[:2] + '/' + build_id[2:] + '.debug'
if os.path.exists(path):
return path
def scan_build_ids(in_file):
with open(in_file) as f:
for line in f:
# extract all {{{...}}} content
start = line.find('{{{')
if start < 0:
continue
end = line.find('}}}', start + 3)
if end < 0:
continue
content = line[start+3:end].split(':')
if not content:
continue
if content[0] == 'module':
yield content[-1]
def copy_symbols(this_dir, target_dir):
symbol_index = SymbolIndex()
for in_file in os.listdir(this_dir):
if not in_file.endswith('.in'):
continue
for build_id in scan_build_ids(this_dir + '/' + in_file):
if len(build_id) < 2:
continue
target_parent = target_dir + '/' + build_id[:2]
target = target_parent + '/' + build_id[2:] + '.debug'
if os.path.exists(target):
continue
symbol_file = symbol_index.lookup(build_id)
if not symbol_file:
print(f'Cannot find symbol file for {build_id}')
continue
print(f'Link {symbol_file} to {target}')
os.makedirs(target_parent, exist_ok=True)
os.link(symbol_file, target)
def main(argv):
if len(argv) != 1:
raise Exception('This script takes no argument')
this_dir = os.path.dirname(os.path.abspath(argv[0]))
target_dir = os.path.abspath(this_dir + '/../../../prebuilt/test_data/symbolizer/symbols')
copy_symbols(this_dir, target_dir)
if __name__ == '__main__':
main(sys.argv)