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_root):
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
compile_cmd = [
os.path.join(llvm_bin, 'clang'), src_path, '-o', obj_path,
'--target=wasm32-emscripten',
'-mllvm', '-enable-emscripten-sjlj',
'-c',
'-nostdinc',
'-Xclang', '-nobuiltininc',
'-Xclang', '-nostdsysteminc',
'-Xclang', '-I%s/system/include' % emscripten_root,
'-O1',
]
link_cmd = [
os.path.join(llvm_bin, 'wasm-ld'), '-flavor', 'wasm',
'-z', '-stack-size=1048576',
obj_path, '-o', wasm_path,
'--allow-undefined',
'--export', '__wasm_call_ctors',
'--export', '__data_end',
'--global-base=568',
]
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:
link_cmd.append('--entry=main')
try:
support.run_command(compile_cmd)
support.run_command(link_cmd)
support.run_command(shared.WASM_DIS + [wasm_path, '-o', wat_path])
finally:
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)