From a42923cf253b909353f278860ba1e7e84fa46e2f Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 20 Aug 2026 05:11:25 +0800 Subject: [PATCH] =?UTF-8?q?fix(stub):=20vpi=20=E6=B3=A8=E5=85=A5=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E5=8F=98=E9=87=8F=E5=A3=B0=E6=98=8E=E5=B8=A6=E6=BA=90?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=20SHA1=20=E5=89=8D=E7=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "跨模块全局变量 _op_head 类型未知(stub 未注入)" 根因:VpiReader _inject_global_variable_declare 从 vpi(源码级裸名)注入依赖全局声明时用 短名 @_op_head,而 5f7a873 后定义端已是 @._op_head → from-import 精确查找(带前缀)在翻译时找不到 → fail-fast 误杀 (函数注入 _inject_function_declare 早已带 src_sha1 mangling,全局漏做)。 修复:_inject_global_variable_declare 注入名用 src_sha1 前缀 mangle (对齐定义端与查找端三方一致),调用点传 ParseVpiIntoModule 已提取的 src_sha1;去重改按 mangled 名匹配。 另:ExprGenName from-import 全局未注入时由 fail-fast 改为 _deps_pending (依赖 vpi 按文件序未就绪属 Phase A 收敛正常态,真实错误由收敛检查暴露)。 --- App/lib/StubGen/VpiReader.vp | 2 +- App/lib/core/Gen/ExprGenName.vp | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/App/lib/StubGen/VpiReader.vp b/App/lib/StubGen/VpiReader.vp index 34620b6..5ff47fe 100644 --- a/App/lib/StubGen/VpiReader.vp +++ b/App/lib/StubGen/VpiReader.vp @@ -1050,7 +1050,7 @@ def _inject_global_variable_declare(pool: memhub.MemBuddy | t.CPtr, gv_ty_v = llvmlite.Ptr(pool, aelem_v) case _: gv_ty_v = resolved_v - gv_v: llvmlite.GlobalVariable | t.CPtr = llvmlite.new_global_variable(pool, gname_v, gv_ty_v) + gv_v: llvmlite.GlobalVariable | t.CPtr = llvmlite.new_global_variable(pool, gv_name_m, gv_ty_v) if gv_v is None: return llvmlite.module_add_global(mod, gv_v) diff --git a/App/lib/core/Gen/ExprGenName.vp b/App/lib/core/Gen/ExprGenName.vp index a5ccc40..c5c58c4 100644 --- a/App/lib/core/Gen/ExprGenName.vp +++ b/App/lib/core/Gen/ExprGenName.vp @@ -339,10 +339,15 @@ class ExprGenName(ExprGenBase.ExprGenBase): if gv_fi is not None and gv_fi.Ty is not None: ref_fi = HandlesExpr.make_global_ref(pool, gv_fi.Name, gv_fi.Ty) else: - HandlesType.fatal_error( - node, - f"跨模块全局变量 '{fi_gname}' 类型未知(stub 未注入)", - "TypeError") + # 依赖模块 vpi/stub 未注入:Phase A 按文件序翻译时依赖模块 + # (如 lexer 先于 ast.tokens)可能晚于本文件,其 .vpi 尚未生成 + # (LoadDepVpiIntoModule 无从注入)→ 标记 _deps_pending 下遍 + # 重试(对齐 CallGenMixin 跨模块依赖未就绪处理)。真实错误由 + # Phase A 收敛检查暴露,不在此 fail-fast——否则清缓存后 + # lexer 先于 tokens 翻译必然误报 "stub 未注入"。 + if trans is not None: + trans._deps_pending = 1 + return None if ref_fi is not None and ref_fi.Ty is not None: lty_fi: llvmlite.LLVMType | t.CPtr = ref_fi.Ty.Pointee if lty_fi is not None: