82 строки
2.5 KiB
Python
Executable File
82 строки
2.5 KiB
Python
Executable File
#!/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:])))
|