From 7065b45db3dd267ea7aec0b42cc5b8e8f8408429 Mon Sep 17 00:00:00 2001 From: David Bolvansky Date: Mon, 29 Jul 2019 17:41:00 +0000 Subject: [PATCH] [UpdateTestChecks] Emit warning when invalid value for -check-prefix(es) option Summary: The script is silent for the following issue: FileCheck %s -check-prefix=CHECK,POPCOUNT FileCheck will catch it later, but I think we can warn here too. Now it warns: ./update_llc_test_checks.py file.ll WARNING: Supplied prefix 'CHECK,POPCOUNT' is invalid. Prefix must contain only alphanumeric characters, hyphens and underscores. Did you mean --check-prefixes=CHECK,POPCOUNT? Reviewers: lebedev.ri, spatel, RKSimon, craig.topper, nikic, gbedwell Reviewed By: RKSimon Subscribers: llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D64589 llvm-svn: 367244 --- utils/UpdateTestChecks/common.py | 25 +++++++++++++++++++++++++ utils/update_analyze_test_checks.py | 1 + utils/update_cc_test_checks.py | 1 + utils/update_llc_test_checks.py | 1 + utils/update_mca_test_checks.py | 1 + utils/update_mir_test_checks.py | 1 + utils/update_test_checks.py | 2 +- 7 files changed, 31 insertions(+), 1 deletion(-) diff --git a/utils/UpdateTestChecks/common.py b/utils/UpdateTestChecks/common.py index 0c78f7bee2d..336ccb9ba77 100644 --- a/utils/UpdateTestChecks/common.py +++ b/utils/UpdateTestChecks/common.py @@ -47,6 +47,7 @@ def invoke_tool(exe, cmd_args, ir): RUN_LINE_RE = re.compile('^\s*[;#]\s*RUN:\s*(.*)$') CHECK_PREFIX_RE = re.compile('--?check-prefix(?:es)?[= ](\S+)') +PREFIX_RE = re.compile('^[a-zA-Z0-9_-]+$') CHECK_RE = re.compile(r'^\s*[;#]\s*([^:]+?)(?:-NEXT|-NOT|-DAG|-LABEL)?:') OPT_FUNCTION_RE = re.compile( @@ -264,3 +265,27 @@ def add_ir_checks(output_lines, comment_marker, prefix_list, func_dict, func_nam def add_analyze_checks(output_lines, comment_marker, prefix_list, func_dict, func_name): check_label_format = '{} %s-LABEL: \'%s\''.format(comment_marker) add_checks(output_lines, comment_marker, prefix_list, func_dict, func_name, check_label_format, False, True) + + +def check_prefix(prefix): + if not PREFIX_RE.match(prefix): + hint = "" + if ',' in prefix: + hint = " Did you mean '--check-prefixes=" + prefix + "'?" + print(("WARNING: Supplied prefix '%s' is invalid. Prefix must contain only alphanumeric characters, hyphens and underscores." + hint) % + (prefix), file=sys.stderr) + + +def verify_filecheck_prefixes(fc_cmd): + fc_cmd_parts = fc_cmd.split() + for part in fc_cmd_parts: + if "check-prefix=" in part: + prefix = part.split('=', 1)[1] + check_prefix(prefix) + elif "check-prefixes=" in part: + prefixes = part.split('=', 1)[1].split(',') + for prefix in prefixes: + check_prefix(prefix) + if prefixes.count(prefix) > 1: + print("WARNING: Supplied prefix '%s' is not unique in the prefix list." % + (prefix,), file=sys.stderr) diff --git a/utils/update_analyze_test_checks.py b/utils/update_analyze_test_checks.py index df09108937c..6c75388b670 100755 --- a/utils/update_analyze_test_checks.py +++ b/utils/update_analyze_test_checks.py @@ -92,6 +92,7 @@ def main(): prefix_list = [] for l in run_lines: (tool_cmd, filecheck_cmd) = tuple([cmd.strip() for cmd in l.split('|', 1)]) + common.verify_filecheck_prefixes(filecheck_cmd) if not tool_cmd.startswith(opt_basename + ' '): print('WARNING: Skipping non-%s RUN line: %s' % (opt_basename, l), file=sys.stderr) diff --git a/utils/update_cc_test_checks.py b/utils/update_cc_test_checks.py index 865ebf7ff57..205b57698da 100755 --- a/utils/update_cc_test_checks.py +++ b/utils/update_cc_test_checks.py @@ -168,6 +168,7 @@ def main(): # Extract -check-prefix in FileCheck args filecheck_cmd = commands[-1] + common.verify_filecheck_prefixes(filecheck_cmd) if not filecheck_cmd.startswith('FileCheck '): print('WARNING: Skipping non-FileChecked RUN line: ' + l, file=sys.stderr) continue diff --git a/utils/update_llc_test_checks.py b/utils/update_llc_test_checks.py index 0936a449c24..9f74a2e1899 100755 --- a/utils/update_llc_test_checks.py +++ b/utils/update_llc_test_checks.py @@ -89,6 +89,7 @@ def main(): filecheck_cmd = '' if len(commands) > 1: filecheck_cmd = commands[1] + common.verify_filecheck_prefixes(filecheck_cmd) if not llc_cmd.startswith('llc '): print('WARNING: Skipping non-llc RUN line: ' + l, file=sys.stderr) continue diff --git a/utils/update_mca_test_checks.py b/utils/update_mca_test_checks.py index 87ac19b39ae..bbeca1d557b 100755 --- a/utils/update_mca_test_checks.py +++ b/utils/update_mca_test_checks.py @@ -116,6 +116,7 @@ def _get_run_infos(run_lines, args): _warn('could not split tool and filecheck commands: {}'.format(run_line)) continue + common.verify_filecheck_prefixes(filecheck_cmd) tool_basename = os.path.splitext(os.path.basename(args.llvm_mca_binary))[0] if not tool_cmd.startswith(tool_basename + ' '): diff --git a/utils/update_mir_test_checks.py b/utils/update_mir_test_checks.py index b42a38bd55a..7a54cc3fd62 100755 --- a/utils/update_mir_test_checks.py +++ b/utils/update_mir_test_checks.py @@ -122,6 +122,7 @@ def build_run_list(test, run_lines, verbose=False): commands = [cmd.strip() for cmd in l.split('|', 1)] llc_cmd = commands[0] filecheck_cmd = commands[1] if len(commands) > 1 else '' + common.verify_filecheck_prefixes(filecheck_cmd) if not llc_cmd.startswith('llc '): warn('Skipping non-llc RUN line: {}'.format(l), test_file=test) diff --git a/utils/update_test_checks.py b/utils/update_test_checks.py index 92ce0535a10..e9f5e6c333b 100755 --- a/utils/update_test_checks.py +++ b/utils/update_test_checks.py @@ -103,7 +103,7 @@ def main(): prefix_list = [] for l in run_lines: (tool_cmd, filecheck_cmd) = tuple([cmd.strip() for cmd in l.split('|', 1)]) - + common.verify_filecheck_prefixes(filecheck_cmd) if not tool_cmd.startswith(opt_basename + ' '): print('WARNING: Skipping non-%s RUN line: %s' % (opt_basename, l), file=sys.stderr) continue