Commit Graph
6 Commits
Author SHA1 Message Date
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