summaryrefslogtreecommitdiffstats
path: root/llvm/utils/update_test_checks.py
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/utils/update_test_checks.py')
-rwxr-xr-xllvm/utils/update_test_checks.py131
1 files changed, 4 insertions, 127 deletions
diff --git a/llvm/utils/update_test_checks.py b/llvm/utils/update_test_checks.py
index a37f2b4c043..a1b1f90a24f 100755
--- a/llvm/utils/update_test_checks.py
+++ b/llvm/utils/update_test_checks.py
@@ -44,133 +44,10 @@ ADVERT = '; NOTE: Assertions have been autogenerated by '
# RegEx: this is where the magic happens.
-SCRUB_IR_COMMENT_RE = re.compile(r'\s*;.*')
-
IR_FUNCTION_RE = re.compile('^\s*define\s+(?:internal\s+)?[^@]*@([\w-]+)\s*\(')
-OPT_FUNCTION_RE = re.compile(
- r'^\s*define\s+(?:internal\s+)?[^@]*@(?P<func>[\w-]+?)\s*\('
- r'(\s+)?[^)]*[^{]*\{\n(?P<body>.*?)^\}$',
- flags=(re.M | re.S))
-# Match things that look at identifiers, but only if they are followed by
-# spaces, commas, paren, or end of the string
-IR_VALUE_RE = re.compile(r'(\s+)%([\w\.]+?)([,\s\(\)]|\Z)')
-
-
-
-def scrub_body(body, opt_basename):
- # Scrub runs of whitespace out of the assembly, but leave the leading
- # whitespace in place.
- body = common.SCRUB_WHITESPACE_RE.sub(r' ', body)
- # Expand the tabs used for indentation.
- body = string.expandtabs(body, 2)
- # Strip trailing whitespace.
- body = common.SCRUB_TRAILING_WHITESPACE_RE.sub(r'', body)
- return body
-
-
-
-# Create a FileCheck variable name based on an IR name.
-def get_value_name(var):
- if var.isdigit():
- var = 'TMP' + var
- var = var.replace('.', '_')
- return var.upper()
-
-
-# Create a FileCheck variable from regex.
-def get_value_definition(var):
- return '[[' + get_value_name(var) + ':%.*]]'
-
-
-# Use a FileCheck variable.
-def get_value_use(var):
- return '[[' + get_value_name(var) + ']]'
-
-# Replace IR value defs and uses with FileCheck variables.
-def genericize_check_lines(lines):
- # This gets called for each match that occurs in
- # a line. We transform variables we haven't seen
- # into defs, and variables we have seen into uses.
- def transform_line_vars(match):
- var = match.group(2)
- if var in vars_seen:
- rv = get_value_use(var)
- else:
- vars_seen.add(var)
- rv = get_value_definition(var)
- # re.sub replaces the entire regex match
- # with whatever you return, so we have
- # to make sure to hand it back everything
- # including the commas and spaces.
- return match.group(1) + rv + match.group(3)
-
- vars_seen = set()
- lines_with_def = []
-
- for i, line in enumerate(lines):
- # An IR variable named '%.' matches the FileCheck regex string.
- line = line.replace('%.', '%dot')
- # Ignore any comments, since the check lines will too.
- scrubbed_line = SCRUB_IR_COMMENT_RE.sub(r'', line)
- lines[i] = IR_VALUE_RE.sub(transform_line_vars, scrubbed_line)
- return lines
-
-
-def add_checks(output_lines, prefix_list, func_dict, func_name, opt_basename):
- # Label format is based on IR string.
- check_label_format = "; %s-LABEL: @%s("
-
- printed_prefixes = []
- for checkprefixes, _ in prefix_list:
- for checkprefix in checkprefixes:
- if checkprefix in printed_prefixes:
- break
- if not func_dict[checkprefix][func_name]:
- continue
- # Add some space between different check prefixes, but not after the last
- # check line (before the test code).
- #if len(printed_prefixes) != 0:
- # output_lines.append(';')
- printed_prefixes.append(checkprefix)
- output_lines.append(check_label_format % (checkprefix, func_name))
- func_body = func_dict[checkprefix][func_name].splitlines()
-
- # For IR output, change all defs to FileCheck variables, so we're immune
- # to variable naming fashions.
- func_body = genericize_check_lines(func_body)
-
- # This could be selectively enabled with an optional invocation argument.
- # Disabled for now: better to check everything. Be safe rather than sorry.
-
- # Handle the first line of the function body as a special case because
- # it's often just noise (a useless asm comment or entry label).
- #if func_body[0].startswith("#") or func_body[0].startswith("entry:"):
- # is_blank_line = True
- #else:
- # output_lines.append('; %s: %s' % (checkprefix, func_body[0]))
- # is_blank_line = False
-
- is_blank_line = False
-
- for func_line in func_body:
- if func_line.strip() == '':
- is_blank_line = True
- continue
- # Do not waste time checking IR comments.
- func_line = SCRUB_IR_COMMENT_RE.sub(r'', func_line)
- # Skip blank lines instead of checking them.
- if is_blank_line == True:
- output_lines.append('; %s: %s' % (checkprefix, func_line))
- else:
- output_lines.append('; %s-NEXT: %s' % (checkprefix, func_line))
- is_blank_line = False
- # Add space between different check prefixes and also before the first
- # line of code in the test function.
- output_lines.append(';')
- break
- return output_lines
+
def main():
@@ -247,8 +124,8 @@ def main():
raw_tool_output = common.invoke_tool(args.opt_binary, opt_args, test)
common.build_function_body_dictionary(
- OPT_FUNCTION_RE, scrub_body, [opt_basename], raw_tool_output,
- prefixes, func_dict, args.verbose)
+ common.OPT_FUNCTION_RE, common.scrub_body, [],
+ raw_tool_output, prefixes, func_dict, args.verbose)
is_in_function = False
is_in_function_start = False
@@ -269,7 +146,7 @@ def main():
continue
# Print out the various check lines here.
- output_lines = add_checks(output_lines, prefix_list, func_dict, func_name, opt_basename)
+ output_lines = common.add_ir_checks(output_lines, prefix_list, func_dict, func_name, opt_basename)
is_in_function_start = False
if is_in_function:
OpenPOWER on IntegriCloud