From 1dcd29db9c393eaa0aefd76668287d8def01f67b Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 3 Oct 2026 19:01:50 +0800 Subject: [PATCH] =?UTF-8?q?fix(phaseb):=20llc=20=E5=B9=B6=E8=A1=8C?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E6=8C=89=E9=98=B6=E6=AE=B5=E5=AE=9A=E4=BD=8D?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E5=86=8D=E4=B8=80=E5=BE=8B=E6=8A=A5=20llc=20?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - LlcTask 追加 FailStage 字段(0=未失败/1=mlir-opt/2=mlir-translate/3=ASan opt/4=llc),worker 在各步失败时写入 - run_llc_parallel 按 FailStage 打印真正失败的阶段名与对应命令:MLIR 后端下 mlir-opt/mlir-translate 失败此前被误指为 llc(现场 .ll 含 LLVM IR 时 mlir-opt 报 unexpected character,日志却指向 llc) - 字段追加在结尾,所有 stride/memset 均按 LlcTask.__sizeof__() 计算,既有偏移不变 --- App/lib/Phase/BuildPipeline.vp | 40 ++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/App/lib/Phase/BuildPipeline.vp b/App/lib/Phase/BuildPipeline.vp index 7ab4804..7981893 100644 --- a/App/lib/Phase/BuildPipeline.vp +++ b/App/lib/Phase/BuildPipeline.vp @@ -529,6 +529,17 @@ def compile_ll_to_obj(ir_path: str, output_dir: str, module_name: str, cc_cmd: s # llc 并行最大线程数(参考 TPC Phase2Translator n_workers=os.cpu_count(),本机 16 核) LLC_MAX_THREADS: t.CDefine = 16 +# LlcTask.FailStage:worker 写"失败发生在哪一步" +# 0 = 未失败/成功;1 = mlir-opt 校验;2 = mlir-translate 降级;3 = ASan opt 插桩;4 = llc +# 此前 worker 只写 Result/ExitCode,主线程只能按 LlcCmd 打印 ⇒ MLIR 后端下 +# mlir-opt/mlir-translate 失败也被误报成 "llc 编译失败"(现场:.ll 里是 LLVM IR +# 时 mlir-opt 报 "unexpected character",日志却指向 llc,定位被带偏)。 +define LLC_STAGE_NONE = 0 +define LLC_STAGE_MLIR_OPT = 1 +define LLC_STAGE_MLIR_TRANSLATE = 2 +define LLC_STAGE_ASAN_OPT = 3 +define LLC_STAGE_LLC = 4 + class LlcTask: """llc 异步任务:命令串(stdlib.malloc)+ 模块 SHA1 + 结果""" @@ -542,6 +553,8 @@ class LlcTask: # MLIR 后端降级命令(非 MLIR 为 None);同样追加在结尾,不影响既有偏移。 MlirOptCmd: bytes # mlir-opt 校验命令 MlirTranslateCmd: bytes # mlir-translate 降级命令 + # 失败阶段(LLC_STAGE_*,见上方常量);追加在结尾,既有偏移不变。 + FailStage: int # worker 写:失败发生在哪一步 def init_llc_task(task: LlcTask | t.CPtr, ir_path: str, output_dir: str, @@ -721,25 +734,30 @@ def _llc_task_worker(arg: t.CPtr) -> t.CPtr: mo_rc: int = _run_cmd_wait(task.MlirOptCmd) if mo_rc != 0: task.ExitCode = mo_rc + task.FailStage = LLC_STAGE_MLIR_OPT task.Result = 1 return t.CPtr(0) if task.MlirTranslateCmd is not None: mt_rc: int = _run_cmd_wait(task.MlirTranslateCmd) if mt_rc != 0: task.ExitCode = mt_rc + task.FailStage = LLC_STAGE_MLIR_TRANSLATE task.Result = 1 return t.CPtr(0) if task.OptCmd is not None: opt_rc: int = _run_cmd_wait(task.OptCmd) if opt_rc != 0: task.ExitCode = opt_rc + task.FailStage = LLC_STAGE_ASAN_OPT task.Result = 1 return t.CPtr(0) llc_rc: int = _run_cmd_wait(task.LlcCmd) task.ExitCode = llc_rc if llc_rc != 0: + task.FailStage = LLC_STAGE_LLC task.Result = 1 else: + task.FailStage = LLC_STAGE_NONE task.Result = 0 return t.CPtr(0) @@ -801,8 +819,26 @@ def run_llc_parallel(tasks: bytes, task_count: int, max_threads: int) -> int: for j in range(batch_n): tsk2: LlcTask | t.CPtr = (LlcTask | t.CPtr)(uint64(tasks) + sizet(batch_start + j) * slot_size) if tsk2 is not None and tsk2.Result != 0: - # 失败:打印模块 sha1 + 退出码 + 完整命令(.ll 路径即命令末参数) - VLogger.error(f"llc 编译失败: {(tsk2.ModuleSha1 if tsk2.ModuleSha1 is not None else "?")} (exit={tsk2.ExitCode} cmd={(tsk2.LlcCmd if tsk2.LlcCmd is not None else "?")})", "LLC") + # 失败:按 FailStage 定位到**具体哪一步**并打印对应该步的命令。 + # 此前一律打印 LlcCmd + "llc 编译失败":MLIR 后端下 mlir-opt / + # mlir-translate 失败(如 .ll 里其实是 LLVM IR 时 mlir-opt 报 + # "unexpected character")被误指到 llc,定位被带偏。 + st: int = tsk2.FailStage + stage_name: str = "未知阶段(worker 未跑完)" + stage_cmd: bytes = tsk2.LlcCmd + if st == LLC_STAGE_MLIR_OPT: + stage_name = "mlir-opt 校验" + stage_cmd = tsk2.MlirOptCmd + elif st == LLC_STAGE_MLIR_TRANSLATE: + stage_name = "mlir-translate 降级" + stage_cmd = tsk2.MlirTranslateCmd + elif st == LLC_STAGE_ASAN_OPT: + stage_name = "opt ASan 插桩" + stage_cmd = tsk2.OptCmd + elif st == LLC_STAGE_LLC: + stage_name = "llc 编译" + stage_cmd = tsk2.LlcCmd + VLogger.error(f"{stage_name}失败: {(tsk2.ModuleSha1 if tsk2.ModuleSha1 is not None else "?")} (exit={tsk2.ExitCode} cmd={(stage_cmd if stage_cmd is not None else "?")})", "LLC") ret = 1 return ret