aboutsummaryrefslogtreecommitdiff
path: root/llvm/utils/UpdateTestChecks/common.py
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/utils/UpdateTestChecks/common.py')
-rw-r--r--llvm/utils/UpdateTestChecks/common.py39
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: