修正了逻辑,使 TPV 能够正常编译

This commit is contained in:
TermiNexus committed 2026-08-03 02:00:49 +08:00
1 parent 4e17365b76
commit 0a10b20dde
24 files changed
+2718 -1985

No files matched your search

+12 -12
View File
@@ -87,8 +87,16 @@ class AugAssignHandle(BaseHandle):
if isinstance(Node.target, ast.Name):
VarName: str = Node.target.id
Op: str = self.Trans.ExprHandler.GetOpSymbol(Node.op)
if VarName in Gen.global_vars and VarName in Gen.module.globals:
GVar: ir.GlobalVariable = Gen.module.globals[VarName]
if VarName in Gen.global_vars:
# 治本修复:global 声明的变量若未被模块级 AnnAssign 创建为 LLVM 全局
# (注解无初始值的全局变量),此处自动创建零初始化全局变量
GVar: ir.GlobalVariable
if VarName not in Gen.module.globals:
_gv_type: ir.Type = Value.type if isinstance(Value.type, ir.IntType) else ir.IntType(64)
GVar = ir.GlobalVariable(Gen.module, _gv_type, name=VarName)
GVar.initializer = ir.Constant(_gv_type, 0)
else:
GVar = Gen.module.globals[VarName]
Gen.variables[VarName] = GVar
OldVal: ir.Value = Gen._load(GVar, name=VarName)
NewVal: ir.Value = Gen.emit_binary_op(Op, OldVal, Value, is_unsigned=is_unsigned)
@@ -96,22 +104,14 @@ class AugAssignHandle(BaseHandle):
return
if VarName in Gen._reg_values:
OldVal: ir.Value = Gen._reg_values[VarName]
saved_block: ir.Block = Gen.builder.block
entry_block: ir.Block = Gen.func.entry_basic_block
Gen.builder.position_at_start(entry_block)
var: ir.AllocaInstr = Gen.builder.alloca(OldVal.type, name=VarName)
var: ir.AllocaInstr = Gen._allocaEntry(OldVal.type, name=VarName)
Gen._store(OldVal, var)
Gen.builder.position_at_end(saved_block)
Gen.variables[VarName] = var
del Gen._reg_values[VarName]
if VarName in Gen._direct_values:
OldVal: ir.Value = Gen._direct_values.pop(VarName)
saved_block: ir.Block = Gen.builder.block
entry_block: ir.Block = Gen.func.entry_basic_block
Gen.builder.position_at_start(entry_block)
var: ir.AllocaInstr = Gen.builder.alloca(OldVal.type, name=VarName)
var: ir.AllocaInstr = Gen._allocaEntry(OldVal.type, name=VarName)
Gen._store(OldVal, var)
Gen.builder.position_at_end(saved_block)
Gen.variables[VarName] = var
if Gen.builder.block.is_terminated:
return