From 18057903360a7be32989e6fe0e1f94786aca9433 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Tue, 18 Aug 2026 08:10:02 +0800 Subject: [PATCH] =?UTF-8?q?fix(tpv):=20vpi=20=E5=8F=82=E6=95=B0=E6=95=B0?= =?UTF-8?q?=E4=B8=8A=E9=99=90=E5=93=A8=E5=85=B5=20+=20declare=20=E9=93=BE?= =?UTF-8?q?=E9=81=8D=E5=8E=86=E5=93=A8=E5=85=B5=EF=BC=8C=E5=AE=9A=E4=BD=8D?= =?UTF-8?q?=20builtins.vp=20dump=20=E5=8D=A1=E6=AD=BB=E6=A0=B9=E5=9B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dump 步数哨兵已定位卡死链路为 printf 的 Params 链异常。新增: 1. VpiReader _inject_function_declare/_inject_method_declare 参数数上限 128(fail-fast):vpi tree 深层节点被覆盖损坏时 args_list.__len__() 返回垃圾大数 → add_param 海量次 → Params 链超长,dump 误报成环 2. CallGenBase._ensure_method_declare FuncHead/Params 遍历步数上限 (防 translate 期间死循环) 3. dump 哨兵报错增强打印 Params.Count,区分真成环与海量节点 --- includes/llvmlite/__function.vp | 7 ++++++- includes/llvmlite/__module.vp | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/includes/llvmlite/__function.vp b/includes/llvmlite/__function.vp index b5bc346..37b8d61 100644 --- a/includes/llvmlite/__function.vp +++ b/includes/llvmlite/__function.vp @@ -687,7 +687,12 @@ def FunctionPrint(buf: t.CChar | t.CPtr, size: t.CSizeT, while cur is not None: cur_steps += 1 if cur_steps > IR_DUMP_CHAIN_LIMIT: - stdio.printf("[IR-DUMP] 链表成环: func params(函数名=%s,print 终止)\n", func.Name) + if func.Params is not None: + stdio.printf("[IR-DUMP] 链表异常: func params(函数名=%s,Params.Count=%zu,遍历超 %d 步,print 终止)\n", + func.Name, func.Params.Count, IR_DUMP_CHAIN_LIMIT) + else: + stdio.printf("[IR-DUMP] 链表异常: func params(函数名=%s,Params=None,遍历超 %d 步,print 终止)\n", + func.Name, IR_DUMP_CHAIN_LIMIT) stdlib.exit(1) if first == 0: _append_cstr(buf, size, ", ") diff --git a/includes/llvmlite/__module.vp b/includes/llvmlite/__module.vp index a5daf9d..cc08bfc 100644 --- a/includes/llvmlite/__module.vp +++ b/includes/llvmlite/__module.vp @@ -242,8 +242,8 @@ class LLVMModule: while param_scan is not None: param_scan_steps += 1 if param_scan_steps > IR_DUMP_CHAIN_LIMIT: - stdio.printf("[IR-DUMP] 链表成环: func params(函数名=%s,dump 终止)\n", - func_scan.Name) + stdio.printf("[IR-DUMP] 链表异常: func params(函数名=%s,Params.Count=%zu,遍历超 %d 步,终止)\n", + func_scan.Name, func_scan.Params.Count, IR_DUMP_CHAIN_LIMIT) stdlib.exit(1) if param_scan.Ty is not None: self.ensure_opaque_for_type(pool, param_scan.Ty)