diff options
author | Nikita Popov <npopov@redhat.com> | 2023-01-24 15:32:31 +0100 |
---|---|---|
committer | Nikita Popov <npopov@redhat.com> | 2023-03-02 09:59:22 +0100 |
commit | a26d3031cf89954d030e494d47ca6653d531dc82 (patch) | |
tree | 05fc907d56c9f873ede621a7a76c5e82d05d1f0b /llvm/utils/UpdateTestChecks/common.py | |
parent | f7ca01333214f934c580c162afdee933e7430b6c (diff) | |
download | llvm-a26d3031cf89954d030e494d47ca6653d531dc82.zip llvm-a26d3031cf89954d030e494d47ca6653d531dc82.tar.gz llvm-a26d3031cf89954d030e494d47ca6653d531dc82.tar.bz2 |
[UTC] Include return type/attributes under --version 2
If --function-signature is used with --version 2, then also include
the return type/attributes in the check lines. This is the
implementation of D133943 rebased on the --version mechanism from
D142473.
This doesn't bump the default version yet, because I'd like to do
that together with D140212 (which enables --function-signature by
default), as these changes seem closely related. For now this
functionality can be accessed by explicitly passing --version 2
to UTC.
Fixes https://github.com/llvm/llvm-project/issues/61058.
Differential Revision: https://reviews.llvm.org/D144963
Diffstat (limited to 'llvm/utils/UpdateTestChecks/common.py')
-rw-r--r-- | llvm/utils/UpdateTestChecks/common.py | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/llvm/utils/UpdateTestChecks/common.py b/llvm/utils/UpdateTestChecks/common.py index b35fac4..b52306a 100644 --- a/llvm/utils/UpdateTestChecks/common.py +++ b/llvm/utils/UpdateTestChecks/common.py @@ -22,6 +22,7 @@ _prefix_filecheck_ir_name = '' Version changelog: 1: Initial version, used by tests that don't specify --version explicitly. +2: --function-signature now also checks return type/attributes. """ DEFAULT_VERSION = 1 @@ -346,7 +347,7 @@ UTC_ADVERT = 'NOTE: Assertions have been autogenerated by ' UNUSED_NOTE = 'NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:' OPT_FUNCTION_RE = re.compile( - r'^(\s*;\s*Function\sAttrs:\s(?P<attrs>[\w\s():,]+?))?\s*define\s+(?:internal\s+)?[^@]*@(?P<func>[\w.$-]+?)\s*' + r'^(\s*;\s*Function\sAttrs:\s(?P<attrs>[\w\s():,]+?))?\s*define\s+(?P<funcdef_attrs_and_ret>[^@]*)@(?P<func>[\w.$-]+?)\s*' r'(?P<args_and_sig>\((\)|(.*?[\w.-]+?)\))[^{]*\{)\n(?P<body>.*?)^\}$', flags=(re.M | re.S)) @@ -459,13 +460,14 @@ def do_scrub(body, scrubber, scrubber_args, extra): # Build up a dictionary of all the function bodies. class function_body(object): - def __init__(self, string, extra, args_and_sig, attrs, func_name_separator): + def __init__(self, string, extra, funcdef_attrs_and_ret, args_and_sig, attrs, func_name_separator): self.scrub = string self.extrascrub = extra + self.funcdef_attrs_and_ret = funcdef_attrs_and_ret self.args_and_sig = args_and_sig self.attrs = attrs self.func_name_separator = func_name_separator - def is_same_except_arg_names(self, extrascrub, args_and_sig, attrs, is_backend): + def is_same_except_arg_names(self, extrascrub, funcdef_attrs_and_ret, args_and_sig, attrs, is_backend): arg_names = set() def drop_arg_names(match): arg_names.add(match.group(variable_group_in_ir_value_match)) @@ -478,6 +480,8 @@ class function_body(object): if match.group(variable_group_in_ir_value_match) is not None and match.group(variable_group_in_ir_value_match) in arg_names: return match.group(1) + match.group(match.lastindex) return match.group(1) + match.group(2) + match.group(match.lastindex) + if self.funcdef_attrs_and_ret != funcdef_attrs_and_ret: + return False if self.attrs != attrs: return False ans0 = IR_VALUE_RE.sub(drop_arg_names, self.args_and_sig) @@ -553,6 +557,7 @@ class FunctionTestBuilder: else: func_name_separator = '' attrs = m.group('attrs') if self._check_attributes else '' + funcdef_attrs_and_ret = m.group('funcdef_attrs_and_ret') if self._record_args else '' # Determine if we print arguments, the opening brace, or nothing after the # function name if self._record_args and 'args_and_sig' in m.groupdict(): @@ -607,9 +612,11 @@ class FunctionTestBuilder: if (self._func_dict[prefix][func] is not None and (str(self._func_dict[prefix][func]) != scrubbed_body or self._func_dict[prefix][func].args_and_sig != args_and_sig or - self._func_dict[prefix][func].attrs != attrs)): + self._func_dict[prefix][func].attrs != attrs or + self._func_dict[prefix][func].funcdef_attrs_and_ret != funcdef_attrs_and_ret)): if self._func_dict[prefix][func].is_same_except_arg_names( scrubbed_extra, + funcdef_attrs_and_ret, args_and_sig, attrs, is_backend): @@ -624,8 +631,8 @@ class FunctionTestBuilder: else: if prefix not in self._processed_prefixes: self._func_dict[prefix][func] = function_body( - scrubbed_body, scrubbed_extra, args_and_sig, attrs, - func_name_separator) + scrubbed_body, scrubbed_extra, funcdef_attrs_and_ret, + args_and_sig, attrs, func_name_separator) self._func_order[prefix].append(func) else: # An earlier RUN line used this check prefixes but didn't produce @@ -897,7 +904,7 @@ def generalize_asm_check_lines(lines, vars_seen, global_vars_seen): global_vars_seen, asm_nameless_values, ASM_VALUE_RE, True) -def add_checks(output_lines, comment_marker, prefix_list, func_dict, func_name, check_label_format, is_backend, is_analyze, global_vars_seen_dict, is_filtered): +def add_checks(output_lines, comment_marker, prefix_list, func_dict, func_name, check_label_format, is_backend, is_analyze, version, global_vars_seen_dict, is_filtered): # prefix_exclusions are prefixes we cannot use to print the function because it doesn't exist in run lines that use these prefixes as well. prefix_exclusions = set() printed_prefixes = [] @@ -945,6 +952,11 @@ def add_checks(output_lines, comment_marker, prefix_list, func_dict, func_name, printed_prefixes.append(checkprefix) attrs = str(func_dict[checkprefix][func_name].attrs) attrs = '' if attrs == 'None' else attrs + if version > 1: + funcdef_attrs_and_ret = func_dict[checkprefix][func_name].funcdef_attrs_and_ret + else: + funcdef_attrs_and_ret = '' + if attrs: output_lines.append('%s %s: Function Attrs: %s' % (comment_marker, checkprefix, attrs)) args_and_sig = str(func_dict[checkprefix][func_name].args_and_sig) @@ -952,10 +964,10 @@ def add_checks(output_lines, comment_marker, prefix_list, func_dict, func_name, args_and_sig = generalize_check_lines([args_and_sig], is_analyze, vars_seen, global_vars_seen)[0] func_name_separator = func_dict[checkprefix][func_name].func_name_separator if '[[' in args_and_sig: - output_lines.append(check_label_format % (checkprefix, func_name, '', func_name_separator)) + output_lines.append(check_label_format % (checkprefix, funcdef_attrs_and_ret, func_name, '', func_name_separator)) output_lines.append('%s %s-SAME: %s' % (comment_marker, checkprefix, args_and_sig)) else: - output_lines.append(check_label_format % (checkprefix, func_name, args_and_sig, func_name_separator)) + output_lines.append(check_label_format % (checkprefix, funcdef_attrs_and_ret, func_name, args_and_sig, func_name_separator)) func_body = str(func_dict[checkprefix][func_name]).splitlines() if not func_body: # We have filtered everything. @@ -1031,20 +1043,26 @@ def add_checks(output_lines, comment_marker, prefix_list, func_dict, func_name, return printed_prefixes def add_ir_checks(output_lines, comment_marker, prefix_list, func_dict, - func_name, preserve_names, function_sig, + func_name, preserve_names, function_sig, version, global_vars_seen_dict, is_filtered): # Label format is based on IR string. - function_def_regex = 'define {{[^@]+}}' if function_sig else '' + if function_sig and version > 1: + function_def_regex = 'define %s' + elif function_sig: + function_def_regex = 'define {{[^@]+}}%s' + else: + function_def_regex = '%s' check_label_format = '{} %s-LABEL: {}@%s%s%s'.format(comment_marker, function_def_regex) return add_checks(output_lines, comment_marker, prefix_list, func_dict, func_name, - check_label_format, False, preserve_names, global_vars_seen_dict, + check_label_format, False, preserve_names, version, + global_vars_seen_dict, is_filtered) def add_analyze_checks(output_lines, comment_marker, prefix_list, func_dict, func_name, is_filtered): - check_label_format = '{} %s-LABEL: \'%s%s%s\''.format(comment_marker) + check_label_format = '{} %s-LABEL: \'%s%s%s%s\''.format(comment_marker) global_vars_seen_dict = {} return add_checks(output_lines, comment_marker, prefix_list, func_dict, func_name, - check_label_format, False, True, global_vars_seen_dict, + check_label_format, False, True, 1, global_vars_seen_dict, is_filtered) def build_global_values_dictionary(glob_val_dict, raw_tool_output, prefixes): |