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) # 注册到模块作用域