TermiNexus
7a329f7d1e
去除 import t, c 以及 FL
2026-10-17 21:58:05 +08:00
TermiNexus
7556264d22
fix(torch): vector_add_inplace 正确调用 simd_add_array
...
simd_add_array(a, b, out, n) 是整段批量函数,原先只传了 3 个参数(缺 count),且在外层每 4 个元素调用一次、每次从下标 0 重新开始。改为单次调用 simd_add_array(a, b, a, n),尾部用 n-(n&3) 起做标量补齐;顺带删掉无用的 malloc(8) 临时块。注:本次提交同时带上了该文件既有的 t.CPtr → rawptr 迁移改动。
2026-10-17 18:47:57 +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
172af1e172
fix(asm): io_wait 改为连续 4 次读备选状态寄存器 0x3F6,提供真实 400ns I/O 延时
...
原先写的是诊断端口 0x80:该端口背后没有设备,在 QEMU 上几乎不消耗时间,等于没有延时。于是 IDE 命令块寄存器 0x1F2..0x1F7 连写会丢写,LBA 寄存器残留上一次的值,导致读到别的扇区(现场:读根目录扇区 8192 却读回 ELF 文件头,目录项全是垃圾,五个 app 全部 spawn 失败;另有 waitDataReady 超时表现为 diskio.read 返回 FR_DISK_ERR)。0ee5ec5 曾为同一现场补过 io_wait 调用,但当时见效靠的是调用开销与代码节奏的余量;内核变大后被吃掉,故障必现。改为 4 次 in al, 0x3F6(真实设备端口,每次均为真实 I/O 往返),并补 CLOBBER_RAX(in al 会改写 RAX,原实现未声明该 clobber)。
2026-10-16 19:56:26 +08:00
TermiNexus
6a22633b6b
chore(string): strrchr/strstr 补 noescape 逃逸标注;builtins/zlib 微调
2026-10-16 16:40:55 +08:00
TermiNexus
49889b39c7
docs(mlirlite): README 更新
2026-10-16 16:40:49 +08:00
TermiNexus
c816f53af4
chore(mlirlite): too-many-elements 处打印 n/g/src 前缀 - 定位哪个全局数组被放大
2026-10-16 12:53:31 +08:00
TermiNexus
e9e1933a62
fix(mlirlite): 全局数组 dense 渲染缓冲提到循环外复用(消每元素~5KB泄漏) + 聚合值读取必前进(修 too many global array elements)
2026-10-16 12:04:24 +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
1aafde09fc
fix(mlirlite): 修掉上一提交里 MlirTypeText 的误用(其第 3 参是类型文本,不是 LLVMType*)
...
现场:cannot convert to MLIR type text (v1 does not cover this form): ''
- 传类型对象当文本 → 取到空串 → fail-fast;改为不调它。
- 位宽改回类型对象自带的 LLVMType.Bits(f16/f32/f64/f128 ↔ 4/8/16/32),并恢复对未知类型的
容忍(非 4/8/16/32 一律按 f64 位模式,即旧行为)。
- 逐 nibble 自写(_HexDigits)保留:真凶是 printf 对高位置位的 32 位值按符号扩展后的 64 位
打印(f32 位型 → 16 位文本,配 f32 类型被判位宽不匹配);现在位数严格等于类型位数。
2026-10-15 19:47:55 +08:00
TermiNexus
8dbad705e9
fix(mlirlite): 浮点常量位型改为逐 nibble 自写,位宽只由 MlirTypeText 决定
...
现场(f32 类型配 16 位文本):
[MLIR-FAIL] ... (type 'f32' needs 8 hex digits, value '0xffffffffc0490fdb' has 16)
即 -π 的 f32 位型被 printf 按**符号扩展后的 64 位**打印(高位置位 → 16 位),
而 _MlirFloatLiteral 按类型只收 8 位 → 整个模块编不过。
- 名字不再用 snprintf 的 %08x / %016llx / %04x,改 _HexDigits 逐 nibble 写固定位数;
位数只由 MlirTypeText(ty) 定(与 MLIR 渲染器取类型文本是同一函数)⇒ 两侧位宽构造上一致。
- 位型计算保持不变(f16 先转 half、f32 先转 float、f128 hi/lo、f64 直接取位)。
2026-10-15 19:38:52 +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
40fd9d8cf7
fix(base64): 因取消整数提升,b64decode 移位左操作数显式加宽为 uint32(修移位计数越界与静默截断)
2026-10-13 16:34:37 +08:00
TermiNexus
e0bb791119
feat(ast): 新增 bigend / littlend 类型描述符软关键字(与 const/volatile 同机制,注解位置展开为 t.BigEndian / t.LittleEndian)
2026-10-13 15:21:31 +08:00
TermiNexus
bf6403c803
fix(socket): accept/socket 非 Windows 分支补齐 u64→INT 显式窄化(out_client.fd / return / out_sock.fd)
2026-10-13 10:19:11 +08:00
TermiNexus
21154a3ab8
fix(socket): socket/accept 的 u64 handle 在 INT 目标处补显式窄化(与 213/328 对称,修隐式窄化报错)
2026-10-13 10:16:55 +08:00
TermiNexus
4aa8d399ff
fix(zlib): zbit_writer 位写入 |= 右值显式窄化为 BYTE(修 augmented assignment 右值过宽报错)
2026-10-12 21:05:48 +08:00
TermiNexus
7f82bec5d1
chore: 全仓同步 TPV→VPC 注释改名与 range(int(...)) 显式收窄适配
2026-10-12 20:59:35 +08:00
TermiNexus
44c1bc4168
fix(mlir): 窥孔取 store 值改按括号配平,修聚合类型被截在第一个逗号
2026-10-12 18:24:55 +08:00
TermiNexus
94ae0d32b7
feat(ast): 整型字面量支持显式宽度后缀 _int<N>/_uint<N>/_i<N>/_u<N>
2026-10-12 18:24:54 +08:00
TermiNexus
fb365a1707
chore: 改名同步 TransPyV -> ViperC(源码/配置内的纯替换)
2026-10-12 15:06:47 +08:00
TermiNexus
ccd7434c5a
chore: 改名同步 TransPyV -> ViperC(.gitignore/文档/脚本)
2026-10-12 15:02:19 +08:00
TermiNexus
38047cbed1
chore: 引用路径改名 TransPyV -> ViperC
2026-10-12 14:28:40 +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
244179eac7
fix(mlirlite): MLIR 模块头补齐 llvm.target_triple/llvm.data_layout 属性
...
MLIR 路径原先只在模块头写注释、不落 target triple/datalayout;而 mlir-translate
只从 MLIR 模块属性取值,project.vpj 的 llc 也没有 -mtriple 兜底,因此降级出的
LLVM IR 完全没有 target triple。后果是 opt -passes=asan 按非 Windows 目标选择
固定 shadow 偏移 1<<44,与链接的动态 ASan 运行库实际映射的 shadow 基址不一致,
第一个被插桩的访问即踩到未映射的 shadow 页而崩(现场:启动期
__traceback_install_ctor -> Install -> strcpy 读字面量)。
改为输出 module attributes {llvm.target_triple, llvm.data_layout},使 IR 头随
mlir-translate 降级带出(同时让 llc 拿到正确 target,不再依赖宿主默认)。
2026-10-11 21:21:02 +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
00ddb296ac
fix(narrow): 字节缓冲写 int/算术结果改用 char(...)(sys/_fakeduck)
...
sys.vp cmd 解析 ch:int 写 buf;_fakeduck ch±32 算术提升为 int。目标均为 bytes(i8),RHS 为 32 位,触发 32->8 隐式窄化。其余 for ch in <str> 形态 ch 是 char,同宽不报错
2026-10-11 11:58:57 +08:00
TermiNexus
0f37f2fde9
revert(narrow): 撤销 define 位掩码的显式强转(编译器已按值推断位宽)
...
TPC 已修复 CDefine 常量位宽推断(无符号 32 位高半区不再误判 i64),X | DEFINE 现为 i32;fileio access |= GENERIC_*、tarfile px.mask |= PAX_*、ast/parser node.flags |= FLAG_IS_* 无需再显式强转,恢复原写法
2026-10-11 11:46:38 +08:00
TermiNexus
7e6ed0db2e
fix(narrow): 32 位字段/变量 |= 64 位 CDefine 改用显式窄化转换
...
CDefine 常量按 64 位处理,X | DEFINE 的结果即 64 位;赋回 32 位字段触发隐式窄化(单个常量赋值有豁免,但 OR 表达式没有)。fileio access |= GENERIC_* 用 ULONG(...);tarfile px.mask |= PAX_*、ast/parser node.flags |= FLAG_IS_* 用 int(...)
2026-10-11 11:42:25 +08:00
TermiNexus
e308e6e734
fix(narrow): viperlib vsnprintf 指数符号写字节改用 char(...) 包裹三元
...
ptr[0] = <int字面量> 属常量豁免;A if c else B 是 int 三元表达式,写入 bytes 元素触发窄化。显式 char(...) 包裹 e/E 与 +/-(各 2 处,共 4 处)
2026-10-11 11:38:14 +08:00
TermiNexus
9d5028bc61
fix(narrow): byte 缓冲写 32 位掩码结果改用 uint8(...)
...
base64 解码输出、zipfile zf_w16le/zf_win32le、zlib adler/gzip 尾写:目标为 bytes/uint8*/BYTE*(8 位),RHS 为 32 位表达式,触发隐式窄化;统一加 uint8(...)
2026-10-11 11:06:02 +08:00
TermiNexus
3dd5bca28e
fix(narrow): hashlib 摘要写字节改用 uint8(...)
...
sha256/sha1/md5 的 digest 阶段把 32/64 位掩码结果写入 bytes 元素(i8),触发隐式窄化;统一加 uint8(...)(与 __sha512 一致)
2026-10-11 11:05:05 +08:00
TermiNexus
19e4ef26a2
refactor(fileio): File/FileW.write 长度形参 ULONG 改为 sizet
...
与 read_all 保持一致:长度来源多为 sizet/strlen,形参用 sizet 可避免 64->32 隐式窄化;内部对 count>0xFFFFFFFF 返回 ERR,仅在 WriteFile 处显式 ULONG(count)
2026-10-10 22:15:47 +08:00
TermiNexus
705de51459
fix(includes): 消除隐式窄化(string.strlen → int)
...
规则收紧后,6 处 string.strlen()(sizet/64 位)隐式落进 int 会报隐式窄化:argparse.vp:204/332、ast/parser.vp:3202/3203/3255/3256 改为显式 int(...);另 gzip.vp:62 的 read_all 容量去掉多余 ULONG(...)(形参已是 sizet)。
2026-10-10 22:09:59 +08:00
TermiNexus
aa88e46b5d
将 w32 库改为 win32
2026-10-10 21:58:27 +08:00
TermiNexus
1c9447dc82
refactor(fileio): read_all 容量形参 ULONG → sizet(File/FileW)
...
与 f.size()(LONGLONG)同宽,消除'64 位尺寸进 32 位形参'的隐式窄化诱因;内部 min(file_size, cap-1) 全程用 sizet,只在交给 ReadFile(ULONG) 处显式窄化,且 cap-1 > 4GiB-1 直接返回失败(单次读上限 DWORD),不再静默回绕。
2026-10-10 21:57:39 +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
0d677bc6f8
将 w32 库进行完整的清理
2026-10-10 18:03:44 +08:00
TermiNexus
7f32042c21
feat(parser): new 的类型改按注解规则解析,认 [N]T 前导数组声明符与 T* 后缀
2026-10-09 18:44:42 +08:00
TermiNexus
17b1d6bb60
feat(tarfile): 纳入 tar 归档读写模块
...
- 读:ustar 头(含 prefix 字段)、GNU L/K 长名与长链接头、PAX x/g 扩展头(path/linkpath/size/mtime/uid/gid/uname/gname)、GNU base-256 数值字段;归档整体读入内存,.tar.gz 先解压
- 写:ustar 头;路径或链接目标超长时补一条 PAX x 记录
- 用法:tarfile.TarFile(path, mode);tarfile.error() 携带失败原因
2026-10-09 15:01:02 +08:00
TermiNexus
be62587521
feat(parser): new 接受无实参括号的类型原子;回收 '*' 伪错时同步回退错误位置
...
- _parse_new_expr:类型原子(Name/Attribute/Subscript)与 T(args) 都接受,New.args 可为 None;非类型原子仍在原地 fail-fast(不让错误漂到 class 未注册那种远处)
- _parse_type_ann 的 ptr_level 回收只还了 error_count,没还 _g_parse_err_line/_col/_msg;而 _record_parse_err 只记第一条,于是 : char*(行尾 '*' 被当乘法、右操作数缺失)留下的过期位置会顶掉后面真正的语法错误(现场:EscapeTest 第 13 行 new stack char 被报成第 6 行)
- 回退判据用记录是否在本次解析中改变:快照已非 0(更早的真错误)时回退是空操作
2026-10-09 14:55:43 +08:00
TermiNexus
bfc773787d
feat(lifetime): stdlib.free 标注 @life(willFree(p)),声明实参在调用后失效
...
P2 标注驱动:编译器据此把调用点对应实参变量标为已失效,其后读/传/再 free 报 LifetimeError。
2026-10-08 21:28:55 +08:00
TermiNexus
770e389360
fix(argparse): 字符串参数的 NULL 默认值不再写入
...
NULL 默认值写进结果会让键存在但值为 NULL:has() 误报参数已给出,函数末尾的 required 检查对字符串参数永远不触发。改为 default_str 为 None 时跳过写入。
2026-10-08 20:35:17 +08:00
TermiNexus
788c52b749
fix(tomllib): 单引号处误用双引号字符串,改为字符字面量
...
char 形参与 char 比较位置写成「双引号包单引号」(实为 i8* 字符串):形参处报 CastError(implicit pointer-to-integer),比较处被 C 哨兵规则静默 ptrtoint 成恒假(TOML 单引号字面量字符串根本解析不出来)。7 处统一改成字符字面量,与 lexer.vp 同款写法一致。
2026-10-08 20:03:34 +08:00
TermiNexus
76deaa27bf
feat(mlirlite): 新增 IRBuilder.build_store_at_entry,支持在入口块写入以建立支配关系
...
M3 owned slife 的所有权影子标志必须在函数入口块置 0:赋值语句可能落在 if/while 里而运行期不执行,那种路径上出口 free 的是未初始化栈垃圾。实现照搬 build_alloca_at_entry:文本插到入口终止符之前,保证支配所有路径。
2026-10-08 20:03:33 +08:00
TermiNexus
77c8d4f9e4
chore: 纳入 ctraits.vpnci 与 tomllib/(与已删除的 ctraits.vpi 配套)
2026-10-08 17:50:26 +08:00
TermiNexus
e25e8958f0
WIP 快照:includes 现有改动(含 M2.4 new 描述符的语法支持)
...
语法侧(M2.4):ast/base.vp 枚举尾部追加 ASTKind.New;ast/exprs.vp 新增 NEW_SRC_*/NEW_LIFE_* 与 class New;ast/parser.vp 新增 _is_new_expr/_parse_new_expr(new 为软关键字,不进 Keyword 表,new=1/new.x/new(1) 仍是标识符);ast/__init__.vp 再导出 New 与常量。
其余为既有 WIP 改动一并快照,保持基线一致(39 文件,+312/-237)。
未纳入:ctraits.vpi(已删除)、ctraits.vpnci、tomllib/(均未跟踪)。
2026-10-08 17:45:31 +08:00
TermiNexus
e3cdb190dc
fix(os): _posix._stat 改为 _mbuddy 堆分配,消除返回栈地址的悬垂
...
_stat 原在栈上构造 posix.Stat 并返回其地址,函数返回后指针悬垂(与其 docstring 声明的 '_mbuddy 分配、调用方 free' 不一致)。改为按契约堆分配,失败时 free。
2026-10-08 12:10:30 +08:00