def recheck(num, lock, task_queue, failed_queue, passed_queue, target, out_dir): common.log_msg(logging.DEBUG, "Started recheck. Process #" + str(num)) cwd_save = os.getcwd() abs_out_dir = os.path.join(cwd_save, out_dir) job_finished = False while not job_finished: try: test_dir = task_queue.get_nowait() task_queue.task_done() common.log_msg( logging.DEBUG, "#" + str(num) + " test directory: " + str(test_dir)) abs_test_dir = os.path.join(cwd_save, test_dir) common.check_and_copy( os.path.join(os.path.join(cwd_save, out_dir), gen_test_makefile.Test_Makefile_name), os.path.join(abs_test_dir, gen_test_makefile.Test_Makefile_name)) os.chdir(os.path.join(cwd_save, abs_test_dir)) valid_res = None out_res = set() prev_out_res_len = 1 # We can't check first result for i in gen_test_makefile.CompilerTarget.all_targets: if i.specs.name not in target.split(): continue common.log_msg(logging.DEBUG, "Re-checking target " + i.name) ret_code, output, err_output, time_expired, elapsed_time = \ common.run_cmd(["make", "-f", gen_test_makefile.Test_Makefile_name, i.name], run_gen.compiler_timeout, num) if time_expired or ret_code != 0: failed_queue.put(test_dir) common.log_msg(logging.DEBUG, "#" + str(num) + " Compilation failed") common.copy_test_to_out( abs_test_dir, os.path.join(abs_out_dir, test_dir), lock) break ret_code, output, err_output, time_expired, elapsed_time = \ common.run_cmd(["make", "-f", gen_test_makefile.Test_Makefile_name, "run_" + i.name], run_gen.run_timeout, num) if time_expired or ret_code != 0: failed_queue.put(test_dir) common.log_msg(logging.DEBUG, "#" + str(num) + " Execution failed") common.copy_test_to_out( abs_test_dir, os.path.join(abs_out_dir, test_dir), lock) break out_res.add(str(output, "utf-8").split()[-1]) if len(out_res) > prev_out_res_len: prev_out_res_len = len(out_res) failed_queue.put(test_dir) common.log_msg(logging.DEBUG, "#" + str(num) + " Out differs") if not blame_opt.prepare_env_and_blame( abs_test_dir, valid_res, i, abs_out_dir, lock, num): common.copy_test_to_out( abs_test_dir, os.path.join(abs_out_dir, test_dir), lock) break valid_res = str(output, "utf-8").split()[-1] passed_queue.put(test_dir) os.chdir(cwd_save) except queue.Empty: job_finished = True
def prepare_and_start(work_dir, config_file, timeout, num_jobs, csmith_bin_path, csmith_runtime, csmith_args, optsets): common.check_dir_and_create(work_dir) # Check for binary of generator csmith_home = os.environ.get("CSMITH_HOME") if csmith_home is None: common.print_and_exit("Please set CSMITH_HOME envirnoment variable") csmith_bin = os.path.abspath(csmith_home + os.sep + csmith_bin_path + os.sep + "csmith") common.check_and_copy(csmith_bin, work_dir) os.chdir(work_dir) ret_code, output, err_output, time_expired, elapsed_time = \ common.run_cmd(["." + os.sep + "csmith", "-v"], csmith_timeout, 0) csmith_version_str = str(output, "utf-8") # TODO: need to add some check, but I hope that it is safe common.log_msg(logging.DEBUG, "Csmith version: " + csmith_version_str) gen_test_makefile.set_standard("c99") gen_test_makefile.parse_config(config_file) compiler_run_args = {} optsets_list = optsets.split() target_was_found = False failed_targets = [] for i in optsets_list: for target in gen_test_makefile.CompilerTarget.all_targets: if target.name != i: continue target_was_found = True common.log_msg(logging.DEBUG, "Trying to form compiler args for " + str(i)) run_str = target.specs.comp_c_name + " " run_str += target.args + " " if target.arch.comp_name != "": run_str += " " + target.specs.arch_prefix + target.arch.comp_name + " " run_str += gen_test_makefile.StatisticsOptions.get_options( target.specs) + " " run_str += csmith_runtime + " " common.log_msg(logging.DEBUG, "Formed compiler args: " + run_str) compiler_run_args[i] = run_str if not target_was_found: failed_targets.append(i) target_was_found = False if len(failed_targets) > 0: common.log_msg(logging.WARNING, "Can't find relevant target: " + str(failed_targets)) for i in range(num_jobs): common.check_dir_and_create(run_gen.process_dir + str(i)) manager_obj = run_gen.manager() stat = manager_obj.Statistics() start_time = time.time() end_time = start_time + timeout * 60 if timeout == -1: end_time = -1 task_threads = [0] * num_jobs for num in range(num_jobs): task_threads[num] = multiprocessing.Process(target=run_csmith, args=(num, csmith_args, compiler_run_args, end_time, stat)) task_threads[num].start() print_statistics(stat, task_threads, num_jobs) sys.stdout.write("\n") for i in range(num_jobs): common.log_msg(logging.DEBUG, "Removing " + run_gen.process_dir + str(i) + " dir") shutil.rmtree(run_gen.process_dir + str(i)) stat_str, verbose_stat_str, prev_len = form_statistics(stat, 0) sys.stdout.write(verbose_stat_str) sys.stdout.flush()