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 |
|
TermiNexus
|
785e825518
|
清理了 t.CVoid
|
2026-09-16 16:07:35 +08:00 |
|
TermiNexus
|
40f5bf46e3
|
perf(llvmlite): Function 追加 NameLen 字段并新增 function_get_name_len 访问器
在 Function 末尾追加 NameLen(创建时一次算好,恒等于 strlen(Name)),FUNC_SIZE 72 改为 80,既有字段偏移不变(复用原 4 字节对齐填充)。
new_function 统一初始化以覆盖全部创建路径;Name 全仓无二次赋值,故 NameLen 与 strlen(Name) 终生恒等。新增 function_get_name_len 并在 __init__ 导出,供跨模块绕过 stub 取长度,替代对函数名的反复 strlen 热点。
|
2026-09-14 08:26:17 +08:00 |
|
TermiNexus
|
c4fe8bd496
|
perf(llvmlite): 窥孔 alloca 判定加首字符短路并消除逐行 strlen
_peep_is_alloc_of 增加首字符预筛、两个调用点同步加守卫,避免逐行乘逐槽的 strncmp 与函数调用(该点实测约 439 万次 strncmp)。
_peep_replace_token 预扫改为以 NUL 为界单趟扫描,strlen(line_buf) 后移到命中之后,无命中调用不再求长(该点实测约 134 万次 strlen)。均保持逐输入等价。
|
2026-09-14 08:21:37 +08:00 |
|
TermiNexus
|
64194f8b78
|
perf(llvmlite): peephole 循环外提 strlen 并降低 strstr/strchr/strncmp 调用
_peep_last_ref_eq/_peep_replace_token 增加长度入参,由调用方(槽扫描外)预求 strlen(a_name/tok/repl),消除 766 万+182 万次重复求长;最后一个 % 改为单趟扫描(不再逐跳 strchr);strncmp 前先比首字符。
新增 _peep_is_alloc_of:以「先比名字再定位子串」等价替换按行 strcmp(_peep_alloc_name),把 strstr 从 O(槽数x行数) 降为仅命中行调用。语义逐输入等价。
|
2026-09-13 22:14:18 +08:00 |
|
TermiNexus
|
44e0e898d3
|
fix(llvmlite): _append_cstr 缓存一致性校验, 修复多模块轮流写同一 buf/池地址复用导致 FunctionPrint 追加落到 NUL 后(LLvmLiteTest Test5/9 模块函数丢失)
|
2026-09-09 21:10:06 +08:00 |
|
TermiNexus
|
f53c2216aa
|
'基线重置,修复了一些 bug,fix(llvmlite): build_alloca_at_entry 在已终止入口块后在 br 后追加 alloca 致非法 IR嵌套循环(如 LoopTest.test_nested_loop 内层 for)内联新建循环变量 alloca 时,入口块已以 br 终止,block_append_text 把 alloca 追加到终止指令之后,生成不可达指令,llc 报 "instruction expected to be numbered %N or greater"。改用 block_insert_text_before_terminator:未终止等同追加,已终止插到终止指令之前;编号乱序由 RenumberSSA 重排处理。'
|
2026-09-07 15:05:50 +08:00 |
|
TermiNexus
|
62bceb6930
|
debug(chain): Renumber block 野值打印扩展为邻域快照(Params/Blocks/容器指针)
[DBGCHAIN] block 野值时一并输出 func.Params(Head/Tail/Count)、Blocks 容器/Tail/Count、func 指针,便于定位写入源。用后移除。
|
2026-09-05 15:04:46 +08:00 |
|
TermiNexus
|
21b4246ea4
|
debug(chain): RenumberSSA 全链验证 + PrintModule param/Params 野值护栏扩展
[DBGCHAIN] 临时诊断追加:RenumberSSA 前校验 func.Blocks/Lines/line.Buf/Len 指针合理性;PrintModule 增加 Function.Params 与 param 指针护栏(含归属函数名打印)。用后移除。
|
2026-09-05 14:58:32 +08:00 |
|
TermiNexus
|
2992674783
|
feat(types): rowptr/REnum 迁移工作区快照 + GSList/PrintModule 临时 DBGCHAIN 护栏
把此前未提交的 rowptr 迁移整体入库(42 文件,含 ast/llvmlite/hashlib/json/zlib 等签名 rowptr 化)。临时诊断(用后移除):linkedlist.vp GSList[T].append 链完整性四检、__module.vp PrintModule Function.Params/param 指针野值护栏([DBGCHAIN] 前缀 + fflush + exit)。
|
2026-09-05 14:51:40 +08:00 |
|
TermiNexus
|
18642a9c23
|
debug(llvmlite): function_set_attrs 添加调用诊断,确认属性是否写入函数
|
2026-08-26 20:35:14 +08:00 |
|
TermiNexus
|
4ce6095359
|
修正
|
2026-08-22 09:25:46 +08:00 |
|
TermiNexus
|
5e768a9831
|
更新了库
|
2026-08-19 05:11:35 +08:00 |
|
TermiNexus
|
14ff9d109f
|
从 TransPyC 主项目中分离 VRTE
|
2026-08-17 11:01:35 +08:00 |
|