diff --git a/mlirlite/__module.vp b/mlirlite/__module.vp index 868f54f..01c5e15 100644 --- a/mlirlite/__module.vp +++ b/mlirlite/__module.vp @@ -25,8 +25,7 @@ from .__function import ( # 持有名称 + 类型 + 初始化值 + 常量标志 + 链接类型。 # 继承 GSListNode[GlobalVariable] 获取强类型 Next。 # ============================================================ -@t.NoVTable -class GlobalVariable(GSListNode[GlobalVariable]): +novirtual class GlobalVariable(GSListNode[GlobalVariable]): Name: str # 全局变量名(如 ".str" / "my_global") Ty: rawptr[LLVMType] # 变量类型 Initializer: rawptr # 初始化值 Value*(None = 无初始化) @@ -358,16 +357,18 @@ class LLVMModule: # (旧 64 KiB 会截断;截断现由 FunctionPrint/LLVMModulePrint 的截断检查 # 响亮报错)。 # 容量上限**受模块池的 buddy 上限约束**:模块池是 ~2 MiB 子池 - # (SUB_POOL_SIZE),其 max_order=15 ⇒ 单个 buddy 块 ≤ 1 MiB,且分配还要 - # 留 16 字节块头 ⇒ 单次 alloc 请求必须 ≤ 1 MiB − 16。此前取 1 MiB - # (1048576)会被判需 order 16 而**结构性失败**([MEM] alloc 失败 - # size=1048576 needed=1048592 order=16 max_order=15)。 - # 取 256 KiB:实测最大单成员文本 ~54 KB(670 KB 模块 / 991 行最大函数, - # 平均 ~54 B/行),余量 ~4.7×;且只需 order 14(512 KiB 块)即可满足。 - tmp_cap: sizet = 262144 + # (SUB_POOL_SIZE 2097136),其 max_order=15 ⇒ 单个 buddy 块最大 + # 32<<15 = 1 MiB;分配还要留 16 字节块头 ⇒ 单次 alloc 请求必须 + # ≤ 1 MiB − 16 = 1048560。 + # 取该上限(1048560):此前取 1048576 会被判需 order 16 而**结构性失败** + # ([MEM] alloc 失败 size=1048576 needed=1048592 order=16 max_order=15); + # 而取 256 KiB 又对个别大函数偏小(触发"输出文本超出缓冲被截断"护栏)。 + # 单函数文本因内联具名结构体完整字段体而显著变长,故按池可服务的最大单块给足; + # 若仍超出,截断由 FunctionPrint/LLVMModulePrint 的截断检查响亮报错。 + tmp_cap: sizet = 1048560 tmp: str = pool.alloc(tmp_cap) if tmp is None: - MlirFail("MLIR 渲染: 模块缩进辅助缓冲分配失败(256 KiB)") + MlirFail("MLIR 渲染: 模块缩进辅助缓冲分配失败(1048560 ≈ 1 MiB − 16 字节块头)") # 全局变量(MLIR 无独立类型定义行:命名结构体类型在使用处内联, # 故这里不再输出 NamedTypeHead 类型定义,仅登记供类型文本回查)