From d579d70113d4ea70e5e0e08e9b162454ee532f57 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Mon, 28 Sep 2026 17:54:13 +0800 Subject: [PATCH] =?UTF-8?q?fix(TransPyV):=20=E4=BF=AE=E6=AD=A3=E5=BD=A2?= =?UTF-8?q?=E5=8F=82/=E5=AD=97=E6=AE=B5=E9=93=BE=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E7=9A=84=E6=B3=A8=E8=A7=A3=E4=B8=BA=20llvmlite.ParamNode*?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit c 类(源码违规):这些变量由 new_param_node 构造、或取自 get_struct_fields / param_list_append / function_get_param_head,实际是 llvmlite.ParamNode 链节点, 注解却写成 llvmlite.Function*。旧的无条件指针 bitcast 掩盖了该错误,严格指针规则下暴露。 涉及:VarGenMixin / CallGenVt / VpiReader / ClassGenEnum / ClassGenVTable / ExprGenName / FuncGenMixin / FuncGenDef / TypeGenResolve / TypeSpec / StmtGenCifMixin / AssignGenMixin(纯注解替换,零语义变化)。15 行。 --- App/lib/Stub/StubGen/VpiReader.vp | 8 +++++--- App/lib/core/Gen/AssignGenMixin.vp | 4 ++-- App/lib/core/Gen/Call/CallGenVt.vp | 8 +++++--- App/lib/core/Gen/Class/ClassGenEnum.vp | 6 +++--- App/lib/core/Gen/Class/ClassGenVTable.vp | 12 ++++++------ App/lib/core/Gen/Expr/ExprGenName.vp | 6 +++--- App/lib/core/Gen/Func/FuncGenDef.vp | 4 ++-- App/lib/core/Gen/Func/FuncGenMixin.vp | 4 ++-- App/lib/core/Gen/Stmt/StmtGenCifMixin.vp | 6 +++--- App/lib/core/Gen/Type/TypeGenResolve.vp | 6 +++--- App/lib/core/Gen/Type/TypeSpec.vp | 4 ++-- App/lib/core/Gen/VarGenMixin.vp | 8 +++++--- 12 files changed, 41 insertions(+), 35 deletions(-) diff --git a/App/lib/Stub/StubGen/VpiReader.vp b/App/lib/Stub/StubGen/VpiReader.vp index 82772ec..ede112b 100644 --- a/App/lib/Stub/StubGen/VpiReader.vp +++ b/App/lib/Stub/StubGen/VpiReader.vp @@ -1419,8 +1419,10 @@ def _resolve_vpi_ret_annot_str(pool: memhub.MemBuddy*, inner_len_t += 1 if ret_annot[6 + inner_len_t] != ']' or inner_len_t == 0: return None - tup_head_t: llvmlite.Function* = None - tup_tail_t: llvmlite.Function* = None + # tuple 返回类型的字段链表是 llvmlite.ParamNode(new_param_node / paramnode_set_next / + # Struct 形参均为 rawptr[ParamNode])——原先误注解为 Function*。 + tup_head_t: llvmlite.ParamNode* = None + tup_tail_t: llvmlite.ParamNode* = None tup_count_t: int = 0 p_t: sizet = 0 while p_t < inner_len_t: @@ -1444,7 +1446,7 @@ def _resolve_vpi_ret_annot_str(pool: memhub.MemBuddy*, stdlib.free(seg_buf_t) if seg_ty_t is None: return None - tup_node_t: llvmlite.Function* = llvmlite.new_param_node(pool, seg_ty_t) + tup_node_t: llvmlite.ParamNode* = llvmlite.new_param_node(pool, seg_ty_t) if tup_node_t is None: return None if tup_head_t is None: diff --git a/App/lib/core/Gen/AssignGenMixin.vp b/App/lib/core/Gen/AssignGenMixin.vp index 38465a4..f6efeee 100644 --- a/App/lib/core/Gen/AssignGenMixin.vp +++ b/App/lib/core/Gen/AssignGenMixin.vp @@ -2829,8 +2829,8 @@ novirtual class AssignGenMixin: tmp_s: llvmlite.Value* = llvmlite.build_alloca(builder, rhs_val.Ty) if tmp_s is not None: llvmlite.build_store(builder, rhs_val, tmp_s) - fchain: llvmlite.Function* = llvmlite.get_struct_fields(rhs_val.Ty) - fcur: llvmlite.Function* = fchain + fchain: llvmlite.ParamNode* = llvmlite.get_struct_fields(rhs_val.Ty) + fcur: llvmlite.ParamNode* = fchain fti: sizet for fti in range(tgt_n): tgt_elt: ast.AST* = tgt_elts.get(fti) diff --git a/App/lib/core/Gen/Call/CallGenVt.vp b/App/lib/core/Gen/Call/CallGenVt.vp index 7d0cfe0..cf59861 100644 --- a/App/lib/core/Gen/Call/CallGenVt.vp +++ b/App/lib/core/Gen/Call/CallGenVt.vp @@ -41,10 +41,12 @@ novirtual class CallGenVt(CallGenBase.CallGenBase): method_count: int = self.Gen.StructGen.get_vtable_method_count(class_name) if method_count <= 0: return 0 # 构造 vtable 类型 { i8*, i8*, ... } - vt_first: llvmlite.Function* = None - vt_prev: llvmlite.Function* = None + # vtable 类型的字段链表是 llvmlite.ParamNode(new_param_node / paramnode_set_next / + # Struct 形参均为 rawptr[ParamNode])——原先误注解为 Function*。 + vt_first: llvmlite.ParamNode* = None + vt_prev: llvmlite.ParamNode* = None for vi in range(method_count): - pn: llvmlite.Function* = llvmlite.new_param_node(pool, i8_ptr_ty) + pn: llvmlite.ParamNode* = llvmlite.new_param_node(pool, i8_ptr_ty) if pn is None: continue if vt_first is None: vt_first = pn diff --git a/App/lib/core/Gen/Class/ClassGenEnum.vp b/App/lib/core/Gen/Class/ClassGenEnum.vp index 17df362..b6d43bd 100644 --- a/App/lib/core/Gen/Class/ClassGenEnum.vp +++ b/App/lib/core/Gen/Class/ClassGenEnum.vp @@ -956,15 +956,15 @@ novirtual class ClassGenEnum(ClassGenBase.ClassGenBase): i32_ty: llvmlite.LLVMType* = llvmlite.Int32(pool) i64_ty: llvmlite.LLVMType* = llvmlite.Int64(pool) - first_node: llvmlite.Function* = None - tail_node: llvmlite.Function* = None + first_node: llvmlite.ParamNode* = None + tail_node: llvmlite.ParamNode* = None for pos in range(total_positions): psize: int = position_max_sizes[pos] field_ty: llvmlite.LLVMType* = i32_ty if psize > 4: field_ty = i64_ty - pnode: llvmlite.Function* = llvmlite.new_param_node(pool, field_ty) + pnode: llvmlite.ParamNode* = llvmlite.new_param_node(pool, field_ty) if pnode is None: continue tail_node = llvmlite.param_list_append(first_node, tail_node, pnode) diff --git a/App/lib/core/Gen/Class/ClassGenVTable.vp b/App/lib/core/Gen/Class/ClassGenVTable.vp index 92e3665..942ea08 100644 --- a/App/lib/core/Gen/Class/ClassGenVTable.vp +++ b/App/lib/core/Gen/Class/ClassGenVTable.vp @@ -305,10 +305,10 @@ novirtual class ClassGenVTable(ClassGenBase.ClassGenBase): i8_ty: llvmlite.LLVMType* = llvmlite.Int8(pool) i8_ptr_ty: llvmlite.LLVMType* = llvmlite.Ptr(pool, i8_ty) - first_node: llvmlite.Function* = None - tail_node: llvmlite.Function* = None + first_node: llvmlite.ParamNode* = None + tail_node: llvmlite.ParamNode* = None for i in range(method_count): - pnode: llvmlite.Function* = llvmlite.new_param_node(pool, i8_ptr_ty) + pnode: llvmlite.ParamNode* = llvmlite.new_param_node(pool, i8_ptr_ty) if pnode is None: continue tail_node = llvmlite.param_list_append(first_node, tail_node, pnode) @@ -1120,10 +1120,10 @@ novirtual class ClassGenVTable(ClassGenBase.ClassGenBase): vt_i8_ty: llvmlite.LLVMType* = llvmlite.Int8(pool) vt_i8_ptr_ty: llvmlite.LLVMType* = llvmlite.Ptr(pool, vt_i8_ty) - vt_first_node: llvmlite.Function* = None - vt_prev_node: llvmlite.Function* = None + vt_first_node: llvmlite.ParamNode* = None + vt_prev_node: llvmlite.ParamNode* = None for vti in range(vt_method_count): - vtnode: llvmlite.Function* = llvmlite.new_param_node(pool, vt_i8_ptr_ty) + vtnode: llvmlite.ParamNode* = llvmlite.new_param_node(pool, vt_i8_ptr_ty) if vtnode is None: continue if vt_first_node is None: diff --git a/App/lib/core/Gen/Expr/ExprGenName.vp b/App/lib/core/Gen/Expr/ExprGenName.vp index d292781..a7fdc5d 100644 --- a/App/lib/core/Gen/Expr/ExprGenName.vp +++ b/App/lib/core/Gen/Expr/ExprGenName.vp @@ -256,12 +256,12 @@ novirtual class ExprGenName(ExprGenBase.ExprGenBase): # fail-fast:函数返回类型缺失,无法构造函数指针(暴露上游根因) self.Gen.TypeGenErr.fatal_error(node, f"函数 '{nm_id}' 返回类型缺失,无法构造函数指针", "TypeError") fn_pp: llvmlite.Param* = llvmlite.function_get_param_head(fn_ref) - fn_first_node: llvmlite.Function* = None - fn_prev_node: llvmlite.Function* = None + fn_first_node: llvmlite.ParamNode* = None + fn_prev_node: llvmlite.ParamNode* = None fn_pcount: int = 0 while fn_pp is not None: fn_pty: llvmlite.LLVMType* = llvmlite.param_get_ty(fn_pp) - fn_pn: llvmlite.Function* = llvmlite.new_param_node(pool, fn_pty) + fn_pn: llvmlite.ParamNode* = llvmlite.new_param_node(pool, fn_pty) if fn_pn is not None: if fn_first_node is None: fn_first_node = fn_pn diff --git a/App/lib/core/Gen/Func/FuncGenDef.vp b/App/lib/core/Gen/Func/FuncGenDef.vp index 73682be..4c27bdd 100644 --- a/App/lib/core/Gen/Func/FuncGenDef.vp +++ b/App/lib/core/Gen/Func/FuncGenDef.vp @@ -1232,10 +1232,10 @@ novirtual class FuncGenDef(CallGenBase.CallGenBase): args_alloca: llvmlite.Value* = None args_ptr: llvmlite.Value* = None if n_params > 0: - fields_head: llvmlite.Function* = None + fields_head: llvmlite.ParamNode* = None fk: int = 0 for fk in range(n_params - 1, -1, -1): - pn_n: llvmlite.Function* = llvmlite.new_param_node(pool, (llvmlite.LLVMType*)(param_tys[fk])) + pn_n: llvmlite.ParamNode* = llvmlite.new_param_node(pool, (llvmlite.LLVMType*)(param_tys[fk])) if pn_n is not None: pn_n.Next = fields_head fields_head = pn_n diff --git a/App/lib/core/Gen/Func/FuncGenMixin.vp b/App/lib/core/Gen/Func/FuncGenMixin.vp index 7663ffe..0773096 100644 --- a/App/lib/core/Gen/Func/FuncGenMixin.vp +++ b/App/lib/core/Gen/Func/FuncGenMixin.vp @@ -378,7 +378,7 @@ novirtual class FuncGenMixin(CallGenBase.CallGenBase): # 13c. 存储 fn_ptr 到 offset 0 # 创建函数指针类型 i32(i8*)* - fn_param_node: llvmlite.Function* = llvmlite.new_param_node(pool, i8_ptr_ty) + fn_param_node: llvmlite.ParamNode* = llvmlite.new_param_node(pool, i8_ptr_ty) fn_func_ty: llvmlite.LLVMType* = llvmlite.Func(pool, i32_ty, fn_param_node, 1) fn_func_ptr_ty: llvmlite.LLVMType* = llvmlite.Ptr(pool, fn_func_ty) @@ -1276,7 +1276,7 @@ novirtual class FuncGenMixin(CallGenBase.CallGenBase): return None # 15. [0] = fn_ptr(函数引用 bitcast 到 i8*) - fn_param_node: llvmlite.Function* = llvmlite.new_param_node(pool, i8_ptr_ty) + fn_param_node: llvmlite.ParamNode* = llvmlite.new_param_node(pool, i8_ptr_ty) fn_func_ty: llvmlite.LLVMType* = llvmlite.Func(pool, i32_ty, fn_param_node, 1) fn_func_ptr_ty: llvmlite.LLVMType* = llvmlite.Ptr(pool, fn_func_ty) fn_ptr_name: str = pool.alloc(64) diff --git a/App/lib/core/Gen/Stmt/StmtGenCifMixin.vp b/App/lib/core/Gen/Stmt/StmtGenCifMixin.vp index 0776eda..a0569fd 100644 --- a/App/lib/core/Gen/Stmt/StmtGenCifMixin.vp +++ b/App/lib/core/Gen/Stmt/StmtGenCifMixin.vp @@ -478,8 +478,8 @@ novirtual class StmtGenCifMixin: rt_vals: sizet* = pool.alloc(8 * 16) if rt_vals is not None: rt_val_ok: int = 1 - rt_head: llvmlite.Function* = None - rt_tail: llvmlite.Function* = None + rt_head: llvmlite.ParamNode* = None + rt_tail: llvmlite.ParamNode* = None rvi: sizet for rvi in range(rt_n): ev_i: llvmlite.Value* = self.Gen.ExprGen.translate_value(builder, pool, mod, rtp_elts.get(rvi), @@ -496,7 +496,7 @@ novirtual class StmtGenCifMixin: if rv_i is None or rv_i.Ty is None: rt_val_ok = 0 break - rn: llvmlite.Function* = llvmlite.new_param_node(pool, rv_i.Ty) + rn: llvmlite.ParamNode* = llvmlite.new_param_node(pool, rv_i.Ty) if rn is None: rt_val_ok = 0 break diff --git a/App/lib/core/Gen/Type/TypeGenResolve.vp b/App/lib/core/Gen/Type/TypeGenResolve.vp index 6a86d62..1eead2f 100644 --- a/App/lib/core/Gen/Type/TypeGenResolve.vp +++ b/App/lib/core/Gen/Type/TypeGenResolve.vp @@ -1935,8 +1935,8 @@ novirtual class TypeGenResolve(TypeGenBase.TypeGenBase): tp_count = 1 if tp_count == 0 or tp_elts is None: return None - tup_head: llvmlite.Function* = None - tup_tail: llvmlite.Function* = None + tup_head: llvmlite.ParamNode* = None + tup_tail: llvmlite.ParamNode* = None tui: sizet for tui in range(tp_count): tup_elt: ast.AST* = tp_elts.get(tui) @@ -1945,7 +1945,7 @@ novirtual class TypeGenResolve(TypeGenBase.TypeGenBase): tup_ety: llvmlite.LLVMType* = self.resolve_annotation_type(pool, tup_elt, imported_modules, from_imports, trans, depth + 1) if tup_ety is None: return None - tup_node: llvmlite.Function* = llvmlite.new_param_node(pool, tup_ety) + tup_node: llvmlite.ParamNode* = llvmlite.new_param_node(pool, tup_ety) if tup_node is None: return None if tup_head is None: diff --git a/App/lib/core/Gen/Type/TypeSpec.vp b/App/lib/core/Gen/Type/TypeSpec.vp index f12892f..3bfd9d9 100644 --- a/App/lib/core/Gen/Type/TypeSpec.vp +++ b/App/lib/core/Gen/Type/TypeSpec.vp @@ -1326,7 +1326,7 @@ def _spec_from_array(arena: TypeSpecArena | t.CPtr, def _spec_from_func(arena: TypeSpecArena | t.CPtr, ret: llvmlite.LLVMType*, - params: llvmlite.Function*, + params: llvmlite.ParamNode*, pcount: int) -> TypeSpec*: """函数类型 → TypeSpec(形参沿 ParamNode 链表遍历;IsVarArg 恒 0,见上)""" ret_s: TypeSpec* = SpecFromLLVMType(arena, ret) @@ -1338,7 +1338,7 @@ def _spec_from_func(arena: TypeSpecArena | t.CPtr, params_arr: sizet* = CompilerFactory.factory.PermPool.alloc(8 * pcount) if params_arr is None: return None - node: llvmlite.Function* = params + node: llvmlite.ParamNode* = params i: int = 0 while node is not None and i < pcount: pty: llvmlite.LLVMType* = llvmlite.paramnode_get_ty(node) diff --git a/App/lib/core/Gen/VarGenMixin.vp b/App/lib/core/Gen/VarGenMixin.vp index 4b5f9f0..865a943 100644 --- a/App/lib/core/Gen/VarGenMixin.vp +++ b/App/lib/core/Gen/VarGenMixin.vp @@ -789,15 +789,17 @@ novirtual class VarGenMixin: if ret_ty is None: self.Gen.TypeGenErr.fatal_error(node, f"REPL: 会话函数 '{func_name}' 的返回类型 token 不受支持(M3 支持 void/iN/float/double/i8*)", "TypeError") return None - fp_first: llvmlite.Function* = None - fp_prev: llvmlite.Function* = None + # 形参链表节点是 llvmlite.ParamNode(new_param_node 返回 rawptr[ParamNode]、 + # paramnode_set_next / Func 形参同为 rawptr[ParamNode])——原先误注解为 Function*。 + fp_first: llvmlite.ParamNode* = None + fp_prev: llvmlite.ParamNode* = None pi: int for pi in range(arg_count): cur_ty: llvmlite.LLVMType* = i8_ptr_ty if pi > 0: pty_slot3: str | t.CPtr = (t.CPtr)(uint64(ptypes) + (pi - 1) * 8) cur_ty = (llvmlite.LLVMType*)(pty_slot3[0]) - pn: llvmlite.Function* = llvmlite.new_param_node(pool, cur_ty) + pn: llvmlite.ParamNode* = llvmlite.new_param_node(pool, cur_ty) if pn is not None: if fp_first is None: fp_first = pn