From 99df2aef99a93a1dd05f0e3b2c3f80b97961555f Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 20 Aug 2026 04:42:20 +0800 Subject: [PATCH] =?UTF-8?q?fix(gen):=20=E5=85=A8=E5=B1=80=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E5=BC=95=E7=94=A8=E5=8A=A0=E5=BC=95=E5=8F=B7=EF=BC=88?= =?UTF-8?q?SHA1=20=E5=89=8D=E7=BC=80=E5=90=8D=E4=BB=A5=E6=95=B0=E5=AD=97?= =?UTF-8?q?=E5=BC=80=E5=A4=B4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit llc "expected instruction opcode" 根因:模块级全局带 SHA1 前缀后名以 数字开头("sha1.name"),LLVM 无引号标识符不能以数字开头。stub/text 打印端早已按 _ll_name_needs_quote 加引号,但引用端(make_global_ref / _find_pool_var 兜底 / 定义端 ref_name)一律 @%s 无引号 → 组合 IR 指令里 store i32 0, i32* @748d0424e8976fa0._pass_count 解析失败。 修复三处引用生成按 _vtable_name_needs_quote(数字开头或含 .)加引号, 对齐函数引用路径(ExprGenName/FuncGenMixin 的 needs_quote 判断)。 组合 IR 去重(_HasGlobalInBuf 等)按打印格式名匹配,带引号一致无需改。 --- App/lib/core/Gen/ExprGenAttr.vp | 11 +++++++++-- App/lib/core/Gen/ExprGenConst.vp | 6 +++++- App/lib/core/Gen/TranslatorGenMixin.vp | 6 +++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/App/lib/core/Gen/ExprGenAttr.vp b/App/lib/core/Gen/ExprGenAttr.vp index 7d9b8d8..46f4d63 100644 --- a/App/lib/core/Gen/ExprGenAttr.vp +++ b/App/lib/core/Gen/ExprGenAttr.vp @@ -93,10 +93,17 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): if name is None or ty is None: return None ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, ty) - ref_name: str = pool.alloc(64) + ref_name: str = pool.alloc(96) if ref_name is None: return None - viperlib.snprintf(ref_name, 64, "@%s", name) + # LLVM 无引号标识符不能以数字开头:带 SHA1 前缀的全局名("sha1.name") + # 必命中 needs_quote(数字开头 + '.'),引用必须加引号 @\"sha1.name\", + # 否则 llc "expected instruction opcode"。对齐函数引用路径 + # (ExprGenName L252-255 的 needs_quote 判断)。 + if HandlesClassDef._vtable_name_needs_quote(name) != 0: + viperlib.snprintf(ref_name, 96, "@\"%s\"", name) + else: + viperlib.snprintf(ref_name, 96, "@%s", name) return llvmlite.SSAValue(pool, ptr_ty, ref_name) # ============================================================ # _resolve_module_attribute_global - 解析模块属性访问的全局变量引用 diff --git a/App/lib/core/Gen/ExprGenConst.vp b/App/lib/core/Gen/ExprGenConst.vp index f0c095c..0ad8066 100644 --- a/App/lib/core/Gen/ExprGenConst.vp +++ b/App/lib/core/Gen/ExprGenConst.vp @@ -236,7 +236,11 @@ class ExprGenConst(ExprGenBase.ExprGenBase): i8_ptr_ptr_ty_fb: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ptr_ty_fb) ref_name_fb: str = pool.alloc(96) if ref_name_fb is not None: - viperlib.snprintf(ref_name_fb, 96, "@%s", mb_name_fb) + # mangled 名带 SHA1 前缀(数字开头),引用必须加引号(见 make_global_ref) + if HandlesClassDef._vtable_name_needs_quote(mb_name_fb) != 0: + viperlib.snprintf(ref_name_fb, 96, "@\"%s\"", mb_name_fb) + else: + viperlib.snprintf(ref_name_fb, 96, "@%s", mb_name_fb) gv_ref_fb: llvmlite.Value | t.CPtr = llvmlite.SSAValue(pool, i8_ptr_ptr_ty_fb, ref_name_fb) # 注册到模块作用域,避免重复创建 HandlesVar.define_module_var(trans.SymTab, "_mbuddy", gv_ref_fb) diff --git a/App/lib/core/Gen/TranslatorGenMixin.vp b/App/lib/core/Gen/TranslatorGenMixin.vp index 8f5ebf5..40c2bdf 100644 --- a/App/lib/core/Gen/TranslatorGenMixin.vp +++ b/App/lib/core/Gen/TranslatorGenMixin.vp @@ -559,7 +559,11 @@ class TranslatorGenMixin: var_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, var_ty) ref_name: str = pool.alloc(96) if ref_name is not None: - viperlib.snprintf(ref_name, 96, "@%s", mangled_name) + # mangled 名带 SHA1 前缀(数字开头),引用必须加引号(对齐 make_global_ref) + if HandlesClassDef._vtable_name_needs_quote(mangled_name) != 0: + viperlib.snprintf(ref_name, 96, "@\"%s\"", mangled_name) + else: + viperlib.snprintf(ref_name, 96, "@%s", mangled_name) gv_ref: llvmlite.Value | t.CPtr = llvmlite.SSAValue(pool, var_ptr_ty, ref_name) # 注册到模块作用域