revert(tpc): 回滚 51de3b6d 的 [DIAG-decl] 临时诊断
「跨模块函数形参退化成 i32*」(constant_get_str_val / function_get_name 第 0 形参
i32*)一族已由 1c1f78e7 定位修复(同名枚举成员遮蔽类定义,判据按 IsEnumMember
区分),探针使命结束,整体移除:
- FuncGen._RecordDeclFrom / _DescribeI32ParamDiag 及两处调用点
- _adjust_args fail-fast 报文中的 _diag_extra 拼接
- BaseGen._get_or_declare_function 入口记录点
- HandlesBase.GetOrCreateFuncDecl 入口记录点
This commit is contained in:
1 parent
fa6b3c2e64
commit
78c5155de9
3 files changed
+1
-76
No files matched your search
@@ -1143,12 +1143,6 @@ class BaseHandle:
|
||||
若 name 已存在且类型不匹配,通过 _replace_function_decl 替换。
|
||||
replace_name 传递给 _replace_function_decl(通常为未 mangle 的 func_name)。
|
||||
"""
|
||||
# [DIAG-decl] 临时诊断:记录声明创建来源(本方法会**替换**已有声明,
|
||||
# 是"形参被改成 i32*"的头号嫌疑点)。定位后删除。
|
||||
try:
|
||||
Gen._RecordDeclFrom(name, _ir.FunctionType(ret_type, param_types, var_arg=is_variadic))
|
||||
except Exception:
|
||||
pass
|
||||
if name not in Gen.functions:
|
||||
# Gen.functions 未登记、但 module.globals 已有同名函数(本模块其它调用点
|
||||
# 或依赖 stub 先建过声明)→ 复用并登记,绝不重建:llvmlite 的 NameScope
|
||||
|
||||
@@ -872,11 +872,6 @@ class BaseGenMixin:
|
||||
return []
|
||||
|
||||
def _get_or_declare_function(self, mangled_name: str, func_type: ir.FunctionType) -> ir.Function:
|
||||
# [DIAG-decl] 临时诊断:记录声明创建来源(定位"形参 i32* vs 实参 %sha1.CLS*")
|
||||
try:
|
||||
self._RecordDeclFrom(mangled_name, func_type)
|
||||
except Exception:
|
||||
pass
|
||||
# DDEBUG: 检测 mangled_name 含双点(不应到达这里)
|
||||
if '..' in mangled_name:
|
||||
import sys
|
||||
|
||||
@@ -116,64 +116,6 @@ class FuncGenMixin:
|
||||
new_args[i] = slot
|
||||
return new_args
|
||||
|
||||
def _RecordDeclFrom(self, name: str, func_type: Any) -> None:
|
||||
"""[DIAG-decl] 临时诊断:记录函数声明的**首个创建来源**(调用栈 + 函数类型)。
|
||||
|
||||
用于定位"形参 i32* vs 实参 %sha1.CLS*"这类跨层不一致是谁创建的声明
|
||||
(import 声明发射器 / stub 解析 / 符号表签名 / 继承包装 等)。
|
||||
只记录一次(首个创建者即最终生效者)。定位完成后连同
|
||||
_DescribeI32ParamDiag 与两处调用点一起删除。
|
||||
"""
|
||||
try:
|
||||
_reg = getattr(self, '_decl_from', None)
|
||||
if _reg is None:
|
||||
_reg = {}
|
||||
self._decl_from = _reg
|
||||
if name in _reg:
|
||||
return
|
||||
import traceback as _tb
|
||||
_reg[name] = ' <- '.join(
|
||||
'%s:%d:%s' % (f.filename.replace('\\', '/').rsplit('/', 1)[-1], f.lineno, f.name)
|
||||
for f in _tb.extract_stack()[-7:-1])
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def _DescribeI32ParamDiag(self, func: ir.Function, arg: ir.Value, param: ir.Value) -> str:
|
||||
"""[DIAG-decl] 临时诊断:形参退化成"指向 i32 的指针"时,拼出判定依据。
|
||||
|
||||
只在"形参是 i32* 且实参是指向具体类的指针"时输出,随 fail-fast 报文一起
|
||||
显示(避免探针输出被忽略)。定位完成后删除。
|
||||
"""
|
||||
try:
|
||||
_p_poi: Any = getattr(param.type, 'pointee', None)
|
||||
if not (isinstance(_p_poi, ir.IntType) and _p_poi.width == 32):
|
||||
return ''
|
||||
_a_poi: Any = getattr(arg.type, 'pointee', None)
|
||||
_full: str | None = getattr(_a_poi, 'name', None)
|
||||
if not _full:
|
||||
return ''
|
||||
_short: str = _full.split('.')[-1]
|
||||
_sym: Any = getattr(self, 'SymbolTable', None)
|
||||
_e: Any = None
|
||||
try:
|
||||
_e = _sym.lookup(_short) if _sym else None
|
||||
except Exception:
|
||||
_e = None
|
||||
_reg: dict = getattr(self, '_decl_from', {}) or {}
|
||||
_from: str = _reg.get(func.name) or _reg.get(_short) or '未知'
|
||||
return (
|
||||
f"\n [DIAG-decl] 实参类={_full}"
|
||||
f" | structs={'有' if _short in self.structs else '无'}"
|
||||
f" | _struct_sha1_map={getattr(self, '_struct_sha1_map', {}).get(_short)!r}"
|
||||
f" | class_sha1_map={getattr(self, 'class_sha1_map', {}).get(_short)!r}"
|
||||
f" | symtab[IsStruct={getattr(_e, 'IsStruct', None)},IsEnum={getattr(_e, 'IsEnum', None)},"
|
||||
f"IsEnumMember={getattr(_e, 'IsEnumMember', None)},IsTypedef={getattr(_e, 'IsTypedef', None)},"
|
||||
f"Base={type(getattr(_e, 'BaseType', None)).__name__}]"
|
||||
f" | 声明函数类型={func.function_type}"
|
||||
f" | 声明来源={_from}")
|
||||
except Exception:
|
||||
return ''
|
||||
|
||||
def _adjust_args(self, args: list[ir.Value], func: ir.Function) -> list[ir.Value]:
|
||||
adjusted: list[ir.Value] = []
|
||||
for i, (arg, param) in enumerate(zip(args, func.args)):
|
||||
@@ -247,14 +189,10 @@ class FuncGenMixin:
|
||||
Reason: str
|
||||
Allowed, Reason = self._ClassifyPtrImplicitConvert(arg.type, param.type)
|
||||
if not Allowed:
|
||||
# [DIAG-decl] 临时诊断(定位"形参 i32* vs 实参 %sha1.CLS*"):
|
||||
# 把判定依据直接拼进报文,使其随 Traceback 一起被看到;
|
||||
# 定位完成后连同 _RecordDeclFrom 调用点一起删除。
|
||||
_diag_extra: str = self._DescribeI32ParamDiag(func, arg, param)
|
||||
raise FailFastError(
|
||||
f"指针隐式转换已禁止({Reason}):调用 {func.name} 第 {i} 个实参"
|
||||
f" {arg.type} 不能隐式转为形参 {param.type};如需转换请显式 cast"
|
||||
f"(如 t.CPtr(...)){self._DescribeValueNode()}{_diag_extra}")
|
||||
f"(如 t.CPtr(...)){self._DescribeValueNode()}")
|
||||
adjusted.append(self.builder.bitcast(arg, param.type, name=f"cast_arg_{i}"))
|
||||
else:
|
||||
if isinstance(arg.type, ir.PointerType) and isinstance(param.type, (ir.IdentifiedStructType, ir.LiteralStructType, ir.ArrayType)):
|
||||
@@ -869,7 +807,6 @@ class FuncGenMixin:
|
||||
return ir.IntType(32)
|
||||
|
||||
def _get_or_declare_func(self, name: str, func_type: ir.FunctionType) -> ir.Function:
|
||||
self._RecordDeclFrom(name, func_type) # [DIAG-decl] 临时诊断
|
||||
for fname, fobj in self.functions.items():
|
||||
if fname == name:
|
||||
return fobj
|
||||
@@ -880,7 +817,6 @@ class FuncGenMixin:
|
||||
return func_decl
|
||||
|
||||
def get_or_declare_c_func(self, name: str, fallback_type: ir.FunctionType | None = None) -> ir.Function | None:
|
||||
self._RecordDeclFrom(name, fallback_type) # [DIAG-decl] 临时诊断
|
||||
if name in self.functions:
|
||||
return self.functions[name]
|
||||
for fname, fobj in self.functions.items():
|
||||
|
||||
Reference in new issue
Block a user