diff --git a/lib/core/Handles/HandlesExprAttr.py b/lib/core/Handles/HandlesExprAttr.py index 5635847..b19db18 100644 --- a/lib/core/Handles/HandlesExprAttr.py +++ b/lib/core/Handles/HandlesExprAttr.py @@ -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):