From 12e8d6bdf83b3a8933a5dd9022128c99a65e0129 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 20 Aug 2026 08:06:12 +0800 Subject: [PATCH] =?UTF-8?q?fix(stub):=20vpi=20=E5=85=A8=E5=B1=80=E6=B3=A8?= =?UTF-8?q?=E5=85=A5=E8=A1=A5=E5=85=A8=20src=5Fsha1=20mangling=E2=80=94?= =?UTF-8?q?=E2=80=94=E4=BF=AE=E5=A4=8D=20a42923c=20=E7=AC=94=E8=AF=AF?= =?UTF-8?q?=E8=87=B4=E7=A9=BA=E5=90=8D=E5=85=A8=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit a42923c 声称"注入名带 src_sha1 前缀",但实际把 new_global_variable 的 gname_v 写成未定义变量 gv_name_m(mangle 逻辑从未实现)→ 注入空名 "@ = external global %MemBuddy*" → llc "expected top-level entity" (SlotsBugTest 回归)。 修复:_inject_global_variable_declare 签名加 src_sha1,计算 mangled 名 "."(对齐定义端 5f7a873 与查找端 from-import 三方一致), 去重与创建均用 mangled 名;调用点传 ParseVpiIntoModule 的 src_sha1。 --- App/lib/StubGen/VpiReader.vp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/App/lib/StubGen/VpiReader.vp b/App/lib/StubGen/VpiReader.vp index 5ff47fe..9a0f1dd 100644 --- a/App/lib/StubGen/VpiReader.vp +++ b/App/lib/StubGen/VpiReader.vp @@ -942,7 +942,7 @@ def _ParseVpiIntoModuleImpl(pool: memhub.MemBuddy | t.CPtr, else: _inject_global_variable_declare(pool, mod, aa, trans, stub_imported_modules, stub_from_imports, - i32_ty, i8_ptr_ty) + i32_ty, i8_ptr_ty, src_sha1) continue # ClassDef → 递归注入类内方法(如 MemBuddy.__init__/alloc) @@ -1007,8 +1007,9 @@ def _inject_global_variable_declare(pool: memhub.MemBuddy | t.CPtr, imported_modules: str, from_imports: str, i32_ty: llvmlite.LLVMType | t.CPtr, - i8_ptr_ty: llvmlite.LLVMType | t.CPtr) -> None: - """从 vpi AnnAssign 创建模块级全局变量 external declare(短名 @name)""" + i8_ptr_ty: llvmlite.LLVMType | t.CPtr, + src_sha1: str) -> None: + """从 vpi AnnAssign 创建模块级全局变量 external declare(mangled 名 @.)""" if pool is None or mod is None or aa is None or trans is None: return tgt_v: ast.AST | t.CPtr = aa.target @@ -1020,10 +1021,20 @@ def _inject_global_variable_declare(pool: memhub.MemBuddy | t.CPtr, gname_v: str = nm_v.id if gname_v[0] == '\0': return - # 去重:遍历模块全局变量链表(短名匹配) + # mangled 名:带源模块 SHA1 前缀(对齐定义端 5f7a873 的 @. + # 与查找端 from-import 精确查找三方一致;裸短名会退化为未定义)。 + # 注:a42923c 曾把此处写成未定义变量 gv_name_m(笔误,mangle 未实现), + # 导致注入空名 @ = external global → llc "expected top-level entity"。 + gv_name_m: str = gname_v + if src_sha1 is not None and src_sha1[0] != '\0': + ml_v: t.CSizeT = string.strlen(src_sha1) + 1 + string.strlen(gname_v) + 1 + gv_name_m = pool.alloc(ml_v) + if gv_name_m is not None: + viperlib.snprintf(gv_name_m, ml_v, "%s.%s", src_sha1, gname_v) + # 去重:遍历模块全局变量链表(mangled 名匹配) cur_v: llvmlite.GlobalVariable | t.CPtr = mod.GlobalHead while cur_v is not None: - if cur_v.Name is not None and string.strcmp(cur_v.Name, gname_v) == 0: + if cur_v.Name is not None and string.strcmp(cur_v.Name, gv_name_m) == 0: return cur_v = cur_v.Next # 解析注解类型(裸类 → Ptr(struct),CArray → 元素指针)