diff --git a/App/lib/core/Handles/HandlesAnnAssign.vp b/App/lib/core/Handles/HandlesAnnAssign.vp index 518fc53..e8f3c98 100644 --- a/App/lib/core/Handles/HandlesAnnAssign.vp +++ b/App/lib/core/Handles/HandlesAnnAssign.vp @@ -148,9 +148,27 @@ def _register_cdefine_from_value(pool: memhub.MemBuddy | t.CPtr, # CDEF-DBG: 打印 float_val 读取(定位浮点 CDefine 值错误) fb_cd: t.CChar | t.CPtr = VLogger.fmt_buf() if fb_cd is not None: - viperlib.snprintf(fb_cd, 1024, "REG-SRC: %s kind=%d const_kind=%d float_val=%.17g rec=%.17g use=%.17g ptr=%p", - name, val_node.kind(), cn_fp.const_kind, cn_fp.float_val, - rec_d, use_val, t.CSizeT(cn_fp)) + # 位模式拆解:把 float_val / rec_d 的 8 字节拷贝到 u64,再拆高低 32 位 + # 用于确认"哪一半被覆写 + 被谁覆写"(若与 int_val/const_kind 位模式重叠即锁布局 bug) + fv_bits: t.CUInt64T = 0 + string.memcpy(t.CVoid(t.CUInt64T(c.Addr(fv_bits)), t.CPtr), + t.CVoid(t.CUInt64T(c.Addr(cn_fp.float_val)), t.CPtr), 8) + rec_bits: t.CUInt64T = 0 + string.memcpy(t.CVoid(t.CUInt64T(c.Addr(rec_bits)), t.CPtr), + t.CVoid(t.CUInt64T(c.Addr(rec_d)), t.CPtr), 8) + stdio.snprintf(fb_cd, 1024, + "REG-SRC: %s kind=%d const_kind=%d ptr=%p\n" + " fv=%.17g %a hi=%08llx lo=%08llx\n" + " int_val=%lld bits=%016llx const_kind_hex=%x str_val=%p\n" + " rec=%.17g %a hi=%08llx lo=%08llx use=%.17g", + name, val_node.kind(), cn_fp.const_kind, t.CSizeT(cn_fp), + cn_fp.float_val, cn_fp.float_val, + t.CUInt64T(fv_bits >> 32), t.CUInt64T(fv_bits & 0xFFFFFFFF), + cn_fp.int_val, t.CUInt64T(cn_fp.int_val), cn_fp.const_kind, + t.CSizeT(cn_fp.str_val), + rec_d, rec_d, + t.CUInt64T(rec_bits >> 32), t.CUInt64T(rec_bits & 0xFFFFFFFF), + use_val) VLogger.info(fb_cd, "CDEF-DBG") HandlesType.register_cdefine_double(pool, name, use_val) return diff --git a/App/lib/core/Handles/HandlesExpr.vp b/App/lib/core/Handles/HandlesExpr.vp index 2a93826..cd15ed8 100644 --- a/App/lib/core/Handles/HandlesExpr.vp +++ b/App/lib/core/Handles/HandlesExpr.vp @@ -1886,7 +1886,7 @@ def translate_name_value(builder: llvmlite.IRBuilder | t.CPtr, # CDEF-DBG: 打印浮点 CDefine 使用(返回 ConstFloat) fb_cd: t.CChar | t.CPtr = VLogger.fmt_buf() if fb_cd is not None: - viperlib.snprintf(fb_cd, 1024, "USE-D: %s -> %.17g (float)", nm_id, cdef_val_d) + stdio.snprintf(fb_cd, 1024, "USE-D: %s -> %.17g (float)", nm_id, cdef_val_d) VLogger.info(fb_cd, "CDEF-DBG") return llvmlite.ConstFloat(pool, llvmlite.Double(pool), cdef_val_d) cdef_val_i: int = t.CInt(cdef_val_d) diff --git a/App/lib/core/Handles/HandlesType.vp b/App/lib/core/Handles/HandlesType.vp index b610188..5c5cbc4 100644 --- a/App/lib/core/Handles/HandlesType.vp +++ b/App/lib/core/Handles/HandlesType.vp @@ -190,8 +190,8 @@ def _dbg_check_ast_floats(mb: memhub.MemBuddy | t.CPtr, if cn_f.const_kind == ast.CONST_FLOAT: fb_chk: t.CChar | t.CPtr = VLogger.fmt_buf() if fb_chk is not None: - viperlib.snprintf(fb_chk, 1024, "[CHK-FLOAT] %s ptr=%p float_val=%.17g", - tag, t.CSizeT(cn_f), cn_f.float_val) + stdio.snprintf(fb_chk, 1024, "[CHK-FLOAT] %s ptr=%p float_val=%.17g", + tag, t.CSizeT(cn_f), cn_f.float_val) VLogger.info(fb_chk, "CHK") return # AnnAssign: value/annotation/target 不在 children 里,单独遍历 @@ -251,7 +251,10 @@ def register_cdefine_double(pool: memhub.MemBuddy | t.CPtr, _g_cdefine_names.append(name) val_buf: str = pool.alloc(32) if val_buf is not None: - viperlib.snprintf(val_buf, 32, "%.17g", value) + # 用 CRT stdio.snprintf 而非 viperlib.snprintf:viperlib 自实现格式化器的 + # %g 浮点路径有 bug(%.17g 输出错误值,如 pi 显示 3.1397985 而非 3.1415926, + # 位模式 %a 正确),会导致 CDefine 表存错文本 → lookup 生成错 LLVM 常量。 + stdio.snprintf(val_buf, 32, "%.17g", value) _g_cdefine_values.append(val_buf) else: _g_cdefine_values.append("0") @@ -260,8 +263,8 @@ def register_cdefine_double(pool: memhub.MemBuddy | t.CPtr, # CDEF-DBG: 打印注册的浮点 CDefine(定位 llc ret i32 0) fb_cd: t.CChar | t.CPtr = VLogger.fmt_buf() if fb_cd is not None: - viperlib.snprintf(fb_cd, 1024, "REG-D: %s = %.17g (buf=%s)", - name, value, val_buf if val_buf is not None else "(null)") + stdio.snprintf(fb_cd, 1024, "REG-D: %s = %.17g (buf=%s)", + name, value, val_buf if val_buf is not None else "(null)") VLogger.info(fb_cd, "CDEF-DBG") @@ -318,7 +321,7 @@ def lookup_cdefine_double(name: str) -> double: # CDEF-DBG: 打印浮点查找命中 fb_cd: t.CChar | t.CPtr = VLogger.fmt_buf() if fb_cd is not None: - viperlib.snprintf(fb_cd, 1024, "LOOKUP-D: %s -> buf=%s atof=%.17g", name, val_str, ret_d) + stdio.snprintf(fb_cd, 1024, "LOOKUP-D: %s -> buf=%s atof=%.17g", name, val_str, ret_d) VLogger.info(fb_cd, "CDEF-DBG") return ret_d ret_i2: double = double(string.atoi(val_str))