fix(stub): vpi 注入全局变量声明带源模块 SHA1 前缀

"跨模块全局变量 _op_head 类型未知(stub 未注入)" 根因:VpiReader
_inject_global_variable_declare 从 vpi(源码级裸名)注入依赖全局声明时用
短名 @_op_head,而 5f7a873 后定义端已是 @<tokens_sha1>._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 收敛正常态,真实错误由收敛检查暴露)。
This commit is contained in:
TermiNexus committed 2026-08-20 05:11:25 +08:00
1 parent 601db9e265
commit a42923cf25
2 files changed
+10 -5

No files matched your search

+1 -1
View File
@@ -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)
+9 -4
View File
@@ -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: