fix(global): external 声明升级用 initializer 判空(llvmlite.ir 无 is_declaration 属性)
上次修复用 getattr(g, 'is_declaration') 判断声明态,但该属性仅在 llvmlite.binding 层存在,ir.GlobalVariable 没有 -> 恒 False -> 升级不生效, _g_gen 依旧无定义。改用 initializer is None 判断(external 声明必无 initializer;已定义全局必有),验证 common + null initializer 可设。
This commit is contained in:
1 parent
c904fac54d
commit
015d5c38ea
1 file changed
+3
-1
@@ -1488,7 +1488,9 @@ class AssignHandle(BaseHandle):
|
||||
# 应升级为 common 定义(多模块同名合并为零值,对齐 None 语义),
|
||||
# 而非静默跳过。
|
||||
existing_gv = Gen.module.globals.get(VarName) if VarName in Gen.module.globals else None
|
||||
if isinstance(existing_gv, ir.GlobalVariable) and getattr(existing_gv, 'is_declaration', False):
|
||||
# 注:llvmlite.ir.GlobalVariable 无 is_declaration 属性(binding 层才有),
|
||||
# 声明/定义靠 initializer 区分:external 声明 initializer 恒为 None。
|
||||
if isinstance(existing_gv, ir.GlobalVariable) and getattr(existing_gv, 'initializer', None) is None:
|
||||
try:
|
||||
existing_gv.linkage = 'common'
|
||||
if Node.value is None or (isinstance(Node.value, ast.Constant) and Node.value.value is None):
|
||||
|
||||
Reference in new issue
Block a user