TermiNexus
|
f0a70748d7
|
fix(match): default case body 的 dbody 类型推断退化 list[int] 截断指针
dbody = dmc.children(普通赋值)触发 TPC 对跨模块属性访问
ast.MatchCase.children 的 RHS 类型推断,失败时静默退化为 list[int],
dbody.get() 被编译成 list[int].get(返回 i32),AST 节点指针被截断为
0x0000c1120bd0 → translate_stmt 读 vtable 崩溃(EnumTest RENUM match ASan)。
与 case body 循环(body_list 用带注解 AnnAssign,类型稳定正确)对照,
default 块改用带注解的 AnnAssign 中转(dbody2)保持
list[ast.AST | t.CPtr] 类型。三处同型修复(_handle_renum_match /
_handle_sequence_match / _handle_tuple_match)。
|
2026-08-21 08:46:45 +08:00 |
|
TermiNexus
|
426bff7daa
|
fix(gen): 补回拆分时丢失的 6 个常量(枚举/泛型/vtable/元数据)
- ENUM_MEMBER_MAX_LOCAL/RENUM_CLASS_MAX/RENUM_VARIANT_PER_CLASS/RENUM_ALIAS_MAX 补回 ClassGenEnum
(未定义名在常量上下文折叠为 0 → 枚举成员收集被静默禁用 → register_enum 永不调用
→ EnumTable 恒空 → `OpKind.Add` 裸名 NameError,includes/ast/base.vp L241 根因)
- SPEC_CACHE_MAX 补回 ClassGenGeneric(原 HandlesClassDef 定义)
- VTBL_METHOD_MAX 补回 ClassGenVTable
- META_MAX/META_KEY_LEN 补回 ClassGenBase
|
2026-08-21 06:58:47 +08:00 |
|
TermiNexus
|
89995dffde
|
refactor(gen): 去除 Handles 委托层——链式化 + GenTypes/GenApi 迁移
- Gen 内部 1742 处 HandlesX.func() 改 self.Gen.Y.method() 链式调用
- 数据类/常量迁移 GenTypes.vp(10 类 + CLASS_META_*/META_*/SEQ_KIND_*/FIELD_MAX 等)
- 管线/保留文件经 GenApi.vp 模块级入口(48 函数带类型注解,从 Gen 方法签名自动生成)
- 删除 26 个纯委托 Handles 文件,仅留 5 个实体文件(Base/Translator/Expr/ExprCall/ExprCallTable)
- 修复字段分裂:TypeGenErr CurrentFile/TraceCount 链式化;CallGenBase TempDir/Cexport 真源化
|
2026-08-21 06:32:40 +08:00 |
|
TermiNexus
|
ca1453c0ec
|
refactor(tpv): set_asan_mode 移除改直接赋 _asan_mode bool;ClassGenEnum 加 Renum 字段 0xb0 崩溃定位临时诊断(定位后移除)
|
2026-08-21 01:37:51 +08:00 |
|
TermiNexus
|
0e48190ba9
|
chore(tpv): 清理过时注释——run_llc_parallel 步进说明、追加89 -> None 说明、Gen 模块迁移说明
|
2026-08-21 01:37:46 +08:00 |
|
TermiNexus
|
a088f21bce
|
fix(BuildPipeline): run_llc_parallel 分批步进错误,修复 llc 线程 join 误报 600 秒超时
batch_start 改用 range(task_count)(步进 1)后,后续批次 join 循环 handles.get(batch_start+j) 取到上一批已 CloseHandle 的句柄 → WaitForSingleObject 返回 WAIT_FAILED(-1) 立即返回 → 误报 llc 线程 join 超时/失败(实际未到 600 秒)。
修复:for batch_start in range(0, task_count, max_threads) 保持原分批语义(步进 max_threads)。
|
2026-08-21 01:05:07 +08:00 |
|
TermiNexus
|
f7f3bbac02
|
fix(TVP): get_class_name_by_type strstr 回退改后缀匹配,修复链式方法调用类名解析
特化类型名 SHA1.GSList[Param] 被 strstr 子串回退错误命中基础名 GSList → GSList.append 查找失败 → 兄弟 Mixin 兜底误匹配 LinkedNode.append(this 前移 sizeof(LinkedNode)=-48)→ 写穿 GSList 容器前 48 字节 → LLvmLiteTest Test 3 崩溃(function_add_param/function_add_block/block_append_line 链式调用根因)。
后缀匹配(SHA1.ClassName 尾部)比 strstr 子串匹配安全,保留精确匹配路径。
|
2026-08-20 16:45:27 +08:00 |
|
TermiNexus
|
9e6e76fcab
|
fix(gen): 兄弟 Mixin this 调整改用模块级 HandlesClassDef._get_type_size
765702b 用 self._get_type_size(定义在 ClassGenEnumMixin)跨 Mixin 调用按 self 类型解析失败 → 链接 undefined symbol: CallGenCall._get_type_size。改为 HandlesClassDef._get_type_size(模块级函数,_field_byte_offset 同源用法)。
|
2026-08-20 11:54:39 +08:00 |
|
TermiNexus
|
765702bb5f
|
fix(gen): this-adjust 补兄弟 Mixin 分支——BaseB 内调 BaseA.helper 前移 sizeof(BaseA)
兄弟 Mixin 兜底(086e792)找到 BaseA.helper 后,this 调整在 BaseB 中查不到 BaseA 首字段'a'走 fail-fast(NoVTableCrossMixinTest BaseB.caller 根因)。对齐 TPC _adjust_this_for_inherited_method 的 sibling 分支:this 前移 -sizeof(定义类 struct),使 BaseA.helper 按自身布局读 self 字段。
|
2026-08-20 11:35:35 +08:00 |
|
TermiNexus
|
086e792b30
|
fix(gen): 兄弟 Mixin 兜底过滤泛型特化类名——防误绑定 list 特化函数
Config.vp Load_project_config 的 root.__getitem__(JsonValue 方法)在 found_func 未命中时被兄弟兜底遍历 struct 表误绑定到 list[ASTptr].__getitem__(泛型特化函数在模块中存在),this 按 list 布局前移 sizeof(list) → 运行期读 -1 崩溃。兜底现仅对不含 '[' 的普通类名生效,对齐 TPC 侧 class_methods 校验语义。
|
2026-08-20 11:14:26 +08:00 |
|
TermiNexus
|
184d84b10b
|
fix(gen): 修正 CallGenCall 类体首行注释缩进
|
2026-08-20 10:41:31 +08:00 |
|
TermiNexus
|
d9a5dfac58
|
chore(gen): 清理 CallGen 拆分残留的重复方法注释块
拆分重构时方法注释头被复制两份(32 处),纯删除 302 行注释,代码零改动。
|
2026-08-20 10:40:09 +08:00 |
|
TermiNexus
|
898a5c2624
|
fix(gen): 兄弟 Mixin 方法兜底——MRO 链外按 struct 表查定义类
方法不在本类 MRO 链(如 BaseB 内 self.helper() 调兄弟 BaseA.helper)时遍历已注册 struct 表找定义类方法,与 TPC HandlesExprCall 行为一致;this 由 _adjust_this_for_inherited_method 前移。
|
2026-08-20 10:28:34 +08:00 |
|
TermiNexus
|
7ba3c74411
|
fix(gen): StmtGenCifMixin 补 ExprCallBase import(迁移 If/For 方法体引用)
TPC 编译报 "跨模块调用 'ExprCallBase.find_func_in_module' 找不到模块 SHA1":
If/For/While 迁移进 StmtGenCifMixin 的方法体引用 ExprCallBase.find_func_in_module
(原 ForHandleIter _handle_oop_iter 等),但该 Mixin 原本未 import ExprCallBase。
已用脚本扫描 Gen/Handles 全部 .vp 交叉核对 import,其余迁移文件无遗漏。
|
2026-08-20 09:33:01 +08:00 |
|
TermiNexus
|
12e8d6bdf8
|
fix(stub): vpi 全局注入补全 src_sha1 mangling——修复 a42923c 笔误致空名全局
a42923c 声称"注入名带 src_sha1 前缀",但实际把 new_global_variable 的
gname_v 写成未定义变量 gv_name_m(mangle 逻辑从未实现)→ 注入空名
"@ = external global %MemBuddy*" → llc "expected top-level entity"
(SlotsBugTest 回归)。
修复:_inject_global_variable_declare 签名加 src_sha1,计算 mangled 名
"<sha1>.<name>"(对齐定义端 5f7a873 与查找端 from-import 三方一致),
去重与创建均用 mangled 名;调用点传 ParseVpiIntoModule 的 src_sha1。
|
2026-08-20 08:06:12 +08:00 |
|
TermiNexus
|
281d26915c
|
fix(gen): 分派改回 Handles 委托壳——NoVTable 同链跨类 self 调用仍 mangle 失败
bootstrap 链接报 undefined symbol: StmtGenDeclMixin.translate_return/if/while/for。
实测 Viper NoVTable 静态绑定下,StmtGenMixin 调父链(StmtGenDeclMixin→StmtGenCifMixin)
方法仍 mangle 成 StmtGenDeclMixin 前缀符号(定义却在 StmtGenCifMixin),同继承链
也不可靠。分派统一改经 Handles 委托壳桥回 gen 单例;HandlesReturn 补 translate_return 壳。
|
2026-08-20 07:02:43 +08:00 |
|
TermiNexus
|
9f396f4874
|
refactor(gen): 完成 P6 机械化迁移——Handler 类并入 Gen Mixin,语句实现单层化
- 10 个 Handler 类主方法迁入 Gen:Assign/AnnAssign/AugAssign→AssignGenMixin,
If/While/For/Return→StmtGenCifMixin,Match→新建 MatchGenMixin(注册 Generator MRO),
Imports→ImportsGenMixin;方法体 self.Trans→trans,签名加 trans 首参
- 分派改:StmtGenMixin.translate_stmt 同链 self.translate_xxx + 跨链经 Handles 委托壳
(NoVTable 静态绑定约束);ExprCall 分派改走 ExprCallCall 壳
- 清理:HandlesTranslator 删 11 个 Handler 字段与 _init_state 创建段;
StmtGenCifMixin 删 5 个 NewXxxHandle 工厂;main/BuildPipeline 补 HandlesAssign._g_gen 注入
- 委托壳保留:跨 Mixin 桥(Assign/AnnAssign/AugAssign/Match/Imports)待编译器缺陷修复后删
|
2026-08-20 06:40:37 +08:00 |
|
TermiNexus
|
e07ea491a5
|
chore(gen): 全量备份——Handles 委托壳瘦身与单例注入统一
- 删除 Handles 各模块已迁移至 Gen 的旧函数体,保留一行委托壳(25 文件 -798 行)
- main.vp / BuildPipeline.vp 全局单例注入改为 _g_gen 直接赋值
- 机械化迁移测试前的基线备份
|
2026-08-20 05:33:59 +08:00 |
|
TermiNexus
|
a42923cf25
|
fix(stub): vpi 注入全局变量声明带源模块 SHA1 前缀
"跨模块全局变量 _op_head 类型未知(stub 未注入)" 根因:VpiReader
_inject_global_variable_declare 从 vpi(源码级裸名)注入依赖全局声明时用
短名 @_op_head,而 5f7a873 后定义端已是 @<tokens_sha1>._op_head →
from-import 精确查找(带前缀)在翻译时找不到 → fail-fast 误杀
(函数注入 _inject_function_declare 早已带 src_sha1 mangling,全局漏做)。
修复:_inject_global_variable_declare 注入名用 src_sha1 前缀 mangle
(对齐定义端与查找端三方一致),调用点传 ParseVpiIntoModule 已提取的
src_sha1;去重改按 mangled 名匹配。
另:ExprGenName from-import 全局未注入时由 fail-fast 改为 _deps_pending
(依赖 vpi 按文件序未就绪属 Phase A 收敛正常态,真实错误由收敛检查暴露)。
|
2026-08-20 05:11:25 +08:00 |
|
TermiNexus
|
601db9e265
|
fix(gen): from-import 模块名截断后再查 SHA1(非 NUL 结尾退化裸名)
undefined symbol: _op_head 根因:lookup_from_import 返回指向 from_imports
内部的指针(非 NUL 结尾,后随空格分隔的其他条目,如 "ast.tokens
TokenType:ast.tokens ...")。ExprGenName 的 from-import 全局查找直接用
该值 LookupSha1ByModName → 整串查不到 → _mangle_name_with_sha1(None)
退化裸名 → 引用 @_op_head 而非 @<tokens_sha1>._op_head → 链接 undefined
(tokens 定义端已带 SHA1 前缀)。ExprGenAttr 别名解析同病。
修复:ExprGenName 新增 _cut_from_import_mod(截断到空格/冒号/NUL),
两处 from-import 分支截断后再查 SHA1;ExprGenAttr 别名解析内联截断。
对齐 CallGenBase._lookup_sha1_from_modname_raw / ExprGenCdef 既有截断逻辑。
|
2026-08-20 05:01:21 +08:00 |
|
TermiNexus
|
99df2aef99
|
fix(gen): 全局变量引用加引号(SHA1 前缀名以数字开头)
llc "expected instruction opcode" 根因:模块级全局带 SHA1 前缀后名以
数字开头("sha1.name"),LLVM 无引号标识符不能以数字开头。stub/text
打印端早已按 _ll_name_needs_quote 加引号,但引用端(make_global_ref /
_find_pool_var 兜底 / 定义端 ref_name)一律 @%s 无引号 → 组合 IR 指令里
store i32 0, i32* @748d0424e8976fa0._pass_count 解析失败。
修复三处引用生成按 _vtable_name_needs_quote(数字开头或含 .)加引号,
对齐函数引用路径(ExprGenName/FuncGenMixin 的 needs_quote 判断)。
组合 IR 去重(_HasGlobalInBuf 等)按打印格式名匹配,带引号一致无需改。
|
2026-08-20 04:42:20 +08:00 |
|
TermiNexus
|
252d15ba9f
|
fix(gen): 模块属性访问支持别名解析(import X as Y → Y._attr)
直接写 GenGenerator._g_gen = gen(别名模块属性)此前不可用:
_resolve_module_attribute_global 未解析别名,_lookup_module_sha1
("GenGenerator") 查不到(Sha1Store 用原始模块名)→ 退化裸名 →
全局带 SHA1 前缀后 undefined symbol。
修复:查目标模块 SHA1 前经 from_imports 解析别名(lookup_from_import
返回原始模块名 lib.core.Gen.Generator)。别名属性写与 setter 调用等价
(写同一 @<模块sha1>._g_gen),且更高效(无函数调用/链接依赖)。
|
2026-08-20 04:37:50 +08:00 |
|
TermiNexus
|
5f7a87341a
|
fix(gen): 模块级全局变量命名带 SHA1 前缀,消除 ld.lld duplicate symbol
多个模块声明同名模块级全局(如 _mbuddy)时全部生成裸名强定义(zeroinit)
→ 链接时 ld.lld duplicate symbol: _mbuddy(大量 warning)。函数名早已
mangled,全局变量漏做。
修复(对齐函数名 _mangle_name,SymTab key 保持裸名查找逻辑零改动):
1. 定义端 TranslatorGenMixin:全局名 = {模块sha1}.{变量名}
2. 模块属性访问 ExprGenAttr:按目标模块 SHA1 前缀精确查找/创建(含嵌套
模块 w32.xxx 与 t 类型对象裸名 linkonce_odr 特例),引用用完整名
3. from-import 全局 ExprGenName:带源模块 SHA1 前缀查找,引用用完整名
4. _find_pool_var 兜底:linkonce_odr + zeroinitializer 定义(每模块独立,
不再依赖裸名链接合并共享;运行时未初始化则真实崩溃暴露,不掩盖)
|
2026-08-20 04:31:39 +08:00 |
|
TermiNexus
|
cf6c917e83
|
fix(gen): 泛型特化类记录触发文件,作废重译正确重置 MethodsEmitted
ld.lld undefined symbol list[ast.ClassDef|t.CPtr].* 根因:Phase A _deps_pending
作废重译时 reset_module_methods_emitted 按当前文件 sha1 精确匹配,特化类
ModuleSha1=模板 sha1(方法名带模板前缀)匹配不到,MethodsEmitted 残留 1
→ 下遍 _specialize_generic_class 补译分支(==0 才补译)跳过 → text.ll 只有
call 无 define → 链接失败。
修复:StructEntry 新增 SpecTriggerSha1(特化类触发文件 sha1),
_specialize_generic_class 全部返回路径经 _record_spec_trigger 记录,
reset_module_methods_emitted 按 ModuleSha1 或 SpecTriggerSha1 匹配重置。
|
2026-08-20 04:04:40 +08:00 |
|
TermiNexus
|
b68ae16639
|
fix(stubmerger): 依赖 worklist 去重,修复 64KB 溢出(app_deps 与 BFS 展开均无去重,公共模块重复累积导致溢出;三处逐模块词边界去重,溢出检查保留作防线)
|
2026-08-20 03:11:48 +08:00 |
|
TermiNexus
|
b08a0aff48
|
perf(phase2): 缓存 BuildCombinedIR 全目录扫描结果
Phase B 编译 .obj 慢得像同步编译的根因:BuildCombinedIR 对每个源文件
调用一次 _collect_stub_sha1s 递归扫描 temp_dir 全部切片子目录(90 文件
× 全目录枚举 O(N×S)),且目录扫描与 llc 并行无关(llc 并行已生效)。
按 temp_dir 缓存扫描结果(StubMerger._stub_scan_cache_*,stdlib 分配
跨 reset 存活),首次扫描后复用,temp_dir 变化时自动重建。BuildCombinedIR
的所有调用点(Phase B 主循环/Phase B+ includes 编译/stubgen)统一受益。
|
2026-08-20 01:15:05 +08:00 |
|
TermiNexus
|
efc0e47058
|
chore(gen): 移除 [DBG-ANNOT]/[LLC-DBG] 调试插桩
EdgeCaseTest/MultiInheritTest 已修复验证,清理 e770fef/dc5bb21/0d2e912
遗留的调试输出:TypeGenResolve.vp resolve_annotation_type 的 [DBG-ANNOT]
(含多余 import stdio),BuildPipeline.vp llc 并行路径的 [LLC-DBG]/
[LLC-DBG2](10 处 region debug-point)。
|
2026-08-20 00:50:18 +08:00 |
|
TermiNexus
|
8947c5c5ee
|
fix(gen): 多继承 this-adjust 对无字段父类跳过字节调整(对齐 TPC,Vec2Extra 误报未注册修复)
|
2026-08-20 00:31:33 +08:00 |
|
TermiNexus
|
e770fef0f7
|
fix(gen): 恢复 ClassGenBase 基类别名解析(_resolve_base_alias)
ClassGenMixin 拆分(47ac2dd)时 _resolve_base_alias 丢失:_get_parent_class
/_collect_parents 不再解析 from-import 别名基类(from t import CStruct as cs
→ class CsPoint(cs)),'cs' 被当真实父类 → find_struct('cs') 失败 → 类 defer
永不注册 → 变量注解解析失败(EdgeCaseTest Test12 回归)。恢复
_resolve_base_alias 并在两处调用;_collect_parents 增 trans 参数透传(别名
解析需 from_imports)。TypeGenResolve 增 [DBG-ANNOT] 插桩待验证后移除。
|
2026-08-20 00:05:32 +08:00 |
|
TermiNexus
|
dc5bb2111b
|
fix(phase2): 句柄数组改回 list[str] 显式 elem_size=8
插桩确认 list[t.CPtr] 构造正常(pool 有效 elem=8 data 有效)但 append
仍读零页崩溃(list[ptr] append 的 store/参数类型生成待查)。改用全库
验证稳定的 list[str](str=bytes=i8*,显式 elem_size=8 走 else 分支),
append(t.CPtr(th.handle)) / t.CPtr(get(j)) 显式转换,join/close 对句柄
操作不变。保留 [LLC-DBG2] 构造状态插桩。
|
2026-08-19 23:12:33 +08:00 |
|
TermiNexus
|
0d2e9124d9
|
debug(phase2): 打印 list[ptr] 构造后内部状态定位 append 崩溃
崩溃仍在 list[ptr].append 的 pool.alloc(0xf8→0x128 偏移变化说明
elem_size 修复生效),需区分 __pool__ 未初始化(__init__ 未调/写错位)
与 MemBuddy 内部损坏。新增 [LLC-DBG2] 打印 pool/count/cap/elem/data。
|
2026-08-19 23:01:48 +08:00 |
|
TermiNexus
|
0faf44e179
|
refactor(phase2): 句柄数组改回 list[t.CPtr]
TPC 已根修 list[t.CPtr] 特化(_resolve_generic_slice_type 保留 t.CPtr
带前缀 + mangled 名统一 'ptr'),不再需要 list[str] 绕开。句柄数组
方案保留:start() 后立即取 handle,join/close 直接对句柄操作。
|
2026-08-19 22:44:21 +08:00 |
|
TermiNexus
|
0810f9f9e8
|
fix(phase2): llc 线程 join 改用句柄数组替代 Thread 对象存取
插桩证实 list[vthreading.Thread|t.CPtr] 的 get(0)/get(1) 返回同一
对象指针(栈对象地址复用),j=0 的 close() 把 handle 置 NULL 后 j=1
的 join 用 NULL 句柄 → WaitForSingleObject 立即 WAIT_FAILED → alive=0
→ e5fb 线程句柄从未被 join(失败槽 Result=-1 误报)。改为 start()
后立即取出 handle 存入 list[t.CPtr](8 字节指针存取稳定),join/close
直接对句柄 WaitForSingleObject/CloseHandle,不再依赖 Thread 对象存续;
join 索引用全局 batch_start+j(handles 跨批次累积)。
|
2026-08-19 22:19:33 +08:00 |
|
TermiNexus
|
88778dc422
|
debug(phase2): join 前打印 th 指针/handle/started 定位 join 立即返回
ClassArrayTest join(0) 已正常等待 edd8(645e8e0 生效),但 join(1) 仍
立即返回 alive=0 且 e5fb Result=-1(worker 未写 Result)。新增
[LLC-DBG2] 插桩打印 th_j 指针/handle/started,区分句柄无效(存取错)
与 e5fb 线程已死两种可能。
|
2026-08-19 22:10:11 +08:00 |
|
TermiNexus
|
645e8e0fbf
|
fix(phase2): llc 线程数组元素类型改为指针 Thread|t.CPtr
list[vthreading.Thread] 的 store/load 类型不一致:append 存 8 字节
(th 指针,elem_ptr 降级 i8*),get 却按 Thread 结构体返回槽地址
(HandlesExprAttr._infer_element_struct_class 推断元素类)→ th_j 是
list 数据槽地址,join 把对象地址当线程句柄 → WaitForSingleObject
立即 WAIT_FAILED → alive=0 → 误报 llc 失败(4bd254a 只修了槽间距,
未修类型不一致)。改为 list[vthreading.Thread | t.CPtr](与已稳定的
list[ast.AST | t.CPtr] 同理),store/load 均为 8 字节指针,
join/is_alive/close 拿到真实线程句柄。
|
2026-08-19 22:03:22 +08:00 |
|
TermiNexus
|
3f3e3d5898
|
fix(phase2): _run_cmd_wait 清零 STARTUPINFOA 等结构体
TPV 的 T() 构造仅 alloca 不 memset(无 __init__ 时只 InitStructDefaults,
extern 结构体无默认值记录 → no-op)。_run_cmd_wait 的 si 只设 cb,
dwFlags 等 15 个字段为栈垃圾:多线程并发调用时垃圾值随机,dwFlags
垃圾位令 CreateProcessA 使用垃圾句柄作子进程 stdio → 子进程行为不定
/父进程线程崩溃(ClassArrayTest e5fb worker 崩、edd8 正常的概率崩溃
根因,70c8810 引入 _run_cmd_wait 时即存在)。si/sa/pi 全部显式清零。
|
2026-08-19 21:50:56 +08:00 |
|
TermiNexus
|
4bd254a27f
|
fix(phase2): llc 并行线程数组修复 list 元素间距与容量越界
1b5246f 引入 list[Thread] 时误把 max_threads 当作 list 构造的
容量参数传入,实际第二参数是 elem_size=16 → 槽间距 16 字节远小于
Thread 结构体大小,set(j, th) 元素重叠覆盖(get 返回混合垃圾对象);
且 list 初始容量仅 8,batch>8 时 set(8..15) 无容量检查越界写堆 →
llc 全部成功后随机 ACCESS_VIOLATION(ClassArrayTest 崩溃根因,ASAN
构建下更早触发)。改为不传 elem_size(默认取 T.__sizeof__())+
append 自动扩容(8→16→32 覆盖 LLC_MAX_THREADS=16 批量)。
|
2026-08-19 21:36:26 +08:00 |
|
TermiNexus
|
42aa90c1af
|
fix(gen): translate_c_deref 支持转换链包裹推断指针目标
对齐 TPC HandlesSpecialCall._infer_deref_target_type 增强:
1. 新增 _IsTypeExpr/_IsCastWrappingDeref 模块级辅助,判定
c.Deref 是否处于类型转换链包裹(如 (T | t.CPtr)(t.CPtr(c.Deref(p))))
2. translate_c_deref 推断条件从仅直接 RHS 扩展为直接 RHS 或
转换链包裹 Deref,新增 dref_is_ptr 允许指针目标推断
(bitcast 后 load 8 字节),修复 llc 并行线程数组 list[Thread]
之外仍受 i8* 退化的场景(1b5246f 只绕开了一处)
|
2026-08-19 21:19:38 +08:00 |
|
TermiNexus
|
1b5246f29f
|
fix(phase2): llc 并行线程数组改用 list[Thread]
c.Deref 对 i8* 无法推断加载类型时只读 1 字节(旧编译器),th_ptrs 存
Thread* 后 join/is_alive 拿到垃圾句柄立即失败——llc 并行"5 秒误报失败"
的直接原因(ClassArrayTest 2 模块并发必现)。改 list[Thread] 保类型,
get 返回明确类型,不再依赖 Deref 推断。含 [LLC-DBG] 插桩,验证后移除。
|
2026-08-19 21:14:20 +08:00 |
|
TermiNexus
|
c68eb22052
|
debug(phase2): 细化插桩区分 CreateProcessA 卡点与 join 等待行为
|
2026-08-19 21:03:47 +08:00 |
|
TermiNexus
|
70c88107ce
|
fix(phase2): llc worker 改用 CreateProcessA 替代 system,修 asan 并发挂起
插桩证实:ClassArrayTest 固定 llc 失败是 e5fb16127bce8f68 的 worker 卡在
stdlib.system() 内(LLC2 未打印,Result 保持 -1)。Python 复现 os.system
并发无问题,差异仅剩 asan 构建环境——Windows asan 的 RTL allocator hook
经 CreateProcess 启动子进程时受干扰(LLVM issue #111166 同类)。
新增 _run_cmd_wait:CreateProcessA 直接执行 + WaitForSingleObject +
GetExitCodeProcess,继承父控制台输出(同 system 语义),全 stdlib/栈分配
线程安全。含 [LLC-DBG] 插桩,验证后移除。
|
2026-08-19 20:57:52 +08:00 |
|
TermiNexus
|
f3c94917e5
|
debug(phase2): 插桩 llc worker 打印 system 返回码,定位 ClassArrayTest 固定 llc 失败误报
|
2026-08-19 20:48:01 +08:00 |
|
TermiNexus
|
f5b3e46543
|
fix(gen): while 1 无限循环无 break 判定 merge 不可达
HandlesWhile 翻译 while 后无条件置 _ctrl_merge_reachable=1,导致末句为
`while 1:`(条件常量真且循环体仅 return 无 break)的函数在收尾检查被
误判"流程掉出末尾未显式 return"(vrandom.gammavariate TypeError)。
新增 _IsConstTrue/_StmtHasBreak(跳过嵌套循环子树):常量真且无本层
break 时 merge 结构性不可达 → 置 0,函数收尾对末句 While 生成 unreachable。
|
2026-08-19 20:35:22 +08:00 |
|
TermiNexus
|
b2e69c2f75
|
chore(gen): 移除全部 [DIAG] 调试打印
|
2026-08-19 10:11:37 +08:00 |
|
TermiNexus
|
63caf152c2
|
perf(phase2): llc 并行线程数 8 提升到 16
对齐 TPC Phase2Translator n_workers=os.cpu_count()(本机 16 核)。
|
2026-08-19 07:56:31 +08:00 |
|
TermiNexus
|
6807082853
|
fix(gen): this-adjust 失败静默跳过改 fail-fast
非第一父类方法调用时,this-adjust 任一步失败(父类/子类 struct 未注册、
首字段缺失、字段查找失败)此前静默用未调整的 obj_ptr 当 self -> 方法按
自身布局读字段读到垃圾(lookup_reexport strcmp 概率崩溃根因候选)。
新增第一父类判定(前缀对齐 delta==0 免调整),其余失败路径 fatal_error
报出方法/定义类/接收类。
|
2026-08-19 07:51:37 +08:00 |
|
TermiNexus
|
edd842b6af
|
fix(phase2): free_llc_task 误 free 任务槽导致 double-free
LlcTask 记录是 llc_tasks 数组的连续槽(非独立 malloc),free_llc_task
此前对槽调 stdlib.free,循环后又对数组整体 free -> 同一 32 字节区域
double-free(ASan)。修复:free_llc_task 只释放命令串并置 None,记录
由调用方随数组整体释放。
|
2026-08-19 07:34:57 +08:00 |
|
TermiNexus
|
18b9b8bfa8
|
perf(phase2): llc 编译改多线程异步并行
Phase B 主循环从'每文件同步跑 llc'改为'循环内写 .ll + 构造 LlcTask
(命令串 stdlib.malloc,避免主池 reset_to(mark2) 回收悬空),循环后
run_llc_parallel 分批发 LLC_MAX_THREADS(8) 个线程并发跑 llc,join 后
校验结果。worker 只调 stdlib.system(),不做任何池分配(MemBuddy 非线程
安全);ASan 模式 opt 插桩也在 worker 内并行。includes 编译路径与
单文件 run_pipeline 保持同步不变。
|
2026-08-19 07:28:08 +08:00 |
|
TermiNexus
|
eb0398eae3
|
fix(gen): this-adjust 基类 bitcast 前确保 opaque 类型声明
_translate_method_call/_translate_super_call 的多继承字节偏移调整会生成
bitcast i8* -> %SHA1.ClassGenBase*,但 PrintModule 只扫描函数签名、
不扫函数体指令,跨模块基类类型未被声明导致 llc 报 use of undefined type。
在 bitcast 前调用 module_ensure_opaque_for_type(幂等,仅对未定义类型
添加 = type opaque)。
|
2026-08-19 06:25:33 +08:00 |
|
TermiNexus
|
e8a3fd0a65
|
fix(attr): ALL_CAPS 非 CDefine 回退跨模块全局变量
Phase1.PYI_BUF_SIZE: t.CSizeT = 262144 是 i64 模块级全局而非 CDefine 宏,
语义同 C 的 extern size_t PYI_BUF_SIZE。原 ALL_CAPS 属性路径在 CDefine
查找失败后直接 fail-fast,从不尝试跨模块全局。修复:
- ExprGenAttr 模块限定路径:CDefine 失败时先查 find_global_in_module,
命中则按跨模块全局引用加载,仅全局也不存在时才 fail-fast;
- ExprGenName 裸名路径:from-import 确认后同样回退跨模块全局加载
(覆盖 from Phase1 import PYI_BUF_SIZE 形式)。
|
2026-08-19 05:41:21 +08:00 |
|