chore(includes): 添加浮点字面量解析定位插桩 - string.atof 打印长字面量解析中间值(ATOF-DBG); parser._new_const_float 打印构造值/readback/节点覆写监控(NEWF-DBG/OVW-DBG); 用于定位浮点 CDefine 值错误(llc ret i32 0)

This commit is contained in:
TermiNexus committed 2026-08-08 18:18:52 +08:00
1 parent 29b18af60c
commit efb4aada15
2 files changed
+39 -1

No files matched your search

+35 -1
View File
@@ -2,6 +2,8 @@ import t, c
from stdint import *
import memhub
import string
import stdio
import stdlib
from .tokens import (Token, TokenType, Keyword, TokOp)
from .base import (
AST, ASTCtx, ASTKind, OpKind, ASTFlag,
@@ -165,7 +167,39 @@ def _new_const_int(pool: memhub.MemManager | t.CPtr, val: t.CInt64T,
def _new_const_float(pool: memhub.MemManager | t.CPtr, val: t.CDouble,
lineno: t.CInt, col: t.CInt) -> AST | t.CPtr:
return Constant(pool, CONST_FLOAT, 0, val, None, lineno, col)
global _g_dbg_pts, _g_dbg_vals, _g_dbg_cnt
new_c: Constant | t.CPtr = Constant(pool, CONST_FLOAT, 0, val, None, lineno, col)
# OVW-DBG: 检查之前构造的浮点节点是否已被覆写(定位覆写者)
if _g_dbg_cnt > 0 and _g_dbg_pts is not None and _g_dbg_vals is not None:
chk: t.CSizeT = 0
while chk < _g_dbg_cnt:
old_ptr: t.CUInt64T = _g_dbg_pts[chk]
if old_ptr != 0:
old_val: t.CDouble = _g_dbg_vals[chk]
old_c: Constant | t.CPtr = (Constant | t.CPtr)(t.CVoid(old_ptr, t.CPtr))
if old_c.float_val != old_val:
stdio.printf("[OVW-DBG] 构造新字面量 val=%.17g 后,之前节点 ptr=%p 的 float_val 从 %.17g 变 %.17g\n",
val, t.CUInt64T(old_ptr), old_val, old_c.float_val)
_g_dbg_pts[chk] = 0
chk += 1
# 记录当前节点
if _g_dbg_pts is None:
_g_dbg_pts = stdlib.malloc(512 * 8)
_g_dbg_vals = stdlib.malloc(512 * 8)
if _g_dbg_cnt < 512 and _g_dbg_pts is not None and _g_dbg_vals is not None:
_g_dbg_pts[_g_dbg_cnt] = t.CUInt64T(new_c)
_g_dbg_vals[_g_dbg_cnt] = val
_g_dbg_cnt += 1
# NEWF-DBG: 打印浮点常量构造值+节点指针+存储后读回(定位浮点 CDefine 值错误)
stdio.printf("[NEWF-DBG] val=%.17g ptr=%p readback=%.17g int_val=%lld\n",
val, t.CSizeT(new_c), new_c.float_val, new_c.int_val)
return new_c
# OVW-DBG: 浮点节点监控表(stdlib 分配,避免污染 pool)
_g_dbg_pts: t.CUInt64T | t.CPtr = None
_g_dbg_vals: t.CDouble | t.CPtr = None
_g_dbg_cnt: int = 0
def _new_const_str(pool: memhub.MemManager | t.CPtr, val: str,
+4
View File
@@ -365,6 +365,10 @@ def atof(src: str) -> t.CDouble:
while exp < 0:
result = result / 10.0
exp += 1
# ATOF-DBG: 打印长浮点字面量解析过程(定位浮点 CDefine 值错误)
if src is not None and strlen(src) >= 12:
stdio.printf("[ATOF-DBG] src=%s int=%.17g frac=%.17g div=%.17g result=%.17g\n",
src, int_part, frac_part, frac_div, result)
return result
def split(s: str, delim: str, result: t.CArray[str]) -> int: