| #!/usr/bin/env python3 |
| # |
| # Copyright 2017 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. |
| |
| from __future__ import print_function |
| |
| import os |
| import sys |
| |
| import shared |
| import support |
| |
| |
| def files_with_extensions(path, extensions): |
| for file in sorted(os.listdir(path)): |
| ext = os.path.splitext(file)[1] |
| if ext in extensions: |
| yield file, ext |
| |
| |
| def generate_wat_files(llvm_bin, emscripten_sysroot): |
| print('\n[ building wat files from C sources... ]\n') |
| |
| lld_path = os.path.join(shared.options.binaryen_test, 'lld') |
| for src_file, ext in files_with_extensions(lld_path, ['.c', '.cpp', '.s']): |
| print('..', src_file) |
| obj_file = src_file.replace(ext, '.o') |
| |
| src_path = os.path.join(lld_path, src_file) |
| obj_path = os.path.join(lld_path, obj_file) |
| |
| wasm_file = src_file.replace(ext, '.wasm') |
| wat_file = src_file.replace(ext, '.wat') |
| |
| obj_path = os.path.join(lld_path, obj_file) |
| wasm_path = os.path.join(lld_path, wasm_file) |
| wat_path = os.path.join(lld_path, wat_file) |
| is_shared = 'shared' in src_file |
| is_64 = '64' in src_file |
| |
| compile_cmd = [ |
| os.path.join(llvm_bin, 'clang'), src_path, '-o', obj_path, |
| '-mllvm', '-enable-emscripten-sjlj', |
| '-c', |
| '-nostdinc', |
| '-Xclang', '-nobuiltininc', |
| '-Xclang', '-nostdsysteminc', |
| '-Xclang', '-I%s/include' % emscripten_sysroot, |
| '-O1', |
| ] |
| |
| link_cmd = [ |
| os.path.join(llvm_bin, 'wasm-ld'), '-flavor', 'wasm', |
| obj_path, '-o', wasm_path, |
| '--allow-undefined', |
| '--export', '__wasm_call_ctors', |
| '--export', '__start_em_asm', |
| '--export', '__stop_em_asm', |
| '--global-base=568', |
| ] |
| # We had a regression where this test only worked if debug names |
| # were included. |
| if 'longjmp' in src_file: |
| link_cmd.append('--strip-debug') |
| if is_shared: |
| compile_cmd.append('-fPIC') |
| compile_cmd.append('-fvisibility=default') |
| link_cmd.append('-shared') |
| link_cmd.append('--experimental-pic') |
| else: |
| if 'reserved_func_ptr' in src_file: |
| link_cmd.append('--entry=__main_argc_argv') |
| else: |
| link_cmd.append('--entry=main') |
| |
| if is_64: |
| compile_cmd.append('--target=wasm64-emscripten') |
| link_cmd.append('-mwasm64') |
| else: |
| compile_cmd.append('--target=wasm32-emscripten') |
| |
| try: |
| support.run_command(compile_cmd) |
| support.run_command(link_cmd) |
| support.run_command(shared.WASM_DIS + [wasm_path, '-o', wat_path]) |
| finally: |
| # Don't need the .o or .wasm files, don't leave them around |
| shared.delete_from_orbit(obj_path) |
| shared.delete_from_orbit(wasm_path) |
| |
| |
| if __name__ == '__main__': |
| if len(shared.options.positional_args) != 2: |
| print('Usage: generate_lld_tests.py [llvm/bin/dir] [path/to/emscripten]') |
| sys.exit(1) |
| generate_wat_files(*shared.options.positional_args) |