13af6ab5fSopenharmony_ci#!/usr/bin/env python3 23af6ab5fSopenharmony_ci# -*- coding: utf-8 -*- 33af6ab5fSopenharmony_ci 43af6ab5fSopenharmony_ci""" 53af6ab5fSopenharmony_ciCopyright (c) 2021 Huawei Device Co., Ltd. 63af6ab5fSopenharmony_ciLicensed under the Apache License, Version 2.0 (the "License"); 73af6ab5fSopenharmony_ciyou may not use this file except in compliance with the License. 83af6ab5fSopenharmony_ciYou may obtain a copy of the License at 93af6ab5fSopenharmony_ci 103af6ab5fSopenharmony_ci http://www.apache.org/licenses/LICENSE-2.0 113af6ab5fSopenharmony_ci 123af6ab5fSopenharmony_ciUnless required by applicable law or agreed to in writing, software 133af6ab5fSopenharmony_cidistributed under the License is distributed on an "AS IS" BASIS, 143af6ab5fSopenharmony_ciWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 153af6ab5fSopenharmony_ciSee the License for the specific language governing permissions and 163af6ab5fSopenharmony_cilimitations under the License. 173af6ab5fSopenharmony_ci 183af6ab5fSopenharmony_ciDescription: Use ark to execute js files 193af6ab5fSopenharmony_ci""" 203af6ab5fSopenharmony_ci 213af6ab5fSopenharmony_ciimport argparse 223af6ab5fSopenharmony_ciimport os 233af6ab5fSopenharmony_ciimport platform 243af6ab5fSopenharmony_ciimport json 253af6ab5fSopenharmony_ciimport sys 263af6ab5fSopenharmony_ciimport signal 273af6ab5fSopenharmony_ciimport re 283af6ab5fSopenharmony_ciimport fileinput 293af6ab5fSopenharmony_ciimport subprocess 303af6ab5fSopenharmony_cifrom utils import * 313af6ab5fSopenharmony_cifrom config import * 323af6ab5fSopenharmony_ciimport mix_compile 333af6ab5fSopenharmony_ci 343af6ab5fSopenharmony_ci 353af6ab5fSopenharmony_cidef parse_args(): 363af6ab5fSopenharmony_ci parser = argparse.ArgumentParser() 373af6ab5fSopenharmony_ci parser.add_argument('--ark-tool', 383af6ab5fSopenharmony_ci default=DEFAULT_ARK_TOOL, 393af6ab5fSopenharmony_ci required=False, 403af6ab5fSopenharmony_ci help="ark's binary tool") 413af6ab5fSopenharmony_ci parser.add_argument('--ark-aot', action='store_true', 423af6ab5fSopenharmony_ci required=False, 433af6ab5fSopenharmony_ci help="Run test262 with aot") 443af6ab5fSopenharmony_ci parser.add_argument('--ark-aot-tool', 453af6ab5fSopenharmony_ci default=DEFAULT_ARK_AOT_TOOL, 463af6ab5fSopenharmony_ci required=False, 473af6ab5fSopenharmony_ci help="ark's aot tool") 483af6ab5fSopenharmony_ci parser.add_argument("--libs-dir", 493af6ab5fSopenharmony_ci default=DEFAULT_LIBS_DIR, 503af6ab5fSopenharmony_ci required=False, 513af6ab5fSopenharmony_ci help="The path collection of dependent so has been divided by':'") 523af6ab5fSopenharmony_ci parser.add_argument("--js-file", 533af6ab5fSopenharmony_ci required=True, 543af6ab5fSopenharmony_ci help="js file") 553af6ab5fSopenharmony_ci parser.add_argument("--stub-file", 563af6ab5fSopenharmony_ci default=DEFAULT_STUB_FILE, 573af6ab5fSopenharmony_ci required=False, 583af6ab5fSopenharmony_ci help="stub file") 593af6ab5fSopenharmony_ci parser.add_argument('--ark-frontend', 603af6ab5fSopenharmony_ci default=DEFAULT_ARK_FRONTEND, 613af6ab5fSopenharmony_ci required=False, 623af6ab5fSopenharmony_ci nargs='?', choices=ARK_FRONTEND_LIST, type=str, 633af6ab5fSopenharmony_ci help="Choose one of them") 643af6ab5fSopenharmony_ci parser.add_argument('--ark-frontend-binary', 653af6ab5fSopenharmony_ci default=DEFAULT_ARK_FRONTEND_BINARY, 663af6ab5fSopenharmony_ci required=False, 673af6ab5fSopenharmony_ci help="ark frontend conversion binary tool") 683af6ab5fSopenharmony_ci parser.add_argument('--ark-arch', 693af6ab5fSopenharmony_ci default=DEFAULT_ARK_ARCH, 703af6ab5fSopenharmony_ci required=False, 713af6ab5fSopenharmony_ci nargs='?', choices=ARK_ARCH_LIST, type=str, 723af6ab5fSopenharmony_ci help="Choose one of them") 733af6ab5fSopenharmony_ci parser.add_argument('--ark-arch-root', 743af6ab5fSopenharmony_ci default=DEFAULT_ARK_ARCH, 753af6ab5fSopenharmony_ci required=False, 763af6ab5fSopenharmony_ci help="the root path for qemu-aarch64 or qemu-arm") 773af6ab5fSopenharmony_ci parser.add_argument('--opt-level', 783af6ab5fSopenharmony_ci default=DEFAULT_OPT_LEVEL, 793af6ab5fSopenharmony_ci required=False, 803af6ab5fSopenharmony_ci help="the opt level for es2abc") 813af6ab5fSopenharmony_ci parser.add_argument('--es2abc-thread-count', 823af6ab5fSopenharmony_ci default=DEFAULT_ES2ABC_THREAD_COUNT, 833af6ab5fSopenharmony_ci required=False, 843af6ab5fSopenharmony_ci help="the thread count for es2abc") 853af6ab5fSopenharmony_ci parser.add_argument('--merge-abc-binary', 863af6ab5fSopenharmony_ci default=DEFAULT_MERGE_ABC_BINARY, 873af6ab5fSopenharmony_ci required=False, 883af6ab5fSopenharmony_ci help="frontend merge abc binary tool") 893af6ab5fSopenharmony_ci parser.add_argument('--merge-abc-mode', 903af6ab5fSopenharmony_ci default=DEFAULT_MERGE_ABC_MODE, 913af6ab5fSopenharmony_ci required=False, 923af6ab5fSopenharmony_ci help="run test for merge abc mode") 933af6ab5fSopenharmony_ci parser.add_argument('--product-name', 943af6ab5fSopenharmony_ci default=DEFAULT_PRODUCT_NAME, 953af6ab5fSopenharmony_ci required=False, 963af6ab5fSopenharmony_ci help="ark's product name") 973af6ab5fSopenharmony_ci parser.add_argument('--run-pgo', action='store_true', 983af6ab5fSopenharmony_ci required=False, 993af6ab5fSopenharmony_ci help="Run test262 with aot pgo") 1003af6ab5fSopenharmony_ci parser.add_argument('--enable-litecg', action='store_true', 1013af6ab5fSopenharmony_ci required=False, 1023af6ab5fSopenharmony_ci help="Run test262 with aot litecg enabled") 1033af6ab5fSopenharmony_ci parser.add_argument('--run-jit', action='store_true', 1043af6ab5fSopenharmony_ci required=False, 1053af6ab5fSopenharmony_ci help="Run test262 with JIT") 1063af6ab5fSopenharmony_ci parser.add_argument('--run-baseline-jit', action='store_true', 1073af6ab5fSopenharmony_ci required=False, 1083af6ab5fSopenharmony_ci help="Run test262 with baseline JIT") 1093af6ab5fSopenharmony_ci parser.add_argument('--abc2program', action='store_true', 1103af6ab5fSopenharmony_ci help="Use abc2prog to generate abc, aot or pgo is not supported yet under this option") 1113af6ab5fSopenharmony_ci parser.add_argument('--disable-force-gc', action='store_true', 1123af6ab5fSopenharmony_ci help="Run test262 with close force-gc") 1133af6ab5fSopenharmony_ci parser.add_argument('--enable-arkguard', action='store_true', 1143af6ab5fSopenharmony_ci required=False, 1153af6ab5fSopenharmony_ci help="enable arkguard for 262 tests") 1163af6ab5fSopenharmony_ci arguments = parser.parse_args() 1173af6ab5fSopenharmony_ci return arguments 1183af6ab5fSopenharmony_ci 1193af6ab5fSopenharmony_ci 1203af6ab5fSopenharmony_ciICU_PATH = f"--icu-data-path={CODE_ROOT}/third_party/icu/ohos_icu4j/data" 1213af6ab5fSopenharmony_ciif platform.system() == "Windows": 1223af6ab5fSopenharmony_ci ICU_PATH = ICU_PATH.replace("/", "\\") 1233af6ab5fSopenharmony_ciARK_TOOL = DEFAULT_ARK_TOOL 1243af6ab5fSopenharmony_ciLIBS_DIR = DEFAULT_LIBS_DIR 1253af6ab5fSopenharmony_ciARK_AOT_TOOL = DEFAULT_ARK_AOT_TOOL 1263af6ab5fSopenharmony_ciARK_FRONTEND = DEFAULT_ARK_FRONTEND 1273af6ab5fSopenharmony_ciARK_FRONTEND_BINARY = DEFAULT_ARK_FRONTEND_BINARY 1283af6ab5fSopenharmony_ciARK_ARCH = DEFAULT_ARK_ARCH 1293af6ab5fSopenharmony_ciPROTO_BIN_SUFFIX = "protoBin" 1303af6ab5fSopenharmony_ci 1313af6ab5fSopenharmony_ci 1323af6ab5fSopenharmony_ciclass ArkProgram(): 1333af6ab5fSopenharmony_ci def __init__(self, args): 1343af6ab5fSopenharmony_ci self.args = args 1353af6ab5fSopenharmony_ci self.ark_tool = ARK_TOOL 1363af6ab5fSopenharmony_ci self.ark_aot = False 1373af6ab5fSopenharmony_ci self.run_pgo = False 1383af6ab5fSopenharmony_ci self.enable_litecg = False 1393af6ab5fSopenharmony_ci self.disable_force_gc = False 1403af6ab5fSopenharmony_ci self.run_jit = False 1413af6ab5fSopenharmony_ci self.run_baseline_jit = False 1423af6ab5fSopenharmony_ci self.ark_aot_tool = ARK_AOT_TOOL 1433af6ab5fSopenharmony_ci self.libs_dir = LIBS_DIR 1443af6ab5fSopenharmony_ci self.ark_frontend = ARK_FRONTEND 1453af6ab5fSopenharmony_ci self.ark_frontend_binary = ARK_FRONTEND_BINARY 1463af6ab5fSopenharmony_ci self.module_list = [] 1473af6ab5fSopenharmony_ci self.dynamicImport_list = [] 1483af6ab5fSopenharmony_ci self.js_file = "" 1493af6ab5fSopenharmony_ci self.stub_file = "" 1503af6ab5fSopenharmony_ci self.module = False 1513af6ab5fSopenharmony_ci self.abc_file = "" 1523af6ab5fSopenharmony_ci self.arch = ARK_ARCH 1533af6ab5fSopenharmony_ci self.arch_root = "" 1543af6ab5fSopenharmony_ci self.opt_level = DEFAULT_OPT_LEVEL 1553af6ab5fSopenharmony_ci self.es2abc_thread_count = DEFAULT_ES2ABC_THREAD_COUNT 1563af6ab5fSopenharmony_ci self.merge_abc_binary = DEFAULT_MERGE_ABC_BINARY 1573af6ab5fSopenharmony_ci self.merge_abc_mode = DEFAULT_MERGE_ABC_MODE 1583af6ab5fSopenharmony_ci self.abc2program = False 1593af6ab5fSopenharmony_ci # when enabling abc2program, may generate a list of abc files 1603af6ab5fSopenharmony_ci self.abc_outputs = [] 1613af6ab5fSopenharmony_ci self.enable_arkguard = False 1623af6ab5fSopenharmony_ci 1633af6ab5fSopenharmony_ci def proce_parameters(self): 1643af6ab5fSopenharmony_ci if self.args.ark_tool: 1653af6ab5fSopenharmony_ci self.ark_tool = self.args.ark_tool 1663af6ab5fSopenharmony_ci 1673af6ab5fSopenharmony_ci if self.args.ark_aot: 1683af6ab5fSopenharmony_ci self.ark_aot = self.args.ark_aot 1693af6ab5fSopenharmony_ci 1703af6ab5fSopenharmony_ci if self.args.run_pgo: 1713af6ab5fSopenharmony_ci self.run_pgo = self.args.run_pgo 1723af6ab5fSopenharmony_ci 1733af6ab5fSopenharmony_ci if self.args.enable_litecg: 1743af6ab5fSopenharmony_ci self.enable_litecg = self.args.enable_litecg 1753af6ab5fSopenharmony_ci 1763af6ab5fSopenharmony_ci if self.args.disable_force_gc: 1773af6ab5fSopenharmony_ci self.disable_force_gc = self.args.disable_force_gc 1783af6ab5fSopenharmony_ci 1793af6ab5fSopenharmony_ci if self.args.run_jit: 1803af6ab5fSopenharmony_ci self.run_jit = self.args.run_jit 1813af6ab5fSopenharmony_ci 1823af6ab5fSopenharmony_ci if self.args.run_baseline_jit: 1833af6ab5fSopenharmony_ci self.run_baseline_jit = self.args.run_baseline_jit 1843af6ab5fSopenharmony_ci 1853af6ab5fSopenharmony_ci if self.args.ark_aot_tool: 1863af6ab5fSopenharmony_ci self.ark_aot_tool = self.args.ark_aot_tool 1873af6ab5fSopenharmony_ci 1883af6ab5fSopenharmony_ci if self.args.ark_frontend_binary: 1893af6ab5fSopenharmony_ci self.ark_frontend_binary = self.args.ark_frontend_binary 1903af6ab5fSopenharmony_ci 1913af6ab5fSopenharmony_ci if self.args.libs_dir: 1923af6ab5fSopenharmony_ci self.libs_dir = self.args.libs_dir 1933af6ab5fSopenharmony_ci 1943af6ab5fSopenharmony_ci if self.args.ark_frontend: 1953af6ab5fSopenharmony_ci self.ark_frontend = self.args.ark_frontend 1963af6ab5fSopenharmony_ci 1973af6ab5fSopenharmony_ci if self.args.opt_level: 1983af6ab5fSopenharmony_ci self.opt_level = self.args.opt_level 1993af6ab5fSopenharmony_ci 2003af6ab5fSopenharmony_ci if self.args.es2abc_thread_count: 2013af6ab5fSopenharmony_ci self.es2abc_thread_count = self.args.es2abc_thread_count 2023af6ab5fSopenharmony_ci 2033af6ab5fSopenharmony_ci if self.args.merge_abc_binary: 2043af6ab5fSopenharmony_ci self.merge_abc_binary = self.args.merge_abc_binary 2053af6ab5fSopenharmony_ci 2063af6ab5fSopenharmony_ci if self.args.merge_abc_mode: 2073af6ab5fSopenharmony_ci self.merge_abc_mode = self.args.merge_abc_mode 2083af6ab5fSopenharmony_ci 2093af6ab5fSopenharmony_ci if self.args.abc2program: 2103af6ab5fSopenharmony_ci self.abc2program = self.args.abc2program 2113af6ab5fSopenharmony_ci 2123af6ab5fSopenharmony_ci self.enable_arkguard = self.args.enable_arkguard 2133af6ab5fSopenharmony_ci 2143af6ab5fSopenharmony_ci self.module_list = MODULE_LIST 2153af6ab5fSopenharmony_ci 2163af6ab5fSopenharmony_ci self.dynamicImport_list = DYNAMIC_IMPORT_LIST 2173af6ab5fSopenharmony_ci 2183af6ab5fSopenharmony_ci self.js_file = self.args.js_file 2193af6ab5fSopenharmony_ci 2203af6ab5fSopenharmony_ci self.stub_file = self.args.stub_file 2213af6ab5fSopenharmony_ci 2223af6ab5fSopenharmony_ci self.arch = self.args.ark_arch 2233af6ab5fSopenharmony_ci 2243af6ab5fSopenharmony_ci self.arch_root = self.args.ark_arch_root 2253af6ab5fSopenharmony_ci 2263af6ab5fSopenharmony_ci def check_compile_mode(self, file): 2273af6ab5fSopenharmony_ci with open(file, 'r', encoding='utf-8') as check_file: 2283af6ab5fSopenharmony_ci content_file = check_file.read() 2293af6ab5fSopenharmony_ci module_pattern = '((?:export|import)\s+(?:{[\s\S]+}|\*))|' 2303af6ab5fSopenharmony_ci module_pattern += '(export\s+(?:let|const|var|function|class|default))|' 2313af6ab5fSopenharmony_ci module_pattern += '(import\s+[\'\"].+[\'\"])' 2323af6ab5fSopenharmony_ci module_mode_list = re.findall(module_pattern, content_file) 2333af6ab5fSopenharmony_ci 2343af6ab5fSopenharmony_ci for module_mode in list(set(module_mode_list)): 2353af6ab5fSopenharmony_ci if len(module_mode[0]) != 0 or len(module_mode[1]) != 0 or len(module_mode[2]) != 0: 2363af6ab5fSopenharmony_ci return True 2373af6ab5fSopenharmony_ci 2383af6ab5fSopenharmony_ci if "flags: [module]" in content_file or "/language/module-code/" in self.js_file: 2393af6ab5fSopenharmony_ci return True 2403af6ab5fSopenharmony_ci 2413af6ab5fSopenharmony_ci return False 2423af6ab5fSopenharmony_ci 2433af6ab5fSopenharmony_ci def get_all_skip_force_gc_tests(self): 2443af6ab5fSopenharmony_ci SKIP_FORCE_GC_LIST_FILES.append(TS2ABC_SKIP_FORCE_GC_LIST_FILE) 2453af6ab5fSopenharmony_ci 2463af6ab5fSopenharmony_ci for file in SKIP_FORCE_GC_LIST_FILES: 2473af6ab5fSopenharmony_ci with open(file) as jsonfile: 2483af6ab5fSopenharmony_ci json_data = json.load(jsonfile) 2493af6ab5fSopenharmony_ci for key in json_data: 2503af6ab5fSopenharmony_ci FORCE_GC_SKIP_TESTS.extend(key["files"]) 2513af6ab5fSopenharmony_ci 2523af6ab5fSopenharmony_ci def gen_dependency_proto(self, dependency): 2533af6ab5fSopenharmony_ci cmd_args = [] 2543af6ab5fSopenharmony_ci output_file = os.path.splitext(dependency.replace(DATA_DIR, BASE_OUT_DIR))[0] 2553af6ab5fSopenharmony_ci output_abc = f"{output_file}{ABC_EXT}" 2563af6ab5fSopenharmony_ci frontend_tool = self.ark_frontend_binary 2573af6ab5fSopenharmony_ci merge_abc_binary = self.args.merge_abc_binary 2583af6ab5fSopenharmony_ci merge_abc_mode = self.merge_abc_mode 2593af6ab5fSopenharmony_ci compile_as_module = self.check_compile_mode(dependency) 2603af6ab5fSopenharmony_ci 2613af6ab5fSopenharmony_ci if self.ark_frontend == ARK_FRONTEND_LIST[0]: 2623af6ab5fSopenharmony_ci if merge_abc_mode != "0": 2633af6ab5fSopenharmony_ci cmd_args = ['node', '--expose-gc', frontend_tool, dependency, 2643af6ab5fSopenharmony_ci '--output-proto', '--merge-abc'] 2653af6ab5fSopenharmony_ci else: 2663af6ab5fSopenharmony_ci # for testing no-record-name abc 2673af6ab5fSopenharmony_ci cmd_args = ['node', '--expose-gc', frontend_tool, dependency, 2683af6ab5fSopenharmony_ci '-o', output_abc] 2693af6ab5fSopenharmony_ci if compile_as_module: 2703af6ab5fSopenharmony_ci mod_opt_index = 6 2713af6ab5fSopenharmony_ci cmd_args.insert(mod_opt_index, "--modules") 2723af6ab5fSopenharmony_ci elif self.ark_frontend == ARK_FRONTEND_LIST[1]: 2733af6ab5fSopenharmony_ci if merge_abc_mode != "0": 2743af6ab5fSopenharmony_ci proto_bin_file = output_file + "." + PROTO_BIN_SUFFIX 2753af6ab5fSopenharmony_ci cmd_args = [frontend_tool, dependency, '--outputProto', 2763af6ab5fSopenharmony_ci proto_bin_file, '--merge-abc'] 2773af6ab5fSopenharmony_ci else: 2783af6ab5fSopenharmony_ci # for testing no-record-name abc 2793af6ab5fSopenharmony_ci cmd_args = [frontend_tool, dependency, '--output', output_abc] 2803af6ab5fSopenharmony_ci if compile_as_module: 2813af6ab5fSopenharmony_ci mod_opt_index = 4 2823af6ab5fSopenharmony_ci cmd_args.insert(mod_opt_index, "--module") 2833af6ab5fSopenharmony_ci proc = subprocess.Popen(cmd_args) 2843af6ab5fSopenharmony_ci proc.wait() 2853af6ab5fSopenharmony_ci 2863af6ab5fSopenharmony_ci def gen_apart_abc(self, dependencies): 2873af6ab5fSopenharmony_ci merge_abc_binary = self.args.merge_abc_binary 2883af6ab5fSopenharmony_ci retcode = 0 2893af6ab5fSopenharmony_ci for dependency in list(set(dependencies)): 2903af6ab5fSopenharmony_ci cmd_args = [] 2913af6ab5fSopenharmony_ci output_file = os.path.splitext(dependency.replace(DATA_DIR, BASE_OUT_DIR))[0] 2923af6ab5fSopenharmony_ci output_abc = os.path.basename(f"{output_file}{ABC_EXT}") 2933af6ab5fSopenharmony_ci file_dir = os.path.split(self.js_file)[0] 2943af6ab5fSopenharmony_ci is_apart_abc_existed = os.path.exists(file_dir + "/" + output_abc) 2953af6ab5fSopenharmony_ci dependency_file_prefix = os.path.basename(dependency)[:-3] 2963af6ab5fSopenharmony_ci dependency_bin_file = '%s/%s.%s' % (file_dir, 2973af6ab5fSopenharmony_ci dependency_file_prefix, PROTO_BIN_SUFFIX) 2983af6ab5fSopenharmony_ci cmd_args = [merge_abc_binary, '--input', dependency_bin_file, 2993af6ab5fSopenharmony_ci '--suffix', PROTO_BIN_SUFFIX, '--outputFilePath', 3003af6ab5fSopenharmony_ci file_dir, '--output', output_abc] 3013af6ab5fSopenharmony_ci if not is_apart_abc_existed: 3023af6ab5fSopenharmony_ci retcode = exec_command(cmd_args) 3033af6ab5fSopenharmony_ci return retcode 3043af6ab5fSopenharmony_ci 3053af6ab5fSopenharmony_ci def gen_merged_abc(self, dependencies, file_name_pre, proto_bin_file): 3063af6ab5fSopenharmony_ci merge_abc_binary = self.args.merge_abc_binary 3073af6ab5fSopenharmony_ci file_dir = os.path.split(self.js_file)[0] 3083af6ab5fSopenharmony_ci proto_abc_file = ".".join([os.path.splitext(os.path.basename(self.js_file))[0], "abc"]) 3093af6ab5fSopenharmony_ci generate_merged_abc = True 3103af6ab5fSopenharmony_ci # collect protoBin file into new-made testcase dir 3113af6ab5fSopenharmony_ci if (len(dependencies) != 0): 3123af6ab5fSopenharmony_ci if os.path.exists(file_name_pre): 3133af6ab5fSopenharmony_ci subprocess.run(['rm', '-rf', file_name_pre]) 3143af6ab5fSopenharmony_ci subprocess.run(['mkdir', file_name_pre]) 3153af6ab5fSopenharmony_ci 3163af6ab5fSopenharmony_ci for dependency in list(set(dependencies)): 3173af6ab5fSopenharmony_ci dependency_file_prefix = os.path.basename(dependency)[:-3] 3183af6ab5fSopenharmony_ci dependency_bin_file = '%s/%s.%s' % (file_dir, 3193af6ab5fSopenharmony_ci dependency_file_prefix, PROTO_BIN_SUFFIX) 3203af6ab5fSopenharmony_ci # test262 report syntax error cases 3213af6ab5fSopenharmony_ci if not os.path.exists(dependency_bin_file): 3223af6ab5fSopenharmony_ci generate_merged_abc = False 3233af6ab5fSopenharmony_ci else: 3243af6ab5fSopenharmony_ci subprocess.run(['cp', dependency_bin_file, file_name_pre]) 3253af6ab5fSopenharmony_ci 3263af6ab5fSopenharmony_ci if not os.path.exists(proto_bin_file): 3273af6ab5fSopenharmony_ci generate_merged_abc = False 3283af6ab5fSopenharmony_ci else: 3293af6ab5fSopenharmony_ci subprocess.run(['cp', proto_bin_file, file_name_pre]) 3303af6ab5fSopenharmony_ci 3313af6ab5fSopenharmony_ci if (len(dependencies) != 0) and generate_merged_abc: 3323af6ab5fSopenharmony_ci # module test262 cases 3333af6ab5fSopenharmony_ci cmd_args = [merge_abc_binary, '--input', file_name_pre, 3343af6ab5fSopenharmony_ci '--suffix', PROTO_BIN_SUFFIX, '--outputFilePath', 3353af6ab5fSopenharmony_ci file_dir, '--output', proto_abc_file] 3363af6ab5fSopenharmony_ci self.abc_file = f'{file_name_pre}.abc' 3373af6ab5fSopenharmony_ci return exec_command(cmd_args) 3383af6ab5fSopenharmony_ci elif os.path.exists(proto_bin_file): 3393af6ab5fSopenharmony_ci cmd_args = [merge_abc_binary, '--input', proto_bin_file, 3403af6ab5fSopenharmony_ci '--suffix', PROTO_BIN_SUFFIX, '--outputFilePath', 3413af6ab5fSopenharmony_ci file_dir, '--output', proto_abc_file] 3423af6ab5fSopenharmony_ci self.abc_file = f'{file_name_pre}.abc' 3433af6ab5fSopenharmony_ci return exec_command(cmd_args) 3443af6ab5fSopenharmony_ci return 0 3453af6ab5fSopenharmony_ci 3463af6ab5fSopenharmony_ci def gen_abc_for_merge_abc_mode(self, js_file, dependencies): 3473af6ab5fSopenharmony_ci file_name_pre = os.path.splitext(js_file)[0] 3483af6ab5fSopenharmony_ci proto_bin_file = file_name_pre + "." + PROTO_BIN_SUFFIX 3493af6ab5fSopenharmony_ci 3503af6ab5fSopenharmony_ci if "dynamic-import" in js_file: 3513af6ab5fSopenharmony_ci return self.gen_apart_abc(dependencies) 3523af6ab5fSopenharmony_ci else: 3533af6ab5fSopenharmony_ci return self.gen_merged_abc(dependencies, file_name_pre, proto_bin_file) 3543af6ab5fSopenharmony_ci 3553af6ab5fSopenharmony_ci def gen_abc_for_script_mode(self, cmd_args, retcode): 3563af6ab5fSopenharmony_ci retcode = exec_command(cmd_args) 3573af6ab5fSopenharmony_ci if retcode == 1: 3583af6ab5fSopenharmony_ci return retcode 3593af6ab5fSopenharmony_ci self.abc_cmd = cmd_args 3603af6ab5fSopenharmony_ci return retcode 3613af6ab5fSopenharmony_ci 3623af6ab5fSopenharmony_ci def gen_abc_for_dynamic_import(self, js_file, retcode): 3633af6ab5fSopenharmony_ci file_name_pre = os.path.splitext(js_file)[0] 3643af6ab5fSopenharmony_ci out_file = f"{file_name_pre}{ABC_EXT}" 3653af6ab5fSopenharmony_ci proto_bin_file = file_name_pre + "." + PROTO_BIN_SUFFIX 3663af6ab5fSopenharmony_ci merge_abc_binary = self.args.merge_abc_binary 3673af6ab5fSopenharmony_ci 3683af6ab5fSopenharmony_ci if ("dynamic-import" in js_file and not os.path.exists(out_file)): 3693af6ab5fSopenharmony_ci file_dir = os.path.split(self.js_file)[0] 3703af6ab5fSopenharmony_ci proto_abc_file = ".".join([os.path.splitext(os.path.basename(self.js_file))[0], "abc"]) 3713af6ab5fSopenharmony_ci cmd_args = [merge_abc_binary, '--input', proto_bin_file, 3723af6ab5fSopenharmony_ci '--suffix', PROTO_BIN_SUFFIX, '--outputFilePath', 3733af6ab5fSopenharmony_ci file_dir, '--output', proto_abc_file] 3743af6ab5fSopenharmony_ci retcode = exec_command(cmd_args) 3753af6ab5fSopenharmony_ci if retcode == 1: 3763af6ab5fSopenharmony_ci return retcode 3773af6ab5fSopenharmony_ci self.abc_cmd = cmd_args 3783af6ab5fSopenharmony_ci return retcode 3793af6ab5fSopenharmony_ci 3803af6ab5fSopenharmony_ci def get_abc_from_import_statement(self, js_file): 3813af6ab5fSopenharmony_ci file_name_pre = os.path.splitext(js_file)[0] 3823af6ab5fSopenharmony_ci out_file = f"{file_name_pre}{ABC_EXT}" 3833af6ab5fSopenharmony_ci 3843af6ab5fSopenharmony_ci self.abc_file = os.path.abspath(out_file) 3853af6ab5fSopenharmony_ci js_dir = os.path.dirname(js_file) 3863af6ab5fSopenharmony_ci for line in fileinput.input(js_file): 3873af6ab5fSopenharmony_ci import_line = re.findall(r"^(?:ex|im)port.*\.js", line) 3883af6ab5fSopenharmony_ci if len(import_line): 3893af6ab5fSopenharmony_ci import_file = re.findall(r"['\"].*\.js", import_line[0]) 3903af6ab5fSopenharmony_ci if len(import_file): 3913af6ab5fSopenharmony_ci abc_file = import_file[0][1:].replace(".js", ABC_EXT) 3923af6ab5fSopenharmony_ci abc_file = os.path.abspath(f'{js_dir}/{abc_file}') 3933af6ab5fSopenharmony_ci if self.abc_file.find(abc_file) < 0: 3943af6ab5fSopenharmony_ci self.abc_file += f':{abc_file}' 3953af6ab5fSopenharmony_ci 3963af6ab5fSopenharmony_ci def gen_command(self, js_file, compile_as_module): 3973af6ab5fSopenharmony_ci cmd_args = [] 3983af6ab5fSopenharmony_ci mod_opt_index = 0 3993af6ab5fSopenharmony_ci frontend_tool = self.ark_frontend_binary 4003af6ab5fSopenharmony_ci file_name_pre = os.path.splitext(js_file)[0] 4013af6ab5fSopenharmony_ci merge_abc_mode = self.merge_abc_mode 4023af6ab5fSopenharmony_ci proto_bin_file = file_name_pre + "." + PROTO_BIN_SUFFIX 4033af6ab5fSopenharmony_ci out_file = f"{file_name_pre}{ABC_EXT}" 4043af6ab5fSopenharmony_ci 4053af6ab5fSopenharmony_ci if self.ark_frontend == ARK_FRONTEND_LIST[0]: 4063af6ab5fSopenharmony_ci mod_opt_index = 3 4073af6ab5fSopenharmony_ci if merge_abc_mode != "0": 4083af6ab5fSopenharmony_ci cmd_args = ['node', '--expose-gc', frontend_tool, js_file, 4093af6ab5fSopenharmony_ci '--output-proto', '--merge-abc'] 4103af6ab5fSopenharmony_ci else: 4113af6ab5fSopenharmony_ci # for testing no-record-name abc 4123af6ab5fSopenharmony_ci cmd_args = ['node', '--expose-gc', frontend_tool, js_file, 4133af6ab5fSopenharmony_ci '-o', out_file] 4143af6ab5fSopenharmony_ci if compile_as_module: 4153af6ab5fSopenharmony_ci cmd_args.insert(mod_opt_index, "-m") 4163af6ab5fSopenharmony_ci self.module = True 4173af6ab5fSopenharmony_ci elif self.ark_frontend == ARK_FRONTEND_LIST[1]: 4183af6ab5fSopenharmony_ci mod_opt_index = 1 4193af6ab5fSopenharmony_ci if merge_abc_mode != "0": 4203af6ab5fSopenharmony_ci # '--merge-abc' is added due to 'merge-abc' is not opened as default in es2abc, should be removed later 4213af6ab5fSopenharmony_ci cmd_args = [frontend_tool, '--function-threads=' + 4223af6ab5fSopenharmony_ci str(self.es2abc_thread_count), '--outputProto', 4233af6ab5fSopenharmony_ci proto_bin_file, js_file, '--merge-abc', '--opt-level=' + str(self.opt_level)] 4243af6ab5fSopenharmony_ci else: 4253af6ab5fSopenharmony_ci # for testing no-record-name abc 4263af6ab5fSopenharmony_ci cmd_args = [frontend_tool, '--opt-level=' + str(self.opt_level), 4273af6ab5fSopenharmony_ci '--function-threads=' + 4283af6ab5fSopenharmony_ci str(self.es2abc_thread_count), '--output', 4293af6ab5fSopenharmony_ci out_file, js_file] 4303af6ab5fSopenharmony_ci if compile_as_module: 4313af6ab5fSopenharmony_ci cmd_args.insert(mod_opt_index, "--module") 4323af6ab5fSopenharmony_ci self.module = True 4333af6ab5fSopenharmony_ci 4343af6ab5fSopenharmony_ci return cmd_args 4353af6ab5fSopenharmony_ci 4363af6ab5fSopenharmony_ci def gen_dependencies_proto(self, js_file): 4373af6ab5fSopenharmony_ci file_dir = os.path.split(js_file)[0] 4383af6ab5fSopenharmony_ci compile_as_module = False 4393af6ab5fSopenharmony_ci dependencies = [] 4403af6ab5fSopenharmony_ci 4413af6ab5fSopenharmony_ci if ("dynamic-import" in js_file): 4423af6ab5fSopenharmony_ci search_dir = os.path.dirname(js_file) 4433af6ab5fSopenharmony_ci else: 4443af6ab5fSopenharmony_ci search_dir = os.path.dirname(js_file.replace(BASE_OUT_DIR, DATA_DIR)) 4453af6ab5fSopenharmony_ci 4463af6ab5fSopenharmony_ci dependencies = collect_module_dependencies(js_file, search_dir, []) 4473af6ab5fSopenharmony_ci compile_as_module = self.check_compile_mode(js_file) 4483af6ab5fSopenharmony_ci 4493af6ab5fSopenharmony_ci if (self.ark_frontend == ARK_FRONTEND_LIST[1]): 4503af6ab5fSopenharmony_ci if list(set(dependencies)): 4513af6ab5fSopenharmony_ci for dependency in list(set(dependencies)): 4523af6ab5fSopenharmony_ci dependency_file = os.path.basename(dependency) 4533af6ab5fSopenharmony_ci dependency_name = os.path.splitext(dependency_file)[0] 4543af6ab5fSopenharmony_ci out_dependency_pre = '%s/%s' % (file_dir, dependency_name) 4553af6ab5fSopenharmony_ci out_dependency_proto = f"{out_dependency_pre}.protoBin" 4563af6ab5fSopenharmony_ci is_dependency_proto_existed = os.path.exists(out_dependency_proto) 4573af6ab5fSopenharmony_ci if not is_dependency_proto_existed: 4583af6ab5fSopenharmony_ci self.gen_dependency_proto(dependency) 4593af6ab5fSopenharmony_ci 4603af6ab5fSopenharmony_ci return compile_as_module, dependencies 4613af6ab5fSopenharmony_ci 4623af6ab5fSopenharmony_ci def gen_abc_for_mix_compile_mode(self, dependencies, out_file): 4633af6ab5fSopenharmony_ci record_names = set() 4643af6ab5fSopenharmony_ci files_info_list = [] 4653af6ab5fSopenharmony_ci # In some cases of circular reference, the js file will be from BASE_OUT_DIR, remove it 4663af6ab5fSopenharmony_ci dependencies = [os.path.abspath(dependency) for dependency in dependencies] 4673af6ab5fSopenharmony_ci dependencies.insert(0, os.path.abspath(self.js_file)) 4683af6ab5fSopenharmony_ci for dependency in dependencies: 4693af6ab5fSopenharmony_ci record_name = os.path.splitext(os.path.basename(dependency))[0] 4703af6ab5fSopenharmony_ci if record_name in record_names: 4713af6ab5fSopenharmony_ci continue 4723af6ab5fSopenharmony_ci 4733af6ab5fSopenharmony_ci record_names.add(record_name) 4743af6ab5fSopenharmony_ci compile_mode = 'esm' if self.check_compile_mode(dependency) else 'script' 4753af6ab5fSopenharmony_ci files_info_list.append(f"{dependency};{record_name};{compile_mode};xxx;yyy\n") 4763af6ab5fSopenharmony_ci 4773af6ab5fSopenharmony_ci mix_compiler = mix_compile.MixCompiler(out_file, files_info_list, self.opt_level, 4783af6ab5fSopenharmony_ci self.es2abc_thread_count, self.es2abc_thread_count, 4793af6ab5fSopenharmony_ci self.es2abc_thread_count, self.ark_frontend_binary) 4803af6ab5fSopenharmony_ci 4813af6ab5fSopenharmony_ci retcode = mix_compiler.mix_compile() 4823af6ab5fSopenharmony_ci self.abc_outputs = mix_compiler.abc_outputs 4833af6ab5fSopenharmony_ci return retcode 4843af6ab5fSopenharmony_ci 4853af6ab5fSopenharmony_ci def gen_abc(self): 4863af6ab5fSopenharmony_ci js_file = self.js_file 4873af6ab5fSopenharmony_ci file_name_pre = os.path.splitext(js_file)[0] 4883af6ab5fSopenharmony_ci file_name = os.path.basename(js_file) 4893af6ab5fSopenharmony_ci file_dir = os.path.split(js_file)[0] 4903af6ab5fSopenharmony_ci out_file = f"{file_name_pre}{ABC_EXT}" 4913af6ab5fSopenharmony_ci out_proto = f"{file_name_pre}.proto" 4923af6ab5fSopenharmony_ci proto_bin_file = file_name_pre + "." + PROTO_BIN_SUFFIX 4933af6ab5fSopenharmony_ci self.abc_file = out_file 4943af6ab5fSopenharmony_ci mod_opt_index = 0 4953af6ab5fSopenharmony_ci compile_as_module = False 4963af6ab5fSopenharmony_ci cmd_args = [] 4973af6ab5fSopenharmony_ci dependency_cmd_args = [] 4983af6ab5fSopenharmony_ci frontend_tool = self.ark_frontend_binary 4993af6ab5fSopenharmony_ci merge_abc_mode = self.merge_abc_mode 5003af6ab5fSopenharmony_ci dependencies = [] 5013af6ab5fSopenharmony_ci merge_abc_binary = self.args.merge_abc_binary 5023af6ab5fSopenharmony_ci retcode = 0 5033af6ab5fSopenharmony_ci 5043af6ab5fSopenharmony_ci # generate the dependencies' proto when ark_frontend is [es2panda] 5053af6ab5fSopenharmony_ci if (file_name in self.module_list or file_name in self.dynamicImport_list): 5063af6ab5fSopenharmony_ci compile_as_module, dependencies = self.gen_dependencies_proto(js_file) 5073af6ab5fSopenharmony_ci 5083af6ab5fSopenharmony_ci if self.abc2program: 5093af6ab5fSopenharmony_ci return self.gen_abc_for_mix_compile_mode(dependencies, out_file) 5103af6ab5fSopenharmony_ci 5113af6ab5fSopenharmony_ci # generate execution command 5123af6ab5fSopenharmony_ci cmd_args = self.gen_command(js_file, compile_as_module) 5133af6ab5fSopenharmony_ci 5143af6ab5fSopenharmony_ci # get abc file list from import statement 5153af6ab5fSopenharmony_ci if merge_abc_mode == "0" and self.ark_aot and self.module: 5163af6ab5fSopenharmony_ci self.get_abc_from_import_statement(js_file) 5173af6ab5fSopenharmony_ci 5183af6ab5fSopenharmony_ci # generate abc file by script mode 5193af6ab5fSopenharmony_ci if not os.path.exists(out_proto): 5203af6ab5fSopenharmony_ci retcode = self.gen_abc_for_script_mode(cmd_args, retcode) 5213af6ab5fSopenharmony_ci if retcode == 1: 5223af6ab5fSopenharmony_ci return retcode 5233af6ab5fSopenharmony_ci 5243af6ab5fSopenharmony_ci # generate abc file by script mode for dynamic-import 5253af6ab5fSopenharmony_ci if self.ark_frontend == ARK_FRONTEND_LIST[1]: 5263af6ab5fSopenharmony_ci retcode = self.gen_abc_for_dynamic_import(js_file, retcode) 5273af6ab5fSopenharmony_ci if retcode == 1: 5283af6ab5fSopenharmony_ci return retcode 5293af6ab5fSopenharmony_ci 5303af6ab5fSopenharmony_ci # generate merged abc file 5313af6ab5fSopenharmony_ci if merge_abc_mode != "0": 5323af6ab5fSopenharmony_ci self.gen_abc_for_merge_abc_mode(js_file, dependencies) 5333af6ab5fSopenharmony_ci 5343af6ab5fSopenharmony_ci return retcode 5353af6ab5fSopenharmony_ci 5363af6ab5fSopenharmony_ci def execute_arkguard(self): 5373af6ab5fSopenharmony_ci js_file = self.js_file 5383af6ab5fSopenharmony_ci js_file_allpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../', js_file) 5393af6ab5fSopenharmony_ci cmd_args = ['node', '--no-warnings', 5403af6ab5fSopenharmony_ci '--loader=ts-node/esm', 5413af6ab5fSopenharmony_ci './src/cli/SecHarmony.ts', 5423af6ab5fSopenharmony_ci js_file_allpath, 5433af6ab5fSopenharmony_ci '--config-path', 5443af6ab5fSopenharmony_ci './test/test262/test262Config.json', 5453af6ab5fSopenharmony_ci '--inplace'] 5463af6ab5fSopenharmony_ci arkguard_path = os.getcwd() + '/arkguard' 5473af6ab5fSopenharmony_ci retcode = exec_command(cmd_args, custom_cwd = arkguard_path) 5483af6ab5fSopenharmony_ci 5493af6ab5fSopenharmony_ci def compile_aot(self): 5503af6ab5fSopenharmony_ci os.environ["LD_LIBRARY_PATH"] = self.libs_dir 5513af6ab5fSopenharmony_ci file_name_pre = os.path.splitext(self.js_file)[0] 5523af6ab5fSopenharmony_ci cmd_args = [] 5533af6ab5fSopenharmony_ci if self.run_pgo: 5543af6ab5fSopenharmony_ci if self.arch == ARK_ARCH_LIST[1]: 5553af6ab5fSopenharmony_ci qemu_tool = "qemu-aarch64" 5563af6ab5fSopenharmony_ci qemu_arg1 = "-L" 5573af6ab5fSopenharmony_ci qemu_arg2 = self.arch_root 5583af6ab5fSopenharmony_ci cmd_args = [qemu_tool, qemu_arg1, qemu_arg2, self.ark_aot_tool, 5593af6ab5fSopenharmony_ci ICU_PATH, f'--compiler-target-triple=aarch64-unknown-linux-gnu'] 5603af6ab5fSopenharmony_ci elif self.arch == ARK_ARCH_LIST[2]: 5613af6ab5fSopenharmony_ci cmd_args = [self.ark_aot_tool, ICU_PATH, f'--compiler-target-triple=arm-unknown-linux-gnu'] 5623af6ab5fSopenharmony_ci elif self.arch == ARK_ARCH_LIST[0]: 5633af6ab5fSopenharmony_ci cmd_args = [self.ark_aot_tool, ICU_PATH] 5643af6ab5fSopenharmony_ci 5653af6ab5fSopenharmony_ci cmd_args.append("--compiler-opt-loop-peeling=true") 5663af6ab5fSopenharmony_ci cmd_args.append("--compiler-fast-compile=false") 5673af6ab5fSopenharmony_ci cmd_args.append("--compiler-opt-track-field=true") 5683af6ab5fSopenharmony_ci cmd_args.append("--compiler-opt-inlining=true") 5693af6ab5fSopenharmony_ci cmd_args.append("--compiler-max-inline-bytecodes=45") 5703af6ab5fSopenharmony_ci cmd_args.append("--compiler-opt-level=2") 5713af6ab5fSopenharmony_ci if self.stub_file != "": 5723af6ab5fSopenharmony_ci cmd_args.append(f"--stub-file={self.stub_file}") 5733af6ab5fSopenharmony_ci if self.disable_force_gc: 5743af6ab5fSopenharmony_ci cmd_args.append(f"--enable-force-gc=false") 5753af6ab5fSopenharmony_ci cmd_args.append(f'--compiler-pgo-profiler-path={file_name_pre}.ap') 5763af6ab5fSopenharmony_ci cmd_args.append(f'--aot-file={file_name_pre}') 5773af6ab5fSopenharmony_ci cmd_args.append(self.abc_file) 5783af6ab5fSopenharmony_ci else: 5793af6ab5fSopenharmony_ci if self.arch == ARK_ARCH_LIST[1]: 5803af6ab5fSopenharmony_ci cmd_args = [self.ark_aot_tool, ICU_PATH, 5813af6ab5fSopenharmony_ci f'--compiler-target-triple=aarch64-unknown-linux-gnu', 5823af6ab5fSopenharmony_ci f'--aot-file={file_name_pre}', 5833af6ab5fSopenharmony_ci self.abc_file] 5843af6ab5fSopenharmony_ci elif self.arch == ARK_ARCH_LIST[2]: 5853af6ab5fSopenharmony_ci cmd_args = [self.ark_aot_tool, ICU_PATH, 5863af6ab5fSopenharmony_ci f'--compiler-target-triple=arm-unknown-linux-gnu', 5873af6ab5fSopenharmony_ci f'--aot-file={file_name_pre}', 5883af6ab5fSopenharmony_ci self.abc_file] 5893af6ab5fSopenharmony_ci elif self.arch == ARK_ARCH_LIST[0]: 5903af6ab5fSopenharmony_ci cmd_args = [self.ark_aot_tool, ICU_PATH, 5913af6ab5fSopenharmony_ci f'--aot-file={file_name_pre}', 5923af6ab5fSopenharmony_ci self.abc_file] 5933af6ab5fSopenharmony_ci if self.enable_litecg: 5943af6ab5fSopenharmony_ci cmd_args.insert(-1, "--compiler-enable-litecg=true") 5953af6ab5fSopenharmony_ci retcode = exec_command(cmd_args, 180000) 5963af6ab5fSopenharmony_ci if retcode: 5973af6ab5fSopenharmony_ci print_command(self.abc_cmd) 5983af6ab5fSopenharmony_ci print_command(cmd_args) 5993af6ab5fSopenharmony_ci 6003af6ab5fSopenharmony_ci def execute_aot(self): 6013af6ab5fSopenharmony_ci unforce_gc = False 6023af6ab5fSopenharmony_ci os.environ["LD_LIBRARY_PATH"] = self.libs_dir 6033af6ab5fSopenharmony_ci file_name_pre = os.path.splitext(self.js_file)[0] 6043af6ab5fSopenharmony_ci cmd_args = [] 6053af6ab5fSopenharmony_ci if self.arch == ARK_ARCH_LIST[1]: 6063af6ab5fSopenharmony_ci qemu_tool = "qemu-aarch64" 6073af6ab5fSopenharmony_ci qemu_arg1 = "-L" 6083af6ab5fSopenharmony_ci qemu_arg2 = self.arch_root 6093af6ab5fSopenharmony_ci cmd_args = [qemu_tool, qemu_arg1, qemu_arg2, self.ark_tool, 6103af6ab5fSopenharmony_ci ICU_PATH, 6113af6ab5fSopenharmony_ci f'--aot-file={file_name_pre}', 6123af6ab5fSopenharmony_ci f'{file_name_pre}.abc'] 6133af6ab5fSopenharmony_ci elif self.arch == ARK_ARCH_LIST[2]: 6143af6ab5fSopenharmony_ci qemu_tool = "qemu-arm" 6153af6ab5fSopenharmony_ci qemu_arg1 = "-L" 6163af6ab5fSopenharmony_ci qemu_arg2 = self.arch_root 6173af6ab5fSopenharmony_ci cmd_args = [qemu_tool, qemu_arg1, qemu_arg2, self.ark_tool, 6183af6ab5fSopenharmony_ci ICU_PATH, 6193af6ab5fSopenharmony_ci f'--aot-file={file_name_pre}', 6203af6ab5fSopenharmony_ci f'{file_name_pre}.abc'] 6213af6ab5fSopenharmony_ci elif self.arch == ARK_ARCH_LIST[0]: 6223af6ab5fSopenharmony_ci if file_name_pre in FORCE_GC_SKIP_TESTS: 6233af6ab5fSopenharmony_ci unforce_gc = True 6243af6ab5fSopenharmony_ci asm_arg1 = "--enable-force-gc=true" 6253af6ab5fSopenharmony_ci if unforce_gc or self.disable_force_gc: 6263af6ab5fSopenharmony_ci asm_arg1 = "--enable-force-gc=false" 6273af6ab5fSopenharmony_ci cmd_args = [self.ark_tool, ICU_PATH, asm_arg1, 6283af6ab5fSopenharmony_ci f'--aot-file={file_name_pre}', 6293af6ab5fSopenharmony_ci f'{file_name_pre}.abc'] 6303af6ab5fSopenharmony_ci 6313af6ab5fSopenharmony_ci record_name = os.path.splitext(os.path.split(self.js_file)[1])[0] 6323af6ab5fSopenharmony_ci cmd_args.insert(-1, f'--entry-point={record_name}') 6333af6ab5fSopenharmony_ci if self.stub_file != "": 6343af6ab5fSopenharmony_ci cmd_args.insert(-1, f'--stub-file={self.stub_file}') 6353af6ab5fSopenharmony_ci retcode = exec_command(cmd_args) 6363af6ab5fSopenharmony_ci if retcode: 6373af6ab5fSopenharmony_ci print_command(cmd_args) 6383af6ab5fSopenharmony_ci return retcode 6393af6ab5fSopenharmony_ci 6403af6ab5fSopenharmony_ci def execute_abc2program_outputs(self, cmd_args): 6413af6ab5fSopenharmony_ci retcode = 0 6423af6ab5fSopenharmony_ci for abc in self.abc_outputs: 6433af6ab5fSopenharmony_ci abc = get_formated_path(abc) 6443af6ab5fSopenharmony_ci cmd_args[-1] = abc 6453af6ab5fSopenharmony_ci retcode = exec_command(cmd_args) 6463af6ab5fSopenharmony_ci if retcode: 6473af6ab5fSopenharmony_ci print_command(cmd_args) 6483af6ab5fSopenharmony_ci return retcode 6493af6ab5fSopenharmony_ci return retcode 6503af6ab5fSopenharmony_ci 6513af6ab5fSopenharmony_ci def execute(self): 6523af6ab5fSopenharmony_ci unforce_gc = False 6533af6ab5fSopenharmony_ci if platform.system() == "Windows": 6543af6ab5fSopenharmony_ci # add env path for cmd/powershell execute 6553af6ab5fSopenharmony_ci libs_dir = self.libs_dir.replace(":", ";") 6563af6ab5fSopenharmony_ci libs_dir = libs_dir.replace("/", "\\") 6573af6ab5fSopenharmony_ci os.environ["PATH"] = libs_dir + ";" + os.environ["PATH"] 6583af6ab5fSopenharmony_ci elif platform.system() == "Linux": 6593af6ab5fSopenharmony_ci os.environ["LD_LIBRARY_PATH"] = self.libs_dir 6603af6ab5fSopenharmony_ci else: 6613af6ab5fSopenharmony_ci sys.exit(f" test262 on {platform.system()} not supported") 6623af6ab5fSopenharmony_ci 6633af6ab5fSopenharmony_ci file_name_pre = get_formated_path(os.path.splitext(self.js_file)[0]) 6643af6ab5fSopenharmony_ci cmd_args = [] 6653af6ab5fSopenharmony_ci if self.arch == ARK_ARCH_LIST[1]: 6663af6ab5fSopenharmony_ci qemu_tool = "qemu-aarch64" 6673af6ab5fSopenharmony_ci qemu_arg1 = "-L" 6683af6ab5fSopenharmony_ci qemu_arg2 = self.arch_root 6693af6ab5fSopenharmony_ci cmd_args = [qemu_tool, qemu_arg1, qemu_arg2, self.ark_tool, 6703af6ab5fSopenharmony_ci ICU_PATH, 6713af6ab5fSopenharmony_ci f'{file_name_pre}.abc'] 6723af6ab5fSopenharmony_ci if self.run_jit or self.run_baseline_jit: 6733af6ab5fSopenharmony_ci cmd_args.insert(-1, f'--compiler-target-triple=aarch64-unknown-linux-gnu') 6743af6ab5fSopenharmony_ci cmd_args.insert(-1, f'--open-ark-tools=true') 6753af6ab5fSopenharmony_ci if self.run_baseline_jit: 6763af6ab5fSopenharmony_ci cmd_args.insert(-1, f'--test-assert=true') 6773af6ab5fSopenharmony_ci elif self.arch == ARK_ARCH_LIST[2]: 6783af6ab5fSopenharmony_ci qemu_tool = "qemu-arm" 6793af6ab5fSopenharmony_ci qemu_arg1 = "-L" 6803af6ab5fSopenharmony_ci qemu_arg2 = self.arch_root 6813af6ab5fSopenharmony_ci cmd_args = [qemu_tool, qemu_arg1, qemu_arg2, self.ark_tool, 6823af6ab5fSopenharmony_ci ICU_PATH, 6833af6ab5fSopenharmony_ci f'{file_name_pre}.abc'] 6843af6ab5fSopenharmony_ci elif self.arch == ARK_ARCH_LIST[0]: 6853af6ab5fSopenharmony_ci if file_name_pre in FORCE_GC_SKIP_TESTS: 6863af6ab5fSopenharmony_ci unforce_gc = True 6873af6ab5fSopenharmony_ci asm_arg1 = "--enable-force-gc=true" 6883af6ab5fSopenharmony_ci if unforce_gc or self.disable_force_gc: 6893af6ab5fSopenharmony_ci asm_arg1 = "--enable-force-gc=false" 6903af6ab5fSopenharmony_ci cmd_args = [self.ark_tool, ICU_PATH, asm_arg1, 6913af6ab5fSopenharmony_ci f'{file_name_pre}.abc'] 6923af6ab5fSopenharmony_ci 6933af6ab5fSopenharmony_ci record_name = os.path.splitext(os.path.split(self.js_file)[1])[0] 6943af6ab5fSopenharmony_ci cmd_args.insert(-1, f'--entry-point={record_name}') 6953af6ab5fSopenharmony_ci if self.run_jit: 6963af6ab5fSopenharmony_ci cmd_args.insert(-1, f'--compiler-enable-litecg=true') 6973af6ab5fSopenharmony_ci cmd_args.insert(-1, f'--compiler-enable-jit=true --log-debug=jit') 6983af6ab5fSopenharmony_ci if self.run_baseline_jit: 6993af6ab5fSopenharmony_ci cmd_args.insert(-1, f'--compiler-enable-baselinejit=true') 7003af6ab5fSopenharmony_ci cmd_args.insert(-1, f'--compiler-force-baselinejit-compile-main=true') 7013af6ab5fSopenharmony_ci if self.stub_file != "": 7023af6ab5fSopenharmony_ci cmd_args.insert(-1, f"--stub-file={self.stub_file}") 7033af6ab5fSopenharmony_ci retcode = 0 7043af6ab5fSopenharmony_ci if self.abc2program: 7053af6ab5fSopenharmony_ci retcode = self.execute_abc2program_outputs(cmd_args) 7063af6ab5fSopenharmony_ci else: 7073af6ab5fSopenharmony_ci retcode = exec_command(cmd_args) 7083af6ab5fSopenharmony_ci if retcode: 7093af6ab5fSopenharmony_ci print_command(cmd_args) 7103af6ab5fSopenharmony_ci return retcode 7113af6ab5fSopenharmony_ci 7123af6ab5fSopenharmony_ci def run_generator_ap(self): 7133af6ab5fSopenharmony_ci os.environ["LD_LIBRARY_PATH"] = self.libs_dir 7143af6ab5fSopenharmony_ci file_name_pre = os.path.splitext(self.js_file)[0] 7153af6ab5fSopenharmony_ci record_name = os.path.splitext(os.path.split(self.js_file)[1])[0] 7163af6ab5fSopenharmony_ci if self.arch == ARK_ARCH_LIST[1]: 7173af6ab5fSopenharmony_ci qemu_tool = "qemu-aarch64" 7183af6ab5fSopenharmony_ci qemu_arg1 = "-L" 7193af6ab5fSopenharmony_ci qemu_arg2 = self.arch_root 7203af6ab5fSopenharmony_ci cmd_args = [qemu_tool, qemu_arg1, qemu_arg2, self.ark_tool, 7213af6ab5fSopenharmony_ci ICU_PATH, 7223af6ab5fSopenharmony_ci "--log-level=error", 7233af6ab5fSopenharmony_ci "--enable-pgo-profiler=true", 7243af6ab5fSopenharmony_ci "--compiler-opt-inlining=true", 7253af6ab5fSopenharmony_ci f'--compiler-pgo-profiler-path={file_name_pre}.ap', 7263af6ab5fSopenharmony_ci "--asm-interpreter=true", 7273af6ab5fSopenharmony_ci f'--entry-point={record_name}'] 7283af6ab5fSopenharmony_ci else: 7293af6ab5fSopenharmony_ci cmd_args = [self.ark_tool, ICU_PATH, 7303af6ab5fSopenharmony_ci "--log-level=error", 7313af6ab5fSopenharmony_ci "--enable-pgo-profiler=true", 7323af6ab5fSopenharmony_ci "--compiler-opt-inlining=true", 7333af6ab5fSopenharmony_ci f'--compiler-pgo-profiler-path={file_name_pre}.ap', 7343af6ab5fSopenharmony_ci "--asm-interpreter=true", 7353af6ab5fSopenharmony_ci f'--entry-point={record_name}'] 7363af6ab5fSopenharmony_ci if self.stub_file != "": 7373af6ab5fSopenharmony_ci cmd_args.append(f"--stub-file={self.stub_file}") 7383af6ab5fSopenharmony_ci if self.disable_force_gc: 7393af6ab5fSopenharmony_ci cmd_args.append(f"--enable-force-gc=false") 7403af6ab5fSopenharmony_ci cmd_args.append(f'{file_name_pre}.abc') 7413af6ab5fSopenharmony_ci return_code = exec_command(cmd_args) 7423af6ab5fSopenharmony_ci if return_code: 7433af6ab5fSopenharmony_ci print_command(cmd_args) 7443af6ab5fSopenharmony_ci return return_code 7453af6ab5fSopenharmony_ci 7463af6ab5fSopenharmony_ci def is_legal_frontend(self): 7473af6ab5fSopenharmony_ci if self.ark_frontend not in ARK_FRONTEND_LIST: 7483af6ab5fSopenharmony_ci sys.stderr.write("Wrong ark front-end option") 7493af6ab5fSopenharmony_ci return False 7503af6ab5fSopenharmony_ci return True 7513af6ab5fSopenharmony_ci 7523af6ab5fSopenharmony_ci def execute_ark(self): 7533af6ab5fSopenharmony_ci self.proce_parameters() 7543af6ab5fSopenharmony_ci self.get_all_skip_force_gc_tests() 7553af6ab5fSopenharmony_ci if not self.is_legal_frontend(): 7563af6ab5fSopenharmony_ci return 7573af6ab5fSopenharmony_ci if self.enable_arkguard: 7583af6ab5fSopenharmony_ci self.execute_arkguard() 7593af6ab5fSopenharmony_ci if self.gen_abc(): 7603af6ab5fSopenharmony_ci return 7613af6ab5fSopenharmony_ci if self.run_pgo: 7623af6ab5fSopenharmony_ci self.run_generator_ap() 7633af6ab5fSopenharmony_ci if self.ark_aot: 7643af6ab5fSopenharmony_ci self.compile_aot() 7653af6ab5fSopenharmony_ci self.execute_aot() 7663af6ab5fSopenharmony_ci else: 7673af6ab5fSopenharmony_ci self.execute() 7683af6ab5fSopenharmony_ci 7693af6ab5fSopenharmony_ci 7703af6ab5fSopenharmony_cidef main(): 7713af6ab5fSopenharmony_ci args = parse_args() 7723af6ab5fSopenharmony_ci 7733af6ab5fSopenharmony_ci ark = ArkProgram(args) 7743af6ab5fSopenharmony_ci ark.execute_ark() 7753af6ab5fSopenharmony_ci 7763af6ab5fSopenharmony_ci 7773af6ab5fSopenharmony_ciif __name__ == "__main__": 7783af6ab5fSopenharmony_ci sys.exit(main()) 779