进行了优化,减少了上帝结构体的符号表占用

This commit is contained in:
2026-06-18 22:12:14 +08:00
parent d7b98cc9c5
commit 19f2787db0
32 changed files with 1245 additions and 1083 deletions

View File

@@ -316,7 +316,7 @@ class ExprCallHandle(BaseHandle):
return self._HandleTypeLlvm(Node)
if Gen._has_function(FuncName):
return self._HandleClosureCallLlvm(Node, FuncName)
if FuncName in self.Trans.SymbolTable:
if self.Trans.SymbolTable.has(FuncName):
SymInfo = self.Trans.SymbolTable[FuncName]
if SymInfo.IsEnum:
if Node.args:
@@ -430,12 +430,12 @@ class ExprCallHandle(BaseHandle):
return self._HandleSizeofLlvm(SizeofNode)
ModulePath = self._get_ModulePath(Node.func.value)
if ModulePath:
aliases = getattr(self.Trans, '_ImportAliases', {})
first_part = ModulePath.split('.')[0]
if first_part in aliases:
ModulePath = aliases[first_part] + ModulePath[len(first_part):]
resolved_first = self.Trans.SymbolTable.resolve_alias(first_part)
if resolved_first != first_part:
ModulePath = resolved_first + ModulePath[len(first_part):]
is_instance_var = isinstance(Node.func.value, ast.Name) and Node.func.value.id in Gen.var_struct_class and Node.func.value.id not in Gen.ModuleSha1Map
is_class_name = isinstance(Node.func.value, ast.Name) and (Node.func.value.id in Gen.structs or (Node.func.value.id in self.Trans.SymbolTable and self.Trans.SymbolTable[Node.func.value.id].IsStruct))
is_class_name = isinstance(Node.func.value, ast.Name) and (Node.func.value.id in Gen.structs or self.Trans.SymbolTable.is_struct(Node.func.value.id))
if is_instance_var and not is_class_name:
return self._HandleMethodCallLlvm(Node)
FuncAttr = Node.func.attr
@@ -445,7 +445,7 @@ class ExprCallHandle(BaseHandle):
return result
if hasattr(self.Trans.ClassHandler, '_generic_class_templates') and FuncAttr in self.Trans.ClassHandler._generic_class_templates:
return self._HandleGenericClassNewLlvm(Node, FuncAttr)
if FuncAttr in self.Trans.SymbolTable:
if self.Trans.SymbolTable.has(FuncAttr):
SymInfo = self.Trans.SymbolTable[FuncAttr]
if SymInfo.IsStruct:
if FuncAttr not in Gen.structs:
@@ -456,14 +456,14 @@ class ExprCallHandle(BaseHandle):
return result
if SymInfo.IsEnumMember and SymInfo.EnumName:
EnumName = SymInfo.EnumName
if EnumName in self.Trans.SymbolTable:
if self.Trans.SymbolTable.has(EnumName):
EnumInfo = self.Trans.SymbolTable[EnumName]
if EnumInfo.IsRenum:
result = self._HandleREnumConstructLlvm(Node, EnumName, FuncAttr, SymInfo.value)
if result is not None:
return result
FullAttrKey = f"{ModulePath}.{FuncAttr}"
if FullAttrKey in self.Trans.SymbolTable:
if self.Trans.SymbolTable.has(FullAttrKey):
SymInfo = self.Trans.SymbolTable[FullAttrKey]
if SymInfo.IsStruct:
if FuncAttr not in Gen.structs:
@@ -478,7 +478,7 @@ class ExprCallHandle(BaseHandle):
if result is not None:
return result
FullAttrKey = f"{ModulePath}.{FuncAttr}"
if FullAttrKey in self.Trans.SymbolTable:
if self.Trans.SymbolTable.has(FullAttrKey):
SymInfo = self.Trans.SymbolTable[FullAttrKey]
if SymInfo.IsTypedef:
return ir.Constant(ir.IntType(32), 0)
@@ -533,7 +533,7 @@ class ExprCallHandle(BaseHandle):
raise Exception(f"Undefined method: 't.{FuncAttr}'")
if isinstance(Node.func.value, ast.Attribute):
inner_attr = Node.func.value.attr
if inner_attr in Gen.structs or (inner_attr in self.Trans.SymbolTable and self.Trans.SymbolTable[inner_attr].IsStruct):
if inner_attr in Gen.structs or self.Trans.SymbolTable.is_struct(inner_attr):
static_result = self._HandleStaticMethodCallLlvm(Node, inner_attr, FuncAttr)
if static_result is not None:
return static_result
@@ -557,22 +557,21 @@ class ExprCallHandle(BaseHandle):
return Gen.builder.call(Gen._get_function(mangled_name), CallArgs, name=f"call_{FuncAttr}")
if MethodResult is None or IsZeroResult:
imported = getattr(self.Trans, '_ImportedModules', set())
aliases = getattr(self.Trans, '_ImportAliases', {})
ModuleSha1Map = getattr(Gen, 'ModuleSha1Map', {})
IsKnown = (ModulePath in imported or ModulePath in aliases or
IsKnown = (ModulePath in imported or ModulePath in self.Trans.SymbolTable.import_aliases or
ModulePath in ModuleSha1Map)
if not IsKnown and ModulePath and '.' in ModulePath:
LastPart = ModulePath.split('.')[-1]
IsKnown = (LastPart in imported or LastPart in aliases or
IsKnown = (LastPart in imported or LastPart in self.Trans.SymbolTable.import_aliases or
LastPart in ModuleSha1Map)
# 最后尝试: 用 FuncAttr 直接查找 Gen.functions_find_function 会遍历 SHA1 前缀)
if FuncAttr and ModulePath and ModulePath not in {'t', 'c'}:
# 先检查 FuncAttr 是否是函数/变量,如果是则跳过 struct 声明
_attr_sym = self.Trans.SymbolTable.get(FuncAttr)
_attr_sym = self.Trans.SymbolTable.lookup(FuncAttr)
_is_func_or_var = _attr_sym and (_attr_sym.IsFunction or _attr_sym.IsVariable)
if not _is_func_or_var and ModulePath:
_full_key = f"{ModulePath}.{FuncAttr}"
_full_sym = self.Trans.SymbolTable.get(_full_key)
_full_sym = self.Trans.SymbolTable.lookup(_full_key)
if _full_sym and (_full_sym.IsFunction or _full_sym.IsVariable):
_is_func_or_var = True
# 优先检查 FuncAttr 是否为 struct/类构造器
@@ -585,7 +584,7 @@ class ExprCallHandle(BaseHandle):
# 检查 FullAttrKey 是否为 struct如 hashlib.md5
if ModulePath:
FullAttrKey = f"{ModulePath}.{FuncAttr}"
if FullAttrKey in self.Trans.SymbolTable:
if self.Trans.SymbolTable.has(FullAttrKey):
FullSymInfo = self.Trans.SymbolTable[FullAttrKey]
if FullSymInfo.IsStruct or FullSymInfo.IsCpythonObject:
if FuncAttr not in Gen.structs:
@@ -648,7 +647,7 @@ class ExprCallHandle(BaseHandle):
def _ensure_struct_declared(self, class_name):
Gen = self.Trans.LlvmGen
# 如果名称是函数或变量,不应创建 struct
SymInfo = self.Trans.SymbolTable.get(class_name)
SymInfo = self.Trans.SymbolTable.lookup(class_name)
if SymInfo and (SymInfo.IsFunction or SymInfo.IsVariable):
return
if class_name in Gen.structs:
@@ -660,7 +659,7 @@ class ExprCallHandle(BaseHandle):
return
else:
return
SymInfo = self.Trans.SymbolTable.get(class_name)
SymInfo = self.Trans.SymbolTable.lookup(class_name)
if SymInfo and SymInfo.Members:
member_types = []
if isinstance(SymInfo.Members, dict):
@@ -719,7 +718,7 @@ class ExprCallHandle(BaseHandle):
if ClassName not in Gen.structs:
self._ensure_struct_declared(ClassName)
SymKey = f'{ClassName}.{MethodName}'
SymInfo = self.Trans.SymbolTable.get(SymKey) or self.Trans.SymbolTable.get(MethodName)
SymInfo = self.Trans.SymbolTable.lookup(SymKey) or self.Trans.SymbolTable.lookup(MethodName)
if SymInfo and SymInfo.IsFunction:
ret_type_info = SymInfo.FuncPtrReturn
if isinstance(ret_type_info, CTypeInfo) and ret_type_info.BaseType:
@@ -761,7 +760,7 @@ class ExprCallHandle(BaseHandle):
return None
CallArgs = []
SymKey = f'{ClassName}.{MethodName}'
SymInfo = self.Trans.SymbolTable.get(SymKey) or self.Trans.SymbolTable.get(MethodName)
SymInfo = self.Trans.SymbolTable.lookup(SymKey) or self.Trans.SymbolTable.lookup(MethodName)
is_static_call = SymInfo is not None and FuncMeta.STATIC_METHOD in SymInfo.MetaList
is_classmethod_call = SymInfo is not None and FuncMeta.CLASS_METHOD in SymInfo.MetaList
# @classmethod: 在参数列表前插入 cls栈上分配的类实例指针
@@ -1208,14 +1207,12 @@ class ExprCallHandle(BaseHandle):
# 解析 import 别名: 如 window -> vpsdk.window
if ModulePath and ModulePath not in ('c', 't'):
import_aliases = getattr(self.Trans, '_ImportAliases', {})
if ModulePath in import_aliases:
ModulePath = import_aliases[ModulePath]
ModulePath = self.Trans.SymbolTable.resolve_alias(ModulePath)
is_user_module = (ModulePath and ModulePath not in ('c', 't') and
(ModulePath in Gen.ModuleSha1Map or
ModulePath in getattr(self.Trans, '_ImportedModules', set()) or
ModulePath in getattr(self.Trans, '_ImportAliases', {})))
ModulePath in self.Trans.SymbolTable.import_aliases))
if ModulePath and ModulePath not in ('c', 't') and not is_user_module:
is_user_module = (ModulePath in Gen.ModuleSha1Map or
ModulePath.split('.')[-1] in Gen.ModuleSha1Map or
@@ -1229,12 +1226,12 @@ class ExprCallHandle(BaseHandle):
if is_user_module:
mangled_name = Gen._mangle_func_name(func_name, ModulePath)
sym_key = f'{ModulePath}.{func_name}'
sym_info = self.Trans.SymbolTable.get(sym_key) or self.Trans.SymbolTable.get(func_name)
sym_info = self.Trans.SymbolTable.lookup(sym_key) or self.Trans.SymbolTable.lookup(func_name)
is_inline = sym_info and (sym_info.IsInline or isinstance(sym_info.Storage, t.CInline))
if is_inline and sym_info.InlineBody:
self._HandleInlineExpandLlvm(Node, sym_info)
return ir.Constant(ir.IntType(32), 1)
sym_info_exact = self.Trans.SymbolTable.get(sym_key)
sym_info_exact = self.Trans.SymbolTable.lookup(sym_key)
if sym_info_exact:
exact_params = sym_info_exact.FuncPtrParams
exact_param_names = [pn for pn, _ in exact_params]
@@ -1276,9 +1273,9 @@ class ExprCallHandle(BaseHandle):
Gen.functions[func_name] = func_decl
return self._HandleClosureCallLlvm(Node, decl_name)
sym_key = f'{ModulePath}.{func_name}'
sym_info = self.Trans.SymbolTable.get(sym_key)
sym_info = self.Trans.SymbolTable.lookup(sym_key)
if not sym_info:
sym_info = self.Trans.SymbolTable.get(func_name)
sym_info = self.Trans.SymbolTable.lookup(func_name)
if sym_info:
is_func = sym_info.IsFunction
sym_is_variadic = sym_info.IsVariadic
@@ -1407,9 +1404,9 @@ class ExprCallHandle(BaseHandle):
return self._HandleClosureCallLlvm(Node, decl_name)
sym_key = f'{ModulePath}.{func_name}' if ModulePath else func_name
sym_info = self.Trans.SymbolTable.get(sym_key)
sym_info = self.Trans.SymbolTable.lookup(sym_key)
if not sym_info:
sym_info = self.Trans.SymbolTable.get(func_name)
sym_info = self.Trans.SymbolTable.lookup(func_name)
if sym_info:
is_func = sym_info.IsFunction
sym_is_variadic = sym_info.IsVariadic
@@ -1576,7 +1573,7 @@ class ExprCallHandle(BaseHandle):
def _HandleTypedefCastLlvm(self, Node, TypedefName):
Gen = self.Trans.LlvmGen
SymInfo = self.Trans.SymbolTable.get(TypedefName)
SymInfo = self.Trans.SymbolTable.lookup(TypedefName)
if not SymInfo or not SymInfo.IsTypedef:
return ir.Constant(ir.IntType(32), 0)
TargetType = Gen._ctype_to_llvm(SymInfo)
@@ -1829,7 +1826,7 @@ class ExprCallHandle(BaseHandle):
ClassName = Gen.var_struct_class.get(VarName)
if ClassName:
SymKey = f'{ClassName}.{MethodName}'
SymInfo = self.Trans.SymbolTable.get(SymKey)
SymInfo = self.Trans.SymbolTable.lookup(SymKey)
if SymInfo and SymInfo.MetaList:
if FuncMeta.STATIC_METHOD in SymInfo.MetaList:
return self._HandleStaticMethodCallLlvm(Node, ClassName, MethodName)
@@ -1901,7 +1898,7 @@ class ExprCallHandle(BaseHandle):
if is_float:
return ir.Constant(ir.FloatType() if target_bits == 32 else ir.DoubleType(), 0.0)
return ir.Constant(ir.IntType(target_bits) if target_bits > 0 else ir.IntType(32), 0)
if MethodName in self.Trans.SymbolTable:
if self.Trans.SymbolTable.has(MethodName):
SymInfo = self.Trans.SymbolTable[MethodName]
if SymInfo.IsTypedef:
return self._HandleTypedefCastLlvm(Node, MethodName)
@@ -1982,9 +1979,8 @@ class ExprCallHandle(BaseHandle):
ObjVal = tmp
if isinstance(Node.func.value, ast.Name):
ModuleName = Node.func.value.id
aliases = getattr(self.Trans, '_ImportAliases', {})
imported = getattr(self.Trans, '_ImportedModules', set())
actual_module = aliases.get(ModuleName, ModuleName)
actual_module = self.Trans.SymbolTable.resolve_alias(ModuleName)
if ModuleName in imported or actual_module in imported:
mangled_name = Gen._mangle_func_name(MethodName, actual_module)
if Gen._has_function(mangled_name):
@@ -2657,7 +2653,7 @@ class ExprCallHandle(BaseHandle):
type_info = Gen.var_type_info[arg_name]
if isinstance(type_info, dict) and type_info.get('type') == 'enum':
enum_type_name = type_info.get('name')
if not enum_type_name and arg_name in self.Trans.SymbolTable:
if not enum_type_name and self.Trans.SymbolTable.has(arg_name):
TypeInfo = self.Trans.SymbolTable[arg_name]
if TypeInfo.IsEnum:
enum_type_name = arg_name
@@ -2666,7 +2662,7 @@ class ExprCallHandle(BaseHandle):
enum_class_name = None
if isinstance(arg.value, ast.Name):
LastPart = arg.attr
if LastPart in self.Trans.SymbolTable:
if self.Trans.SymbolTable.has(LastPart):
AttrInfo = self.Trans.SymbolTable[LastPart]
if AttrInfo.IsEnumMember and AttrInfo.EnumName:
enum_type_name = AttrInfo.EnumName
@@ -2681,7 +2677,7 @@ class ExprCallHandle(BaseHandle):
qualified_name_under = f"{enum_class_name}_{LastPart}"
enum_member_found = None
for qname in (qualified_name_dot, qualified_name_under):
if qname in self.Trans.SymbolTable:
if self.Trans.SymbolTable.has(qname):
info = self.Trans.SymbolTable[qname]
if info.IsEnumMember and info.EnumName == enum_class_name:
enum_member_found = info
@@ -3425,7 +3421,7 @@ class ExprCallHandle(BaseHandle):
type_str = 'int'
type_name = attr_name
elif isinstance(arg_node, ast.Name):
var_info = self.Trans.SymbolTable.get(arg_node.id)
var_info = self.Trans.SymbolTable.lookup(arg_node.id)
if var_info and isinstance(var_info, dict):
var_type = var_info.get('type', '')
if var_type in ('double', 'float'):