| #!/usr/bin/env python3 |
| # Copyright 2019 The Emscripten Authors. All rights reserved. |
| # Emscripten is available under two separate licenses, the MIT license and the |
| # University of Illinois/NCSA Open Source License. Both these licenses can be |
| # found in the LICENSE file. |
| |
| """Size helper script |
| |
| This script acts as a frontend replacement for `size` that supports combining |
| JS and wasm output from emscripten. |
| The traditional size utility reports the size of each section in a binary |
| and the total. This replacement adds another pseudo-section, "JS" which |
| shows the size of the JavaScript loader file. |
| |
| Currently there are many limitations; basically this tool is enough to |
| be used by the LLVM testsuite runner code to analyze size output. |
| |
| Currently this tool only supports sysv output format (it accepts but ignores |
| any '-format' argument). It does not accept any other arguments aside from the |
| input file, which is expected to be a JS file. The wasm file is expected to be |
| in the same directory, and have the same basename with a '.wasm' extension. |
| """ |
| |
| import argparse |
| import os |
| import subprocess |
| import sys |
| |
| from tools import shared |
| |
| LLVM_SIZE = os.path.expanduser(shared.build_llvm_tool_path(shared.exe_suffix('llvm-size'))) |
| |
| |
| def error(text): |
| print(text, file=sys.stderr, flush=True) |
| return 1 |
| |
| |
| def parse_args(argv): |
| parser = argparse.ArgumentParser(description=__doc__) |
| parser.add_argument('-format') |
| parser.add_argument('file') |
| args = parser.parse_args(argv) |
| return args.file |
| |
| |
| def print_sizes(js_file): |
| if not os.path.isfile(js_file): |
| return error('Input JS file %s not foune' % js_file) |
| if not js_file.endswith('.js'): |
| return error('Input file %s does not have a JS extension' % js_file) |
| |
| basename = js_file[:-3] |
| |
| # Find the JS file size |
| st = os.stat(js_file) |
| js_size = st.st_size |
| |
| # Find the rest of the sizes |
| wasm_file = basename + '.wasm' |
| if not os.path.isfile(wasm_file): |
| return error('Wasm file %s not found' % wasm_file) |
| |
| sizes = shared.check_call([LLVM_SIZE, '--format=sysv', wasm_file], |
| stdout=subprocess.PIPE).stdout |
| # llvm-size may emit some number of blank lines (after the total), ignore them |
| lines = [line for line in sizes.splitlines() if line] |
| |
| # Last line is the total. Add the JS size. |
| total = int(lines[-1].split()[-1]) |
| total += js_size |
| |
| for line in lines[:-1]: |
| print(line) |
| |
| print('JS\t\t%s\t0' % js_size) |
| print('Total\t\t%s' % total) |
| |
| |
| if __name__ == '__main__': |
| sys.exit(print_sizes(parse_args(sys.argv[1:]))) |