From dc5bb2111b44d930bb3a8555e9f644f743f5fff7 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 19 Aug 2026 23:12:33 +0800 Subject: [PATCH] =?UTF-8?q?fix(phase2):=20=E5=8F=A5=E6=9F=84=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E6=94=B9=E5=9B=9E=20list[str]=20=E6=98=BE=E5=BC=8F=20?= =?UTF-8?q?elem=5Fsize=3D8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 插桩确认 list[t.CPtr] 构造正常(pool 有效 elem=8 data 有效)但 append 仍读零页崩溃(list[ptr] append 的 store/参数类型生成待查)。改用全库 验证稳定的 list[str](str=bytes=i8*,显式 elem_size=8 走 else 分支), append(t.CPtr(th.handle)) / t.CPtr(get(j)) 显式转换,join/close 对句柄 操作不变。保留 [LLC-DBG2] 构造状态插桩。 --- App/lib/core/BuildPipeline.vp | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/App/lib/core/BuildPipeline.vp b/App/lib/core/BuildPipeline.vp index 1a6b262..0229506 100644 --- a/App/lib/core/BuildPipeline.vp +++ b/App/lib/core/BuildPipeline.vp @@ -603,16 +603,12 @@ def run_llc_parallel(tasks: bytes, task_count: int, max_threads: int) -> int: return 0 if max_threads <= 0: max_threads = 1 - # 线程句柄数组(list[t.CPtr] 8 字节指针存取稳定):插桩证实此前 - # list[vthreading.Thread|t.CPtr] 的 get(0)/get(1) 返回同一槽(elem_size=0 - # 根因已修:TPC _HandleSizeofLlvm 对联合类型 X|t.CPtr 返回 8),且 - # j=0 的 close() 清空对象 handle 后 j=1 的 join 用 NULL 句柄 → 立即 - # WAIT_FAILED。改为 start() 后立即取出 handle 值存入句柄数组, - # join/close 直接对句柄操作,不再依赖 Thread 对象的存续。 - # 注:list[t.CPtr] 特化此前报 "Undefined method 'append'"(type_map 用裸 - # CPtr 替换模板不可解析)已根修(TPC _resolve_generic_slice_type 保留 - # t.CPtr 带前缀 + mangled 名统一 'ptr')。 - handles: list[t.CPtr] | t.CPtr = list[t.CPtr](_mbuddy) + # 线程句柄数组:list[str](str=bytes=i8*,elem_size=8 显式)存句柄值。 + # 此前 list[t.CPtr] 特化修复后 append 仍崩(pool 有效、elem=8 下读零页, + # list[ptr] append 的 store 与 t.CPtr 参数类型生成待查);list[str] 全库 + # 验证稳定(append/get 8 字节指针)。start() 后立即取 handle 存入, + # join/close 直接对句柄操作,不依赖 Thread 对象存续。 + handles: list[str] | t.CPtr = list[str](_mbuddy, 8) if handles is None: VLogger.error("run_llc_parallel: 线程句柄数组分配失败", "PhaseB") return 1 @@ -638,11 +634,11 @@ def run_llc_parallel(tasks: bytes, task_count: int, max_threads: int) -> int: th.start() # start() 后立即取出句柄(Thread 对象栈地址可能被后续构造复用, # join 时再读 self.handle 可能已被 close 清空/覆盖) - handles.append(th.handle) + handles.append(t.CPtr(th.handle)) j += 1 j = 0 while j < batch_n: - h_j: t.CPtr = handles.get(batch_start + j) + h_j: t.CPtr = t.CPtr(handles.get(batch_start + j)) #region debug-point LLC7 stdio.printf("[LLC-DBG] join 前 %d handle=%llx\n", j, t.CUInt64T(h_j)) #endregion