TermiNexus
|
d6b87da063
|
fix(viperc/attr): 不再要求 import c 才认 @__attribute__(否则函数属性被静默丢弃)
ast/parser.vp 的 _DesugarMagicAttribute 会把用户写的 `@__attribute__(...)` 脱糖成
`@c.Attribute(...)`,此处看到的 `c.` 前缀是编译器自己产生的(用户并未写 `@c.Attribute`)。
原先这里要求 is_module_imported(...,"c"),用户没写 `import c` 时整条装饰器被静默丢弃,
stackrealign / always_inline 等函数属性全部失效。现去掉该守卫,与 extract_func_section
(本就没有此守卫)保持一致。
|
2026-10-14 16:42:16 +08:00 |
|
TermiNexus
|
0f2675e794
|
fix(viperc/codegen): Win64 变参提升按实参符号性选择 zext/sext,避免无符号值高位被填脏
变参调用把 <64 位整数提升到 i64 时原先一律 sext:uint8 0x8E 会被填成
0xFFFFFFFFFFFFFF8E,va_arg(i64) 读到脏高位(即 Debugger/VKERNELERR.md 记录的 sext 家族)。
现按实参符号性选择:无符号走 zext、有符号仍走 sext,与
CallGenVa._check_and_promote_variadic_call 同口径(复用 ExprGenOps.should_zext_widen)。
|
2026-10-14 16:41:58 +08:00 |
|
TermiNexus
|
0678cc8c48
|
feat(viperc/diag): 报错定位到具体表达式 + 栈帧跟踪当前语句(方案 A+B)
A:报错节点是合成节点(lineno==0,如构造器内联出的参数赋值)时,优先用“正在翻译的实参
位置”兜底 → 报错精确指向调用处的表达式(如 `&_on_submit`),不再退回函数定义行。
- TypeGenBase 新增 CurArgFile/CurArgLine/CurArgCol 与 set_cur_arg()
- CallGenLib 翻译实参前调用 set_cur_arg(当前文件, arg_node 位置)
- TypeGenErr 兜底顺序改为:节点自身行号 → CurArg → 栈最内层帧
- 语句边界清空 CurArg,避免兜底串味到上一条语句的实参
B:栈帧跟踪“当前语句”位置(Python traceback 口径)
- TypeGenBase.update_top_trace_position():更新最内层帧的 lineno/col
- translate_stmt 每条语句推进时调用 → 报错时栈帧给出的是调用点所在语句,而非函数定义行
配合 A 即可得到“调用点 + 具体表达式”两帧。
|
2026-10-14 16:40:35 +08:00 |
|
TermiNexus
|
70c271d2a4
|
fix(viperc): &func 对函数指针变量应取其值(Ptr(Func) 一级),不再多一层地址
现场:Apps/HelloWorld 里 vpui.Button(..., &_on_submit) 报
CastError: pointer level differs (source level 2 -> target level 1);
source: level 2, pointee !llvm.ptr -> target: level 1, pointee i8
根因:嵌套函数名在符号表里是 Ptr(Func) 变量。ExprGenOps 的取址分支有一条
“变量本身就是那个对象”的规则(结构体指针变量要 load 一次、而非取变量地址),
但该 match 只覆盖了 Ptr(Ptr(Struct)),未覆盖 Ptr(Ptr(Func)) —— 于是 `&f` 落到末尾的
`return v_ao`,给出的是变量地址 Ptr(Ptr(Func))(二级),而不是函数地址 Ptr(Func)(一级)。
修改:在该 match 中补上 Ptr(Ptr(Func)) 分支,load 一次后返回 Ptr(Func),
与结构体指针变量同口径。
|
2026-10-14 16:37:37 +08:00 |
|
TermiNexus
|
9d02a3ac0b
|
improve(viperc/diag): 指针级数不符报错补印“级数 + pointee 类型”
LLVM 不透明指针下 source/target 两边的类型文本都是 !llvm.ptr,看不出差异,现场只剩
一个 “2 -> 1”。现改为同时打印:
source: level N, pointee <T> -> target: level M, pointee <U>
这样一眼能定位是哪个表达式/哪个形参触发的级数不符。
|
2026-10-14 16:01:09 +08:00 |
|
TermiNexus
|
6b180c8f59
|
fix(viperc/life): 进程入口豁免补上 _start(ViperOS 应用入口),消除栈逃逸误报
现象:Apps/HelloWorld/main.vp 报 LifetimeError(`master` frame-local,传给构造器参数会
悬垂)。而 `master = &root` 中 root 是 _start 的帧内 Tk,_start 是进程入口
(@__attribute__(section(".text.startup")),结尾 mainloop/process.exit),本帧返回即进程
结束 —— 与 main 同口径,确无逃逸。
_CurFuncIsEntryMain 此前只认 "main",现把 `_start` 一并视为进程入口。
|
2026-10-14 15:53:28 +08:00 |
|
TermiNexus
|
a23c1bda3e
|
fix(viperc/diag): 调用栈帧与错误点同位置时不再重复打印
现象:`_start` 定义行在 Traceback 里被打印两遍 —— 栈内最内层帧与随后的“错误点帧”
落在同一 file:line(错误的 AST 节点 lineno 为 0 时,错误点位置会回退到栈最内层帧,
于是与栈帧完全重合)。
Diag.emit 增加两条去重规则(DIAG_DIR_UP / DIAG_DIR_DOWN 两个方向都生效):
① 连续两个位置完全相同的栈帧只印一次;
② 与紧随其后的“错误点帧”(emit_current 打印的那一帧)位置相同的栈帧不再重复印。
|
2026-10-14 15:53:05 +08:00 |
|
TermiNexus
|
dc24970af2
|
fix(gen): 修 __before_init__ 字段默认值写入的参数次序(build_store 缺 builder/file 顺序颠倒),修编译期参数缺失报错
|
2026-10-13 21:46:20 +08:00 |
|
TermiNexus
|
ea54d5685d
|
feat(gen): virtual(HasVTable)类豁免「无 def => struct」规则,必须合成 __before_init__/__init__ 且必发 vtable;非泛型构造路径按符号存在性判定调用
|
2026-10-13 21:29:24 +08:00 |
|
TermiNexus
|
99a021ad67
|
fix(gen): 类合成默认构造——有方法但无显式 __init__ 的类合成空 __init__(补 undefined 符号);完全无 def 的类按 struct 处理,不合成 __init__/__before_init__
|
2026-10-13 20:59:41 +08:00 |
|
TermiNexus
|
12da1cbfc1
|
fix(gen): define 复用前置声明时按源码形参名对齐签名参数名,修签名与函数体两套参数名导致 MLIR「region entry argument already in use」
|
2026-10-13 20:33:06 +08:00 |
|
TermiNexus
|
bc1eeb6e38
|
feat(gen): REPL 会话变量的复合赋值下传槽类型作为 target_ty(复用 repl_slot_ty,缺失即 fail-fast),与二元/普通变量路径对齐
|
2026-10-13 20:04:34 +08:00 |
|
TermiNexus
|
c1e5a11962
|
feat(gen): 复合赋值统一二元运算口径(常量无损适配另一侧、不做整数提升、RHS 按左值类型翻译),修 u16 -= 1 误报窄化
|
2026-10-13 20:01:16 +08:00 |
|
TermiNexus
|
d2138678ef
|
feat(gen): 同型聚合值 -> 同型聚合指针 允许隐式值拷贝(调用者帧溢出临时槽后取址),修裸类形参接收聚合值实参报错
|
2026-10-13 18:33:49 +08:00 |
|
TermiNexus
|
1c3cdf3493
|
fix(stub): 消费模块补齐按值返回聚合的具名结构体完整体(_inject_method_declare 补 _ensure_full_value_types、_inject_class_struct_declare 补登完整定义),修 MLIR opaque 报错
|
2026-10-13 17:48:57 +08:00 |
|
TermiNexus
|
377c0db5d3
|
fix(gen): life_of_expr 的构造分支按目标类型判定——目标为同型聚合值时判 LIFE_VALUE(值拷贝),不再误判帧逃逸
|
2026-10-13 17:48:35 +08:00 |
|
TermiNexus
|
6cb1f525d9
|
feat(gen): 常量操作数隐式适配另一侧位宽(仅另一侧非常量时),修 u16 变量 + 字面量被抬到 i32 导致误报窄化
|
2026-10-13 17:01:53 +08:00 |
|
TermiNexus
|
a01e9280cc
|
fix(stub,phase1): 因取消整数提升,模块属性 CDefine 的窄乘法显式加宽为 sizet(修缓冲区尺寸回绕成 0/负值)
|
2026-10-13 16:34:39 +08:00 |
|
TermiNexus
|
14d8c05a2a
|
feat(gen): 二元运算取消 C 式整数提升(任何位宽不再默认提升到 i32),改为按 max(两侧)/目标位宽运算
|
2026-10-13 16:20:02 +08:00 |
|
TermiNexus
|
97c0a1c6fd
|
fix(gen): 取消「宽整型 -> bool(i1)」的隐式真值归一化,改为 fail-fast(仅保留编译期常量豁免)
|
2026-10-13 16:07:43 +08:00 |
|
TermiNexus
|
d7c5af9b80
|
fix(gen): callable[[]] 省略返回类型按 void 注册(作为值使用时报错,不再静默按 int)
|
2026-10-13 13:32:47 +08:00 |
|
TermiNexus
|
cb2dc4cb3a
|
feat(gen): 字节序 bswap 改为按目标端序判断(BigEndian/LittleEndian 都相对目标),原语改名 apply_byte_order_bswap
|
2026-10-13 13:29:03 +08:00 |
|
TermiNexus
|
444e87dd7d
|
fix(gen): callable[[]](省略返回类型)按默认 int(i32) 注册函数指针签名,修间接调用签名缺失 fail-fast
|
2026-10-13 13:26:51 +08:00 |
|
TermiNexus
|
d3997e0746
|
fix(gen): 函数指针变量别名(f2: rawptr = f)继承已注册的返回类型签名,修 rawptr 间接调用的签名缺失 fail-fast
|
2026-10-13 13:26:11 +08:00 |
|
TermiNexus
|
32599a08c1
|
fix(stub): .vpi 读取侧复刻字段标记判定(volatile/pointee-volatile/const/字节序),跨模块不再丢字段标记
|
2026-10-13 12:30:23 +08:00 |
|
TermiNexus
|
37c4b0da3b
|
feat(gen): 字节序 bswap 代码生成——字段/局部变量/数组元素读写处成对 llvm.bswap(仅 BigEndian 且 16/32/64 位整数)
|
2026-10-13 12:30:05 +08:00 |
|
TermiNexus
|
5d15d01e21
|
feat(gen): 支持 t.BigEndian / t.LittleEndian 字节序描述符(注解识别 X|marker 并把字节序登记到 FieldEntry.ByteOrder,暂不生成 bswap)
|
2026-10-13 12:17:02 +08:00 |
|
TermiNexus
|
3ca2165fd9
|
feat(gen): 指向同型聚合的指针→同型聚合值允许隐式值拷贝(裸类形参 T* ABI 的直接赋值仍按值拷贝)
|
2026-10-13 10:30:15 +08:00 |
|
TermiNexus
|
b859f8a136
|
fix(gen): CDefine 常量(含 mod.N 属性形态)拓宽方向单独判定——负值 sext、非负 zext,修 zlib 窗口尺寸被 sext 成负数与 Z_DEFAULT_COMPRESSION->255
|
2026-10-12 21:48:05 +08:00 |
|
TermiNexus
|
22475e0fda
|
fix(gen): 逃逸检查把模块级(根 scope)变量判为 LIFE_STATIC,修模块级数组 return 误判帧逃逸(pyzlib_error_msg)
|
2026-10-12 21:23:23 +08:00 |
|
TermiNexus
|
c0ff5c9d96
|
fix(gen): 复合赋值取消「右值有符号 vs 左值无符号」拦截,与二元 x = x op y 口径一致(修 sizet += int 误报)
|
2026-10-12 21:16:50 +08:00 |
|
TermiNexus
|
c9562a6e04
|
feat(gen): 一元 +/-/~ 按符号性提升——u 类不提升(保持原位宽),i 类提升到 i32 防负数陷阱
|
2026-10-12 21:10:06 +08:00 |
|
TermiNexus
|
d206abf3e1
|
chore: 全仓同步 w32→win32 模块改名与 range(int(...)) 显式收窄适配
|
2026-10-12 20:59:11 +08:00 |
|
TermiNexus
|
ea2af739dd
|
feat(gen): range 边界与循环变量统一提升到至少 i32(取消 u8/u16 循环变量档),u64 边界保持 i64
|
2026-10-12 20:57:12 +08:00 |
|
TermiNexus
|
00bf7ebf38
|
fix(gen): 非负 define 常量按最小位宽的无符号位模式参与宽化/比较(修 range(50000) 迭代 0 次)
|
2026-10-12 20:52:52 +08:00 |
|
TermiNexus
|
e3743b185f
|
fix(gen): zip/enumerate 的 range 源工作位宽随参数(仿 for-range),修 range(3) 被 i64 索引误判窄化
|
2026-10-12 20:24:50 +08:00 |
|
TermiNexus
|
54b239747e
|
chore(gen): 清理「按值物化」残留注释(裸类形参即 T*,非值语义槽)
|
2026-10-12 20:03:10 +08:00 |
|
TermiNexus
|
ae12ae8581
|
Revert "feat(gen): 裸类形参按值物化(值语义),调用方 ABI 不变"
This reverts commit 87914b0a51.
|
2026-10-12 19:56:02 +08:00 |
|
TermiNexus
|
001f8afc37
|
fix(gen): 常量适配限定为位运算,算术一律按 C 语义拓宽(修 i8 乘法回绕致 memhub 不变式误报)
|
2026-10-12 19:40:13 +08:00 |
|
TermiNexus
|
e7b05c6a3d
|
fix(gen): 三元表达式两支统一按常量无损适配,修 i8 表元素 vs 字符字面量被抬成 i32 的窄化误报
|
2026-10-12 19:27:58 +08:00 |
|
TermiNexus
|
3d638927d5
|
fix(gen): 移位的工作位宽不计入计数宽度,修 ushort 表达式被抬成 32 位后赋回 ushort 误报窄化
|
2026-10-12 19:22:36 +08:00 |
|
TermiNexus
|
4a66aa7fd2
|
feat(gen): 二元运算采用目标感知工作位宽(仿 C:算到目标位宽;移位只提升左操作数),隐式窄化仍禁止
|
2026-10-12 18:53:50 +08:00 |
|
TermiNexus
|
9d02cc4684
|
fix(gen): 移位按 C 语义把左操作数提升到 int,且移位数不参与常量适配(修 uchar<<8 误报)
|
2026-10-12 18:42:54 +08:00 |
|
TermiNexus
|
65c72fd55c
|
fix(gen): 二元运算按常量无损适配另一侧位宽,修 crc(uint)^0xFFFFFFFF 被抬成 64 位
|
2026-10-12 18:32:55 +08:00 |
|
TermiNexus
|
8453698f66
|
chore(gen): ExprGenBase 残留清理(range(int()) 与 TPV->VPC 注释)
|
2026-10-12 18:25:56 +08:00 |
|
TermiNexus
|
74fafb3b56
|
fix(gen): 整型字面量宽度按值推导(新增 u32 档)+ 显式宽度严格校验
|
2026-10-12 18:25:38 +08:00 |
|
TermiNexus
|
f044d94e90
|
fix(gen): -x/~x 对编译期常量折叠,修负字面量被隐式窄化误拦
|
2026-10-12 18:25:24 +08:00 |
|
TermiNexus
|
87914b0a51
|
feat(gen): 裸类形参按值物化(值语义),调用方 ABI 不变
|
2026-10-12 18:25:04 +08:00 |
|
TermiNexus
|
d7a5f7e68b
|
fix(gen): 值语义聚合槽豁免改为类型级判定,去掉易漏判的槽身份比较
|
2026-10-12 16:56:03 +08:00 |
|
TermiNexus
|
7c11c589f7
|
fix(gen): 值语义聚合槽允许隐式值拷贝,修 self.field = param 的 Foo* -> Foo 误报
|
2026-10-12 16:42:52 +08:00 |
|