[llvm] Change update_xxx_checks to continue on error when processing mutliple inputs (PR #137728)

Scott Linder via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 29 12:47:46 PDT 2025


================
@@ -61,163 +215,17 @@ 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
 
 
----------------
slinder1 wrote:

I can't comment on the context, but should this be `sys.exit(main())` like the rest, or is this a special case?

https://github.com/llvm/llvm-project/pull/137728


More information about the llvm-commits mailing list