From f9957787a0232d6dfe07afa26c4969f0481fffd9 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sun, 27 Sep 2026 18:01:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(codegen):=20TPC=20=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E7=BA=A7=20t.State=20=E5=85=A8=E5=B1=80=E5=8F=AA=E5=A3=B0?= =?UTF-8?q?=E6=98=8E=E4=B8=8D=E5=AE=9A=E4=B9=89=EF=BC=88external=20linkage?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit extern 名字: 类型的展开产物(名字: 类型 | t.State):本模块生成 @名字 = external global T,不写定义(否则 duplicate symbol) 位置早于「已存在则升级 common 定义」分支,避免 extern 被反向升级成定义;与 import 侧 _EmitExternalGlobalDeclLlvm 同名分支同口径 export(t.CExport)侧无需改动:TPC 模块级全局本就用裸名(_mangle_name 不作用于全局变量),裸名导出语义天然满足 --- lib/core/Handles/HandlesAssign.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/core/Handles/HandlesAssign.py b/lib/core/Handles/HandlesAssign.py index 8547f17..411cd8e 100644 --- a/lib/core/Handles/HandlesAssign.py +++ b/lib/core/Handles/HandlesAssign.py @@ -1707,6 +1707,20 @@ class AssignHandle(BaseHandle): VarType: ir.Type = Gen._ctype_to_llvm(TypeInfo) if isinstance(VarType, ir.VoidType): VarType = ir.IntType(32) + # t.State 标记的模块级全局(`extern 名字: 类型` 的展开产物,见 + # SymbolUtils._ExpandExportExternVar):**只声明不定义**(external linkage), + # 符号定义在外部(C 库 / 汇编 / 其它翻译单元),本模块不得再生成定义 + # (否则 ld.lld duplicate symbol)。与 import 侧 + # _EmitExternalGlobalDeclLlvm 的同名分支(HandlesImports.py:1211-1217)同口径。 + # 位置必须早于下方「VarName 已在 module.globals → 升级 common 定义」分支: + # 否则 extern 会被反向升级成定义,抵消 external 声明语义。 + if TypeInfo is not None and TypeInfo.IsState: + if VarName not in Gen.module.globals: + _ext_gv: ir.GlobalVariable = ir.GlobalVariable(Gen.module, VarType, name=VarName) + _ext_gv.linkage = 'external' + Gen._export_funcs.add(VarName) + Gen.variables[VarName] = Gen.module.globals[VarName] + return # const / volatile 模块级全局登记(统一登记入口,持久层 global_*)。 # 局限(明确记录,见 Debugger/type-descriptors.md 已知差异):本分支只覆盖 # 标量/指针型全局;数组(t.CArray[...])与结构体型全局在更早的分支