diff --git a/test262/README.md b/test262/README.md index 51c3e85b41bce3a14f7dfa5a6c686434417ca713..8259b92e0c9984f0d8f55a44a9e3523e0fc4b57b 100644 --- a/test262/README.md +++ b/test262/README.md @@ -21,6 +21,8 @@ usage: run_test262.py [-h] [--dir DIR] [--file FILE] [--mode [{1,2,3}]] [--es51] [--es2015 [{all,only}]] [--esnext] [--engine FILE] [--babel] [--timeout TIMEOUT] [--threads THREADS] [--hostArgs HOSTARGS] + [--ark-aot] + [--ark-aot-tool ARK_AOT_TOOL] [--ark-tool ARK_TOOL] [--ark-frontend-tool ARK_FRONTEND_TOOL] [--libs-dir LIBS_DIR] @@ -45,6 +47,9 @@ optional arguments: --threads THREADS Run this many tests in parallel. Note that the browser runners don't work great with t > 1. --hostArgs HOSTARGS command-line arguments to pass to eshost host + --ark-aot Run test262 with aot + --ark-aot-tool ARK_AOT_TOOL + ark's aot tool --ark-tool ARK_TOOL ark's binary tool --ark-frontend-tool ARK_FRONTEND_TOOL ark frontend conversion tool diff --git a/test262/config.py b/test262/config.py index bd87d40b4b3a0e1107c4728fb3952a6681d7ae5f..a2f738b18977d4f0c98a33985d7933d7e55865cb 100755 --- a/test262/config.py +++ b/test262/config.py @@ -45,6 +45,7 @@ TEST_CI_DIR = os.path.join(DATA_DIR, "test_CI") DEFAULT_ARK_FRONTEND_TOOL = os.path.join(ARK_DIR, "build", "src", "index.js") DEFAULT_ARK_TOOL = os.path.join(ARK_JS_RUNTIME_DIR, "ark_js_vm") +DEFAULT_ARK_AOT_TOOL = os.path.join(ARK_JS_RUNTIME_DIR, "ark_aot_compiler") DEFAULT_LIBS_DIR = f"{ARK_DIR}:{ICUI_DIR}:{LLVM_DIR}:{ARK_JS_RUNTIME_DIR}" DEFAULT_HOST_TYPE = "panda" diff --git a/test262/run_sunspider.py b/test262/run_sunspider.py index cb59b4f5085a0ea174c7e13c3ded34821a3c3e6b..67bcf46c86e924c03b5634c3be1353537bd19728 100755 --- a/test262/run_sunspider.py +++ b/test262/run_sunspider.py @@ -23,6 +23,8 @@ import os import platform import sys import signal +import re +import fileinput import subprocess from utils import * from config import * @@ -34,6 +36,13 @@ def parse_args(): default=DEFAULT_ARK_TOOL, required=False, help="ark's binary tool") + parser.add_argument('--ark-aot', action='store_true', + required=False, + help="Run test262 with aot") + parser.add_argument('--ark-aot-tool', + default=DEFAULT_ARK_AOT_TOOL, + required=False, + help="ark's aot tool") parser.add_argument('--ark-frontend-tool', default=DEFAULT_ARK_FRONTEND_TOOL, required=False, @@ -72,6 +81,7 @@ if platform.system() == "Windows" : ARK_TOOL = DEFAULT_ARK_TOOL ARK_FRONTEND_TOOL = DEFAULT_ARK_FRONTEND_TOOL LIBS_DIR = DEFAULT_LIBS_DIR +ARK_AOT_TOOL = DEFAULT_ARK_AOT_TOOL ARK_FRONTEND = DEFAULT_ARK_FRONTEND ARK_ARCH = DEFAULT_ARK_ARCH @@ -131,16 +141,32 @@ def exec_command(cmd_args, timeout=DEFAULT_TIMEOUT): output(code, msg) return code +def print_command(cmd_args): + sys.stderr.write("\n") + for arg in cmd_args: + sys.stderr.write(arg + " ") + sys.stderr.write("\n") + +def run_command(cmd_args): + timeout = DEFAULT_TIMEOUT / 1000 + cmd = f"timeout {timeout} " + for arg in cmd_args: + cmd += f"{arg} " + return os.system(cmd) class ArkProgram(): def __init__(self, args): self.args = args self.ark_tool = ARK_TOOL + self.ark_aot = False + self.ark_aot_tool = ARK_AOT_TOOL self.ark_frontend_tool = ARK_FRONTEND_TOOL self.libs_dir = LIBS_DIR self.ark_frontend = ARK_FRONTEND self.module_list = [] self.js_file = "" + self.module = False + self.abc_file = "" self.arch = ARK_ARCH self.arch_root = "" @@ -148,6 +174,12 @@ class ArkProgram(): if self.args.ark_tool: self.ark_tool = self.args.ark_tool + if self.args.ark_aot: + self.ark_aot = self.args.ark_aot + + if self.args.ark_aot_tool: + self.ark_aot_tool = self.args.ark_aot_tool + if self.args.ark_frontend_tool: self.ark_frontend_tool = self.args.ark_frontend_tool @@ -170,6 +202,7 @@ class ArkProgram(): file_name_pre = os.path.splitext(js_file)[0] file_name = os.path.basename(js_file) out_file = f"{file_name_pre}.abc" + self.abc_file = out_file mod_opt_index = 0 cmd_args = [] frontend_tool = self.ark_frontend_tool @@ -184,9 +217,88 @@ class ArkProgram(): if file_name in self.module_list: cmd_args.insert(mod_opt_index, "-m") + self.module = True + if self.ark_aot: + os.system(f'''sed -i 's/;$262.destroy();/\/\/;$262.destroy();/g' {js_file}''') + if self.module: + js_dir = os.path.dirname(js_file) + for line in fileinput.input(js_file): + import_line = re.findall(r"^(?:ex|im)port.*from.*\.js", line) + if len(import_line): + import_file = re.findall(r"['\"].*\.js", import_line[0]) + if len(import_file): + abc_file = import_file[0][1:].replace(".js", ".abc") + if self.abc_file.find(abc_file) < 0: + self.abc_file += f':{js_dir}/{abc_file}' retcode = exec_command(cmd_args) return retcode + def compile_aot(self): + os.environ["LD_LIBRARY_PATH"] = self.libs_dir + file_name_pre = os.path.splitext(self.js_file)[0] + abc_file = f'{file_name_pre}.abc' + cmd_args = [] + if self.arch == ARK_ARCH_LIST[1]: + cmd_args = [self.ark_aot_tool, ICU_PATH, + f'--target-triple=aarch64-unknown-linux-gnu', + f'--aot-file={file_name_pre}.m', + f'--snapshot-output-file={file_name_pre}.snapshot', + self.abc_file, + f'> {file_name_pre}.log 2>&1'] + elif self.arch == ARK_ARCH_LIST[2]: + cmd_args = [self.ark_aot_tool, ICU_PATH, + f'--target-triple=arm-unknown-linux-gnu', + f'--aot-file={file_name_pre}.m', + f'--snapshot-output-file={file_name_pre}.snapshot', + self.abc_file, + f'> {file_name_pre}.log 2>&1'] + elif self.arch == ARK_ARCH_LIST[0]: + cmd_args = [self.ark_aot_tool, ICU_PATH, + f'--aot-file={file_name_pre}.m', + f'--snapshot-output-file={file_name_pre}.snapshot', + self.abc_file, + f'> {file_name_pre}.log 2>&1'] + retcode = run_command(cmd_args) + if retcode: + print_command(cmd_args) + + def execute_aot(self): + os.environ["LD_LIBRARY_PATH"] = self.libs_dir + file_name_pre = os.path.splitext(self.js_file)[0] + cmd_args = [] + if self.arch == ARK_ARCH_LIST[1]: + qemu_tool = "qemu-aarch64" + qemu_arg1 = "-L" + qemu_arg2 = self.arch_root + cmd_args = [qemu_tool, qemu_arg1, qemu_arg2, self.ark_tool, + ICU_PATH, + '--asm-interpreter=1', + f'--aot-file={file_name_pre}.m', + f'--snapshot-output-file={file_name_pre}.snapshot', + f'{file_name_pre}.abc'] + elif self.arch == ARK_ARCH_LIST[2]: + qemu_tool = "qemu-arm" + qemu_arg1 = "-L" + qemu_arg2 = self.arch_root + cmd_args = [qemu_tool, qemu_arg1, qemu_arg2, self.ark_tool, + ICU_PATH, + '--asm-interpreter=1', + f'--aot-file={file_name_pre}.m', + f'--snapshot-output-file={file_name_pre}.snapshot', + f'{file_name_pre}.abc'] + elif self.arch == ARK_ARCH_LIST[0]: + cmd_args = [self.ark_tool, ICU_PATH, + '--asm-interpreter=1', + f'--aot-file={file_name_pre}.m', + f'--snapshot-output-file={file_name_pre}.snapshot', + f'{file_name_pre}.abc'] + + retcode = run_command(cmd_args) + if retcode: + os.system(f'cp {self.js_file} {BASE_OUT_DIR}/../') + print_command(cmd_args) + return retcode + def execute(self): if platform.system() == "Windows" : os.environ["PATH"] = self.libs_dir + ";" + os.environ["PATH"] @@ -215,6 +327,8 @@ class ArkProgram(): f'{file_name_pre}.abc'] retcode = exec_command(cmd_args) + if retcode: + print_command(cmd_args) return retcode def is_legal_frontend(self): @@ -229,8 +343,11 @@ class ArkProgram(): return if self.gen_abc(): return - self.execute() - + if self.ark_aot: + self.compile_aot() + self.execute_aot() + else: + self.execute() def main(): args = parse_args() diff --git a/test262/run_test262.py b/test262/run_test262.py index d8f05aa9929ded0f96eef0868b10dc5d781540d0..585b236c274dd758c2a1dcc6b9f8185750a1f872 100755 --- a/test262/run_test262.py +++ b/test262/run_test262.py @@ -74,6 +74,10 @@ def parse_args(): help="command-line arguments to pass to eshost host\n") parser.add_argument('--ark-tool', help="ark's binary tool") + parser.add_argument('--ark-aot', action='store_true', + help="Run test262 with aot") + parser.add_argument('--ark-aot-tool', + help="ark's aot tool") parser.add_argument('--ark-frontend-tool', help="ark frontend conversion tool") parser.add_argument("--libs-dir", @@ -465,6 +469,7 @@ def get_threads(args): def get_host_args(args, host_type): host_args = "" ark_tool = DEFAULT_ARK_TOOL + ark_aot_tool = DEFAULT_ARK_AOT_TOOL ark_frontend_tool = DEFAULT_ARK_FRONTEND_TOOL libs_dir = DEFAULT_LIBS_DIR ark_frontend = DEFAULT_ARK_FRONTEND @@ -479,6 +484,9 @@ def get_host_args(args, host_type): if args.ark_tool: ark_tool = args.ark_tool + if args.ark_aot_tool: + ark_aot_tool = args.ark_aot_tool + if args.ark_frontend_tool: ark_frontend_tool = args.ark_frontend_tool @@ -491,10 +499,13 @@ def get_host_args(args, host_type): if host_type == DEFAULT_HOST_TYPE: host_args = f"-B test262/run_sunspider.py " host_args += f"--ark-tool={ark_tool} " + if args.ark_aot: + host_args += f"--ark-aot " + host_args += f"--ark-aot-tool={ark_aot_tool} " host_args += f"--ark-frontend-tool={ark_frontend_tool} " host_args += f"--libs-dir={libs_dir} " host_args += f"--ark-frontend={ark_frontend} " - host_args += f"--module-list={module_list}" + host_args += f"--module-list={module_list} " if args.ark_arch != ark_arch: host_args += f"--ark-arch={args.ark_arch} "