diff --git a/llvm/utils/UpdateTestChecks/asm.py b/llvm/utils/UpdateTestChecks/asm.py --- a/llvm/utils/UpdateTestChecks/asm.py +++ b/llvm/utils/UpdateTestChecks/asm.py @@ -324,8 +324,7 @@ print("Cannot find a triple. Assume 'x86'", file=sys.stderr) return 'x86' -def build_function_body_dictionary_for_triple(args, raw_tool_output, triple, - prefixes, func_dict, func_order): +def get_run_handler(triple): target_handlers = { 'i686': (scrub_asm_x86, ASM_FUNCTION_X86_RE), 'x86': (scrub_asm_x86, ASM_FUNCTION_X86_RE), @@ -366,10 +365,7 @@ if handler is None: raise KeyError('Triple %r is not supported' % (triple)) - scrubber, function_re = handler - common.build_function_body_dictionary( - function_re, scrubber, [args], raw_tool_output, prefixes, - func_dict, func_order, args.verbose, False, False) + return handler ##### Generator of assembly CHECK lines diff --git a/llvm/utils/UpdateTestChecks/common.py b/llvm/utils/UpdateTestChecks/common.py --- a/llvm/utils/UpdateTestChecks/common.py +++ b/llvm/utils/UpdateTestChecks/common.py @@ -322,7 +322,32 @@ func_dict[prefix][func] = function_body(scrubbed_body, scrubbed_extra, args_and_sig, attrs) func_order[prefix].append(func) - warn_on_failed_prefixes(func_dict) + +class FunctionTestBuilder: + def __init__(self, run_list, flags, scrubber_args): + self._verbose = flags.verbose + self._record_args = flags.function_signature + self._check_attributes = flags.check_attributes + self._scrubber_args = scrubber_args + self._func_dict = {} + self._func_order = {} + for tuple in run_list: + for prefix in tuple[0]: + self._func_dict.update({prefix:dict()}) + self._func_order.update({prefix: []}) + + def finish_and_get_func_dict(self): + warn_on_failed_prefixes(self._func_dict) + return self._func_dict + + def func_order(self): + return self._func_order + + def process_run_line(self, function_re, scrubber, raw_tool_output, prefixes): + build_function_body_dictionary(function_re, scrubber, self._scrubber_args, + raw_tool_output, prefixes, self._func_dict, + self._func_order, self._verbose, + self._record_args, self._check_attributes) ##### Generator of LLVM IR CHECK lines diff --git a/llvm/utils/update_analyze_test_checks.py b/llvm/utils/update_analyze_test_checks.py --- a/llvm/utils/update_analyze_test_checks.py +++ b/llvm/utils/update_analyze_test_checks.py @@ -108,12 +108,11 @@ # now, we just ignore all but the last. prefix_list.append((check_prefixes, tool_cmd_args)) - func_dict = {} - func_order = {} - for prefixes, _ in prefix_list: - for prefix in prefixes: - func_dict.update({prefix: dict()}) - func_order.update({prefix: []}) + builder = common.FunctionTestBuilder( + run_list = prefix_list, + flags = args, + scrubber_args = []) + for prefixes, opt_args in prefix_list: common.debug('Extracted opt cmd:', opt_basename, opt_args, file=sys.stderr) common.debug('Extracted FileCheck prefixes:', str(prefixes), file=sys.stderr) @@ -122,10 +121,10 @@ # Split analysis outputs by "Printing analysis " declarations. for raw_tool_output in re.split(r'Printing analysis ', raw_tool_outputs): - common.build_function_body_dictionary( - common.ANALYZE_FUNCTION_RE, common.scrub_body, [], - raw_tool_output, prefixes, func_dict, func_order, args.verbose, False, False) + builder.process_run_line(common.ANALYZE_FUNCTION_RE, common.scrub_body, + raw_tool_output, prefixes) + func_dict = builder.finish_and_get_func_dict() is_in_function = False is_in_function_start = False prefix_set = set([prefix for prefixes, _ in prefix_list for prefix in prefixes]) diff --git a/llvm/utils/update_cc_test_checks.py b/llvm/utils/update_cc_test_checks.py --- a/llvm/utils/update_cc_test_checks.py +++ b/llvm/utils/update_cc_test_checks.py @@ -176,8 +176,8 @@ return args, parser -def get_function_body(args, filename, clang_args, extra_commands, prefixes, - triple_in_cmd, func_dict, func_order): +def get_function_body(builder, args, filename, clang_args, extra_commands, + prefixes): # TODO Clean up duplication of asm/common build_function_body_dictionary # Invoke external tool and extract function bodies. raw_tool_output = common.invoke_tool(args.clang, clang_args, filename) @@ -195,10 +195,9 @@ raw_tool_output = common.invoke_tool(extra_args[0], extra_args[1:], f.name) if '-emit-llvm' in clang_args: - common.build_function_body_dictionary( - common.OPT_FUNCTION_RE, common.scrub_body, [], - raw_tool_output, prefixes, func_dict, func_order, args.verbose, - args.function_signature, args.check_attributes) + builder.process_run_line( + common.OPT_FUNCTION_RE, common.scrub_body, raw_tool_output, + prefixes) else: print('The clang command line should include -emit-llvm as asm tests ' 'are discouraged in Clang testsuite.', file=sys.stderr) @@ -248,25 +247,25 @@ run_list.append((check_prefixes, clang_args, commands[1:-1], triple_in_cmd)) # Execute clang, generate LLVM IR, and extract functions. - func_dict = {} - func_order = {} - for p in run_list: - prefixes = p[0] - for prefix in prefixes: - func_dict.update({prefix: dict()}) - func_order.update({prefix: []}) + + builder = common.FunctionTestBuilder( + run_list=run_list, + flags=ti.args, + scrubber_args=[]) + for prefixes, clang_args, extra_commands, triple_in_cmd in run_list: common.debug('Extracted clang cmd: clang {}'.format(clang_args)) common.debug('Extracted FileCheck prefixes: {}'.format(prefixes)) - get_function_body(ti.args, ti.path, clang_args, extra_commands, prefixes, - triple_in_cmd, func_dict, func_order) + get_function_body(builder, ti.args, ti.path, clang_args, extra_commands, + prefixes) # Invoke clang -Xclang -ast-dump=json to get mapping from start lines to # mangled names. Forward all clang args for now. for k, v in get_line2spell_and_mangled(ti.args, clang_args).items(): line2spell_and_mangled_list[k].append(v) + func_dict = builder.finish_and_get_func_dict() global_vars_seen_dict = {} prefix_set = set([prefix for p in run_list for prefix in p[0]]) output_lines = [] @@ -302,8 +301,8 @@ prefixes, func_dict, func) - common.add_checks_at_end(output_lines, run_list, func_order, '//', - lambda my_output_lines, prefixes, func: + common.add_checks_at_end(output_lines, run_list, builder.func_order(), + '//', lambda my_output_lines, prefixes, func: check_generator(my_output_lines, prefixes, func)) else: diff --git a/llvm/utils/update_llc_test_checks.py b/llvm/utils/update_llc_test_checks.py --- a/llvm/utils/update_llc_test_checks.py +++ b/llvm/utils/update_llc_test_checks.py @@ -104,24 +104,28 @@ else: check_indent = '' - func_dict = {} - func_order = {} - for p in run_list: - prefixes = p[0] - for prefix in prefixes: - func_dict.update({prefix: dict()}) - func_order.update({prefix: []}) + builder = common.FunctionTestBuilder( + run_list=run_list, + flags=type('', (object,), { + 'verbose': ti.args.verbose, + 'function_signature': False, + 'check_attributes': False}), + scrubber_args=[ti.args]) + for prefixes, llc_args, triple_in_cmd, march_in_cmd in run_list: common.debug('Extracted LLC cmd:', llc_tool, llc_args) common.debug('Extracted FileCheck prefixes:', str(prefixes)) - raw_tool_output = common.invoke_tool(ti.args.llc_binary or llc_tool, llc_args, ti.path) + raw_tool_output = common.invoke_tool(ti.args.llc_binary or llc_tool, + llc_args, ti.path) triple = triple_in_cmd or triple_in_ir if not triple: triple = asm.get_triple_from_march(march_in_cmd) - asm.build_function_body_dictionary_for_triple(ti.args, raw_tool_output, - triple, prefixes, func_dict, func_order) + scrubber, function_re = asm.get_run_handler(triple) + builder.process_run_line(function_re, scrubber, raw_tool_output, prefixes) + + func_dict = builder.finish_and_get_func_dict() is_in_function = False is_in_function_start = False @@ -146,7 +150,7 @@ common.dump_input_lines(output_lines, ti, prefix_set, ';') # Now generate all the checks. - common.add_checks_at_end(output_lines, run_list, func_order, + common.add_checks_at_end(output_lines, run_list, builder.func_order(), check_indent + ';', lambda my_output_lines, prefixes, func: asm.add_asm_checks(my_output_lines, diff --git a/llvm/utils/update_test_checks.py b/llvm/utils/update_test_checks.py --- a/llvm/utils/update_test_checks.py +++ b/llvm/utils/update_test_checks.py @@ -102,22 +102,21 @@ prefix_list.append((check_prefixes, tool_cmd_args)) global_vars_seen_dict = {} - func_dict = {} - func_order = {} - for prefixes, _ in prefix_list: - for prefix in prefixes: - func_dict.update({prefix: dict()}) - func_order.update({prefix: []}) + builder = common.FunctionTestBuilder( + run_list=prefix_list, + flags=ti.args, + scrubber_args=[]) + for prefixes, opt_args in prefix_list: common.debug('Extracted opt cmd: ' + opt_basename + ' ' + opt_args) common.debug('Extracted FileCheck prefixes: ' + str(prefixes)) - raw_tool_output = common.invoke_tool(ti.args.opt_binary, opt_args, ti.path) - common.build_function_body_dictionary( - common.OPT_FUNCTION_RE, common.scrub_body, [], - raw_tool_output, prefixes, func_dict, func_order, ti.args.verbose, - ti.args.function_signature, ti.args.check_attributes) + raw_tool_output = common.invoke_tool(ti.args.opt_binary, opt_args, + ti.path) + builder.process_run_line(common.OPT_FUNCTION_RE, common.scrub_body, + raw_tool_output, prefixes) + func_dict = builder.finish_and_get_func_dict() is_in_function = False is_in_function_start = False prefix_set = set([prefix for prefixes, _ in prefix_list for prefix in prefixes]) @@ -140,8 +139,8 @@ common.dump_input_lines(output_lines, ti, prefix_set, ';') # Now generate all the checks. - common.add_checks_at_end(output_lines, prefix_list, func_order, ';', - lambda my_output_lines, prefixes, func: + common.add_checks_at_end(output_lines, prefix_list, builder.func_order(), + ';', lambda my_output_lines, prefixes, func: common.add_ir_checks(my_output_lines, ';', prefixes, func_dict, func, False,