diff --git a/.run/P36/baseline/r22_t5_xfile.log b/.run/P36/baseline/r22_t5_xfile.log new file mode 100644 index 0000000000..8ded434326 --- /dev/null +++ b/.run/P36/baseline/r22_t5_xfile.log @@ -0,0 +1,476 @@ +clean: removed build/, expected/, and the regenerated splat tree (asm/, assets/, undefined_*_auto.txt). +disc-extract: up to date — extracted/retail/ matches the committed manifest (sha1 e5c6019249dec3c71bb2cf40658a78439dddb037) +splat 0.41.0 (powered by spimdisasm 1.41.0) + 0%| | 0/1096 [00:001 text) kinds {'gte': 150, 'launder': 154, 'instruction': 9, 'barrier': 1} controls (R39): src/800.c func_800226C0 pins got 14 expected 45 N-A src/shared/ov/func_80178004.h pins got 8 expected 26 N-A ov_SC03_006 func_80184034 bare-name pins got 0 expected 3 N-A engine_prelude.h asm sites (a macro definition only) got 0 expected 0 OK - elapsed 33.0 s + elapsed 40.8 s diff --git a/.run/P36/delever/apply_t5_xfile.log b/.run/P36/delever/apply_t5_xfile.log new file mode 100644 index 0000000000..b8ad4bf8d7 --- /dev/null +++ b/.run/P36/delever/apply_t5_xfile.log @@ -0,0 +1,4 @@ +07:06:03 apply t5_xfile: 2 files, control src/shared/ov/func_80165CA0.h IDENTICAL (0.61 s), calibration 4bc987426, census a667519a38753e8f +07:06:07 src/shared/ov/func_80165CA0.h:func_80165CA0 A=DIFFERS B: removed 6 needed 2 compiles 9 +07:06:25 src/shared/ov/func_80166F58__3728db8a.h:func_80166F58 A=DIFFERS B: removed 0 needed 2 compiles 3 +07:06:25 delever: batch t5_xfile — 2 files (headers; 2 drawable) · 2 bodies: 0 lever-free, 2 residue, 0 refused · sites removed 6 / needed 4 / refused 3 / deferred 0 · replays 0 (0 disagreed) · compiles 297 in 22 s wall · final 2/2 identical · written 2 files diff --git a/.run/P36/delever/batch_t5_xfile.json b/.run/P36/delever/batch_t5_xfile.json new file mode 100644 index 0000000000..aa7aef2c14 --- /dev/null +++ b/.run/P36/delever/batch_t5_xfile.json @@ -0,0 +1,54 @@ +{ + "label": "t5_xfile", + "generated": "2026-09-09 07:06", + "headers": true, + "batch": 300, + "only": [ + "src/shared/ov/func_80165CA0.h", + "src/shared/ov/func_80166F58__3728db8a.h" + ], + "files": 2, + "drawable_files": 2, + "wall_s": 22.4, + "calib": { + "head": "4bc987426", + "stamp": "b44c5a8a3423" + }, + "bodies": 2, + "compiles": 297, + "sites_removed": 6, + "sites_needed": 4, + "sites_refused": 3, + "sites_deferred": 0, + "lever_free": 0, + "residue": 2, + "refused_bodies": 0, + "replays": 0, + "disagreed": 0, + "written": 2, + "seconds": 132.78877711296082, + "final_ok": 2, + "final_bad": 0, + "per_file": [ + { + "tu": "src/shared/ov/func_80165CA0.h", + "bodies": 1, + "final": "IDENTICAL", + "written": true, + "removed": 6, + "needed": 2, + "refused": 0, + "compiles": 291 + }, + { + "tu": "src/shared/ov/func_80166F58__3728db8a.h", + "bodies": 1, + "final": "IDENTICAL", + "written": true, + "removed": 0, + "needed": 2, + "refused": 3, + "compiles": 6 + } + ] +} diff --git a/.run/P36/delever/calibration.json b/.run/P36/delever/calibration.json index 38e5140df8..9bcc56b9e0 100644 --- a/.run/P36/delever/calibration.json +++ b/.run/P36/delever/calibration.json @@ -1,7 +1,7 @@ { - "head": "3b2c5178b", + "head": "4bc987426", "stamp": "b44c5a8a3423", - "generated": "2026-09-09 06:39", + "generated": "2026-09-09 07:05", "aliases": [ "main", "ov_SC03_014", @@ -21,207 +21,207 @@ "main": { "objects": 85, "identical": 85, - "seconds": 10.379000000000003, - "mean_s": 0.122 + "seconds": 9.508000000000003, + "mean_s": 0.112 }, "ov_SC03_014": { "objects": 32, "identical": 32, - "seconds": 6.51, - "mean_s": 0.203 + "seconds": 5.9910000000000005, + "mean_s": 0.187 }, "ov_SC03_015": { "objects": 32, "identical": 32, - "seconds": 6.227999999999999, - "mean_s": 0.195 + "seconds": 6.171000000000001, + "mean_s": 0.193 }, "ov_SC04_011": { "objects": 28, "identical": 28, - "seconds": 5.250000000000001, - "mean_s": 0.188 + "seconds": 4.969000000000001, + "mean_s": 0.177 } }, "per_object_seconds": { - "build/src/800.o": 0.798, - "build/src/800_b.o": 0.122, - "build/src/800_b_2.o": 0.331, - "build/src/800_b_o0a.o": 0.143, - "build/src/800_c.o": 0.423, - "build/src/800b2.o": 0.124, - "build/src/apicard1.o": 0.143, - "build/src/apicard2.o": 0.121, - "build/src/apicard3.o": 0.177, - "build/src/apicard4.o": 0.112, - "build/src/apicard5.o": 0.119, - "build/src/apicard6.o": 0.207, - "build/src/apicard7.o": 0.177, - "build/src/boot.o": 0.166, - "build/src/gap.o": 0.141, - "build/src/libapi1.o": 0.117, - "build/src/libapi2.o": 0.071, - "build/src/libc2_1.o": 0.084, - "build/src/libc2_2.o": 0.077, - "build/src/libcd1.o": 0.093, - "build/src/libcd2.o": 0.174, - "build/src/libetc.o": 0.081, - "build/src/libgpu.o": 0.094, - "build/src/libgpu2.o": 0.18, - "build/src/libgs1.o": 0.08, - "build/src/libgs2.o": 0.096, - "build/src/libgs3.o": 0.188, - "build/src/libgs4.o": 0.096, - "build/src/libgs5.o": 0.086, - "build/src/libgs6.o": 0.124, - "build/src/libgs7.o": 0.075, - "build/src/libgs8.o": 0.098, - "build/src/libgte1.o": 0.092, - "build/src/libgte10.o": 0.093, - "build/src/libgte11.o": 0.205, - "build/src/libgte12.o": 0.079, - "build/src/libgte13.o": 0.082, - "build/src/libgte14.o": 0.081, - "build/src/libgte15.o": 0.24, - "build/src/libgte16.o": 0.086, - "build/src/libgte17.o": 0.09, - "build/src/libgte18.o": 0.073, - "build/src/libgte19.o": 0.062, - "build/src/libgte2.o": 0.081, - "build/src/libgte20.o": 0.084, - "build/src/libgte21.o": 0.109, - "build/src/libgte22.o": 0.074, - "build/src/libgte23.o": 0.096, - "build/src/libgte24.o": 0.067, - "build/src/libgte25.o": 0.176, - "build/src/libgte26.o": 0.064, - "build/src/libgte27.o": 0.078, - "build/src/libgte28.o": 0.095, - "build/src/libgte29.o": 0.067, - "build/src/libgte3.o": 0.076, - "build/src/libgte30.o": 0.089, - "build/src/libgte4.o": 0.071, - "build/src/libgte5.o": 0.089, - "build/src/libgte6.o": 0.065, - "build/src/libgte7.o": 0.094, - "build/src/libgte8.o": 0.142, - "build/src/libgte9.o": 0.098, - "build/src/libmcrd1.o": 0.128, - "build/src/libmcrd2.o": 0.086, - "build/src/libpad1.o": 0.135, - "build/src/libpad2.o": 0.083, - "build/src/sgap.o": 0.104, - "build/src/sgap_2.o": 0.102, - "build/src/sgap_3.o": 0.089, - "build/src/sgap_4.o": 0.2, - "build/src/sgap_5.o": 0.098, - "build/src/sgap_6.o": 0.1, - "build/src/sgap_8.o": 0.111, - "build/src/snd1.o": 0.103, - "build/src/snd10.o": 0.094, - "build/src/snd11.o": 0.095, - "build/src/snd12.o": 0.084, - "build/src/snd2.o": 0.087, - "build/src/snd3.o": 0.096, - "build/src/snd4.o": 0.099, - "build/src/snd5.o": 0.064, - "build/src/snd6.o": 0.168, - "build/src/snd7.o": 0.075, - "build/src/snd8.o": 0.089, - "build/src/snd9.o": 0.073, - "build/src/ov_SC03_014/ov_SC03_014.o": 0.213, - "build/src/ov_SC03_014/ov_SC03_014_after.o": 0.572, - "build/src/ov_SC03_014/ov_SC03_014_jr_8012ACE0.o": 0.513, - "build/src/ov_SC03_014/ov_SC03_014_jr_80135888.o": 0.111, - "build/src/ov_SC03_014/ov_SC03_014_jr_80135A4C.o": 0.067, - "build/src/ov_SC03_014/ov_SC03_014_jr_80135D20.o": 0.192, - "build/src/ov_SC03_014/ov_SC03_014_jr_801380E0.o": 0.289, - "build/src/ov_SC03_014/ov_SC03_014_jr_8013C98C.o": 0.146, - "build/src/ov_SC03_014/ov_SC03_014_jr_8013F350.o": 0.089, - "build/src/ov_SC03_014/ov_SC03_014_jr_8013FFD8.o": 0.172, - "build/src/ov_SC03_014/ov_SC03_014_jr_80140608.o": 0.227, - "build/src/ov_SC03_014/ov_SC03_014_jr_8015444C.o": 0.104, - "build/src/ov_SC03_014/ov_SC03_014_jr_80154C24.o": 0.185, - "build/src/ov_SC03_014/ov_SC03_014_jr_801588CC.o": 0.116, - "build/src/ov_SC03_014/ov_SC03_014_jr_80159C84.o": 0.109, - "build/src/ov_SC03_014/ov_SC03_014_jr_8015A3C8.o": 0.089, - "build/src/ov_SC03_014/ov_SC03_014_jr_8015AE2C.o": 0.181, - "build/src/ov_SC03_014/ov_SC03_014_jr_8015C32C.o": 0.59, - "build/src/ov_SC03_014/ov_SC03_014_jr_8016AB6C.o": 0.563, - "build/src/ov_SC03_014/ov_SC03_014_jr_80171B4C.o": 0.118, - "build/src/ov_SC03_014/ov_SC03_014_jr_801734BC.o": 0.257, - "build/src/ov_SC03_014/ov_SC03_014_jr_801789AC.o": 0.079, + "build/src/800.o": 0.869, + "build/src/800_b.o": 0.085, + "build/src/800_b_2.o": 0.329, + "build/src/800_b_o0a.o": 0.155, + "build/src/800_c.o": 0.237, + "build/src/800b2.o": 0.132, + "build/src/apicard1.o": 0.158, + "build/src/apicard2.o": 0.092, + "build/src/apicard3.o": 0.202, + "build/src/apicard4.o": 0.073, + "build/src/apicard5.o": 0.083, + "build/src/apicard6.o": 0.147, + "build/src/apicard7.o": 0.065, + "build/src/boot.o": 0.117, + "build/src/gap.o": 0.078, + "build/src/libapi1.o": 0.087, + "build/src/libapi2.o": 0.093, + "build/src/libc2_1.o": 0.109, + "build/src/libc2_2.o": 0.137, + "build/src/libcd1.o": 0.12, + "build/src/libcd2.o": 0.075, + "build/src/libetc.o": 0.075, + "build/src/libgpu.o": 0.077, + "build/src/libgpu2.o": 0.155, + "build/src/libgs1.o": 0.159, + "build/src/libgs2.o": 0.113, + "build/src/libgs3.o": 0.118, + "build/src/libgs4.o": 0.128, + "build/src/libgs5.o": 0.081, + "build/src/libgs6.o": 0.1, + "build/src/libgs7.o": 0.165, + "build/src/libgs8.o": 0.088, + "build/src/libgte1.o": 0.107, + "build/src/libgte10.o": 0.081, + "build/src/libgte11.o": 0.07, + "build/src/libgte12.o": 0.12, + "build/src/libgte13.o": 0.085, + "build/src/libgte14.o": 0.068, + "build/src/libgte15.o": 0.068, + "build/src/libgte16.o": 0.077, + "build/src/libgte17.o": 0.062, + "build/src/libgte18.o": 0.076, + "build/src/libgte19.o": 0.12, + "build/src/libgte2.o": 0.113, + "build/src/libgte20.o": 0.066, + "build/src/libgte21.o": 0.064, + "build/src/libgte22.o": 0.168, + "build/src/libgte23.o": 0.098, + "build/src/libgte24.o": 0.066, + "build/src/libgte25.o": 0.07, + "build/src/libgte26.o": 0.068, + "build/src/libgte27.o": 0.067, + "build/src/libgte28.o": 0.086, + "build/src/libgte29.o": 0.071, + "build/src/libgte3.o": 0.14, + "build/src/libgte30.o": 0.079, + "build/src/libgte4.o": 0.131, + "build/src/libgte5.o": 0.065, + "build/src/libgte6.o": 0.177, + "build/src/libgte7.o": 0.071, + "build/src/libgte8.o": 0.066, + "build/src/libgte9.o": 0.142, + "build/src/libmcrd1.o": 0.139, + "build/src/libmcrd2.o": 0.069, + "build/src/libpad1.o": 0.071, + "build/src/libpad2.o": 0.065, + "build/src/sgap.o": 0.065, + "build/src/sgap_2.o": 0.163, + "build/src/sgap_3.o": 0.068, + "build/src/sgap_4.o": 0.08, + "build/src/sgap_5.o": 0.081, + "build/src/sgap_6.o": 0.072, + "build/src/sgap_8.o": 0.083, + "build/src/snd1.o": 0.073, + "build/src/snd10.o": 0.078, + "build/src/snd11.o": 0.072, + "build/src/snd12.o": 0.111, + "build/src/snd2.o": 0.079, + "build/src/snd3.o": 0.101, + "build/src/snd4.o": 0.073, + "build/src/snd5.o": 0.106, + "build/src/snd6.o": 0.172, + "build/src/snd7.o": 0.07, + "build/src/snd8.o": 0.07, + "build/src/snd9.o": 0.103, + "build/src/ov_SC03_014/ov_SC03_014.o": 0.136, + "build/src/ov_SC03_014/ov_SC03_014_after.o": 0.6, + "build/src/ov_SC03_014/ov_SC03_014_jr_8012ACE0.o": 0.438, + "build/src/ov_SC03_014/ov_SC03_014_jr_80135888.o": 0.074, + "build/src/ov_SC03_014/ov_SC03_014_jr_80135A4C.o": 0.134, + "build/src/ov_SC03_014/ov_SC03_014_jr_80135D20.o": 0.179, + "build/src/ov_SC03_014/ov_SC03_014_jr_801380E0.o": 0.224, + "build/src/ov_SC03_014/ov_SC03_014_jr_8013C98C.o": 0.161, + "build/src/ov_SC03_014/ov_SC03_014_jr_8013F350.o": 0.155, + "build/src/ov_SC03_014/ov_SC03_014_jr_8013FFD8.o": 0.068, + "build/src/ov_SC03_014/ov_SC03_014_jr_80140608.o": 0.256, + "build/src/ov_SC03_014/ov_SC03_014_jr_8015444C.o": 0.078, + "build/src/ov_SC03_014/ov_SC03_014_jr_80154C24.o": 0.201, + "build/src/ov_SC03_014/ov_SC03_014_jr_801588CC.o": 0.103, + "build/src/ov_SC03_014/ov_SC03_014_jr_80159C84.o": 0.133, + "build/src/ov_SC03_014/ov_SC03_014_jr_8015A3C8.o": 0.084, + "build/src/ov_SC03_014/ov_SC03_014_jr_8015AE2C.o": 0.107, + "build/src/ov_SC03_014/ov_SC03_014_jr_8015C32C.o": 0.556, + "build/src/ov_SC03_014/ov_SC03_014_jr_8016AB6C.o": 0.318, + "build/src/ov_SC03_014/ov_SC03_014_jr_80171B4C.o": 0.17, + "build/src/ov_SC03_014/ov_SC03_014_jr_801734BC.o": 0.327, + "build/src/ov_SC03_014/ov_SC03_014_jr_801789AC.o": 0.088, "build/src/ov_SC03_014/ov_SC03_014_jr_80178D40.o": 0.123, - "build/src/ov_SC03_014/ov_SC03_014_jr_8017A4AC.o": 0.154, - "build/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.o": 0.209, - "build/src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.o": 0.23, - "build/src/ov_SC03_014/ov_SC03_014_jr_80184440.o": 0.09, - "build/src/ov_SC03_014/ov_SC03_014_jr_801848E4.o": 0.323, - "build/src/ov_SC03_014/ov_SC03_014_o0b.o": 0.067, - "build/src/ov_SC03_014/ov_SC03_014_o0c.o": 0.098, - "build/src/ov_SC03_014/ov_SC03_014_o0d.o": 0.092, - "build/src/ov_SC03_014/ov_SC03_014_o0e.o": 0.142, - "build/src/ov_SC03_015/ov_SC03_015.o": 0.175, - "build/src/ov_SC03_015/ov_SC03_015_after.o": 0.564, - "build/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.o": 0.541, - "build/src/ov_SC03_015/ov_SC03_015_jr_80135888.o": 0.079, - "build/src/ov_SC03_015/ov_SC03_015_jr_80135A4C.o": 0.068, - "build/src/ov_SC03_015/ov_SC03_015_jr_80135D20.o": 0.17, - "build/src/ov_SC03_015/ov_SC03_015_jr_801380E0.o": 0.245, - "build/src/ov_SC03_015/ov_SC03_015_jr_8013C98C.o": 0.131, - "build/src/ov_SC03_015/ov_SC03_015_jr_8013F350.o": 0.112, - "build/src/ov_SC03_015/ov_SC03_015_jr_8013FFD8.o": 0.109, - "build/src/ov_SC03_015/ov_SC03_015_jr_80140608.o": 0.313, - "build/src/ov_SC03_015/ov_SC03_015_jr_8015444C.o": 0.079, - "build/src/ov_SC03_015/ov_SC03_015_jr_80154C24.o": 0.204, - "build/src/ov_SC03_015/ov_SC03_015_jr_801588CC.o": 0.102, - "build/src/ov_SC03_015/ov_SC03_015_jr_80159C84.o": 0.082, - "build/src/ov_SC03_015/ov_SC03_015_jr_8015A3C8.o": 0.076, - "build/src/ov_SC03_015/ov_SC03_015_jr_8015AE2C.o": 0.17, - "build/src/ov_SC03_015/ov_SC03_015_jr_8015C32C.o": 0.602, - "build/src/ov_SC03_015/ov_SC03_015_jr_8016AB6C.o": 0.442, - "build/src/ov_SC03_015/ov_SC03_015_jr_80171B4C.o": 0.109, - "build/src/ov_SC03_015/ov_SC03_015_jr_801734BC.o": 0.227, - "build/src/ov_SC03_015/ov_SC03_015_jr_801789AC.o": 0.082, - "build/src/ov_SC03_015/ov_SC03_015_jr_80178D40.o": 0.121, - "build/src/ov_SC03_015/ov_SC03_015_jr_8017A4AC.o": 0.077, - "build/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.o": 0.252, - "build/src/ov_SC03_015/ov_SC03_015_jr_8017EB7C.o": 0.24, - "build/src/ov_SC03_015/ov_SC03_015_jr_80184440.o": 0.057, - "build/src/ov_SC03_015/ov_SC03_015_jr_801848E4.o": 0.414, - "build/src/ov_SC03_015/ov_SC03_015_o0b.o": 0.134, - "build/src/ov_SC03_015/ov_SC03_015_o0c.o": 0.076, - "build/src/ov_SC03_015/ov_SC03_015_o0d.o": 0.082, - "build/src/ov_SC03_015/ov_SC03_015_o0e.o": 0.093, - "build/src/ov_SC04_011/ov_SC04_011.o": 0.144, - "build/src/ov_SC04_011/ov_SC04_011_after.o": 0.591, - "build/src/ov_SC04_011/ov_SC04_011_jr_8012ACE0.o": 0.407, - "build/src/ov_SC04_011/ov_SC04_011_jr_80135888.o": 0.057, - "build/src/ov_SC04_011/ov_SC04_011_jr_80135A4C.o": 0.058, - "build/src/ov_SC04_011/ov_SC04_011_jr_80135D20.o": 0.165, - "build/src/ov_SC04_011/ov_SC04_011_jr_801380E0.o": 0.216, - "build/src/ov_SC04_011/ov_SC04_011_jr_8013C98C.o": 0.173, - "build/src/ov_SC04_011/ov_SC04_011_jr_8013F350.o": 0.083, - "build/src/ov_SC04_011/ov_SC04_011_jr_8013FFD8.o": 0.096, - "build/src/ov_SC04_011/ov_SC04_011_jr_80140608.o": 0.215, - "build/src/ov_SC04_011/ov_SC04_011_jr_8015444C.o": 0.078, - "build/src/ov_SC04_011/ov_SC04_011_jr_80154C24.o": 0.268, - "build/src/ov_SC04_011/ov_SC04_011_jr_801588CC.o": 0.115, - "build/src/ov_SC04_011/ov_SC04_011_jr_80159C84.o": 0.083, - "build/src/ov_SC04_011/ov_SC04_011_jr_8015A3C8.o": 0.083, - "build/src/ov_SC04_011/ov_SC04_011_jr_8015AE2C.o": 0.182, - "build/src/ov_SC04_011/ov_SC04_011_jr_8015C32C.o": 0.459, - "build/src/ov_SC04_011/ov_SC04_011_jr_8016AB6C.o": 0.338, - "build/src/ov_SC04_011/ov_SC04_011_jr_80171B4C.o": 0.11, - "build/src/ov_SC04_011/ov_SC04_011_jr_801734BC.o": 0.201, - "build/src/ov_SC04_011/ov_SC04_011_jr_801789AC.o": 0.1, - "build/src/ov_SC04_011/ov_SC04_011_jr_80178D40.o": 0.114, - "build/src/ov_SC04_011/ov_SC04_011_jr_8017A4AC.o": 0.078, - "build/src/ov_SC04_011/ov_SC04_011_jr_8017AE2C.o": 0.151, - "build/src/ov_SC04_011/ov_SC04_011_jr_8017D494.o": 0.546, - "build/src/ov_SC04_011/ov_SC04_011_o0b.o": 0.07, - "build/src/ov_SC04_011/ov_SC04_011_o0c.o": 0.069 + "build/src/ov_SC03_014/ov_SC03_014_jr_8017A4AC.o": 0.072, + "build/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.o": 0.204, + "build/src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.o": 0.314, + "build/src/ov_SC03_014/ov_SC03_014_jr_80184440.o": 0.057, + "build/src/ov_SC03_014/ov_SC03_014_jr_801848E4.o": 0.313, + "build/src/ov_SC03_014/ov_SC03_014_o0b.o": 0.097, + "build/src/ov_SC03_014/ov_SC03_014_o0c.o": 0.074, + "build/src/ov_SC03_014/ov_SC03_014_o0d.o": 0.066, + "build/src/ov_SC03_014/ov_SC03_014_o0e.o": 0.081, + "build/src/ov_SC03_015/ov_SC03_015.o": 0.144, + "build/src/ov_SC03_015/ov_SC03_015_after.o": 0.546, + "build/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.o": 0.433, + "build/src/ov_SC03_015/ov_SC03_015_jr_80135888.o": 0.063, + "build/src/ov_SC03_015/ov_SC03_015_jr_80135A4C.o": 0.059, + "build/src/ov_SC03_015/ov_SC03_015_jr_80135D20.o": 0.127, + "build/src/ov_SC03_015/ov_SC03_015_jr_801380E0.o": 0.164, + "build/src/ov_SC03_015/ov_SC03_015_jr_8013C98C.o": 0.181, + "build/src/ov_SC03_015/ov_SC03_015_jr_8013F350.o": 0.08, + "build/src/ov_SC03_015/ov_SC03_015_jr_8013FFD8.o": 0.099, + "build/src/ov_SC03_015/ov_SC03_015_jr_80140608.o": 0.258, + "build/src/ov_SC03_015/ov_SC03_015_jr_8015444C.o": 0.088, + "build/src/ov_SC03_015/ov_SC03_015_jr_80154C24.o": 0.199, + "build/src/ov_SC03_015/ov_SC03_015_jr_801588CC.o": 0.101, + "build/src/ov_SC03_015/ov_SC03_015_jr_80159C84.o": 0.094, + "build/src/ov_SC03_015/ov_SC03_015_jr_8015A3C8.o": 0.1, + "build/src/ov_SC03_015/ov_SC03_015_jr_8015AE2C.o": 0.111, + "build/src/ov_SC03_015/ov_SC03_015_jr_8015C32C.o": 0.689, + "build/src/ov_SC03_015/ov_SC03_015_jr_8016AB6C.o": 0.524, + "build/src/ov_SC03_015/ov_SC03_015_jr_80171B4C.o": 0.118, + "build/src/ov_SC03_015/ov_SC03_015_jr_801734BC.o": 0.353, + "build/src/ov_SC03_015/ov_SC03_015_jr_801789AC.o": 0.109, + "build/src/ov_SC03_015/ov_SC03_015_jr_80178D40.o": 0.118, + "build/src/ov_SC03_015/ov_SC03_015_jr_8017A4AC.o": 0.149, + "build/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.o": 0.179, + "build/src/ov_SC03_015/ov_SC03_015_jr_8017EB7C.o": 0.258, + "build/src/ov_SC03_015/ov_SC03_015_jr_80184440.o": 0.112, + "build/src/ov_SC03_015/ov_SC03_015_jr_801848E4.o": 0.302, + "build/src/ov_SC03_015/ov_SC03_015_o0b.o": 0.113, + "build/src/ov_SC03_015/ov_SC03_015_o0c.o": 0.111, + "build/src/ov_SC03_015/ov_SC03_015_o0d.o": 0.11, + "build/src/ov_SC03_015/ov_SC03_015_o0e.o": 0.079, + "build/src/ov_SC04_011/ov_SC04_011.o": 0.152, + "build/src/ov_SC04_011/ov_SC04_011_after.o": 0.496, + "build/src/ov_SC04_011/ov_SC04_011_jr_8012ACE0.o": 0.401, + "build/src/ov_SC04_011/ov_SC04_011_jr_80135888.o": 0.063, + "build/src/ov_SC04_011/ov_SC04_011_jr_80135A4C.o": 0.061, + "build/src/ov_SC04_011/ov_SC04_011_jr_80135D20.o": 0.126, + "build/src/ov_SC04_011/ov_SC04_011_jr_801380E0.o": 0.175, + "build/src/ov_SC04_011/ov_SC04_011_jr_8013C98C.o": 0.156, + "build/src/ov_SC04_011/ov_SC04_011_jr_8013F350.o": 0.108, + "build/src/ov_SC04_011/ov_SC04_011_jr_8013FFD8.o": 0.072, + "build/src/ov_SC04_011/ov_SC04_011_jr_80140608.o": 0.217, + "build/src/ov_SC04_011/ov_SC04_011_jr_8015444C.o": 0.086, + "build/src/ov_SC04_011/ov_SC04_011_jr_80154C24.o": 0.231, + "build/src/ov_SC04_011/ov_SC04_011_jr_801588CC.o": 0.111, + "build/src/ov_SC04_011/ov_SC04_011_jr_80159C84.o": 0.075, + "build/src/ov_SC04_011/ov_SC04_011_jr_8015A3C8.o": 0.138, + "build/src/ov_SC04_011/ov_SC04_011_jr_8015AE2C.o": 0.1, + "build/src/ov_SC04_011/ov_SC04_011_jr_8015C32C.o": 0.486, + "build/src/ov_SC04_011/ov_SC04_011_jr_8016AB6C.o": 0.279, + "build/src/ov_SC04_011/ov_SC04_011_jr_80171B4C.o": 0.154, + "build/src/ov_SC04_011/ov_SC04_011_jr_801734BC.o": 0.238, + "build/src/ov_SC04_011/ov_SC04_011_jr_801789AC.o": 0.071, + "build/src/ov_SC04_011/ov_SC04_011_jr_80178D40.o": 0.118, + "build/src/ov_SC04_011/ov_SC04_011_jr_8017A4AC.o": 0.072, + "build/src/ov_SC04_011/ov_SC04_011_jr_8017AE2C.o": 0.115, + "build/src/ov_SC04_011/ov_SC04_011_jr_8017D494.o": 0.532, + "build/src/ov_SC04_011/ov_SC04_011_o0b.o": 0.064, + "build/src/ov_SC04_011/ov_SC04_011_o0c.o": 0.072 }, "ok": true, - "seconds": 3.1 + "seconds": 3.0 } diff --git a/.run/P36/delever/ledger.jsonl b/.run/P36/delever/ledger.jsonl index e636b8f304..207ea44137 100644 --- a/.run/P36/delever/ledger.jsonl +++ b/.run/P36/delever/ledger.jsonl @@ -17546,3 +17546,5 @@ {"ts": "2026-09-09 06:46:40", "label": "sweep3", "rung": "sweep", "calib": {"head": "3b2c5178b", "stamp": "b44c5a8a3423"}, "tu": "src/ov_SC07_010/ov_SC07_010_jr_8015C32C.c", "fn": null, "addr": null, "aliases": null, "header": false, "verdict": "SWEPT-all", "dead": ["SHB", "SHB", "SHB"], "inner_dropped": [], "sites": [], "compiles": 1} {"ts": "2026-09-09 06:46:40", "label": "sweep3", "rung": "sweep", "calib": {"head": "3b2c5178b", "stamp": "b44c5a8a3423"}, "tu": "src/ov_SC07_011/ov_SC07_011_jr_8015C32C.c", "fn": null, "addr": null, "aliases": null, "header": false, "verdict": "SWEPT-all", "dead": ["SHB", "SHB", "SHB"], "inner_dropped": [], "sites": [], "compiles": 1} {"ts": "2026-09-09 06:55:47", "label": "sweep3", "rung": "sweep", "calib": {"head": "3b2c5178b", "stamp": "b44c5a8a3423"}, "tu": "src/shared/engine_prelude.h", "fn": null, "addr": null, "aliases": null, "header": true, "verdict": "REFUSED", "dead": ["ENGINE_SHB"], "inner_dropped": [], "sites": [], "compiles": 3975} +{"ts": "2026-09-09 07:06:16", "label": "t5_xfile", "rung": "B", "calib": {"head": "4bc987426", "stamp": "b44c5a8a3423"}, "tu": "src/shared/ov/func_80165CA0.h", "fn": "func_80165CA0", "addr": 2148949152, "aliases": ["ov_MAIN_012", "ov_SC01_000", "ov_SC01_001", "ov_SC01_004", "ov_SC01_005", "ov_SC01_006", "ov_SC01_008", "ov_SC01_009", "ov_SC01_074", "ov_SC01_077", "ov_SC01_080", "ov_SC01_084", "ov_SC02_000", "ov_SC02_003", "ov_SC02_004", "ov_SC02_005", "ov_SC02_011", "ov_SC02_015", "ov_SC02_016", "ov_SC02_017", "ov_SC02_021", "ov_SC02_026", "ov_SC02_027", "ov_SC02_028", "ov_SC02_031", "ov_SC02_035", "ov_SC02_037", "ov_SC02_039", "ov_SC02_041", "ov_SC03_001", "ov_SC03_002", "ov_SC03_003", "ov_SC03_006", "ov_SC03_007", "ov_SC03_010", "ov_SC03_011", "ov_SC03_012", "ov_SC03_013", "ov_SC03_014", "ov_SC03_015", "ov_SC03_023", "ov_SC03_024", "ov_SC03_028", "ov_SC03_029", "ov_SC03_030", "ov_SC03_031", "ov_SC03_089", "ov_SC03_090", "ov_SC03_091", "ov_SC03_092", "ov_SC03_093", "ov_SC03_094", "ov_SC03_095", "ov_SC03_096", "ov_SC03_097", "ov_SC03_098", "ov_SC03_099", "ov_SC03_100", "ov_SC03_101", "ov_SC03_102", "ov_SC03_103", "ov_SC03_104", "ov_SC03_105", "ov_SC03_107", "ov_SC03_108", "ov_SC03_109", "ov_SC03_110", "ov_SC03_111", "ov_SC03_112", "ov_SC03_113", "ov_SC03_114", "ov_SC03_115", "ov_SC03_116", "ov_SC03_117", "ov_SC03_118", "ov_SC03_119", "ov_SC03_121", "ov_SC03_124", "ov_SC03_125", "ov_SC03_126", "ov_SC04_000", "ov_SC04_002", "ov_SC04_003", "ov_SC04_004", "ov_SC04_005", "ov_SC04_006", "ov_SC04_007", "ov_SC04_008", "ov_SC04_009", "ov_SC04_010", "ov_SC04_011", "ov_SC04_012", "ov_SC04_015", "ov_SC04_016", "ov_SC04_018", "ov_SC04_019", "ov_SC04_020", "ov_SC04_021", "ov_SC05_000", "ov_SC05_001", "ov_SC05_002", "ov_SC05_003", "ov_SC05_004", "ov_SC05_005", "ov_SC05_006", "ov_SC05_007", "ov_SC05_008", "ov_SC05_009", "ov_SC05_010", "ov_SC05_011", "ov_SC05_017", "ov_SC05_018", "ov_SC05_019", "ov_SC06_000", "ov_SC06_006", "ov_SC06_008", "ov_SC06_010", "ov_SC06_011", "ov_SC06_013", "ov_SC06_014", "ov_SC06_015", "ov_SC06_016", "ov_SC06_018", "ov_SC06_020", "ov_SC06_022", "ov_SC06_024", "ov_SC06_025", "ov_SC06_027", "ov_SC06_029", "ov_SC06_030", "ov_SC06_032", "ov_SC06_033", "ov_SC07_000", "ov_SC07_001", "ov_SC07_002", "ov_SC07_006", "ov_SC07_007", "ov_SC07_008", "ov_SC07_009", "ov_SC07_010", "ov_SC07_011"], "header": true, "includers": 136, "o0": false, "nhash_before": "b10fd3c5f43d53867bbc37ab4c872f244f1e7ad7", "nhash_after": "df8ff08ceb0ac5972fad10d4d662f9046e889098", "exemplar": null, "verdict": "RESIDUE", "replay_disagreed": false, "sites": [{"ord": 0, "kind": "pin", "cls": "A", "detail": "$3", "via": "", "line": 12, "verdict": "NEEDED", "why": "", "oracle": "DIFFERS"}, {"ord": 1, "kind": "launder", "cls": "B", "detail": "ENGINE_SHB", "via": "ENGINE_SHB", "line": 20, "verdict": "REMOVED", "why": "", "oracle": "IDENTICAL"}, {"ord": 2, "kind": "launder", "cls": "B", "detail": "ENGINE_SHB", "via": "ENGINE_SHB", "line": 26, "verdict": "REMOVED", "why": "", "oracle": "IDENTICAL"}, {"ord": 3, "kind": "launder", "cls": "B", "detail": "ENGINE_SHB", "via": "ENGINE_SHB", "line": 27, "verdict": "REMOVED", "why": "", "oracle": "IDENTICAL"}, {"ord": 4, "kind": "launder", "cls": "B", "detail": "ENGINE_SHB", "via": "ENGINE_SHB", "line": 28, "verdict": "REMOVED", "why": "", "oracle": "IDENTICAL"}, {"ord": 5, "kind": "launder", "cls": "B", "detail": "ENGINE_SHB", "via": "ENGINE_SHB", "line": 30, "verdict": "REMOVED", "why": "", "oracle": "IDENTICAL"}, {"ord": 6, "kind": "launder", "cls": "B", "detail": "ENGINE_SHB", "via": "ENGINE_SHB", "line": 31, "verdict": "REMOVED", "why": "", "oracle": "IDENTICAL"}, {"ord": 7, "kind": "launder", "cls": "B", "detail": "ENGINE_SHB", "via": "ENGINE_SHB", "line": 32, "verdict": "NEEDED", "why": "", "oracle": "DIFFERS"}], "compiles": 150, "seconds": 67.253} +{"ts": "2026-09-09 07:06:25", "label": "t5_xfile", "rung": "B", "calib": {"head": "4bc987426", "stamp": "b44c5a8a3423"}, "tu": "src/shared/ov/func_80166F58__3728db8a.h", "fn": "func_80166F58", "addr": 2148953944, "aliases": ["ov_SC03_126", "ov_SC04_021", "ov_SC05_019"], "header": true, "includers": 3, "o0": false, "nhash_before": "85b4f6b26d2215ec2d3a4ecbdcac77301329e035", "nhash_after": "85b4f6b26d2215ec2d3a4ecbdcac77301329e035", "exemplar": null, "verdict": "RESIDUE", "replay_disagreed": false, "sites": [{"ord": 0, "kind": "pin", "cls": "A", "detail": "$20", "via": "", "line": 11, "verdict": "NEEDED", "why": "", "oracle": "DIFFERS"}, {"ord": 1, "kind": "pin", "cls": "A", "detail": "$5", "via": "", "line": 13, "verdict": "NEEDED", "why": "", "oracle": "DIFFERS"}, {"ord": 2, "kind": "launder", "cls": "B", "detail": "SHB", "via": "SHB", "line": 21, "verdict": "REFUSED", "why": "macro `SHB` is not defined in this file", "oracle": ""}, {"ord": 3, "kind": "launder", "cls": "B", "detail": "SHB", "via": "SHB", "line": 21, "verdict": "REFUSED", "why": "macro `SHB` is not defined in this file", "oracle": ""}, {"ord": 4, "kind": "launder", "cls": "B", "detail": "SHB", "via": "SHB", "line": 22, "verdict": "REFUSED", "why": "macro `SHB` is not defined in this file", "oracle": ""}], "compiles": 3, "seconds": 1.433} diff --git a/.run/P36/delever/t5_newsites_files.txt b/.run/P36/delever/t5_newsites_files.txt new file mode 100644 index 0000000000..67565af6d6 --- /dev/null +++ b/.run/P36/delever/t5_newsites_files.txt @@ -0,0 +1,2 @@ +src/shared/ov/func_80165CA0.h +src/shared/ov/func_80166F58__3728db8a.h diff --git a/decomp-architect/corpus/tools/P10/gte_consolidate.py b/decomp-architect/corpus/tools/P10/gte_consolidate.py index 6ab98751aa..6d8765af9b 100644 --- a/decomp-architect/corpus/tools/P10/gte_consolidate.py +++ b/decomp-architect/corpus/tools/P10/gte_consolidate.py @@ -300,7 +300,9 @@ def inventory(jobs=12, quiet=False): # ---------------------------------------------------------------------------------------------------------------------- # the canonical table # ---------------------------------------------------------------------------------------------------------------------- -def canonical_table(inv, quiet=False): +def canonical_table(inv, quiet=False, write=True): + """write=False for fixtures: the selftest once overwrote the real table with its two-signature fixture (the census then classified + every direct statement against a fixture and 362 levers vanished twice) — a selftest never writes an instrument's real state.""" sony = sony_table() incn = inc_names() groups = collections.defaultdict(list) @@ -380,7 +382,8 @@ def canonical_table(inv, quiet=False): variants[f"{key}|{'|'.join(cs)}"] = dict(name=vname, of=name, key=key, clob=list(cs), extra=extra, fewer=fewer, defs=cnt, files=len({d["tu"] for d in ds if tuple(d["sig"]["clob"]) == cs})) out = dict(generated=time.strftime("%Y-%m-%d %H:%M"), canonical=table, variants=variants, unsigned=[dict(tu=d["tu"], name=d["name"], l0=d["l0"]) for d in unsigned]) - CANON.write_text(json.dumps(out, indent=1)) + if write: + CANON.write_text(json.dumps(out, indent=1)) if not quiet: print(f"gte_consolidate: canonical table — {len(table)} signatures ({sum(1 for t in table.values() if t['sony'])} with Sony's name), " f"{sum(t['defs'] for t in table.values())} canonical definitions; {len(variants)} lever variants holding {sum(v['defs'] for v in variants.values())} definitions; " @@ -806,14 +809,37 @@ def sweep(a): def_spans = collections.defaultdict(list) for (l0, l1, name, body) in lc.define_blocks(raw): def_spans[name].append((ls[l0 - 1], ls[l1] if l1 < len(ls) else len(raw))) - def mentions(name): + def mentions(name, l0=None, next_l0=None): text = m for s0, e0 in def_spans.get(name, ()): text = text[:s0] + " " * (e0 - s0) + text[e0:] + if l0 is not None: + a = ls[l0 - 1] + b = ls[next_l0 - 1] if next_l0 else len(text) + text = text[a:b] return re.search(r"\b%s\b" % re.escape(name), text) is not None + # uses per DEFINITION: a use (a census site via the name, or an #include of a header that uses the name) is governed by the last + # definition of that name above it; a definition with no governed use is dead even when a sibling definition is used + use_lines = collections.defaultdict(list) + for s in sites: + if s["tu"] == rel and s.get("via"): + use_lines[s["via"]].append(s["line"]) + inc_lines = [] + for mm in sc.INCLUDE_LINE.finditer(m): + h = os.path.normpath(os.path.join(os.path.dirname(rel), mm.group(1))) + inc_lines.append((m.count("\n", 0, mm.start()) + 1, hdr_uses.get(h, collections.Counter()))) + def governed_uses(name, l0, next_l0): + n = sum(1 for ln in use_lines.get(name, []) if l0 < ln and (next_l0 is None or ln < next_l0)) + n += sum(1 for ln, hu in inc_lines if hu.get(name, 0) and l0 < ln and (next_l0 is None or ln < next_l0)) + return n + same_name = collections.defaultdict(list) + for (l0, l1, name, body) in lc.define_blocks(raw): + same_name[name].append(l0) for (l0, l1, name, body) in blocks: start, end = ls[l0 - 1], ls[l1] if l1 < len(ls) else len(raw) - if used.get(name, 0) == 0 and not mentions(name): + later = sorted(x for x in same_name[name] if x > l0) + next_l0 = later[0] if later else None + if governed_uses(name, l0, next_l0) == 0 and not mentions(name, l0, next_l0): edits.append((start, end, "")) dead.append(name) continue @@ -971,7 +997,7 @@ def selftest(): dict(tu="c.c", l0=1, l1=2, name="LDV0_DA34", params="( r0 )", body='__asm__ volatile ("lwc2 $0, 0( %0 );lwc2 $1, 4( %0 )" : : "r"( r0 ))', kind="gte", sig=s4), dict(tu="a.c", l0=3, l1=3, name="gte_rtps", params="()", body='__asm__ volatile ("nop;nop;rtps")', kind="gte", sig=s1), ], direct=[], uses={}) - canon = canonical_table(inv, quiet=True) + canon = canonical_table(inv, quiet=True, write=False) t = canon["canonical"].get(sig_key(s4)) if not t or t["name"] != "gte_ldv0" or t["clob"] != [] or t["defs"] != 2: fail(f"canonical ldv0: {t}") @@ -1003,7 +1029,7 @@ def selftest(): fo = fm.find("(", fpos) finner = fm[fo + 1:lc._paren_span(fm, fo)] inv2 = dict(definitions=defs, direct=[dict(tu="fx.c", line=7, col=5, fn="f", inner=finner, sig=signature(finner))], uses={}) - canon2 = canonical_table(inv2, quiet=True) + canon2 = canonical_table(inv2, quiet=True, write=False) plan = plan_files(inv2, canon2, bound={}) edits, rec = file_edits("fx.c", fx, plan["fx.c"], canon2, "self") out = dl.apply_edits(fx, edits) @@ -1017,7 +1043,7 @@ def selftest(): for (l0, l1, name, body) in lc.define_blocks(fxo): defso.append(dict(tu="fo.c", l0=l0, l1=l1, name=name, params=define_params(fxo, l0), body=body, kind="gte", sig=signature(asm_inner(body)))) invo = dict(definitions=defso + [dict(tu="fa.c", l0=1, l1=1, name="gte_rtps", params="()", body='__asm__ volatile ("nop;nop;rtps")', kind="gte", sig=signature('"nop;nop;rtps"'))], direct=[], uses={}) - canono = canonical_table(invo, quiet=True) + canono = canonical_table(invo, quiet=True, write=False) plano = plan_files(invo, canono, bound={}) editso, reco = file_edits("fo.c", fxo, plano["fo.c"], canono, "self") outo = dl.apply_edits(fxo, editso) @@ -1040,7 +1066,7 @@ def selftest(): for (l0, l1, name, body) in lc.define_blocks(fx2): defs2.append(dict(tu="fy.c", l0=l0, l1=l1, name=name, params=define_params(fx2, l0), body=body, kind="gte", sig=signature(asm_inner(body)))) inv3 = dict(definitions=defs2, direct=[], uses={}) - canon3 = canonical_table(inv3, quiet=True) + canon3 = canonical_table(inv3, quiet=True, write=False) names3 = sorted(t_["name"] for t_ in canon3["canonical"].values()) plan3 = plan_files(inv3, canon3, bound={}) edits3, rec3 = file_edits("fy.c", fx2, plan3["fy.c"], canon3, "self") diff --git a/decomp-architect/corpus/tools/P10/lever_census.py b/decomp-architect/corpus/tools/P10/lever_census.py index 39aa985d7f..b896ab8ce8 100644 --- a/decomp-architect/corpus/tools/P10/lever_census.py +++ b/decomp-architect/corpus/tools/P10/lever_census.py @@ -394,7 +394,30 @@ def _paren_depth_at(masked, start, pos): return depth -def walk_file(raw, rel, is_header): +def global_asm_macros(files): + """name -> kind for every asm-bearing #define in the tree plus the GTE header and the prelude: a USE of a macro defined in another + file (the prelude's ENGINE_SHB in a shared header; a unit's SHB in a header it includes) was invisible to the census, which only + knew a file's own definitions — 7 launder levers uncounted, three live SHB definitions judged dead (the oracle refused). Kinds + disagreeing across definitions resolve to the majority.""" + kinds = collections.defaultdict(collections.Counter) + for rel in list(files) + [GTE_HEADER_DEFAULT, PRELUDE]: + p = REPO / rel + if not p.exists(): + continue + raw = p.read_text(errors="surrogateescape") + if "#define" not in raw: + continue + for (l0, l1, name, body) in define_blocks(raw): + k = macro_kind(body) + if k: + kinds[name][k] += 1 + return {n: c.most_common(1)[0][0] for n, c in kinds.items()} + + +PRELUDE = "src/shared/engine_prelude.h" + + +def walk_file(raw, rel, is_header, global_names=None): """One file. Returns dict(sites=[...], defs=[...], macro_defs=[...], tokens=dict(raw, live, macro_block, comment_dead, unclassified), unclassified=[...]).""" masked = sc.mask_text(raw) @@ -426,7 +449,8 @@ def walk_file(raw, rel, is_header): mdefs.append(dict(name=name, kind=kind, line=l0, end=l1, nlines=l1 - l0 + 1, text_hash=hashlib.sha1(re.sub(r"\s+", " ", body).encode()).hexdigest()[:12])) if l1 > l0: macro_block_lines.update(range(l0, l1 + 1)) - asm_macro_names = {m["name"]: m["kind"] for m in mdefs} + asm_macro_names = dict(global_names or {}) # names defined elsewhere in the tree (kind by the majority definition) + asm_macro_names.update({m["name"]: m["kind"] for m in mdefs}) # the file's own definitions win # single-line #define lines stay in the masked text: their tokens are roled 'macro-def' define_single_lines = {l0 for (l0, l1, _, _) in define_blocks(raw) if l0 == l1} sites, roles, claimed = [], {}, set() @@ -676,9 +700,9 @@ def walk_file(raw, rel, is_header): def _walk_worker(args): - rel, is_header = args + rel, is_header, global_names = args raw = (REPO / rel).read_text(errors="surrogateescape") - return walk_file(raw, rel, is_header) + return walk_file(raw, rel, is_header, global_names) # ---------------------------------------------------------------------------------------------------------------------- @@ -755,11 +779,13 @@ def run_census(jobs, use_cache=True, out_dir=OUT_DIR_DEFAULT, want_sites=False, cache = {} work, keys = [], {} files = [(rel, False) for rel in sorted(tu_aliases)] + [(h, True) for h in headers] + gnames = global_asm_macros([rel for rel, _ in files]) + gstamp = hashlib.sha1(json.dumps(sorted(gnames.items())).encode()).hexdigest()[:8] # the cross-file name table is part of the key for rel, is_h in files: st = (REPO / rel).stat() - keys[rel] = f"{rel}|{int(st.st_mtime)}|{st.st_size}|{TOOL_STAMP}" # a tool change invalidates every cached walk (R35) + keys[rel] = f"{rel}|{int(st.st_mtime)}|{st.st_size}|{TOOL_STAMP}|{gstamp}" # a tool change invalidates every cached walk (R35) if keys[rel] not in cache: - work.append((rel, is_h)) + work.append((rel, is_h, gnames)) results = {} if work: with ProcessPoolExecutor(max_workers=jobs) as ex: @@ -1036,6 +1062,7 @@ s32 func_80128218(s32 a0, register s32 a1) { __asm__("addu %0,%1,$zero" : "=r"(v) : "r"(s)); __asm__("la %0, D_800A5E94" : "=r"(p)); SHB(v); + ENGINE_SHB(v); GTE_LDV0(p); q = (u8 *)__builtin_memcpy((void *)a0, (void *)a1, 8); return v + zr + plain + buf[0] + (s32)q; @@ -1051,10 +1078,10 @@ void func_80128500(void) { def selftest(): - r = walk_file(FIXTURE, "src/fx/x.c", False) + r = walk_file(FIXTURE, "src/fx/x.c", False, global_names={"ENGINE_SHB": "launder"}) got = collections.Counter((s["cls"], s["kind"]) for s in r["sites"]) want = collections.Counter({("A", "pin"): 5, ("D", "register"): 2, ("C", "decl-file"): 1, ("C", "decl-body"): 1, ("C", "cast"): 1, - ("B", "barrier"): 3, ("B", "launder"): 2, ("B", "keepalive"): 1, ("B", "instruction"): 2, + ("B", "barrier"): 3, ("B", "launder"): 3, ("B", "keepalive"): 1, ("B", "instruction"): 2, # the fixture's GTE_LDV0 carries a "memory" clobber Sony's gte_ldv0 lacks: a gte-lever once the T5 tables # (.run/P36/gte/canonical.json + sig_cache.json, tracked) exist — they do in every checkout ("B", GTE_LEVER_KIND if _gte_lookup()[1] else "gte"): 1, @@ -1077,7 +1104,7 @@ def selftest(): if len(r["orphan_markers"]) != 1: print(f"selftest: orphan markers {r['orphan_markers']} (want exactly the stale line)"); ok = False via = sorted(s["detail"] for s in r["sites"] if s.get("via")) - if via != ["GTE_LDV0", "SHB"]: + if via != ["ENGINE_SHB", "GTE_LDV0", "SHB"]: print(f"selftest: macro uses {via}"); ok = False mk = sorted((m["name"], m["kind"]) for m in r["macro_defs"]) if mk != [("GTE_LDV0", "gte"), ("SHB", "launder")]: diff --git a/docs/SETUP.md b/docs/SETUP.md index 39a0ba1d00..3b8418f359 100644 --- a/docs/SETUP.md +++ b/docs/SETUP.md @@ -782,10 +782,10 @@ Every script under `tools/` (plus the two report make-targets), grouped by purpo | | `tools/kit_lint.py [--selftest] [--paths …]` | **(P33.5 task 11)** The day-one decomp kit (`decomp-architect/`) stays de-specialised: (1) LEAK — no line outside a ```` ```calibration ```` fence and off a `provenance:` line matches `SLUS|Musashi|BFM|Druthulu|func_80|ov_SC|/home/musashi|/mnt/z|172\.17\.|\bR[0-9]{1,2}\b|§[0-9]+` (fence-aware: `grep -v calibration` would drop only lines containing the word); (2) PLACEHOLDERS — the `{{NAME}}` set used under the package equals the backticked set in `templates/PLACEHOLDERS.md` (the contract); (3) SYNTAX — `bash -n` / `py_compile` (no bytecode written) / JSON+YAML parse; (4) the gitignore template diff (delegated); (5) `TODO(platform)` / `TODO(phase-N)` counts; (6) coverage — zero files is a failure. rc 1 findings, rc 2 package absent (R43). `--selftest` = the R39 control (a planted leak line + a planted unlisted placeholder must be caught, fenced and provenance lines must not). In `tools-health` (selftest, then the real run). | | | `tools/tool_census.py [--check | --manifest | --corpus | --all | --consumers FILE]` | **(P33.5 task 13.5)** The tools audit as a derived instrument: two independent enumerations of every tool file under `tools/` (`find` vs `git ls-files`, submodules/vendored/downloaded excluded — they must agree, R34); per tool the docstring line, its SETUP row, its CONSUMERS (Makefile/`.mk` targets, CI, the wave playbook, other tools by import or by name) and hence its class (LIVE · REFERENCED · ORPHAN); the AUTHORED facts live in `config/tool_dictionary.tsv` (phase · portability · the NEED the tool answers · what · what it hard-codes · the retirement verdict with its successor or product) with coverage asserted BOTH ways (R32 — a new tool without a row fails `--check`). Generates `docs/tool-index.md` (the need-keyed dictionary; KEEP-GEN), the kit's `tools/MANIFEST.md` (`--manifest`) and the three verbatim corpora `decomp-architect/corpus/tools//` + `corpus/cookbook/` + `corpus/record/` (the how-to, the decision log, the accelerators, the retrospective, the story, the playbook, the effort map, the gen3 docs, the digest, every PhaseEnd — task 14.5) (`--corpus`; superseded tools as pointer files; sha1-equal to their sources). `--check` in `tools-health`; `make kit-corpus` = `--all`. `--consumers FILE` is the referrer census before any `git mv` of a tool. | | | `tools/share_census.py` | **(P35 T1)** The fleet-wide census of byte-identical function classes and the S1 "one source per unique function" checker (`--check`, `--selftest`, `--scope`, `--strict-macros`, `--strict-text`); its ledger is `config/dedup_exceptions.tsv`; details in the P35 T1 section below. | -| | `tools/lever_census.py` | **(P36 T1)** The census of every compiler-forcing construct ("lever") in the fleet's C — register pins, asm statements by kind (barrier / launder / keepalive / instruction / GTE / verbatim-body), volatile levers, bare `register`, plus the deferred asm-label aliases, builtins and attributes — derived from `share_census`'s scanner with a per-token coverage assertion against the raw text, four known-true controls, the `// !FAKE:` marker split, `--check` (0 unmarked pins/asm AND 0 orphan markers — a `// !FAKE:` line with no pin/asm site on it nor on the line below) and `--check --strict` (0 pins, 0 asm outside the GTE header) gates, the JSON's `head` + stat-based `src_stamp` (delever refuses a census that does not describe the tree) and a per-file walk cache keyed on the walker's own hash (a tool change invalidates it, R35), `--sites` (every site to `.run/P36/census/lever_sites.jsonl`, the delever ledger's input), `--selftest`. Evidence: `.run/P36/census/lever_census.{json,txt}`; `progress.py` publishes the `levers` block and a README sentence from it. | +| | `tools/lever_census.py` | **(P36 T1)** The census of every compiler-forcing construct ("lever") in the fleet's C — register pins, asm statements by kind (barrier / launder / keepalive / instruction / GTE / verbatim-body), volatile levers, bare `register`, plus the deferred asm-label aliases, builtins and attributes — derived from `share_census`'s scanner with a per-token coverage assertion against the raw text, four known-true controls, the `// !FAKE:` marker split, `--check` (0 unmarked pins/asm AND 0 orphan markers — a `// !FAKE:` line with no pin/asm site on it nor on the line below) and `--check --strict` (0 pins, 0 asm outside the GTE header) gates, cross-file macro names (a use of a macro defined in another file — the prelude's `ENGINE_SHB`, a unit's `SHB` inside an included header, the GTE header's names — is classed by the majority definition's kind; it was invisible before), the JSON's `head` + stat-based `src_stamp` (delever refuses a census that does not describe the tree) and a per-file walk cache keyed on the walker's own hash (a tool change invalidates it, R35), `--sites` (every site to `.run/P36/census/lever_sites.jsonl`, the delever ledger's input), `--selftest`. Evidence: `.run/P36/census/lever_census.{json,txt}`; `progress.py` publishes the `levers` block and a README sentence from it. | | | `tools/delever_oracle.py` | **(P36 T2)** The fast byte oracle for a single-translation-unit edit: `--recipes` captures every object's exact build command through `make -n -W BINARY=` (the Makefile's own pipeline — the jump-table pad stage, the per-object `-O0` overrides, the twin rule — into `.run/P36/delever/recipes.json`, regenerable in ~15 s); a candidate is compiled IN PLACE with `-o`/`-MF` redirected to scratch and its bytes compared with `build/`'s object from the fleet run (build/ is never written); `--calibrate ` proves 100 % equality untouched + twin == primary + a positive control (a nop injected at the end of a real body → DIFFERS) and writes `calibration.json` (HEAD, config stamp, per-object seconds); `--status`. Measured at T2: main 0.08–0.77 s per object, overlays ~0.14 s. | | | `tools/delever.py` | **(P36 T2/T3)** The de-lever engine AND the campaign tool. Rewrites per lever class on the raw text at the census's positions (a token mismatch REFUSES, never guesses): pin → plain declaration (type/qualifiers/initializer kept; the `$0` zero-register variable's uses → 0, refused if it is ever assigned), barrier / keep-alive → deleted, launder → deleted when it launders a value into itself, **an ASSIGNMENT `out = in;` when its output and input differ** (deleting those made cc1 2.7.2 abort — the T2 probe counted them NEEDED), a hand-placed instruction → its C (addu-$zero/move/la/lh/lw/addiu/sll/srl/and/andi/lui/li and the lui+addiu / lui+ori pairs), a macro-carried site → deleted for a pure launder statement macro (`SHB`), its value `((T)(p))` for a launder statement-expression, REFUSED for a compound macro (XFER/DRAW/RTP_SND: the lever is in the `#define`, T5), volatile / register → dropped. Per body: replay (a ledger exemplar with the same normalized text: 1 compile) → rung A strip-all → rung B greedy, through `delever_oracle` (verdicts IDENTICAL / DIFFERS / COMPILE-ERROR / COMPILE-CRASH). **The file is the write unit and its final compile the proof**: every body's accepted edits + the file-scope volatile edits + the `// !FAKE:` markers spliced once, compiled through every recipe of the file (a twin's object; every includer of a header, in parallel) — IDENTICAL or the file-scope edits are dropped, or the file is restored and REFUSED (COMBINATION-FAILED). `--plan` / `--apply --batch N --label L [--headers] [--only …] [-j 12]` (TUs in parallel, exemplar files before their copies; headers serial; the tree must be clean, the calibration current, the census's src stamp the tree's — it reruns the census itself), `--redraw REFUSED NOTHING-USABLE` (draw again the bodies whose latest ledger verdict is one of these — after a tool fix), `--restore` (from `inflight.json`, the only restore — R102; it also drops the in-flight batch's ledger rows into an ignored `ledger.jsonl.killed_