fix(phaseb): llc 并行失败按阶段定位,不再一律报 llc 编译失败

- 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__() 计算,既有偏移不变
This commit is contained in:
TermiNexus committed 2026-10-03 19:01:50 +08:00
1 parent cda4cca805
commit 1dcd29db9c
1 file changed
+38 -2
+38 -2
View File
@@ -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