fix(TPV): 浮点CDefine存储与浮点调试打印改用CRT stdio(绕开viperlib %g格式化bug); REG-SRC 拆位模式打印定位 float_val 覆写假象

This commit is contained in:
TermiNexus committed 2026-08-08 20:38:24 +08:00
1 parent 92ba3af752
commit 59ae99f6d7
3 files changed
+31 -10

No files matched your search

+21 -3
View File
@@ -148,9 +148,27 @@ def _register_cdefine_from_value(pool: memhub.MemBuddy | t.CPtr,
# CDEF-DBG: 打印 float_val 读取(定位浮点 CDefine 值错误) # CDEF-DBG: 打印 float_val 读取(定位浮点 CDefine 值错误)
fb_cd: t.CChar | t.CPtr = VLogger.fmt_buf() fb_cd: t.CChar | t.CPtr = VLogger.fmt_buf()
if fb_cd is not None: 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", # 位模式拆解:把 float_val / rec_d 的 8 字节拷贝到 u64,再拆高低 32 位
name, val_node.kind(), cn_fp.const_kind, cn_fp.float_val, # 用于确认"哪一半被覆写 + 被谁覆写"(若与 int_val/const_kind 位模式重叠即锁布局 bug)
rec_d, use_val, t.CSizeT(cn_fp)) 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") VLogger.info(fb_cd, "CDEF-DBG")
HandlesType.register_cdefine_double(pool, name, use_val) HandlesType.register_cdefine_double(pool, name, use_val)
return return
+1 -1
View File
@@ -1886,7 +1886,7 @@ def translate_name_value(builder: llvmlite.IRBuilder | t.CPtr,
# CDEF-DBG: 打印浮点 CDefine 使用(返回 ConstFloat) # CDEF-DBG: 打印浮点 CDefine 使用(返回 ConstFloat)
fb_cd: t.CChar | t.CPtr = VLogger.fmt_buf() fb_cd: t.CChar | t.CPtr = VLogger.fmt_buf()
if fb_cd is not None: 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") VLogger.info(fb_cd, "CDEF-DBG")
return llvmlite.ConstFloat(pool, llvmlite.Double(pool), cdef_val_d) return llvmlite.ConstFloat(pool, llvmlite.Double(pool), cdef_val_d)
cdef_val_i: int = t.CInt(cdef_val_d) cdef_val_i: int = t.CInt(cdef_val_d)
+9 -6
View File
@@ -190,8 +190,8 @@ def _dbg_check_ast_floats(mb: memhub.MemBuddy | t.CPtr,
if cn_f.const_kind == ast.CONST_FLOAT: if cn_f.const_kind == ast.CONST_FLOAT:
fb_chk: t.CChar | t.CPtr = VLogger.fmt_buf() fb_chk: t.CChar | t.CPtr = VLogger.fmt_buf()
if fb_chk is not None: if fb_chk is not None:
viperlib.snprintf(fb_chk, 1024, "[CHK-FLOAT] %s ptr=%p float_val=%.17g", stdio.snprintf(fb_chk, 1024, "[CHK-FLOAT] %s ptr=%p float_val=%.17g",
tag, t.CSizeT(cn_f), cn_f.float_val) tag, t.CSizeT(cn_f), cn_f.float_val)
VLogger.info(fb_chk, "CHK") VLogger.info(fb_chk, "CHK")
return return
# AnnAssign: value/annotation/target 不在 children 里,单独遍历 # AnnAssign: value/annotation/target 不在 children 里,单独遍历
@@ -251,7 +251,10 @@ def register_cdefine_double(pool: memhub.MemBuddy | t.CPtr,
_g_cdefine_names.append(name) _g_cdefine_names.append(name)
val_buf: str = pool.alloc(32) val_buf: str = pool.alloc(32)
if val_buf is not None: 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) _g_cdefine_values.append(val_buf)
else: else:
_g_cdefine_values.append("0") _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) # CDEF-DBG: 打印注册的浮点 CDefine(定位 llc ret i32 0)
fb_cd: t.CChar | t.CPtr = VLogger.fmt_buf() fb_cd: t.CChar | t.CPtr = VLogger.fmt_buf()
if fb_cd is not None: if fb_cd is not None:
viperlib.snprintf(fb_cd, 1024, "REG-D: %s = %.17g (buf=%s)", stdio.snprintf(fb_cd, 1024, "REG-D: %s = %.17g (buf=%s)",
name, value, val_buf if val_buf is not None else "(null)") name, value, val_buf if val_buf is not None else "(null)")
VLogger.info(fb_cd, "CDEF-DBG") VLogger.info(fb_cd, "CDEF-DBG")
@@ -318,7 +321,7 @@ def lookup_cdefine_double(name: str) -> double:
# CDEF-DBG: 打印浮点查找命中 # CDEF-DBG: 打印浮点查找命中
fb_cd: t.CChar | t.CPtr = VLogger.fmt_buf() fb_cd: t.CChar | t.CPtr = VLogger.fmt_buf()
if fb_cd is not None: 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") VLogger.info(fb_cd, "CDEF-DBG")
return ret_d return ret_d
ret_i2: double = double(string.atoi(val_str)) ret_i2: double = double(string.atoi(val_str))