Skip to content

Commit 88b03aa

Browse files
authored
Change update_xxx_checks to continue on error when processing mutliple inputs (#137728)
Change llvm/utils/update_xxx_checks.py scripts to: Catch exceptions individually for each test. On exception print which test triggered the exception and continue with the remaining test updates.
1 parent ff8fc5b commit 88b03aa

7 files changed

+1226
-1181
lines changed

llvm/utils/update_analyze_test_checks.py

Lines changed: 163 additions & 155 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131

3232
from __future__ import print_function
3333

34+
from sys import stderr
35+
from traceback import print_exc
3436
import argparse
3537
import os # Used to advertise this file's name ("autogenerated_note").
3638
import sys
@@ -39,6 +41,158 @@
3941
from UpdateTestChecks import common
4042

4143

44+
def update_test(opt_basename: str, ti: common.TestInfo):
45+
triple_in_ir = None
46+
for l in ti.input_lines:
47+
m = common.TRIPLE_IR_RE.match(l)
48+
if m:
49+
triple_in_ir = m.groups()[0]
50+
break
51+
52+
prefix_list = []
53+
for l in ti.run_lines:
54+
if "|" not in l:
55+
common.warn("Skipping unparsable RUN line: " + l)
56+
continue
57+
58+
(tool_cmd, filecheck_cmd) = tuple([cmd.strip() for cmd in l.split("|", 1)])
59+
common.verify_filecheck_prefixes(filecheck_cmd)
60+
61+
if not tool_cmd.startswith(opt_basename + " "):
62+
common.warn("WSkipping non-%s RUN line: %s" % (opt_basename, l))
63+
continue
64+
65+
if not filecheck_cmd.startswith("FileCheck "):
66+
common.warn("Skipping non-FileChecked RUN line: " + l)
67+
continue
68+
69+
tool_cmd_args = tool_cmd[len(opt_basename) :].strip()
70+
tool_cmd_args = tool_cmd_args.replace("< %s", "").replace("%s", "").strip()
71+
check_prefixes = common.get_check_prefixes(filecheck_cmd)
72+
73+
# FIXME: We should use multiple check prefixes to common check lines. For
74+
# now, we just ignore all but the last.
75+
prefix_list.append((check_prefixes, tool_cmd_args))
76+
77+
ginfo = common.make_analyze_generalizer(version=1)
78+
builder = common.FunctionTestBuilder(
79+
run_list=prefix_list,
80+
flags=type(
81+
"",
82+
(object,),
83+
{
84+
"verbose": ti.args.verbose,
85+
"filters": ti.args.filters,
86+
"function_signature": False,
87+
"check_attributes": False,
88+
"replace_value_regex": [],
89+
},
90+
),
91+
scrubber_args=[],
92+
path=ti.path,
93+
ginfo=ginfo,
94+
)
95+
96+
for prefixes, opt_args in prefix_list:
97+
common.debug("Extracted opt cmd:", opt_basename, opt_args, file=sys.stderr)
98+
common.debug("Extracted FileCheck prefixes:", str(prefixes), file=sys.stderr)
99+
100+
raw_tool_outputs = common.invoke_tool(ti.args.opt_binary, opt_args, ti.path)
101+
102+
if re.search(r"Printing analysis ", raw_tool_outputs) is not None:
103+
# Split analysis outputs by "Printing analysis " declarations.
104+
for raw_tool_output in re.split(r"Printing analysis ", raw_tool_outputs):
105+
builder.process_run_line(
106+
common.ANALYZE_FUNCTION_RE,
107+
common.scrub_body,
108+
raw_tool_output,
109+
prefixes,
110+
)
111+
elif (
112+
re.search(r"(LV|LDist): Checking a loop in ", raw_tool_outputs) is not None
113+
):
114+
for raw_tool_output in re.split(
115+
r"(LV|LDist): Checking a loop in ", raw_tool_outputs
116+
):
117+
builder.process_run_line(
118+
common.LOOP_PASS_DEBUG_RE,
119+
common.scrub_body,
120+
raw_tool_output,
121+
prefixes,
122+
)
123+
else:
124+
common.warn("Don't know how to deal with this output")
125+
continue
126+
127+
builder.processed_prefixes(prefixes)
128+
129+
func_dict = builder.finish_and_get_func_dict()
130+
is_in_function = False
131+
is_in_function_start = False
132+
prefix_set = set([prefix for prefixes, _ in prefix_list for prefix in prefixes])
133+
common.debug("Rewriting FileCheck prefixes:", str(prefix_set), file=sys.stderr)
134+
output_lines = []
135+
136+
generated_prefixes = []
137+
for input_info in ti.iterlines(output_lines):
138+
input_line = input_info.line
139+
args = input_info.args
140+
if is_in_function_start:
141+
if input_line == "":
142+
continue
143+
if input_line.lstrip().startswith(";"):
144+
m = common.CHECK_RE.match(input_line)
145+
if not m or m.group(1) not in prefix_set:
146+
output_lines.append(input_line)
147+
continue
148+
149+
# Print out the various check lines here.
150+
generated_prefixes.extend(
151+
common.add_analyze_checks(
152+
output_lines,
153+
";",
154+
prefix_list,
155+
func_dict,
156+
func_name,
157+
ginfo,
158+
is_filtered=builder.is_filtered(),
159+
)
160+
)
161+
is_in_function_start = False
162+
163+
if is_in_function:
164+
if common.should_add_line_to_output(input_line, prefix_set):
165+
# This input line of the function body will go as-is into the output.
166+
output_lines.append(input_line)
167+
else:
168+
continue
169+
if input_line.strip() == "}":
170+
is_in_function = False
171+
continue
172+
173+
# If it's outside a function, it just gets copied to the output.
174+
output_lines.append(input_line)
175+
176+
m = common.IR_FUNCTION_RE.match(input_line)
177+
if not m:
178+
continue
179+
func_name = m.group(1)
180+
if ti.args.function is not None and func_name != ti.args.function:
181+
# When filtering on a specific function, skip all others.
182+
continue
183+
is_in_function = is_in_function_start = True
184+
185+
if ti.args.gen_unused_prefix_body:
186+
output_lines.extend(
187+
ti.get_checks_for_unused_prefixes(prefix_list, generated_prefixes)
188+
)
189+
190+
common.debug("Writing %d lines to %s..." % (len(output_lines), ti.path))
191+
192+
with open(ti.path, "wb") as f:
193+
f.writelines(["{}\n".format(l).encode("utf-8") for l in output_lines])
194+
195+
42196
def main():
43197
from argparse import RawTextHelpFormatter
44198

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

218+
returncode = 0
64219
for ti in common.itertests(
65220
initial_args.tests, parser, script_name="utils/" + script_name
66221
):
67-
triple_in_ir = None
68-
for l in ti.input_lines:
69-
m = common.TRIPLE_IR_RE.match(l)
70-
if m:
71-
triple_in_ir = m.groups()[0]
72-
break
73-
74-
prefix_list = []
75-
for l in ti.run_lines:
76-
if "|" not in l:
77-
common.warn("Skipping unparsable RUN line: " + l)
78-
continue
79-
80-
(tool_cmd, filecheck_cmd) = tuple([cmd.strip() for cmd in l.split("|", 1)])
81-
common.verify_filecheck_prefixes(filecheck_cmd)
82-
83-
if not tool_cmd.startswith(opt_basename + " "):
84-
common.warn("WSkipping non-%s RUN line: %s" % (opt_basename, l))
85-
continue
86-
87-
if not filecheck_cmd.startswith("FileCheck "):
88-
common.warn("Skipping non-FileChecked RUN line: " + l)
89-
continue
90-
91-
tool_cmd_args = tool_cmd[len(opt_basename) :].strip()
92-
tool_cmd_args = tool_cmd_args.replace("< %s", "").replace("%s", "").strip()
93-
check_prefixes = common.get_check_prefixes(filecheck_cmd)
94-
95-
# FIXME: We should use multiple check prefixes to common check lines. For
96-
# now, we just ignore all but the last.
97-
prefix_list.append((check_prefixes, tool_cmd_args))
98-
99-
ginfo = common.make_analyze_generalizer(version=1)
100-
builder = common.FunctionTestBuilder(
101-
run_list=prefix_list,
102-
flags=type(
103-
"",
104-
(object,),
105-
{
106-
"verbose": ti.args.verbose,
107-
"filters": ti.args.filters,
108-
"function_signature": False,
109-
"check_attributes": False,
110-
"replace_value_regex": [],
111-
},
112-
),
113-
scrubber_args=[],
114-
path=ti.path,
115-
ginfo=ginfo,
116-
)
117-
118-
for prefixes, opt_args in prefix_list:
119-
common.debug("Extracted opt cmd:", opt_basename, opt_args, file=sys.stderr)
120-
common.debug(
121-
"Extracted FileCheck prefixes:", str(prefixes), file=sys.stderr
122-
)
123-
124-
raw_tool_outputs = common.invoke_tool(ti.args.opt_binary, opt_args, ti.path)
125-
126-
if re.search(r"Printing analysis ", raw_tool_outputs) is not None:
127-
# Split analysis outputs by "Printing analysis " declarations.
128-
for raw_tool_output in re.split(
129-
r"Printing analysis ", raw_tool_outputs
130-
):
131-
builder.process_run_line(
132-
common.ANALYZE_FUNCTION_RE,
133-
common.scrub_body,
134-
raw_tool_output,
135-
prefixes,
136-
)
137-
elif (
138-
re.search(r"(LV|LDist): Checking a loop in ", raw_tool_outputs)
139-
is not None
140-
):
141-
for raw_tool_output in re.split(
142-
r"(LV|LDist): Checking a loop in ", raw_tool_outputs
143-
):
144-
builder.process_run_line(
145-
common.LOOP_PASS_DEBUG_RE,
146-
common.scrub_body,
147-
raw_tool_output,
148-
prefixes,
149-
)
150-
else:
151-
common.warn("Don't know how to deal with this output")
152-
continue
153-
154-
builder.processed_prefixes(prefixes)
155-
156-
func_dict = builder.finish_and_get_func_dict()
157-
is_in_function = False
158-
is_in_function_start = False
159-
prefix_set = set([prefix for prefixes, _ in prefix_list for prefix in prefixes])
160-
common.debug("Rewriting FileCheck prefixes:", str(prefix_set), file=sys.stderr)
161-
output_lines = []
162-
163-
generated_prefixes = []
164-
for input_info in ti.iterlines(output_lines):
165-
input_line = input_info.line
166-
args = input_info.args
167-
if is_in_function_start:
168-
if input_line == "":
169-
continue
170-
if input_line.lstrip().startswith(";"):
171-
m = common.CHECK_RE.match(input_line)
172-
if not m or m.group(1) not in prefix_set:
173-
output_lines.append(input_line)
174-
continue
175-
176-
# Print out the various check lines here.
177-
generated_prefixes.extend(
178-
common.add_analyze_checks(
179-
output_lines,
180-
";",
181-
prefix_list,
182-
func_dict,
183-
func_name,
184-
ginfo,
185-
is_filtered=builder.is_filtered(),
186-
)
187-
)
188-
is_in_function_start = False
189-
190-
if is_in_function:
191-
if common.should_add_line_to_output(input_line, prefix_set):
192-
# This input line of the function body will go as-is into the output.
193-
output_lines.append(input_line)
194-
else:
195-
continue
196-
if input_line.strip() == "}":
197-
is_in_function = False
198-
continue
199-
200-
# If it's outside a function, it just gets copied to the output.
201-
output_lines.append(input_line)
202-
203-
m = common.IR_FUNCTION_RE.match(input_line)
204-
if not m:
205-
continue
206-
func_name = m.group(1)
207-
if ti.args.function is not None and func_name != ti.args.function:
208-
# When filtering on a specific function, skip all others.
209-
continue
210-
is_in_function = is_in_function_start = True
211-
212-
if ti.args.gen_unused_prefix_body:
213-
output_lines.extend(
214-
ti.get_checks_for_unused_prefixes(prefix_list, generated_prefixes)
215-
)
216-
217-
common.debug("Writing %d lines to %s..." % (len(output_lines), ti.path))
218-
219-
with open(ti.path, "wb") as f:
220-
f.writelines(["{}\n".format(l).encode("utf-8") for l in output_lines])
222+
try:
223+
update_test(opt_basename, ti)
224+
except Exception:
225+
stderr.write(f"Error: Failed to update test {ti.path}\n")
226+
print_exc()
227+
returncode = 1
228+
return returncode
221229

222230

223231
if __name__ == "__main__":
224-
main()
232+
sys.exit(main())

0 commit comments

Comments
 (0)