fix(define): CDefine 常量位宽按值推断(含无符号 32 位高半区)

_make_define_constant 原用 abs(val) > 2^31-1 判定,把 [2^31, 2^32-1] 的无符号位模式(如 GENERIC_READ=0x80000000、SHARED 掩码)误判为 i64,导致 X | DEFINE 结果为 i64、赋回 32 位使用点时触发「64→32 隐式窄化」。改为按值推断:落进 [-2^31, 2^32-1] 即 i32,与 TPV 的 define_min_width/ExprGenCdef 同口径
This commit is contained in:
TermiNexus committed 2026-10-11 11:46:33 +08:00
1 parent 815a6245a5
commit 7a061d4d49
1 file changed
+7 -3
+7 -3
View File
@@ -402,9 +402,13 @@ class ExprAttrHandle(BaseHandle):
if _dt is not None:
return ir.Constant(ir.IntType(_dt[0]), _dt[1])
if isinstance(val, int):
if abs(val) > 2147483647:
return ir.Constant(ir.IntType(64), val)
return ir.Constant(ir.IntType(32), val)
# 位宽按值推断(与 TPV ExprGenCdef / define_min_width 同口径):能装进 32 位
# 位模式(含无符号高半区 [2^31, 2^32-1],如 GENERIC_READ / SHARED 掩码)就用 i32,
# 否则 i64。此前用 abs(val) > 2^31-1 判定,会把无符号高半区误判成 i64,与 32 位
# 使用点(ULONG/DWORD)组合时触发「64→32 隐式窄化」。
if -2147483648 <= val <= 4294967295:
return ir.Constant(ir.IntType(32), val if val <= 2147483647 else val - 4294967296)
return ir.Constant(ir.IntType(64), val)
elif isinstance(val, float):
return ir.Constant(ir.DoubleType(), val)
elif isinstance(val, str):