Skip to content

runtime: 删除第二份签名表,typed_core 从能力表派生(表漂移治理) - #627

Merged
miaobyte merged 1 commit into
masterfrom
fix/runtime-table-drift
Nov 2, 2026
Merged

miaobyte merged 1 commit into
masterfrom
fix/runtime-table-drift

Conversation

@miaobyte

@miaobyte miaobyte commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

表漂移治理:删除第二份签名表,typed_core 从能力表派生

治的是什么病

同一事实此前被抄成两份表:

表 位置 用途 引入
能力表 runtime/src/myrwircaps.c 派发 —
签名表 runtime/src/isa_sig.c typed_core 判定(156 项 BIN/CMP/UN) e3c66ac0(publish the full 300-entry ISA manifest)

两份表靠闸门逐项比对来维持一致,而闸门本身被逐个删除:

  • 5be42c65(mark typed core rows and drop type dispatch for them)——typed core 行列改为标记,签名表与派发的对齐闸门随之削弱;
  • 144c848a(layout: 收窄恢复 typed 特化与测试)——相关测试收窄。

于是两份表可以静默漂移,没有任何东西会报错。

改后:单一来源

-    const kvlangIsaSig *sg = kvlangIsaSigs(&nsig);
-    row->typed_core = k == KV_ISA_BIN || k == KV_ISA_CMP || k == KV_ISA_UN;
+    row->typed_core = kvlangRwirCaps()[row->opcode_id].result_kind != NULL;

typed_core = 「能力表里声明了定长结果类型的行」(156 项),与派发同源——同一个事实只留一个源,删除 runtime/src/isa_sig.c。

闸门如何验证(双向)

新增 runtime/tests/myrwircap_ids.py + tests/fixtures/myrwircap_ids.txt(323 行黄金快照,按 myrwircaps.c 预处理后的表序、id = 表下标):

  • 4 个合成错位必须红,且点名第一个错位的 index 与两边名字;
  • 1 个同输入必须绿;
  • --selftest 输出原文:ok: selftest 4 mismatches + 1 equal。

验证(git archive 3dac68fc 干净副本,layout + C runtime + byteseek 三重建)

项 基线 改后
C runtime ctest 46 项 48 项全绿(新增 2 条)
tutorial 242/1(09-debugger/pauses.kv) 242/1,失败集合同
导出符号集 308 308,集合完全相同

关于符号(口径说明):删除一个翻译单元后链接地址会移动——例如
kvlangBuiltinAdd 从 0x33a80 移到 0x33a40。我们声明的是符号集不变
(308 个类型+名字的集合逐项相同),不是地址不变。

注:make runtime 只构建库;ctest 需要 cmake --build build/runtime 全量构建后
测试目标才存在,否则 48 项会全部报 "Not Run"。构建成功 ≠ 测试跑过。

文件(7 个路径:4 改 + 1 删 + 2 增)

M  runtime/CMakeLists.txt
M  runtime/src/func_code.c
M  runtime/src/runtime_internal.h
M  runtime/tests/isa_conformance.py
D  runtime/src/isa_sig.c
A  runtime/tests/myrwircap_ids.py
A  runtime/tests/fixtures/myrwircap_ids.txt

关联 #622,不关闭该 issue。

🤖 Generated with Claude Code

同一事实此前抄成两份表:能力表 myrwircaps.c(派发用)与签名表
isa_sig.c(typed_core 用)。两份表靠闸门逐项比对,闸门又被逐个删除,
于是表漂移无人发现。

本提交删除 isa_sig.c,typed_core 改为「能力表里声明了定长结果类型
(result_kind != NULL)的行」,与派发同源——同一事实只留一个源。

附带能力表编号黄金快照(323 行)与 --selftest 双向钉子:4 个合成错位
必须红并点名 index,1 个同输入必须绿。

Co-Authored-By: Claude Code <noreply@anthropic.com>
@miaobyte
miaobyte merged commit 689ae7a into master Nov 2, 2026
6 of 10 checks passed
@miaobyte
miaobyte deleted the fix/runtime-table-drift branch November 2, 2026 02:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant