32 Commits
Author SHA1 Message Date
TermiNexus c9a868d03f feat(mlirlite): carry raw LLVM and raw MLIR function bodies 2026-10-27 14:13:33 +08:00
TermiNexus 1b21d58be3 fix(mlirlite): 消除 IR 文本缓冲与解析器的静默截断
构建器:_append_cstr 装不下时改调 MlirFail(原先静默截断会让 switch 少 case、asm 半截、call 少参数);新增 _line_cap_for 按实际片段长度分配行缓冲,覆盖 load/store、12 种转换指令、gep/gep_array/gep_struct、phi、switch、select、atomicrmw、cmpxchg、va_arg、inline asm;build_call 的 callee 不再按 128 截断,参数槽从 32 放宽到 64。解析器:_mlir_read_value/_mlir_read_type 超限即 MlirFail,不再悄悄少写;所有值/类型/符号 scratch 由 512 提到 4096,调用点容量同步;_replace_ssa_numbers 改为两遍精确分配(原 2x 估算会半行截断);全局初始化器的聚合 token 与 addressof 符号名同样改为 4096 + fail-loud;TypePrint 的 "..." 占位现在会置 _MlirTypeTrunc,由 TypePrint 统一报错。
2026-10-17 17:57:40 +08:00
TermiNexus 1eb46faa41 fix(mlirlite): T2「store→load 转发」改为类型感知(跨类型 load 不再被按名替换)
现场(位拷贝早期实现写成 `load i64, ptr %xv`):
  697:16: error: use of value '%x' expects different type than prior uses: 'i64' vs 'f64'
    llvm.store %x, %0 : i64, !llvm.ptr
—— T2 转发是纯**按名字**替换的:把 `store double %x, ptr %xv` 的 %x 顶进了那条 i64 行。

- 扫描时同时记录 store 存值的**类型文本**(括号配平读)与每个 load 的**声明类型文本**
  (同样括号配平,读到第一个顶层 ',' 或空格);
- 仅当**所有 load 的声明类型都与存值类型一致**时才转发,否则整槽放弃(保守,IR 始终合法);
- 同类型槽(标量/指针/聚合的常见情形)转发不受影响:聚合两侧读法同口径,不会因文本截断白丢。
2026-10-15 20:18:59 +08:00
TermiNexus 32b631ef6f feat(mlirlite): float 位模式位宽不匹配的报文带上类型/常量文本/实际位数
- 只报'宽度不匹配'无法定位是哪条常量(本次现场只能靠二分源码才找到);补上
  (type, want, value, nd) 后一眼可见,与 _MlirConstFail 同风格。
- 同一文件里还带着你之前未提交的改动(函数属性渲染:_MlirFuncAttrs / _SC_Attr /
  AttrGroup 语义注释等),一并入库;如需拆分请示意。
2026-10-15 19:26:16 +08:00
TermiNexus 44c1bc4168 fix(mlir): 窥孔取 store 值改按括号配平,修聚合类型被截在第一个逗号 2026-10-12 18:24:55 +08:00
TermiNexus fb365a1707 chore: 改名同步 TransPyV -> ViperC(源码/配置内的纯替换) 2026-10-12 15:06:47 +08:00
TermiNexus bca23ffa06 fix(mlirlite): MLIR 间接调用点也过 alias 解析,callee 不再悬空
no-op bitcast(含函数指针 bitcast)被 alias 机制省略后,参数用法会改写成别名目标,
但 llvm.call 的 callee 位置原样写出 → 悬空 %N,mlir-opt 报 use of undeclared SSA value /
definition of SSA value has type 'i8' but previously used here with type '!llvm.ptr'。

- _MlirCall:callee 走 _MlirResolve,并用解析后的名字判断直接/间接调用
  (别名解析可能把 callee 指到 @符号,那就成了直接调用,不能再写 !llvm.ptr)
2026-10-12 13:18:51 +08:00
TermiNexus 4914311014 fix(mlirlite): 常量表与自动常量名空间(%c<seq>)按需扩容
原实现三处都钉死在 MLIR_CONST_CAP(512):常量表满 → MlirFail("constant table overflow")、%c0..%c511 用尽 → MlirFail、_MlirMarkUsedCName 里"更大的后缀不可能冲突"的假设。这些只是资源限制,不该中断编译。

- 新增 _MLIR_ConstCap 活容量与 _MlirConstGrow(池内翻倍扩容常量表 + 已用名表并拷贝旧内容)
- 常量表满、名字空间用尽改为扩容后重试;_MlirMarkUsedCName 记录任意 c<digits> 并先扩容再置位
- _MlirTablesInit 按活容量分配/清零,复用分支保留已扩容容量
2026-10-12 12:40:20 +08:00
TermiNexus cc7cfdb4af fix(mlirlite): alias 表按需扩容;工厂改 new memgr;define 位宽/截断配套
- mlirlite/__function.vp:_MlirAliasAdd 的 512 条硬上限改为 _MlirAliasGrow 池内翻倍扩容,不再把资源限制当编译错误
- mlirlite 类型工厂改 new memgr(pool) 返回值(消除栈逃逸);__module.vp 补 triple/datalayout
- viperlib.get_digit_count 用 uint(base) 显式声明无符号除法语义(新 AugAssign 符号规则)
- string.vp:strcpy/strcat/strncpy/strncat/memset/memset32/memcpy/memmove 加 @life(noescape(...))
2026-10-12 12:38:15 +08:00
TermiNexus 6bd5a6e7a4 refactor(mlirlite): 语法迁移(rawptr/novirtual/解引用写入) 并修正 DerefAs 迁移为整对象拷贝
REnum 变体构造(*LLVMType.X(...))返回的是栈 alloca 地址,不能跨帧存活;原 c.DerefAs(ptr, LLVMType.X(...)) 是'同帧 load+store 拷贝'。机械迁移成 *ptr = LLVMType.X(...) 会把栈地址写进 pool 缓冲并返回(栈逃逸),导致 SpecTypeBits 读到非变体返回 0(现场: enum 宽度推断失败)。改为 *ptr = *LLVMType.X(...) 恢复同帧整对象拷贝;*result_ty_ptr = *result_ty 同理
2026-10-11 12:47:06 +08:00
TermiNexus 466c777f34 feat(mlirlite): 常量渲染失败时报出 (类型, 值),便于定位 unsupported constant operand form
MlirFail 无栈回溯,原报文只有 'unsupported constant operand form',无法判断是哪种非常量形态(指针/聚合类型字面量或常量表达式)。新增 _MlirConstFail:把 MLIR 类型文本与常量文本一并打印。
2026-10-10 20:07:03 +08:00
TermiNexus 825919b202 fix(compiler): 修复 ViperApps 暴露的 3 处缺陷(vqt6 返回注解 / MLIR 常量命名 / scratch 复用)
1) vqt6/__init__.vp:6 处类实例返回注解由引号前向引用(QAction/QMenu/QTreeWidgetItem)改为 T*——引号前向引用解析为结构体值类型,而实例是指针,致 QAction Foo*→Foo CastError(4 个 Qt 系工程失败)。

2) mlirlite/__function.vp:常量自动 SSA 名 %cN 避让用户同名标识符(形参 c1/c2 与常量 %c1 冲突 => mlir-opt redefinition of SSA value,致 ViperMNIST 失败)。

3) mlirlite/__function.vp + __module.vp:新增 MlirTablesReset,使打印窗口内的表/scratch 跨函数复用(原每函数分配约 153KiB 且窗口内不回收 => 1GiB 主池被榨干,致 ViperFLProject parse scratch allocation failed)。
2026-10-07 08:48:03 +08:00
TermiNexus 587d989dec chore(messages): includes 运行时中文字符串英文化
把 includes 下 11 个文件(memhub 94、mlirlite/__function 71、ast/parser 54、mlirlite/__module 41、mlirlite/__types 28、ast/lexer 8、ast/tokens 4、sys 2、traceback 1、mlirlite/__builder 1、requests/https 1)的运行时诊断/报错字符串(OOM/MEM/FREEFRAME/MLIR 报错/AST 报错/栈转储横幅等)由中文改为英文。

口径:只改字符串字面量内部文字,行数零变化(+307/-307);printf 格式符与转义序列的多重集合逐一校验不变(_strcheck 异常 0)。验证:三重重编 SUCCESS(184.28s)+ 全量 77/77 顺序回归通过 + VET 编译 SUCCESS / --search-paths 7 条 exit 0。
2026-10-06 12:23:45 +08:00
TermiNexus 03450a71ff fix(mlirlite): 局部窥孔优化每个函数体只执行一次
PrintModule 会按 STUB/TEXT/FULL 三次 dump 同一模块,而 FunctionPrint 每次都跑 _peephole_opt;T2(entry-slot store→load 转发)不是幂等变换,第二遍会误删仍有 load 指向的 entry alloca,留下悬空 SSA 名(mlir-opt: op using value defined outside the region)。给 Function 加 PeepDone 守卫,优化只作用于 builder 产出的原始文本。
2026-10-05 19:58:39 +08:00
TermiNexus 0055ab7ea7 refactor: rawptr[T] -> T* 与 t.CConst 前缀迁移(R14/R16)
R14:rawptr[X] -> X*(41 文件 / 2037 行改动),X 含模块限定名与嵌套下标(rawptr[GSList[NameEntry]] -> GSList[NameEntry]*)。保留 6 处 rawptr[t.CPtr](规范例外:存纯裸指针);# 注释与字符串里的 rawptr[...] 属元语法描述,未动。 R16(保守子集):t.CConst | str/bytes -> const str/bytes,t.CConst | char | t.CPtr -> const str;typedef 右值位置豁免(const str 在该处无法注册,与 R1 同源)。 验证:TPC 自举三重重编 SUCCESS;TransPyV.exe 全量 77/77 顺序回归通过。
2026-10-05 17:38:21 +08:00
TermiNexus e71daeea0e docs(includes): R11 注释英文化——75 个文件的中文注释改写为英文短注释
按规范「注释只讲解作用,不掺杂历史原因,尽量英文」:把 includes 下 75 个 .vp 的中文 # 注释与三引号 docstring 改写为英文,每个注释块压到 2 行以内。

保留要点:作用、约束、危险警告(不得/必须/注意)、ABI 与类型约定(如 BYTEPTR | t.CPtr = i8** 的跨模块坍缩坑)、位宽/长度约定、fail-fast 要求、内存与句柄所有权。

未动:文件头注释(规范豁免,仍是中文)、运行时中文字符串常量(printf / fatal_error / MlirFail 等用户可见消息,属代码字面量)。

验证:独立脚本比对 HEAD 与工作区的代码骨架(剥离 # 注释与三引号 docstring 后的非空行)——75 个文件逐字节一致;行尾 CRLF/LF 未被改动;全文剩余中文仅 547 行头注释、0 条行尾注释。bootstrap 三重重编 SUCCESS;全量 77/77 顺序回归通过。
2026-10-05 16:18:44 +08:00
TermiNexus 27121f56a7 refactor(includes): R12 下标 while 循环改 for range,R13 c.Set 迁移为赋值
R12(wiki/新规范 L27-39):把「i: int = 0 与 while i < N: … i += 1」形式的下标循环改写为「for i in range(N):」。保守判定:仅当条件为裸 NAME < EXPR、循环体无 continue、NAME 在体内无其它赋值、无嵌套重绑定、循环后同层不再引用 NAME 时才改写。共 269 处 / 48 文件。

R13:c.Set 是正在退化的路径——c.Set(*p, v) 期望写作 *p = v,c.Set(a, b) 等于 a = b。本次把 includes 内 45 处 c.Set 全部迁移为赋值,includes 已无 c.Set 调用。

验证:bootstrap 三重重编 SUCCESS(无 vast_c 解析回退);全量 77/77 顺序回归通过;ZlibTest 内部断言 79 passed / 0 failed。
2026-10-05 15:33:52 +08:00
TermiNexus e80284a6d5 refactor: 全量迁移 includes 到新规范语法
按根目录 新规范 迁移 R1/R2/R3/R4/R6/R7/R8/R9:指针 T* 后缀、内建类型短别名、c.Addr/c.Deref 单目化、c.Asm 改 __asm__、t.CDefine 改 define 软关键字、t.CEnum 改 enum。R4 对内建 cast 多参实参保留 c.Deref 原写法(单目化会致 TPC 类型退化)。验证:includes 52/52 编译通过,TransPyV 自举产物顺序回归 77/77 全通过。
2026-10-05 09:04:46 +08:00
TermiNexus aecdf27132 feat(mlirlite): 新增调用点记录 API 供 --traceback 旁文件(关闭时零开销)
新增 DebugSetEnabled / DebugNoteFunc / DebugClearFunc / DebugNoteLine /
DebugResetFunc / DebugTakeText 与内部 _DebugNoteCall;build_call 在启用时把
(调用方, 被调方, 当前源行) 追加到可增长文本缓冲,供每模块 DebugTakeText 取出
写 .vpcall。默认(未开 --traceback)不启用,输出不变。
2026-10-04 22:38:07 +08:00
TermiNexus 68fe839da9 fix(mlir): 类型文本缓冲成对扩容(scratch 尺寸 + 各处 cap)
重编 TransPyV 自身时触发类型文本截断护栏:
  [MLIR-FAIL] MLIR 渲染: 类型文本超出输出缓冲被截断(该处缓冲过小,需按类型长度增大)
  (PhaseA ./TransPyV/App/lib/core/CompilerFactory.vp)

根因:内联具名结构体在使用处展开完整字段体,类型文本可达数百字节,而
_append_cstr / MlirTypeText / TypePrint / _MlirTypePrintDepth 的定长
cap(256/512/1024/2048)与对应 scratch 缓冲偏小。

修复(cap 与底层缓冲**成对**放大,保证 cap ≤ 缓冲,绝不越界):
- _MlirTablesInit:_SC_Ty/_SC_Ty2/_SC_Mt/_SC_Buf/_SC_B1/_SC_B2 512→4096、
  _SC_Tmp2/_SC_IdxT 1024→4096、_SC_ArgTs 2048→8192、_SC_Tmp 4096→8192;
- 以"别名 → 缓冲尺寸"追踪脚本放大各调用点 cap(77 处,含被当作 cap 缓冲使用的
  pool.alloc 同步 512/1024→4096),如 _MlirGep 的 idxt/bmt、_MlirCall 的
  argts/rmt/vftys、_MlirNamedStructAppend/TypePrint 的 tmp/rfb/tmp3 等;
- __builder.vp 的 _TY_TEXT_CAP 512→2048(类型文本内嵌缓冲 + cap;arg_cap 由它
  推导,不宜过高以免多参调用单次分配逼近模块池单块上限)。
2026-10-04 19:56:42 +08:00
TermiNexus f95eb8016b fix(mlir): i1 常量物化用裸布尔关键字(true/false 不带 : i1)
mlir-opt 报:
  error: expected ')'
      %c7 = llvm.mlir.constant(false : i1) : i1

`true`/`false` 是 MLIR 的裸布尔关键字,不能再带类型后缀(其余标量必须写
`值 : 类型`)。

修复两处常量物化:
- `_MlirEmitOneConst`(函数内常量);
- `_MlirGvEmitConst`(全局初值 region 叶子 op)。

README §2.3 常量表补 i1 行。
2026-10-03 22:11:45 +08:00
TermiNexus a7aaed01f4 fix(mlir): LLVM intrinsic 调用改走 llvm.call_intrinsic,声明不输出
mlir-translate 是**程序化构造** LLVM IR,不像 LLVM 的 IR 解析器那样把旧式
intrinsic 名 upgrade 成带类型后缀的形式。原先 `@llvm.va_start` 走普通
llvm.call,且 declare 被原样输出为 `llvm.func @llvm.va_start`,降级得到未
mangle 的 `@llvm.va_start`,LLVM 校验报:

  Intrinsic name not mangled correctly for type arguments!
  Should be: llvm.va_start.p0
  ptr @llvm.va_start

修复:
- `_MlirCall`:裸符号名以 `llvm.` 开头(且非 `llvm.mlir.*`)的调用改渲染为
  `llvm.call_intrinsic "llvm.xxx"(...) : (...) -> ...`,由 mlir-translate
  按操作数类型自动 mangle 名字(llvm.va_start -> llvm.va_start.p0);
- `FunctionPrint`:intrinsic 的 declare **不输出**(否则残留的
  `llvm.func @llvm.va_start` 仍会触发同一校验错误)。

README §2.1 映射表补 intrinsic 行,§2.9 新增 ③′ 说明。
2026-10-03 22:05:30 +08:00
TermiNexus aa94d67183 fix(mlir): GEP 常量索引写字面量并修正类型列表
mlir-opt 的 llvm.getelementptr 要求“索引到结构体”的索引必须是常量字面量,
而 _MlirGep 原先把常量索引经 _MlirOperand 物化成 SSA 操作数(%cN),
触发 verifier:
  error: 'llvm.getelementptr' op expected index 1 indexing a struct to be constant

按 MLIR LLVMDialect 的定义修正为官方形态:
- 常量索引 -> 整数字面量([0, 1]),不物化、不占类型位;
- 仅 SSA 索引物化为操作数,其类型进入 (...) 类型列表。

同步修正 README §2.1 映射表(原 [%c0, %c1] : (!llvm.ptr, i32, i32) 形态错误),
并在 §2.3 补充“常量必须物化”的 GEP 索引例外说明。
2026-10-03 21:33:25 +08:00
TermiNexus bff0f20f51 fix(mlir): 模块/函数输出缓冲截断响亮报错 + 缩进辅助缓冲 64 KiB → 1 MiB
dump_ir 的输出缓冲(8/16 MB)此前用 _append_cstr **静默**丢内容 —— MLIR 文本因
内联具名结构体完整字段体而明显长于 LLVM IR,一旦超出就得到被截断的半截模块,
mlir-opt 只会报难以定位的语法错。

- __module.vp:_append_cstr 写入被截断时置 _MlirModOutTrunc;LLVMModulePrint
  结束前检查并 MlirFail;模块缩进辅助缓冲 64 KiB → 1 MiB(tmp_cap),并把该
  缓冲分配失败也改为响亮报错(否则会静默漏印全部模块成员)
- __function.vp:_append_cstr 写入被截断时置 _MlirOutTrunc;FunctionPrint
  三个出口(declare / 无基本块 / 正常结束)均检查并 MlirFail
2026-10-03 21:15:34 +08:00
TermiNexus 33d5737f0c feat(mlir): 补齐 f16/f128 浮点位模式物化
ConstFloat 现按类型宽度产出位模式:f16 → 0x%04x(t.CFloat16T 按 half 舍入后取
2 字节)、f32 → 0x%08x、f64 → 0x%016llx、f128 → 高低两个 64 位字拼成 32 位
十六进制(t.CFloat128T 为 double 的无损扩展;c.Load 的宽度取源指针 pointee,
故源显式转成 u64*,避免按 16 字节写入 8 字节目标而越界)。name_buf 由 32 增至
64(f128 文本需 35 字节)。

- _MlirFloatLiteral 接受 f16/f128 原样直通,并新增“位模式位数与类型是否相符”
  强校验(f16/f32/f64/f128 ↔ 4/8/16/32 位十六进制;MLIR 按类型宽度解释该十六进制值)
- README §2.3 常量表 / §5 打印阶段转换说明同步
2026-10-03 20:52:02 +08:00
TermiNexus f813c0543b fix(mlir): 浮点常量位模式原样直通,消除 %e 截断精度
MLIR FloatAttr 语法支持十六进制位模式(Builtin Dialect:
`hexadecimal-literal ':' float-type`,按底层二进制位解释),故 ConstFloat 产出的
`0x…` 无需转十进制。此前 _MlirFloatLiteral 把它转成 `%e`(默认 7 位有效数字):
3.141592653589793 → 3.141593e+00,静默截断,与 __values.vp 选位模式的初衷相悖。

- _MlirFloatLiteral:hex 且 mt 为 f32/f64 → 原样返回(无损);
  f16/f128 仍响亮报错(ConstFloat 只产出 64 位位模式,宽度与该两类型不符)
- 删除因此失效的 _MlirParseHexU64
- README §2.3 常量表 / §5 打印阶段转换说明同步
2026-10-03 20:35:37 +08:00
TermiNexus 7b006c96a0 feat(mlirlite): 补齐 Debug Info 同形 API,导出名集与 llvmlite 一致(215=215)
- __module.vp: 新增 DINode/DINamedMeta 类、LLVMModule 追加 6 个 DI 字段(96->144B)、module_add_di_node/module_add_named_metadata 及实例方法、DI_NODE_SIZE/DI_NAMED_SIZE

- __function.vp: Function 追加 DbgRef(80->88B) + function_set_dbg

- __builder.vp: IRBuilder 追加 DbgLoc(32->40B) + set/clear_debug_location 方法 + 顶层 builder_set/clear_debug_location

- __init__.vp: 导出上述 7 个 DI 名字,恢复与 llvmlite 的逐名同形(215=215)

- MLIR 打印阶段忽略 DI:LLVMModulePrint 不输出 !N 元数据、_emit 不读 DbgLoc,保持 MLIR 语法合法(DI 只记录不输出)

- README: 记录 DI 为「同形保留/只记录不输出」,名字数更新为 215
2026-10-03 07:43:03 +08:00
TermiNexus 31b0f79ed2 Revert "fix(includes): llvmlite/mlirlite/torch 的分配器形参放宽到基类 MemManager"
This reverts commit 9b1399b627.
2026-09-29 15:48:06 +08:00
TermiNexus 9b1399b627 fix(includes): llvmlite/mlirlite/torch 的分配器形参放宽到基类 MemManager
【类别 c 源码违规(库侧接口过窄)】编译器判据没错——兄弟类指针相转本就该禁;
错在库侧把「分配器」形参写死成了具体类,比它实际需要的契约窄一层。

现象:
  编译 Test/LLvmLiteTest/App/main.vp 报
  CastError: 指针隐式转指针已禁止:被指类型是非基本类型;源类型
  %"c8dff2457a2f7a42.MemPool"* → 目标类型 %"c8dff2457a2f7a42.MemBuddy"*
  现场:`pool: memhub.MemPool | t.CPtr = memhub.MemPool(pool_mem, POOL_SIZE)`
  之后 `test_type_print(pool)` → 传进 llvmlite 的 `pool: memhub.MemBuddy*` 形参。
  (MLIRLiteTest 同理,也传 memhub.MemPool。)

根因:项目自身约定是「分配器参数写基类」,只有这两个 lite 模块写成了具体类:
  · includes/ast/* 全库:`pool: rawptr[memhub.MemManager]`(base.vp/astaux.vp/exprs.vp…)
  · includes/vector.vp:13:`def __init__(self, pool: memhub.MemManager*, ...)`
  · 而 includes/llvmlite/* 128 处、includes/mlirlite/* 141 处、includes/torch/* 3 处
    写的是 `pool: memhub.MemBuddy*`。

判据(全部可取证,非猜测):
  1. `MemManager`(memhub.vp:321 `@t.CVTable`)声明虚接口 alloc/free/reset
     (:333 / :337 / :341),注释明写 "Virtual functions (overridden by subclasses)";
  2. `MemPool`(:420/:437/:441)、`MemSlab`(:552/:574/:590)、`MemBuddy`(:1454/:1696/:1846)
     各自覆盖,故基类指针 + 虚分派对三种分配器都成立;
  3. 这三个模块对 pool 只调用 alloc/free(llvmlite 124/2、mlirlite 173/2、torch 4/0),
     两者都在基类虚接口上,没有任何 MemBuddy 专有方法(无 alloc_tagged/realloc);
  4. 三个模块内 `memhub.MemBuddy` 除该形参外**无其它出现形态**(已逐行分类核对,
     无 __mbuddy__ 字段、无 MemBuddy(...) 构造)。

修法:272 处类型放宽 `pool: memhub.MemBuddy*` → `pool: memhub.MemManager*`
  llvmlite 128(__builder 45 / __types 27 / __module 16 / __function 15 /
    __init__ 12 / __values 7 / __verify 6)
  mlirlite 141(__builder 44 / __types 37 / __module 18 / __function 17 /
    __init__ 12 / __values 7 / __verify 6)
  torch 3(__init__.vp)
  其中 8 处是「持有 pool 的字段/模块级单例」声明,由已放宽的形参直接赋值
  (self.Pool = pool / ptr.Pool = pool / _MLIR_Pool = pool / _MlirGvPool = pool),
  必须同步放宽,否则赋值本身会变成下转:
    llvmlite __builder.vp:32 / __types.vp:314 / __init__.vp:354 的 `Pool:`
    mlirlite __builder.vp:32 / __types.vp:316 / __init__.vp:363 的 `Pool:`
    mlirlite __function.vp:1153 `_MLIR_Pool` / __module.vp:881 `_MlirGvPool`

这是**放宽**(接受基类)而非放宽判据:原调用方(TransPyV 等一律传 MemBuddy)不受影响
(MemBuddy* → MemManager* 是继承上转,合法),MemPool*/MemSlab* 调用方变为合法。
未动 argparse 的 2 处 `pool: memhub.MemBuddy* = None`(其调用方传 MemBuddy,无过窄证据),
也未动各处 `_mbuddy: memhub.MemBuddy*` 全局单例(由 main 显式赋 MemBuddy 实例)。

实测:`git diff` 272 增 / 272 删,逐行核对**全部**为 pool/Pool 类型行,无其它改动混入。
2026-09-29 15:37:28 +08:00
TermiNexus 0212bd942c fix(includes): 槽视图改为 cast 到声明类型(地址 → 二级指针不再隐式转换)
【类别 c 源码违规】`slot: <A> = t.CPtr(addr)` 把一级指针(i8*)隐式塞进二级注解
(i8** / X**),违反 2026-09-28 收紧的「指针级数必须相同」。TransPyV 侧 coerce
没有「值侧是显式 cast」豁免(ExprGenBase._ptr_cast_reason 先比层数),故回归测试
在 includes/llvmlite/__function.vp:950 首爆:
  指针隐式转指针已禁止:指针层数不同(源 1 级 → 目标 2 级);源类型 i8* → 目标 i8**。

判据(按注解层数分类,不枚举调用点):
  · str / bytes 本身即 i8*(含一层),再 | t.CPtr ⇒ i8**(槽里存的是 str)
  · str* / bytes* 同 str | t.CPtr(i8**)
  · T | t.CPtr:T 为指针特化时 ⇒ X**(如 list[X*]、list[str])
  · A | t.CPtr | t.CPtr:逐层叠加 ⇒ 二级(如 hashtable 的 value 槽)
  一级注解(int | t.CPtr = i32*、t.CUInt64T | t.CPtr = i64*、类名 | t.CPtr = X*)
  与 i8* 同级且 i8* 是通用指针通配 ⇒ 本可编译,一律保持原样不动。

修法:RHS 改为**cast 到声明类型**,即「注解写什么就 cast 什么」——
  `t.CPtr(addr)` / `(t.CPtr)(addr)` / `rawptr(addr)` → `(A)(addr)`;
  `str*` 注解沿用 sys.vp 既有写法 `str*(addr)`(等价于 `str | t.CPtr` 强转)。
显式写明目标类型后,层数与被指类型均由程序员给出,编译器无需任何豁免。
与 TransPyV/App CallGenCBuiltin.vp 的 `cl_ptr: str | t.CPtr = (str | t.CPtr)(cl_addr)`
以及 includes/vector.vp 的 `dst: T* = (T*)offset` 同一写法。

本仓改动 27 处 / 5 文件:
  _list.vp 7
  _dict.vp 9(8 处槽视图 + L63 的 `key_ptr: str* = rawptr(...)`)
  hashtable.vp 6(含 3 处 …|t.CPtr|t.CPtr)
  llvmlite/__function.vp 2
  mlirlite/__function.vp 3(2 处槽视图 + _mlir_slotp 的 return:该函数返回注解
  即 str | t.CPtr,其 return 同属「i8* → 二级」)

未动其它一级注解站点,例如 _dict.vp 的 int/float/t.CDouble/t.CInt | t.CPtr、
hashtable.vp 的 t.CUInt64T | t.CPtr、argparse.vp:168 的 Argument | t.CPtr。
2026-09-29 15:10:33 +08:00
TermiNexus db3be6968f fix(memhub,gzip): 内存池 OOM 归属画像与 free 拒绝现场;gzip 注解 *= 词法粘连
memhub: alloc 失败打印归属 site/ctx 与存活块 order 分布(新增 dump_alive_orders);free 被 _is_valid_ptr 拒绝时首次打印现场;接通 big_alloc_count

gzip: ub: uchar*= buf 补空格(*= 被词法合并为单 OP,注解止于 uchar)

新增 traceback 模块;删除 dbgstack.vp;其余模块随新语法与尺寸口径同步
2026-09-26 19:27:24 +08:00
TermiNexus 0f556463e7 修正了部分代码的表达方式,最后可用版本,mlirlite 已基本完善 2026-09-23 17:42:03 +08:00