From 832e570e1a8a16e4570bec6a99813ab96f095e17 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Mon, 28 Sep 2026 21:20:41 +0800 Subject: [PATCH] =?UTF-8?q?feat(includes):=20=E6=96=B0=E5=A2=9E=203=20?= =?UTF-8?q?=E4=B8=AA=E8=B7=A8=E6=A8=A1=E5=9D=97=E9=93=BE=E8=A1=A8=E8=AE=BF?= =?UTF-8?q?=E9=97=AE=E5=99=A8=EF=BC=88GlobalVariable/PhiIncoming/SwitchCas?= =?UTF-8?q?e=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GlobalVariable.Next / PhiIncoming.Next / SwitchCase.Next 均继承自泛型基类 GSListNode[T],泛型特化体不在任何 .vpi 中 ⇒ 导入侧 class_members 只有 __inherited_N 占位名,裸字段访问在严格属性解析下 fail-fast。 沿用既有约定(paramnode_get_next / value_set_next 等)在**定义模块内**补同名同义 访问器(None 守卫 + x.Next,零行为变化): · llvmlite/__module.vp: globalvariable_get_next(读) · llvmlite/__builder.vp: phiincoming_set_next / switchcase_set_next(写) · mlirlite 同形镜像同步(保持"逐名同形"不变量,MLIR 侧 llvmlite.→mlirlite. 重命名可编译) 并在两库 __init__.vp 的 from-import 列表登记导出。 --- llvmlite/__builder.vp | 24 ++++++++++++++++++++++++ llvmlite/__init__.vp | 4 +++- llvmlite/__module.vp | 13 +++++++++++++ mlirlite/__builder.vp | 24 ++++++++++++++++++++++++ mlirlite/__init__.vp | 6 ++++-- mlirlite/__module.vp | 12 ++++++++++++ 6 files changed, 80 insertions(+), 3 deletions(-) diff --git a/llvmlite/__builder.vp b/llvmlite/__builder.vp index 776a2d7..73c20ee 100644 --- a/llvmlite/__builder.vp +++ b/llvmlite/__builder.vp @@ -1751,6 +1751,18 @@ def new_phi_incoming(pool: memhub.MemBuddy*, return ptr +def phiincoming_set_next(inc: rawptr[PhiIncoming], nxt: rawptr[PhiIncoming]): + """设置 phi 入边链表的下一个节点(跨模块访问器)。 + + PhiIncoming.Next 继承自泛型基类 GSListNode[PhiIncoming],泛型特化体不在 + 任何 .vpi 中 ⇒ 导入侧 class_members 只有 __inherited_N 占位名,裸字段访问 + 会 fail-fast。本模块内执行能正确访问该字段(与 paramnode_set_next 同一约定)。 + """ + if inc is None: + return + inc.Next = nxt + + # ============================================================ # Phi 指令 # ============================================================ @@ -1786,6 +1798,18 @@ def new_switch_case(pool: memhub.MemBuddy*, return ptr +def switchcase_set_next(sc: rawptr[SwitchCase], nxt: rawptr[SwitchCase]): + """设置 switch case 链表的下一个节点(跨模块访问器)。 + + SwitchCase.Next 继承自泛型基类 GSListNode[SwitchCase],泛型特化体不在任何 + .vpi 中 ⇒ 导入侧 class_members 只有 __inherited_N 占位名,裸字段访问会 + fail-fast。本模块内执行能正确访问该字段(与 paramnode_set_next 同一约定)。 + """ + if sc is None: + return + sc.Next = nxt + + # ============================================================ # Switch 指令 # ============================================================ diff --git a/llvmlite/__init__.vp b/llvmlite/__init__.vp index c8c145d..e2bdb87 100644 --- a/llvmlite/__init__.vp +++ b/llvmlite/__init__.vp @@ -39,6 +39,7 @@ from .__module import ( module_set_named_type_packed, module_set_target, module_set_datalayout, module_add_di_node, module_add_named_metadata, + globalvariable_get_next, global_set_constant, global_set_linkage, global_set_unnamed_addr, global_set_section, LLVMModulePrint, OUTPUT_FULL, OUTPUT_STUB, OUTPUT_TEXT, module_ensure_opaque_for_type, @@ -59,7 +60,8 @@ from .__builder import ( build_gep, build_gep_array, build_gep_struct, build_phi, build_switch, build_select, build_unreachable, build_atomicrmw, build_cmpxchg, build_inline_asm, build_va_arg, - PhiIncoming, new_phi_incoming, SwitchCase, new_switch_case, + PhiIncoming, new_phi_incoming, SwitchCase, new_switch_case, + phiincoming_set_next, switchcase_set_next, ICMP_EQ, ICMP_NE, ICMP_SGT, ICMP_SGE, ICMP_SLT, ICMP_SLE, ICMP_UGT, ICMP_UGE, ICMP_ULT, ICMP_ULE, FCMP_FALSE, FCMP_OEQ, FCMP_OGT, FCMP_OGE, FCMP_OLT, FCMP_OLE, diff --git a/llvmlite/__module.vp b/llvmlite/__module.vp index d0863af..7d39380 100644 --- a/llvmlite/__module.vp +++ b/llvmlite/__module.vp @@ -588,6 +588,19 @@ def module_add_global(mod: rawptr[LLVMModule], gv: rawptr[GlobalVariable]): mod.add_global(gv) +def globalvariable_get_next(gv: rawptr[GlobalVariable]) -> rawptr[GlobalVariable]: + """获取链表中的下一个全局变量(跨模块访问器)。 + + GlobalVariable.Next 继承自泛型基类 GSListNode[GlobalVariable],而泛型特化体 + 不在任何 .vpi 中 ⇒ 导入侧 class_members 只有 __inherited_N 占位名,裸字段 + 访问会 fail-fast("属性 'Next' 在类 'GlobalVariable' 中找不到")。本模块内 + 执行能正确访问该字段,与 paramnode_get_next/value_get_next 同一约定。 + """ + if gv is None: + return None + return gv.Next + + def module_set_target(mod: rawptr[LLVMModule], triple: str): mod.set_target(triple) diff --git a/mlirlite/__builder.vp b/mlirlite/__builder.vp index 98624c2..973b650 100644 --- a/mlirlite/__builder.vp +++ b/mlirlite/__builder.vp @@ -1687,6 +1687,18 @@ def new_phi_incoming(pool: memhub.MemBuddy*, return ptr +def phiincoming_set_next(inc: rawptr[PhiIncoming], nxt: rawptr[PhiIncoming]): + """设置 phi 入边链表的下一个节点(跨模块访问器)。 + + PhiIncoming.Next 继承自泛型基类 GSListNode[PhiIncoming],泛型特化体不在任何 + .vpi 中 ⇒ 导入侧 class_members 只有 __inherited_N 占位名,裸字段访问会 + fail-fast。本模块内执行能正确访问该字段(与 llvmlite 同形镜像同名同义)。 + """ + if inc is None: + return + inc.Next = nxt + + # ============================================================ # Phi 指令 # ============================================================ @@ -1722,6 +1734,18 @@ def new_switch_case(pool: memhub.MemBuddy*, return ptr +def switchcase_set_next(sc: rawptr[SwitchCase], nxt: rawptr[SwitchCase]): + """设置 switch case 链表的下一个节点(跨模块访问器)。 + + SwitchCase.Next 继承自泛型基类 GSListNode[SwitchCase],泛型特化体不在任何 + .vpi 中 ⇒ 导入侧 class_members 只有 __inherited_N 占位名,裸字段访问会 + fail-fast。本模块内执行能正确访问该字段(与 llvmlite 同形镜像同名同义)。 + """ + if sc is None: + return + sc.Next = nxt + + # ============================================================ # Switch 指令 # ============================================================ diff --git a/mlirlite/__init__.vp b/mlirlite/__init__.vp index 8a88bbe..75d94dd 100644 --- a/mlirlite/__init__.vp +++ b/mlirlite/__init__.vp @@ -45,7 +45,8 @@ from .__function import ( ) from .__module import ( LLVMModule, GlobalVariable, NamedTypeNode, new_module, new_global_variable, - module_add_function, module_add_global, module_add_named_type, + module_add_function, module_add_global, module_add_named_type, + globalvariable_get_next, module_set_named_type_packed, module_set_target, module_set_datalayout, global_set_constant, global_set_linkage, global_set_unnamed_addr, global_set_section, @@ -67,7 +68,8 @@ from .__builder import ( build_gep, build_gep_array, build_gep_struct, build_phi, build_switch, build_select, build_unreachable, build_atomicrmw, build_cmpxchg, build_inline_asm, build_va_arg, - PhiIncoming, new_phi_incoming, SwitchCase, new_switch_case, + PhiIncoming, new_phi_incoming, SwitchCase, new_switch_case, + phiincoming_set_next, switchcase_set_next, ICMP_EQ, ICMP_NE, ICMP_SGT, ICMP_SGE, ICMP_SLT, ICMP_SLE, ICMP_UGT, ICMP_UGE, ICMP_ULT, ICMP_ULE, FCMP_FALSE, FCMP_OEQ, FCMP_OGT, FCMP_OGE, FCMP_OLT, FCMP_OLE, diff --git a/mlirlite/__module.vp b/mlirlite/__module.vp index 0cde7b8..b28205c 100644 --- a/mlirlite/__module.vp +++ b/mlirlite/__module.vp @@ -409,6 +409,18 @@ def module_add_global(mod: rawptr[LLVMModule], gv: rawptr[GlobalVariable]): mod.add_global(gv) +def globalvariable_get_next(gv: rawptr[GlobalVariable]) -> rawptr[GlobalVariable]: + """获取链表中的下一个全局变量(跨模块访问器)。 + + GlobalVariable.Next 继承自泛型基类 GSListNode[GlobalVariable],泛型特化体不在 + 任何 .vpi 中 ⇒ 导入侧 class_members 只有 __inherited_N 占位名,裸字段访问会 + fail-fast。本模块内执行能正确访问该字段(与 llvmlite 同形镜像同名同义)。 + """ + if gv is None: + return None + return gv.Next + + def module_set_target(mod: rawptr[LLVMModule], triple: str): mod.set_target(triple)