| #!/usr/bin/env python3 |
| # Copyright 2021 WebAssembly Community Group participants |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| """Automatically port legacy passes tests to be lit tests |
| """ |
| |
| import argparse |
| import glob |
| import os |
| import subprocess |
| import sys |
| |
| |
| script_dir = os.path.dirname(__file__) |
| test_dir = os.path.join(os.path.dirname(script_dir), 'test') |
| |
| |
| def warn(msg): |
| print(f'WARNING: {msg}', file=sys.stderr) |
| |
| |
| def port_test(args, test): |
| name = os.path.basename(test) |
| base = name.replace('.wast', '') |
| print('..', name) |
| |
| if not test.endswith('.wast'): |
| warn('Skipping because only .wast files are supported') |
| return |
| |
| dest = os.path.join(test_dir, 'lit', 'passes', name) |
| if not args.force and os.path.exists(dest): |
| warn('Skipping because destination file already exist') |
| return |
| |
| joined_passes = base |
| passes_file = os.path.join(test_dir, 'passes', base + '.passes') |
| if os.path.exists(passes_file): |
| with open(passes_file) as f: |
| joined_passes = f.read().strip() |
| |
| if 'translate-to-fuzz' in joined_passes or 'dwarf' in joined_passes: |
| warn('Skipping due to Windows issues') |
| return |
| |
| for bad in ['noprint', 'metrics', 'fuzz', 'print', 'emit', 'dump']: |
| if bad in joined_passes: |
| warn('Skipping due to nonstandard output') |
| return |
| |
| passes = joined_passes.split('_') |
| opts = [('--' + p if not p.startswith('O') and p != 'g' else '-' + p) |
| for p in passes] |
| |
| run_line = (f';; RUN: foreach %s %t wasm-opt {" ".join(opts)} -S -o -' |
| ' | filecheck %s') |
| |
| notice = (f';; NOTE: This test was ported using port_test.py and could be' |
| ' cleaned up.') |
| |
| with open(test, 'r') as src_file: |
| with open(dest, 'w') as dest_file: |
| print(notice, file=dest_file) |
| print('', file=dest_file) |
| print(run_line, file=dest_file) |
| print('', file=dest_file) |
| print(src_file.read(), file=dest_file, end='') |
| |
| update_script = os.path.join(script_dir, 'update_lit_checks.py') |
| subprocess.run([sys.executable, update_script, '-f', '--all-items', dest]) |
| |
| if not args.no_delete: |
| for f in glob.glob(test.replace('.wast', '.*')): |
| # Do not delete binary tests with the same name |
| if f.endswith('.wasm') or f.endswith('.bin.txt'): |
| continue |
| os.remove(f) |
| if args.git_add: |
| subprocess.run(['git', 'add', f]) |
| |
| if args.git_add: |
| subprocess.run(['git', 'add', dest]) |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser(description=__doc__) |
| parser.add_argument('-f', '--force', action='store_true', |
| help='Overwrite existing lit tests') |
| parser.add_argument('--no-delete', action='store_true', |
| help='Do not remove the old tests') |
| parser.add_argument('--git-add', action='store_true', |
| help='Stage changes') |
| parser.add_argument('tests', nargs='+', help='The test files to port') |
| args = parser.parse_args() |
| |
| for pattern in args.tests: |
| for test in glob.glob(pattern, recursive=True): |
| port_test(args, test) |
| |
| |
| if __name__ == '__main__': |
| main() |