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