summaryrefslogtreecommitdiffstats
path: root/llvm/utils/update_test_checks.py
diff options
context:
space:
mode:
authorFangrui Song <maskray@google.com>2018-01-30 00:40:05 +0000
committerFangrui Song <maskray@google.com>2018-01-30 00:40:05 +0000
commitee4e2e718d00a44c9ac4e663534a0391d72a3549 (patch)
tree6870c5f91733a78679383f68b4fbf4117775f8c2 /llvm/utils/update_test_checks.py
parent96f8c5c420df383e61fe61bf67fc73a3ef8aab75 (diff)
downloadbcm5719-llvm-ee4e2e718d00a44c9ac4e663534a0391d72a3549.tar.gz
bcm5719-llvm-ee4e2e718d00a44c9ac4e663534a0391d72a3549.zip
[utils] De-duplicate utils/update_{llc_,}test_checks.py
Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D42654 llvm-svn: 323718
Diffstat (limited to 'llvm/utils/update_test_checks.py')
-rwxr-xr-xllvm/utils/update_test_checks.py86
1 files changed, 16 insertions, 70 deletions
diff --git a/llvm/utils/update_test_checks.py b/llvm/utils/update_test_checks.py
index 073d43d8e4d..a37f2b4c043 100755
--- a/llvm/utils/update_test_checks.py
+++ b/llvm/utils/update_test_checks.py
@@ -38,76 +38,36 @@ import sys
import tempfile
import re
+from UpdateTestChecks import common
+
ADVERT = '; NOTE: Assertions have been autogenerated by '
# RegEx: this is where the magic happens.
-SCRUB_LEADING_WHITESPACE_RE = re.compile(r'^(\s+)')
-SCRUB_WHITESPACE_RE = re.compile(r'(?!^(| \w))[ \t]+', flags=re.M)
-SCRUB_TRAILING_WHITESPACE_RE = re.compile(r'[ \t]+$', flags=re.M)
-SCRUB_KILL_COMMENT_RE = re.compile(r'^ *#+ +kill:.*\n')
SCRUB_IR_COMMENT_RE = re.compile(r'\s*;.*')
-RUN_LINE_RE = re.compile('^\s*;\s*RUN:\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))
-CHECK_PREFIX_RE = re.compile('--?check-prefix(?:es)?=(\S+)')
-CHECK_RE = re.compile(r'^\s*;\s*([^:]+?)(?:-NEXT|-NOT|-DAG|-LABEL)?:')
# 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)')
-# Invoke the tool that is being tested.
-def invoke_tool(args, cmd_args, ir):
- with open(ir) as ir_file:
- stdout = subprocess.check_output(args.opt_binary + ' ' + cmd_args,
- shell=True, stdin=ir_file)
- # Fix line endings to unix CR style.
- stdout = stdout.replace('\r\n', '\n')
- return stdout
-
def scrub_body(body, opt_basename):
# Scrub runs of whitespace out of the assembly, but leave the leading
# whitespace in place.
- body = SCRUB_WHITESPACE_RE.sub(r' ', body)
+ body = common.SCRUB_WHITESPACE_RE.sub(r' ', body)
# Expand the tabs used for indentation.
body = string.expandtabs(body, 2)
# Strip trailing whitespace.
- body = SCRUB_TRAILING_WHITESPACE_RE.sub(r'', body)
+ body = common.SCRUB_TRAILING_WHITESPACE_RE.sub(r'', body)
return body
-# Build up a dictionary of all the function bodies.
-def build_function_body_dictionary(raw_tool_output, prefixes, func_dict, verbose, opt_basename):
- func_regex = OPT_FUNCTION_RE
- for m in func_regex.finditer(raw_tool_output):
- if not m:
- continue
- func = m.group('func')
- scrubbed_body = scrub_body(m.group('body'), opt_basename)
- if func.startswith('stress'):
- # We only use the last line of the function body for stress tests.
- scrubbed_body = '\n'.join(scrubbed_body.splitlines()[-1:])
- if verbose:
- print >>sys.stderr, 'Processing function: ' + func
- for l in scrubbed_body.splitlines():
- print >>sys.stderr, ' ' + l
- for prefix in prefixes:
- if func in func_dict[prefix] and func_dict[prefix][func] != scrubbed_body:
- if prefix == prefixes[-1]:
- print >>sys.stderr, ('WARNING: Found conflicting asm under the '
- 'same prefix: %r!' % (prefix,))
- else:
- func_dict[prefix][func] = None
- continue
-
- func_dict[prefix][func] = scrubbed_body
-
# Create a FileCheck variable name based on an IR name.
def get_value_name(var):
@@ -213,21 +173,6 @@ def add_checks(output_lines, prefix_list, func_dict, func_name, opt_basename):
return output_lines
-def should_add_line_to_output(input_line, prefix_set):
- # Skip any blank comment lines in the IR.
- if input_line.strip() == ';':
- return False
- # Skip any blank lines in the IR.
- #if input_line.strip() == '':
- # return False
- # And skip any CHECK lines. We're building our own.
- m = CHECK_RE.match(input_line)
- if m and m.group(1) in prefix_set:
- return False
-
- return True
-
-
def main():
from argparse import RawTextHelpFormatter
parser = argparse.ArgumentParser(description=__doc__, formatter_class=RawTextHelpFormatter)
@@ -254,7 +199,7 @@ def main():
input_lines = [l.rstrip() for l in f]
raw_lines = [m.group(1)
- for m in [RUN_LINE_RE.match(l) for l in input_lines] if m]
+ for m in [common.RUN_LINE_RE.match(l) for l in input_lines] if m]
run_lines = [raw_lines[0]] if len(raw_lines) > 0 else []
for l in raw_lines[1:]:
if run_lines[-1].endswith("\\"):
@@ -282,7 +227,7 @@ def main():
tool_cmd_args = tool_cmd[len(opt_basename):].strip()
tool_cmd_args = tool_cmd_args.replace('< %s', '').replace('%s', '').strip()
- check_prefixes = [item for m in CHECK_PREFIX_RE.finditer(filecheck_cmd)
+ check_prefixes = [item for m in common.CHECK_PREFIX_RE.finditer(filecheck_cmd)
for item in m.group(1).split(',')]
if not check_prefixes:
check_prefixes = ['CHECK']
@@ -300,8 +245,10 @@ def main():
print >>sys.stderr, 'Extracted opt cmd: ' + opt_basename + ' ' + opt_args
print >>sys.stderr, 'Extracted FileCheck prefixes: ' + str(prefixes)
- raw_tool_output = invoke_tool(args, opt_args, test)
- build_function_body_dictionary(raw_tool_output, prefixes, func_dict, args.verbose, opt_basename)
+ 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)
is_in_function = False
is_in_function_start = False
@@ -316,20 +263,20 @@ def main():
if input_line == '':
continue
if input_line.lstrip().startswith(';'):
- m = CHECK_RE.match(input_line)
+ m = common.CHECK_RE.match(input_line)
if not m or m.group(1) not in prefix_set:
output_lines.append(input_line)
continue
# Print out the various check lines here.
- output_lines = add_checks(output_lines, prefix_list, func_dict, name, opt_basename)
+ output_lines = add_checks(output_lines, prefix_list, func_dict, func_name, opt_basename)
is_in_function_start = False
if is_in_function:
- if should_add_line_to_output(input_line, prefix_set) == True:
+ if common.should_add_line_to_output(input_line, prefix_set):
# This input line of the function body will go as-is into the output.
# Except make leading whitespace uniform: 2 spaces.
- input_line = SCRUB_LEADING_WHITESPACE_RE.sub(r' ', input_line)
+ input_line = common.SCRUB_LEADING_WHITESPACE_RE.sub(r' ', input_line)
output_lines.append(input_line)
else:
continue
@@ -347,8 +294,8 @@ def main():
m = IR_FUNCTION_RE.match(input_line)
if not m:
continue
- name = m.group(1)
- if args.function is not None and name != args.function:
+ func_name = m.group(1)
+ if args.function is not None and func_name != args.function:
# When filtering on a specific function, skip all others.
continue
is_in_function = is_in_function_start = True
@@ -362,4 +309,3 @@ def main():
if __name__ == '__main__':
main()
-
OpenPOWER on IntegriCloud