重置上传,新增了多个标准库,开始 TransPyV 自举实验

This commit is contained in:
2026-07-19 11:38:15 +08:00
parent 796222a300
commit 4e66207ba1
1041 changed files with 6597 additions and 27814 deletions

View File

@@ -22,7 +22,11 @@ from .__function import Function, BasicBlock, block_append_text, function_move_b
# builder.build_store(ConstInt(42), a)
# r = builder.build_load(i32_ty, a)
# builder.build_ret(r)
#
# 注意: 加 @t.NoVTable 以与硬编码 BUILDER_SIZE=32 保持一致
# (所有方法均为顶层函数,无需 vtable
# ============================================================
@t.NoVTable
class IRBuilder:
Pool: memhub.MemBuddy | t.CPtr # 内存池
Func: Function | t.CPtr # 所属函数
@@ -897,7 +901,10 @@ def build_gep_struct(builder: IRBuilder | t.CPtr, struct_ty: LLVMType | t.CPtr,
# ============================================================
# PhiIncoming: phi 节点的入边 (value, block) 对
# 继承 GSListNode[PhiIncoming] 获取强类型 Next
#
# 注意: 必须加 @t.NoVTable理由见 __function.py 的 Line 注释)。
# ============================================================
@t.NoVTable
class PhiIncoming(GSListNode[PhiIncoming]):
Val: Value | t.CPtr
Block: BasicBlock | t.CPtr
@@ -965,7 +972,10 @@ def build_phi(builder: IRBuilder | t.CPtr, ty: LLVMType | t.CPtr,
# ============================================================
# SwitchCase: switch 指令的 case 分支
#
# 注意: 必须加 @t.NoVTable理由见 __function.py 的 Line 注释)。
# ============================================================
@t.NoVTable
class SwitchCase(GSListNode[SwitchCase]):
CaseVal: Value | t.CPtr
Block: BasicBlock | t.CPtr

View File

@@ -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无需移动

View File

@@ -10,7 +10,10 @@ from linkedlist import GSListNode
# ParamNode: 函数参数类型链表节点
# 继承 GSListNode[ParamNode] 获取强类型 Next: ParamNode|CPtr
# Ty 用 t.CVoid | t.CPtr 前向引用,使用时转型为 (LLVMType | t.CPtr)
#
# 注意: 必须加 @t.NoVTable理由见 __function.py 的 Line 注释)。
# ============================================================
@t.NoVTable
class ParamNode(GSListNode[ParamNode]):
Ty: t.CVoid | t.CPtr # LLVMType*(前向引用,使用时转型)

View File

@@ -13,7 +13,10 @@ from .__types import LLVMType, TypePrint
# 表示一个 LLVM IR 值SSA 临时值(%0/%result或常量字面量42/0
# 每个值有类型指针、名字、是否常量标志。
# 继承 GSListNode[Value] 获取强类型 Next: Value|CPtr值池链表
#
# 注意: 必须加 @t.NoVTable理由见 __function.py 的 Line 注释)。
# ============================================================
@t.NoVTable
class Value(GSListNode[Value]):
Ty: LLVMType | t.CPtr # 值的类型
Name: t.CChar | t.CPtr # SSA 名("%0"/"%result")或常量文本("42"/"1.5e+00"

View File

@@ -28,7 +28,10 @@ VERIFY_ERR_PHI_NOT_FIRST: t.CDefine = 4
# ============================================================
# NameEntry: 已定义 SSA 名条目(链表节点)
#
# 注意: 必须加 @t.NoVTable理由见 __function.py 的 Line 注释)。
# ============================================================
@t.NoVTable
class NameEntry(GSListNode[NameEntry]):
Name: t.CChar | t.CPtr # SSA 名(如 "%0"/"%result"