From 56a4b5c8185d1bd3b1ed913df2ac0155a3048435 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 22 Aug 2026 04:21:04 +0800 Subject: [PATCH] =?UTF-8?q?fix(tpc):=20stub=20=E5=8A=A0=E8=BD=BD=E5=99=A8?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E5=85=A8=E5=B1=80=E5=8F=98=E9=87=8F=E5=A3=B0?= =?UTF-8?q?=E6=98=8E=E2=80=94=E2=80=94=E8=B7=A8=E6=A8=A1=E5=9D=97=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E5=8F=98=E9=87=8F=E4=B8=8D=E5=86=8D=E9=9D=99=E9=BB=98?= =?UTF-8?q?=E4=B8=A2=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 根因:_LoadDeclarationsFromStubLlvm 只解析 struct/declare,忽略全局变量声明行,TPC 编译 TPV 时跨模块全局变量(StubMerger._sha1_store_count 等)从未嵌入 Gen.module.globals - 后果:_lookup_module_global 恒 None -> return 静默跳过 ret(HandlesReturn 的 if Val 分支)、跨模块赋值静默丢失 - 修复:逐行循环加分支解析 16hex 前缀的 external global 声明(剥离 zeroinitializer 与 align 尾部修饰),用 _parse_llvm_type 解析类型后嵌入 external GlobalVariable;.str. 内部常量与 @main 等非 16hex 前缀跳过 - 诊断脚本验证 4 种真实 stub.ll 格式(struct 指针/数组/zeroinitializer/vtable 结构体)全部解析成功 --- lib/core/Handles/HandlesImports.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/core/Handles/HandlesImports.py b/lib/core/Handles/HandlesImports.py index e06256e..488285a 100644 --- a/lib/core/Handles/HandlesImports.py +++ b/lib/core/Handles/HandlesImports.py @@ -2681,7 +2681,27 @@ class ImportHandle(BaseHandle): raise _vlog().warning(f"处理导入失败: {_e}", "Exception") continue - + + # 全局变量声明:@sha1.name = external global TYPE(stub.ll 写入, + # 原加载器只解析 struct/declare、忽略全局变量 → TPC 编译 TPV 时 + # 跨模块全局变量(如 StubMerger._sha1_store_count)从未嵌入 + # Gen.module.globals → _lookup_module_global 恒 None → return + # 静默跳过 ret / 跨模块赋值丢失。此处嵌入 external 声明, + # 名称格式与定义一致(@{sha1}.{name},temp/*.text.ll 确认)。 + _gv_match = re.match(r'@("?)([a-f0-9]{16}\.[\w.\[\]]+)\1\s*=\s*external\s+global\s+(\S.*)', stripped) + if _gv_match: + _gv_name: str = _gv_match.group(2) + _gv_type_str: str = _gv_match.group(3).strip() + # 去掉尾部修饰(zeroinitializer / , align N),只保留类型 + _gv_type_str = re.sub(r'\s+zeroinitializer.*$', '', _gv_type_str) + _gv_type_str = re.sub(r'\s*,\s*align\s+\d+.*$', '', _gv_type_str) + if _gv_name not in Gen.module.globals: + _gv_ty: ir.Type | None = self._parse_llvm_type(_gv_type_str, Gen, source_sha1=source_sha1) + if _gv_ty is not None: + _gv = ir.GlobalVariable(Gen.module, _gv_ty, name=_gv_name) + _gv.linkage = 'external' + continue + if not stripped.startswith('declare '): continue