fix(gen): 全局变量引用加引号(SHA1 前缀名以数字开头)
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 等)按打印格式名匹配,带引号一致无需改。
This commit is contained in:
1 parent
252d15ba9f
commit
99df2aef99
3 files changed
+19
-4
No files matched your search
@@ -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 - 解析模块属性访问的全局变量引用
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
# 注册到模块作用域
|
||||
|
||||
Reference in new issue
Block a user