From 7a061d4d49fa48f8cef5d6d456d7d076d481712d Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sun, 11 Oct 2026 11:46:33 +0800 Subject: [PATCH] =?UTF-8?q?fix(define):=20CDefine=20=E5=B8=B8=E9=87=8F?= =?UTF-8?q?=E4=BD=8D=E5=AE=BD=E6=8C=89=E5=80=BC=E6=8E=A8=E6=96=AD=EF=BC=88?= =?UTF-8?q?=E5=90=AB=E6=97=A0=E7=AC=A6=E5=8F=B7=2032=20=E4=BD=8D=E9=AB=98?= =?UTF-8?q?=E5=8D=8A=E5=8C=BA=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _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 同口径 --- lib/core/Handles/HandlesExprAttr.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) 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):