diff options
author | sstefan1 <sstipanovic@s-energize.com> | 2020-07-11 21:53:50 +0200 |
---|---|---|
committer | sstefan1 <sstipanovic@s-energize.com> | 2020-07-19 20:07:24 +0200 |
commit | 937bad3594e7cba44cddae4661e1bae911beba3e (patch) | |
tree | e562f20b837c1f9033d10d84e2d13feaa7d3ccc9 /llvm/utils/UpdateTestChecks/common.py | |
parent | f7a571537a14da83e5701864471b99b61cdcca54 (diff) | |
download | llvm-937bad3594e7cba44cddae4661e1bae911beba3e.zip llvm-937bad3594e7cba44cddae4661e1bae911beba3e.tar.gz llvm-937bad3594e7cba44cddae4661e1bae911beba3e.tar.bz2 |
[Utils] Check function attributes in update_test_checks
Summary:
This introduces new flag to the update_test_checks and
update_cc_test_checks that allows for function attributes
to be checked in a check-line. If the flag is not set,
the behavior should remain the same.
Reviewers: jdoerfert
Subscribers: arichardson, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D83629
Diffstat (limited to 'llvm/utils/UpdateTestChecks/common.py')
-rw-r--r-- | llvm/utils/UpdateTestChecks/common.py | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/llvm/utils/UpdateTestChecks/common.py b/llvm/utils/UpdateTestChecks/common.py index 7b4a9b3..b964bf3 100644 --- a/llvm/utils/UpdateTestChecks/common.py +++ b/llvm/utils/UpdateTestChecks/common.py @@ -142,7 +142,7 @@ UTC_ARGS_CMD = re.compile(r'.*' + UTC_ARGS_KEY + '\s*(?P<cmd>.*)\s*$') UTC_ADVERT = 'NOTE: Assertions have been autogenerated by ' OPT_FUNCTION_RE = re.compile( - r'^\s*define\s+(?:internal\s+)?[^@]*@(?P<func>[\w.-]+?)\s*' + r'^(\s*;\s*Function\sAttrs:\s(?P<attrs>[\w\s]+?))?\s*define\s+(?:internal\s+)?[^@]*@(?P<func>[\w.-]+?)\s*' r'(?P<args_and_sig>\((\)|(.*?[\w.-]+?)\))[^{]*)\{\n(?P<body>.*?)^\}$', flags=(re.M | re.S)) @@ -218,11 +218,12 @@ 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): + def __init__(self, string, extra, args_and_sig, attrs): self.scrub = string self.extrascrub = extra self.args_and_sig = args_and_sig - def is_same_except_arg_names(self, extrascrub, args_and_sig): + self.attrs = attrs + def is_same_except_arg_names(self, extrascrub, args_and_sig, attrs): arg_names = set() def drop_arg_names(match): arg_names.add(match.group(2)) @@ -231,6 +232,8 @@ class function_body(object): if match.group(2) in arg_names: return match.group(1) + match.group(3) return match.group(1) + match.group(2) + match.group(3) + if self.attrs != attrs: + return False ans0 = IR_VALUE_RE.sub(drop_arg_names, self.args_and_sig) ans1 = IR_VALUE_RE.sub(drop_arg_names, args_and_sig) if ans0 != ans1: @@ -244,12 +247,13 @@ class function_body(object): def __str__(self): return self.scrub -def build_function_body_dictionary(function_re, scrubber, scrubber_args, raw_tool_output, prefixes, func_dict, verbose, record_args): +def build_function_body_dictionary(function_re, scrubber, scrubber_args, raw_tool_output, prefixes, func_dict, verbose, record_args, check_attributes): for m in function_re.finditer(raw_tool_output): if not m: continue func = m.group('func') body = m.group('body') + attrs = m.group('attrs') if check_attributes else '' # Determine if we print arguments, the opening brace, or nothing after the function name if record_args and 'args_and_sig' in m.groupdict(): args_and_sig = scrub_body(m.group('args_and_sig').strip()) @@ -271,19 +275,20 @@ def build_function_body_dictionary(function_re, scrubber, scrubber_args, raw_too for l in scrubbed_body.splitlines(): print(' ' + l, file=sys.stderr) for prefix in prefixes: - if func in func_dict[prefix] and (str(func_dict[prefix][func]) != scrubbed_body or (func_dict[prefix][func] and func_dict[prefix][func].args_and_sig != args_and_sig)): - if func_dict[prefix][func] and func_dict[prefix][func].is_same_except_arg_names(scrubbed_extra, args_and_sig): - func_dict[prefix][func].scrub = scrubbed_extra - func_dict[prefix][func].args_and_sig = args_and_sig - continue - else: - if prefix == prefixes[-1]: - warn('Found conflicting asm under the same prefix: %r!' % (prefix,)) - else: - func_dict[prefix][func] = None + if func in func_dict[prefix]: + if str(func_dict[prefix][func]) != scrubbed_body or (func_dict[prefix][func] and (func_dict[prefix][func].args_and_sig != args_and_sig or func_dict[prefix][func].attrs != attrs)): + if func_dict[prefix][func] and func_dict[prefix][func].is_same_except_arg_names(scrubbed_extra, args_and_sig, attrs): + func_dict[prefix][func].scrub = scrubbed_extra + func_dict[prefix][func].args_and_sig = args_and_sig continue + else: + if prefix == prefixes[-1]: + warn('Found conflicting asm under the same prefix: %r!' % (prefix,)) + else: + func_dict[prefix][func] = None + continue - func_dict[prefix][func] = function_body(scrubbed_body, scrubbed_extra, args_and_sig) + func_dict[prefix][func] = function_body(scrubbed_body, scrubbed_extra, args_and_sig, attrs) ##### Generator of LLVM IR CHECK lines @@ -383,6 +388,10 @@ def add_checks(output_lines, comment_marker, prefix_list, func_dict, func_name, vars_seen = set() printed_prefixes.append(checkprefix) + attrs = str(func_dict[checkprefix][func_name].attrs) + attrs = '' if attrs == 'None' else attrs + 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) args_and_sig = genericize_check_lines([args_and_sig], is_analyze, vars_seen)[0] if '[[' in args_and_sig: |