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:
1 parent
815a6245a5
commit
7a061d4d49
1 file changed
+7
-3
@@ -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):
|
||||
|
||||
Reference in new issue
Block a user