重置上传,新增了多个标准库,开始 TransPyV 自举实验
This commit is contained in:
@@ -13,7 +13,12 @@ from .__types import LLVMType, ParamNode, TypePrint
|
||||
#
|
||||
# 每条 LLVM IR 指令序列化为一行文本,通过链表组织。
|
||||
# 继承 GSListNode[Line] 获取强类型 Next: Line|CPtr
|
||||
#
|
||||
# 注意: 必须加 @t.NoVTable。否则 TransPyC 为子类添加 vtable 指针(T*),
|
||||
# 但完全丢失父类 GSListNode[T] 的 Next 字段,导致 struct 布局错位,
|
||||
# 所有字段访问读取垃圾值(见续 XV 会话根因分析)。
|
||||
# ============================================================
|
||||
@t.NoVTable
|
||||
class Line(GSListNode[Line]):
|
||||
Buf: t.CChar | t.CPtr # 行文本(NUL 结尾)
|
||||
Len: t.CSizeT # 文本长度(不含 NUL)
|
||||
@@ -25,7 +30,10 @@ class Line(GSListNode[Line]):
|
||||
# 持有名称 + 指令行链表 + 终止指令标志。
|
||||
# 继承 GSListNode[BasicBlock] 获取强类型 Next: BasicBlock|CPtr
|
||||
# Lines 为 GSList[Line] 指针,提供 O(1) 追加。
|
||||
#
|
||||
# 注意: 必须加 @t.NoVTable(理由同 Line)。
|
||||
# ============================================================
|
||||
@t.NoVTable
|
||||
class BasicBlock(GSListNode[BasicBlock]):
|
||||
Name: t.CChar | t.CPtr # 块名(如 "entry"/"if.then")
|
||||
Lines: GSList[Line] | t.CPtr # 指令行链表容器(Head/Tail/Count)
|
||||
@@ -37,7 +45,10 @@ class BasicBlock(GSListNode[BasicBlock]):
|
||||
#
|
||||
# 继承 GSListNode[Param] 获取强类型 Next: Param|CPtr
|
||||
# Attrs 存储参数属性文本(如 "noundef"/"nocapture"/"readonly"),None=无属性
|
||||
#
|
||||
# 注意: 必须加 @t.NoVTable(理由同 Line)。
|
||||
# ============================================================
|
||||
@t.NoVTable
|
||||
class Param(GSListNode[Param]):
|
||||
Ty: LLVMType | t.CPtr # 参数类型
|
||||
Name: t.CChar | t.CPtr # 参数名(如 "%0"/"%a")
|
||||
@@ -51,7 +62,10 @@ class Param(GSListNode[Param]):
|
||||
# 继承 GSListNode[Function] 获取强类型 Next: Function|CPtr
|
||||
# Params/Blocks 为 GSList 指针,提供 O(1) 追加。
|
||||
# Attrs 存储函数级属性文本(如 "nounwind"/"noinline"),None=无属性
|
||||
#
|
||||
# 注意: 必须加 @t.NoVTable(理由同 Line)。
|
||||
# ============================================================
|
||||
@t.NoVTable
|
||||
class Function(GSListNode[Function]):
|
||||
Name: t.CChar | t.CPtr # 函数名
|
||||
RetTy: LLVMType | t.CPtr # 返回类型
|
||||
@@ -161,9 +175,12 @@ def function_move_block_to_end(func: Function | t.CPtr, block: BasicBlock | t.CP
|
||||
用于解决 SSA 名非单调问题:BB 按创建顺序排列,但指令按控制流顺序生成,
|
||||
导致 SSA 编号在文本输出时非单调递增,llc 报错。
|
||||
在 position_at_end 时调用此函数,使 BB 顺序与 position 顺序一致。
|
||||
|
||||
注意:必须使用 GSList[BasicBlock] 带类型参数,否则 TransPyC 创建不完整
|
||||
struct 类型,导致 blocks.Head/Tail/Count 字段访问读取垃圾值。
|
||||
"""
|
||||
if func is None or block is None: return
|
||||
blocks: GSList | t.CPtr = func.Blocks
|
||||
blocks: GSList[BasicBlock] | t.CPtr = func.Blocks
|
||||
if blocks is None: return
|
||||
|
||||
# 已经是 Tail,无需移动
|
||||
|
||||
Reference in New Issue
Block a user