feat(sidecar): 落盘 {sha1}.meta 函数定义清单,声明文件判定改读结构化 sidecar

- 新增 WriteModuleFuncMeta:翻译期从 Module.FuncHead + Function.IsDeclared 产出 FUNC <mangled> DEF|DECL(与 dump_ir 的 stub/text 判据同源)
- 新增 _MetaHasDef / 重写 IsDeclOnlyModule:不再扫 text.ll 的 define 行,改读 meta
- Phase1/Phase2 落盘点紧随 text.ll 写出 meta;Phase1 增量跳转额外要求 meta 存在
- Phase2 内联 is_decl_mi 与 PhaseC 判定统一走 IsDeclOnlyModule

去 IR 化步骤①(sidecar 最小闭环),全后端统一,默认行为不变。
This commit is contained in:
TermiNexus committed 2026-10-03 08:06:39 +08:00
1 parent 0ebe2e0752
commit 94d2bf5047
3 files changed
+134 -75

No files matched your search

+17 -3
View File
@@ -922,9 +922,20 @@ def RunPhase1(mb: memhub.MemBuddy*, includes_dir: str, temp_dir: str,
tf: rawptr[fileio.File] = fileio.File(text_path, fileio.MODE.R)
if not tf.closed:
tf.close()
stdlib.free(text_path)
stdlib.free(stub_path)
continue
# sidecar({sha1}.meta)也必须存在:缺失则重新翻译以补写,
# 否则 Phase B+/C 的「纯声明文件」判定拿不到结构化清单。
meta_path_1b: str = StubMergerCollect._sliced_path(temp_dir, dir_len, sha1, "meta")
meta_ok_1b: int = 0
if meta_path_1b is not None:
mf_chk: rawptr[fileio.File] = fileio.File(meta_path_1b, fileio.MODE.R)
if not mf_chk.closed:
mf_chk.close()
meta_ok_1b = 1
stdlib.free(meta_path_1b)
if meta_ok_1b != 0:
stdlib.free(text_path)
stdlib.free(stub_path)
continue
stdlib.free(text_path)
# text.ll 不存在,需要重新翻译
rp: str = entry.RelPath
@@ -1129,6 +1140,9 @@ def RunPhase1(mb: memhub.MemBuddy*, includes_dir: str, temp_dir: str,
stdlib.free(text_path_p1)
stdlib.free(text_buf)
# save {sha1}.meta(结构化 sidecar:函数定义清单,替代从 text.ll 反推 declare-vs-define)
StubMergerIR.WriteModuleFuncMeta(tr.Module, temp_dir, dir_len_p1, sha1)
# 计时点 3:dump(stub+text)完成;输出单文件三段耗时
t_f3: uint64 = w32.win32base.GetTickCount64()
VLogger.info(f"[{i+1}/{loop_n_b}] 翻译: {file_path} (parse={t_f1-t_f0} ms, translate={t_f2-t_f1} ms, dump={t_f3-t_f2} ms, total={t_f3-t_f0} ms)", "Phase1")
+9 -36
View File
@@ -1085,6 +1085,9 @@ def RunMultiFileProject(mb: memhub.MemBuddy*,
stdlib.free(text_path_a)
stdlib.free(text_buf_a)
# save {sha1}.meta(结构化 sidecar:函数定义清单)
StubMergerIR.WriteModuleFuncMeta(tr_a.Module, temp_dir, td_len_pa, ent.Sha1)
# save dependencies (_imported_modules) for Phase B (切片路径)
deps_path_a: str = StubMergerCollect._sliced_path(temp_dir, td_len_pa, ent.Sha1, "deps.txt")
if deps_path_a is not None:
@@ -1416,45 +1419,13 @@ def RunMultiFileProject(mb: memhub.MemBuddy*,
VLogger.error("includes 源路径分配失败,终止编译", "PhaseB+")
viperlib.snprintf(src_fp_mi, inc_dir_len_mi + 1 + rel_path_len_mi + 1, "%s/%s", incdir_mi, inc_rel_mi)
# 检查是否为声明文件(只有 declare 没有实质 define)
# 判断方法: text.ll 中若有混淆函数 define(含 @")则为实现文件
is_decl_mi: int = -1
tpath_mi: str = StubMergerCollect._sliced_path(temp_dir, td_len_mi, inc_sha1_mi, "text.ll")
if tpath_mi is not None:
tf_mi: rawptr[fileio.File] = fileio.File(tpath_mi, fileio.MODE.R)
if not tf_mi.closed:
is_decl_mi = 1
tbuf_mi: bytes = stdlib.malloc(StubMerger.STUB_READ_BUF_SIZE)
tbr_mi: int64 = 0
if tbuf_mi is not None:
tbr_mi = tf_mi.read_all(tbuf_mi, StubMerger.STUB_READ_BUF_SIZE)
if tbuf_mi is not None and tbr_mi > 0:
if tbr_mi < StubMerger.STUB_READ_BUF_SIZE:
tbuf_mi[tbr_mi] = '\0'
# 逐行扫描: 找 define 行即为实现文件
# (不再要求行中含 @",因为 memhub 等模块的函数名
# 如 @ca40915f11b8b6ad._align_up 不带引号但仍是实现文件)
tpos_mi: sizet = 0
while tpos_mi < tbr_mi:
tls_mi: sizet = tpos_mi
while tpos_mi < tbr_mi:
if tbuf_mi[tpos_mi] == '\n':
break
tpos_mi += 1
tll_mi: sizet = tpos_mi - tls_mi
if tpos_mi < tbr_mi:
tpos_mi += 1
if tll_mi >= 7 and string.strncmp(tbuf_mi + tls_mi, "define ", 7) == 0:
is_decl_mi = 0
break
stdlib.free(tbuf_mi)
tf_mi.close()
stdlib.free(tpath_mi)
# 检查是否为声明文件(读 {sha1}.meta 的结构化定义清单:无 FUNC ... DEF 即纯声明)
is_decl_mi: int = StubMergerIR.IsDeclOnlyModule(temp_dir, td_len_mi, inc_sha1_mi)
# is_decl_mi == -1: text.ll 不存在(Phase1 未翻译此文件)
# is_decl_mi == -1: meta 不存在(Phase1 未翻译此文件)
# is_decl_mi == 1: 声明文件(仅 declare 无 define)
# is_decl_mi == 0: 实现文件(有 define)
# 只跳过声明文件(is_decl_mi == 1);text.ll 不存在时继续,让后续翻译逻辑处理
# 只跳过声明文件(is_decl_mi == 1);meta 不存在时继续,让后续翻译逻辑处理
if is_decl_mi == 1:
stdlib.free(check_pat_mi)
if check_fd_mi is not None:
@@ -1505,6 +1476,8 @@ def RunMultiFileProject(mb: memhub.MemBuddy*,
itf.close()
stdlib.free(inc_text_path)
stdlib.free(inc_text_buf)
# save {sha1}.meta(结构化 sidecar:函数定义清单)
StubMergerIR.WriteModuleFuncMeta(tr_mi.Module, temp_dir, td_len_mi, inc_sha1_mi)
# 重试 BuildCombinedIR
inc_combined_len_mi = StubMergerBuild.BuildCombinedIR(temp_dir, inc_sha1_mi, inc_combined_mi, COMBINED_IR_SIZE)
# OOM 清理:stub/text 已写盘,回收本 includes 文件翻译瞬时数据