Skip to content

Change update_xxx_checks to continue on error when processing mutliple inputs #137728

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 30, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
318 changes: 163 additions & 155 deletions llvm/utils/update_analyze_test_checks.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@

from __future__ import print_function

from sys import stderr
from traceback import print_exc
import argparse
import os # Used to advertise this file's name ("autogenerated_note").
import sys
Expand All @@ -39,6 +41,158 @@
from UpdateTestChecks import common


def update_test(opt_basename: str, ti: common.TestInfo):
triple_in_ir = None
for l in ti.input_lines:
m = common.TRIPLE_IR_RE.match(l)
if m:
triple_in_ir = m.groups()[0]
break

prefix_list = []
for l in ti.run_lines:
if "|" not in l:
common.warn("Skipping unparsable RUN line: " + l)
continue

(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 + " "):
common.warn("WSkipping non-%s RUN line: %s" % (opt_basename, l))
continue

if not filecheck_cmd.startswith("FileCheck "):
common.warn("Skipping non-FileChecked RUN line: " + l)
continue

tool_cmd_args = tool_cmd[len(opt_basename) :].strip()
tool_cmd_args = tool_cmd_args.replace("< %s", "").replace("%s", "").strip()
check_prefixes = common.get_check_prefixes(filecheck_cmd)

# FIXME: We should use multiple check prefixes to common check lines. For
# now, we just ignore all but the last.
prefix_list.append((check_prefixes, tool_cmd_args))

ginfo = common.make_analyze_generalizer(version=1)
builder = common.FunctionTestBuilder(
run_list=prefix_list,
flags=type(
"",
(object,),
{
"verbose": ti.args.verbose,
"filters": ti.args.filters,
"function_signature": False,
"check_attributes": False,
"replace_value_regex": [],
},
),
scrubber_args=[],
path=ti.path,
ginfo=ginfo,
)

for prefixes, opt_args in prefix_list:
common.debug("Extracted opt cmd:", opt_basename, opt_args, file=sys.stderr)
common.debug("Extracted FileCheck prefixes:", str(prefixes), file=sys.stderr)

raw_tool_outputs = common.invoke_tool(ti.args.opt_binary, opt_args, ti.path)

if re.search(r"Printing analysis ", raw_tool_outputs) is not None:
# Split analysis outputs by "Printing analysis " declarations.
for raw_tool_output in re.split(r"Printing analysis ", raw_tool_outputs):
builder.process_run_line(
common.ANALYZE_FUNCTION_RE,
common.scrub_body,
raw_tool_output,
prefixes,
)
elif (
re.search(r"(LV|LDist): Checking a loop in ", raw_tool_outputs) is not None
):
for raw_tool_output in re.split(
r"(LV|LDist): Checking a loop in ", raw_tool_outputs
):
builder.process_run_line(
common.LOOP_PASS_DEBUG_RE,
common.scrub_body,
raw_tool_output,
prefixes,
)
else:
common.warn("Don't know how to deal with this output")
continue

builder.processed_prefixes(prefixes)

func_dict = builder.finish_and_get_func_dict()
is_in_function = False
is_in_function_start = False
prefix_set = set([prefix for prefixes, _ in prefix_list for prefix in prefixes])
common.debug("Rewriting FileCheck prefixes:", str(prefix_set), file=sys.stderr)
output_lines = []

generated_prefixes = []
for input_info in ti.iterlines(output_lines):
input_line = input_info.line
args = input_info.args
if is_in_function_start:
if input_line == "":
continue
if input_line.lstrip().startswith(";"):
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.
generated_prefixes.extend(
common.add_analyze_checks(
output_lines,
";",
prefix_list,
func_dict,
func_name,
ginfo,
is_filtered=builder.is_filtered(),
)
)
is_in_function_start = False

if is_in_function:
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.
output_lines.append(input_line)
else:
continue
if input_line.strip() == "}":
is_in_function = False
continue

# If it's outside a function, it just gets copied to the output.
output_lines.append(input_line)

m = common.IR_FUNCTION_RE.match(input_line)
if not m:
continue
func_name = m.group(1)
if ti.args.function is not None and func_name != ti.args.function:
# When filtering on a specific function, skip all others.
continue
is_in_function = is_in_function_start = True

if ti.args.gen_unused_prefix_body:
output_lines.extend(
ti.get_checks_for_unused_prefixes(prefix_list, generated_prefixes)
)

common.debug("Writing %d lines to %s..." % (len(output_lines), ti.path))

with open(ti.path, "wb") as f:
f.writelines(["{}\n".format(l).encode("utf-8") for l in output_lines])


def main():
from argparse import RawTextHelpFormatter

Expand All @@ -61,164 +215,18 @@ def main():
common.error("Unexpected opt name: " + opt_basename)
sys.exit(1)

returncode = 0
for ti in common.itertests(
initial_args.tests, parser, script_name="utils/" + script_name
):
triple_in_ir = None
for l in ti.input_lines:
m = common.TRIPLE_IR_RE.match(l)
if m:
triple_in_ir = m.groups()[0]
break

prefix_list = []
for l in ti.run_lines:
if "|" not in l:
common.warn("Skipping unparsable RUN line: " + l)
continue

(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 + " "):
common.warn("WSkipping non-%s RUN line: %s" % (opt_basename, l))
continue

if not filecheck_cmd.startswith("FileCheck "):
common.warn("Skipping non-FileChecked RUN line: " + l)
continue

tool_cmd_args = tool_cmd[len(opt_basename) :].strip()
tool_cmd_args = tool_cmd_args.replace("< %s", "").replace("%s", "").strip()
check_prefixes = common.get_check_prefixes(filecheck_cmd)

# FIXME: We should use multiple check prefixes to common check lines. For
# now, we just ignore all but the last.
prefix_list.append((check_prefixes, tool_cmd_args))

ginfo = common.make_analyze_generalizer(version=1)
builder = common.FunctionTestBuilder(
run_list=prefix_list,
flags=type(
"",
(object,),
{
"verbose": ti.args.verbose,
"filters": ti.args.filters,
"function_signature": False,
"check_attributes": False,
"replace_value_regex": [],
},
),
scrubber_args=[],
path=ti.path,
ginfo=ginfo,
)

for prefixes, opt_args in prefix_list:
common.debug("Extracted opt cmd:", opt_basename, opt_args, file=sys.stderr)
common.debug(
"Extracted FileCheck prefixes:", str(prefixes), file=sys.stderr
)

raw_tool_outputs = common.invoke_tool(ti.args.opt_binary, opt_args, ti.path)

if re.search(r"Printing analysis ", raw_tool_outputs) is not None:
# Split analysis outputs by "Printing analysis " declarations.
for raw_tool_output in re.split(
r"Printing analysis ", raw_tool_outputs
):
builder.process_run_line(
common.ANALYZE_FUNCTION_RE,
common.scrub_body,
raw_tool_output,
prefixes,
)
elif (
re.search(r"(LV|LDist): Checking a loop in ", raw_tool_outputs)
is not None
):
for raw_tool_output in re.split(
r"(LV|LDist): Checking a loop in ", raw_tool_outputs
):
builder.process_run_line(
common.LOOP_PASS_DEBUG_RE,
common.scrub_body,
raw_tool_output,
prefixes,
)
else:
common.warn("Don't know how to deal with this output")
continue

builder.processed_prefixes(prefixes)

func_dict = builder.finish_and_get_func_dict()
is_in_function = False
is_in_function_start = False
prefix_set = set([prefix for prefixes, _ in prefix_list for prefix in prefixes])
common.debug("Rewriting FileCheck prefixes:", str(prefix_set), file=sys.stderr)
output_lines = []

generated_prefixes = []
for input_info in ti.iterlines(output_lines):
input_line = input_info.line
args = input_info.args
if is_in_function_start:
if input_line == "":
continue
if input_line.lstrip().startswith(";"):
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.
generated_prefixes.extend(
common.add_analyze_checks(
output_lines,
";",
prefix_list,
func_dict,
func_name,
ginfo,
is_filtered=builder.is_filtered(),
)
)
is_in_function_start = False

if is_in_function:
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.
output_lines.append(input_line)
else:
continue
if input_line.strip() == "}":
is_in_function = False
continue

# If it's outside a function, it just gets copied to the output.
output_lines.append(input_line)

m = common.IR_FUNCTION_RE.match(input_line)
if not m:
continue
func_name = m.group(1)
if ti.args.function is not None and func_name != ti.args.function:
# When filtering on a specific function, skip all others.
continue
is_in_function = is_in_function_start = True

if ti.args.gen_unused_prefix_body:
output_lines.extend(
ti.get_checks_for_unused_prefixes(prefix_list, generated_prefixes)
)

common.debug("Writing %d lines to %s..." % (len(output_lines), ti.path))

with open(ti.path, "wb") as f:
f.writelines(["{}\n".format(l).encode("utf-8") for l in output_lines])
try:
update_test(opt_basename, ti)
except Exception:
stderr.write(f"Error: Failed to update test {ti.path}\n")
print_exc()
returncode = 1
return returncode


if __name__ == "__main__":
main()
sys.exit(main())
Loading