This commit is contained in:
2026-07-30 13:34:26 +08:00
parent a2cc28a6ab
commit f79c8ca643
43 changed files with 1690 additions and 1016 deletions

View File

@@ -7,7 +7,7 @@ import stdio
from linkedlist import GSListNode, GSList
from .__types import LLVMType, TypePrint
from .__values import Value, new_value, SSAValue
from .__function import Function, BasicBlock, block_append_text, function_move_block_to_end, _ll_name_needs_quote
from .__function import Function, BasicBlock, block_append_text, block_set_terminated, block_get_terminated, function_move_block_to_end, _ll_name_needs_quote
# ============================================================
# IRBuilder: 游标式 IR 指令发射器
@@ -104,20 +104,19 @@ def _emit(builder: IRBuilder | t.CPtr, text: t.CChar | t.CPtr):
def _mark_terminated(builder: IRBuilder | t.CPtr):
"""标记当前块已终止"""
if builder is None or builder.CurBlock is None: return
builder.CurBlock.IsTerminated = 1
block_set_terminated(builder.CurBlock, 1)
def builder_cur_block_is_terminated(builder: IRBuilder | t.CPtr) -> t.CInt:
"""检查当前块的 IsTerminated 标志
供其他模块绕过 stub 类型限制使用:
builder.CurBlock.IsTerminated 在 stub 类型中 BasicBlock 为 opaque
直接访问会被 TransPyC 静默跳过(不生成 GEP不报错
导致返回寄存器残留值br 回边指令被错误跳过。
通过 block_get_terminated 辅助函数访问,避免链式属性
builder.CurBlock.IsTerminated 在跨模块场景下 BasicBlock 为 opaque
导致的 GEP 静默跳过问题。
"""
if builder is None or builder.CurBlock is None:
return 1
return builder.CurBlock.IsTerminated
return block_get_terminated(builder.CurBlock)
# ============================================================