phase-36: rung R made TU-parallel — a worker owns a whole translation unit (the oracle writes each candidate to the real source path and names its scratch object after the object it builds), shared headers stay serial (two headers can share an includer's object), bodies judged bottom-up within a file so a bank never shifts a body still to come, and the in-flight map is per-file under the lock so a killed run restores every worker's file

This commit is contained in:
Drew T
2026-09-09 15:56:07 -06:00
parent aef1159488
commit 2d8ee30a10
3 changed files with 308 additions and 244 deletions
+187 -187
View File
@@ -1,7 +1,7 @@
{
"head": "a2da99b13",
"head": "aef115948",
"stamp": "b44c5a8a3423",
"generated": "2026-09-09 12:22",
"generated": "2026-09-09 15:18",
"aliases": [
"main",
"ov_SC03_014",
@@ -21,207 +21,207 @@
"main": {
"objects": 85,
"identical": 85,
"seconds": 10.411,
"mean_s": 0.122
"seconds": 13.021000000000003,
"mean_s": 0.153
},
"ov_SC03_014": {
"objects": 32,
"identical": 32,
"seconds": 6.194000000000002,
"mean_s": 0.194
"seconds": 6.852000000000002,
"mean_s": 0.214
},
"ov_SC03_015": {
"objects": 32,
"identical": 32,
"seconds": 6.275,
"mean_s": 0.196
"seconds": 6.595999999999999,
"mean_s": 0.206
},
"ov_SC04_011": {
"objects": 28,
"identical": 28,
"seconds": 5.665000000000001,
"mean_s": 0.202
"seconds": 5.715,
"mean_s": 0.204
}
},
"per_object_seconds": {
"build/src/800.o": 1.137,
"build/src/800_b.o": 0.106,
"build/src/800_b_2.o": 0.399,
"build/src/800_b_o0a.o": 0.089,
"build/src/800_c.o": 0.437,
"build/src/800b2.o": 0.142,
"build/src/apicard1.o": 0.082,
"build/src/apicard2.o": 0.167,
"build/src/apicard3.o": 0.077,
"build/src/apicard4.o": 0.12,
"build/src/apicard5.o": 0.109,
"build/src/apicard6.o": 0.144,
"build/src/apicard7.o": 0.136,
"build/src/boot.o": 0.133,
"build/src/gap.o": 0.085,
"build/src/libapi1.o": 0.1,
"build/src/libapi2.o": 0.08,
"build/src/libc2_1.o": 0.089,
"build/src/libc2_2.o": 0.085,
"build/src/libcd1.o": 0.102,
"build/src/libcd2.o": 0.066,
"build/src/libetc.o": 0.066,
"build/src/libgpu.o": 0.172,
"build/src/libgpu2.o": 0.103,
"build/src/libgs1.o": 0.094,
"build/src/libgs2.o": 0.098,
"build/src/libgs3.o": 0.16,
"build/src/libgs4.o": 0.079,
"build/src/libgs5.o": 0.175,
"build/src/libgs6.o": 0.096,
"build/src/libgs7.o": 0.085,
"build/src/libgs8.o": 0.114,
"build/src/libgte1.o": 0.089,
"build/src/libgte10.o": 0.081,
"build/src/libgte11.o": 0.133,
"build/src/libgte12.o": 0.08,
"build/src/libgte13.o": 0.091,
"build/src/libgte14.o": 0.069,
"build/src/libgte15.o": 0.064,
"build/src/libgte16.o": 0.086,
"build/src/libgte17.o": 0.064,
"build/src/libgte18.o": 0.07,
"build/src/libgte19.o": 0.126,
"build/src/libgte2.o": 0.067,
"build/src/libgte20.o": 0.069,
"build/src/libgte21.o": 0.154,
"build/src/libgte22.o": 0.077,
"build/src/libgte23.o": 0.079,
"build/src/libgte24.o": 0.175,
"build/src/libgte25.o": 0.09,
"build/src/libgte26.o": 0.157,
"build/src/libgte27.o": 0.071,
"build/src/libgte28.o": 0.104,
"build/src/libgte29.o": 0.095,
"build/src/libgte3.o": 0.081,
"build/src/libgte30.o": 0.125,
"build/src/libgte4.o": 0.064,
"build/src/libgte5.o": 0.126,
"build/src/libgte6.o": 0.076,
"build/src/libgte7.o": 0.092,
"build/src/libgte8.o": 0.207,
"build/src/libgte9.o": 0.201,
"build/src/libmcrd1.o": 0.103,
"build/src/libmcrd2.o": 0.077,
"build/src/libpad1.o": 0.071,
"build/src/libpad2.o": 0.168,
"build/src/sgap.o": 0.083,
"build/src/sgap_2.o": 0.087,
"build/src/sgap_3.o": 0.085,
"build/src/sgap_4.o": 0.102,
"build/src/sgap_5.o": 0.23,
"build/src/sgap_6.o": 0.082,
"build/src/sgap_8.o": 0.08,
"build/src/snd1.o": 0.109,
"build/src/snd10.o": 0.072,
"build/src/snd11.o": 0.073,
"build/src/snd12.o": 0.072,
"build/src/snd2.o": 0.076,
"build/src/snd3.o": 0.144,
"build/src/snd4.o": 0.088,
"build/src/snd5.o": 0.085,
"build/src/snd6.o": 0.083,
"build/src/snd7.o": 0.07,
"build/src/snd8.o": 0.071,
"build/src/snd9.o": 0.11,
"build/src/ov_SC03_014/ov_SC03_014.o": 0.144,
"build/src/ov_SC03_014/ov_SC03_014_after.o": 0.695,
"build/src/ov_SC03_014/ov_SC03_014_jr_8012ACE0.o": 0.437,
"build/src/ov_SC03_014/ov_SC03_014_jr_80135888.o": 0.204,
"build/src/ov_SC03_014/ov_SC03_014_jr_80135A4C.o": 0.075,
"build/src/ov_SC03_014/ov_SC03_014_jr_80135D20.o": 0.143,
"build/src/ov_SC03_014/ov_SC03_014_jr_801380E0.o": 0.193,
"build/src/ov_SC03_014/ov_SC03_014_jr_8013C98C.o": 0.164,
"build/src/ov_SC03_014/ov_SC03_014_jr_8013F350.o": 0.088,
"build/src/ov_SC03_014/ov_SC03_014_jr_8013FFD8.o": 0.076,
"build/src/ov_SC03_014/ov_SC03_014_jr_80140608.o": 0.235,
"build/src/ov_SC03_014/ov_SC03_014_jr_8015444C.o": 0.086,
"build/src/ov_SC03_014/ov_SC03_014_jr_80154C24.o": 0.192,
"build/src/ov_SC03_014/ov_SC03_014_jr_801588CC.o": 0.194,
"build/src/ov_SC03_014/ov_SC03_014_jr_80159C84.o": 0.166,
"build/src/ov_SC03_014/ov_SC03_014_jr_8015A3C8.o": 0.086,
"build/src/ov_SC03_014/ov_SC03_014_jr_8015AE2C.o": 0.133,
"build/src/ov_SC03_014/ov_SC03_014_jr_8015C32C.o": 0.545,
"build/src/ov_SC03_014/ov_SC03_014_jr_8016AB6C.o": 0.469,
"build/src/ov_SC03_014/ov_SC03_014_jr_80171B4C.o": 0.168,
"build/src/ov_SC03_014/ov_SC03_014_jr_801734BC.o": 0.236,
"build/src/ov_SC03_014/ov_SC03_014_jr_801789AC.o": 0.073,
"build/src/ov_SC03_014/ov_SC03_014_jr_80178D40.o": 0.117,
"build/src/ov_SC03_014/ov_SC03_014_jr_8017A4AC.o": 0.093,
"build/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.o": 0.208,
"build/src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.o": 0.242,
"build/src/ov_SC03_014/ov_SC03_014_jr_80184440.o": 0.059,
"build/src/ov_SC03_014/ov_SC03_014_jr_801848E4.o": 0.33,
"build/src/ov_SC03_014/ov_SC03_014_o0b.o": 0.073,
"build/src/ov_SC03_014/ov_SC03_014_o0c.o": 0.096,
"build/src/ov_SC03_014/ov_SC03_014_o0d.o": 0.078,
"build/src/ov_SC03_014/ov_SC03_014_o0e.o": 0.096,
"build/src/ov_SC03_015/ov_SC03_015.o": 0.195,
"build/src/ov_SC03_015/ov_SC03_015_after.o": 0.743,
"build/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.o": 0.558,
"build/src/ov_SC03_015/ov_SC03_015_jr_80135888.o": 0.073,
"build/src/ov_SC03_015/ov_SC03_015_jr_80135A4C.o": 0.109,
"build/src/ov_SC03_015/ov_SC03_015_jr_80135D20.o": 0.153,
"build/src/ov_SC03_015/ov_SC03_015_jr_801380E0.o": 0.23,
"build/src/ov_SC03_015/ov_SC03_015_jr_8013C98C.o": 0.163,
"build/src/ov_SC03_015/ov_SC03_015_jr_8013F350.o": 0.083,
"build/src/ov_SC03_015/ov_SC03_015_jr_8013FFD8.o": 0.083,
"build/src/ov_SC03_015/ov_SC03_015_jr_80140608.o": 0.192,
"build/src/ov_SC03_015/ov_SC03_015_jr_8015444C.o": 0.126,
"build/src/ov_SC03_015/ov_SC03_015_jr_80154C24.o": 0.229,
"build/src/800.o": 0.914,
"build/src/800_b.o": 0.242,
"build/src/800_b_2.o": 0.599,
"build/src/800_b_o0a.o": 0.179,
"build/src/800_c.o": 0.343,
"build/src/800b2.o": 0.21,
"build/src/apicard1.o": 0.217,
"build/src/apicard2.o": 0.153,
"build/src/apicard3.o": 0.233,
"build/src/apicard4.o": 0.224,
"build/src/apicard5.o": 0.281,
"build/src/apicard6.o": 0.212,
"build/src/apicard7.o": 0.22,
"build/src/boot.o": 0.223,
"build/src/gap.o": 0.211,
"build/src/libapi1.o": 0.191,
"build/src/libapi2.o": 0.083,
"build/src/libc2_1.o": 0.127,
"build/src/libc2_2.o": 0.103,
"build/src/libcd1.o": 0.196,
"build/src/libcd2.o": 0.127,
"build/src/libetc.o": 0.115,
"build/src/libgpu.o": 0.211,
"build/src/libgpu2.o": 0.131,
"build/src/libgs1.o": 0.144,
"build/src/libgs2.o": 0.107,
"build/src/libgs3.o": 0.122,
"build/src/libgs4.o": 0.152,
"build/src/libgs5.o": 0.074,
"build/src/libgs6.o": 0.139,
"build/src/libgs7.o": 0.093,
"build/src/libgs8.o": 0.084,
"build/src/libgte1.o": 0.155,
"build/src/libgte10.o": 0.078,
"build/src/libgte11.o": 0.106,
"build/src/libgte12.o": 0.119,
"build/src/libgte13.o": 0.081,
"build/src/libgte14.o": 0.197,
"build/src/libgte15.o": 0.076,
"build/src/libgte16.o": 0.068,
"build/src/libgte17.o": 0.171,
"build/src/libgte18.o": 0.08,
"build/src/libgte19.o": 0.088,
"build/src/libgte2.o": 0.098,
"build/src/libgte20.o": 0.099,
"build/src/libgte21.o": 0.234,
"build/src/libgte22.o": 0.088,
"build/src/libgte23.o": 0.08,
"build/src/libgte24.o": 0.196,
"build/src/libgte25.o": 0.081,
"build/src/libgte26.o": 0.143,
"build/src/libgte27.o": 0.165,
"build/src/libgte28.o": 0.082,
"build/src/libgte29.o": 0.086,
"build/src/libgte3.o": 0.073,
"build/src/libgte30.o": 0.089,
"build/src/libgte4.o": 0.127,
"build/src/libgte5.o": 0.142,
"build/src/libgte6.o": 0.084,
"build/src/libgte7.o": 0.119,
"build/src/libgte8.o": 0.121,
"build/src/libgte9.o": 0.101,
"build/src/libmcrd1.o": 0.157,
"build/src/libmcrd2.o": 0.092,
"build/src/libpad1.o": 0.188,
"build/src/libpad2.o": 0.204,
"build/src/sgap.o": 0.11,
"build/src/sgap_2.o": 0.12,
"build/src/sgap_3.o": 0.086,
"build/src/sgap_4.o": 0.108,
"build/src/sgap_5.o": 0.136,
"build/src/sgap_6.o": 0.149,
"build/src/sgap_8.o": 0.148,
"build/src/snd1.o": 0.15,
"build/src/snd10.o": 0.199,
"build/src/snd11.o": 0.085,
"build/src/snd12.o": 0.197,
"build/src/snd2.o": 0.187,
"build/src/snd3.o": 0.071,
"build/src/snd4.o": 0.098,
"build/src/snd5.o": 0.069,
"build/src/snd6.o": 0.081,
"build/src/snd7.o": 0.073,
"build/src/snd8.o": 0.076,
"build/src/snd9.o": 0.15,
"build/src/ov_SC03_014/ov_SC03_014.o": 0.157,
"build/src/ov_SC03_014/ov_SC03_014_after.o": 0.685,
"build/src/ov_SC03_014/ov_SC03_014_jr_8012ACE0.o": 0.701,
"build/src/ov_SC03_014/ov_SC03_014_jr_80135888.o": 0.082,
"build/src/ov_SC03_014/ov_SC03_014_jr_80135A4C.o": 0.071,
"build/src/ov_SC03_014/ov_SC03_014_jr_80135D20.o": 0.146,
"build/src/ov_SC03_014/ov_SC03_014_jr_801380E0.o": 0.356,
"build/src/ov_SC03_014/ov_SC03_014_jr_8013C98C.o": 0.141,
"build/src/ov_SC03_014/ov_SC03_014_jr_8013F350.o": 0.165,
"build/src/ov_SC03_014/ov_SC03_014_jr_8013FFD8.o": 0.08,
"build/src/ov_SC03_014/ov_SC03_014_jr_80140608.o": 0.323,
"build/src/ov_SC03_014/ov_SC03_014_jr_8015444C.o": 0.172,
"build/src/ov_SC03_014/ov_SC03_014_jr_80154C24.o": 0.227,
"build/src/ov_SC03_014/ov_SC03_014_jr_801588CC.o": 0.112,
"build/src/ov_SC03_014/ov_SC03_014_jr_80159C84.o": 0.099,
"build/src/ov_SC03_014/ov_SC03_014_jr_8015A3C8.o": 0.106,
"build/src/ov_SC03_014/ov_SC03_014_jr_8015AE2C.o": 0.129,
"build/src/ov_SC03_014/ov_SC03_014_jr_8015C32C.o": 0.709,
"build/src/ov_SC03_014/ov_SC03_014_jr_8016AB6C.o": 0.328,
"build/src/ov_SC03_014/ov_SC03_014_jr_80171B4C.o": 0.123,
"build/src/ov_SC03_014/ov_SC03_014_jr_801734BC.o": 0.248,
"build/src/ov_SC03_014/ov_SC03_014_jr_801789AC.o": 0.075,
"build/src/ov_SC03_014/ov_SC03_014_jr_80178D40.o": 0.157,
"build/src/ov_SC03_014/ov_SC03_014_jr_8017A4AC.o": 0.092,
"build/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.o": 0.346,
"build/src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.o": 0.243,
"build/src/ov_SC03_014/ov_SC03_014_jr_80184440.o": 0.126,
"build/src/ov_SC03_014/ov_SC03_014_jr_801848E4.o": 0.317,
"build/src/ov_SC03_014/ov_SC03_014_o0b.o": 0.067,
"build/src/ov_SC03_014/ov_SC03_014_o0c.o": 0.1,
"build/src/ov_SC03_014/ov_SC03_014_o0d.o": 0.07,
"build/src/ov_SC03_014/ov_SC03_014_o0e.o": 0.099,
"build/src/ov_SC03_015/ov_SC03_015.o": 0.201,
"build/src/ov_SC03_015/ov_SC03_015_after.o": 0.741,
"build/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.o": 0.498,
"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.083,
"build/src/ov_SC03_015/ov_SC03_015_jr_80135D20.o": 0.136,
"build/src/ov_SC03_015/ov_SC03_015_jr_801380E0.o": 0.165,
"build/src/ov_SC03_015/ov_SC03_015_jr_8013C98C.o": 0.16,
"build/src/ov_SC03_015/ov_SC03_015_jr_8013F350.o": 0.129,
"build/src/ov_SC03_015/ov_SC03_015_jr_8013FFD8.o": 0.089,
"build/src/ov_SC03_015/ov_SC03_015_jr_80140608.o": 0.207,
"build/src/ov_SC03_015/ov_SC03_015_jr_8015444C.o": 0.077,
"build/src/ov_SC03_015/ov_SC03_015_jr_80154C24.o": 0.214,
"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.078,
"build/src/ov_SC03_015/ov_SC03_015_jr_8015A3C8.o": 0.081,
"build/src/ov_SC03_015/ov_SC03_015_jr_8015AE2C.o": 0.113,
"build/src/ov_SC03_015/ov_SC03_015_jr_8015C32C.o": 0.557,
"build/src/ov_SC03_015/ov_SC03_015_jr_8016AB6C.o": 0.454,
"build/src/ov_SC03_015/ov_SC03_015_jr_80171B4C.o": 0.114,
"build/src/ov_SC03_015/ov_SC03_015_jr_801734BC.o": 0.255,
"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.143,
"build/src/ov_SC03_015/ov_SC03_015_jr_8017A4AC.o": 0.118,
"build/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.o": 0.243,
"build/src/ov_SC03_015/ov_SC03_015_jr_8017EB7C.o": 0.226,
"build/src/ov_SC03_015/ov_SC03_015_jr_80184440.o": 0.062,
"build/src/ov_SC03_015/ov_SC03_015_jr_801848E4.o": 0.361,
"build/src/ov_SC03_015/ov_SC03_015_o0b.o": 0.078,
"build/src/ov_SC03_015/ov_SC03_015_o0c.o": 0.09,
"build/src/ov_SC03_015/ov_SC03_015_o0d.o": 0.072,
"build/src/ov_SC03_015/ov_SC03_015_o0e.o": 0.082,
"build/src/ov_SC04_011/ov_SC04_011.o": 0.252,
"build/src/ov_SC04_011/ov_SC04_011_after.o": 0.691,
"build/src/ov_SC04_011/ov_SC04_011_jr_8012ACE0.o": 0.439,
"build/src/ov_SC04_011/ov_SC04_011_jr_80135888.o": 0.067,
"build/src/ov_SC04_011/ov_SC04_011_jr_80135A4C.o": 0.08,
"build/src/ov_SC04_011/ov_SC04_011_jr_80135D20.o": 0.192,
"build/src/ov_SC04_011/ov_SC04_011_jr_801380E0.o": 0.188,
"build/src/ov_SC04_011/ov_SC04_011_jr_8013C98C.o": 0.126,
"build/src/ov_SC04_011/ov_SC04_011_jr_8013F350.o": 0.092,
"build/src/ov_SC04_011/ov_SC04_011_jr_8013FFD8.o": 0.092,
"build/src/ov_SC04_011/ov_SC04_011_jr_80140608.o": 0.214,
"build/src/ov_SC04_011/ov_SC04_011_jr_8015444C.o": 0.091,
"build/src/ov_SC04_011/ov_SC04_011_jr_80154C24.o": 0.203,
"build/src/ov_SC04_011/ov_SC04_011_jr_801588CC.o": 0.164,
"build/src/ov_SC04_011/ov_SC04_011_jr_80159C84.o": 0.092,
"build/src/ov_SC04_011/ov_SC04_011_jr_8015A3C8.o": 0.127,
"build/src/ov_SC04_011/ov_SC04_011_jr_8015AE2C.o": 0.176,
"build/src/ov_SC04_011/ov_SC04_011_jr_8015C32C.o": 0.453,
"build/src/ov_SC04_011/ov_SC04_011_jr_8016AB6C.o": 0.307,
"build/src/ov_SC04_011/ov_SC04_011_jr_80171B4C.o": 0.113,
"build/src/ov_SC04_011/ov_SC04_011_jr_801734BC.o": 0.222,
"build/src/ov_SC04_011/ov_SC04_011_jr_801789AC.o": 0.077,
"build/src/ov_SC04_011/ov_SC04_011_jr_80178D40.o": 0.227,
"build/src/ov_SC04_011/ov_SC04_011_jr_8017A4AC.o": 0.101,
"build/src/ov_SC04_011/ov_SC04_011_jr_8017AE2C.o": 0.129,
"build/src/ov_SC04_011/ov_SC04_011_jr_8017D494.o": 0.589,
"build/src/ov_SC04_011/ov_SC04_011_o0b.o": 0.079,
"build/src/ov_SC04_011/ov_SC04_011_o0c.o": 0.082
"build/src/ov_SC03_015/ov_SC03_015_jr_80159C84.o": 0.132,
"build/src/ov_SC03_015/ov_SC03_015_jr_8015A3C8.o": 0.11,
"build/src/ov_SC03_015/ov_SC03_015_jr_8015AE2C.o": 0.234,
"build/src/ov_SC03_015/ov_SC03_015_jr_8015C32C.o": 0.614,
"build/src/ov_SC03_015/ov_SC03_015_jr_8016AB6C.o": 0.506,
"build/src/ov_SC03_015/ov_SC03_015_jr_80171B4C.o": 0.131,
"build/src/ov_SC03_015/ov_SC03_015_jr_801734BC.o": 0.241,
"build/src/ov_SC03_015/ov_SC03_015_jr_801789AC.o": 0.071,
"build/src/ov_SC03_015/ov_SC03_015_jr_80178D40.o": 0.176,
"build/src/ov_SC03_015/ov_SC03_015_jr_8017A4AC.o": 0.079,
"build/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.o": 0.358,
"build/src/ov_SC03_015/ov_SC03_015_jr_8017EB7C.o": 0.246,
"build/src/ov_SC03_015/ov_SC03_015_jr_80184440.o": 0.086,
"build/src/ov_SC03_015/ov_SC03_015_jr_801848E4.o": 0.343,
"build/src/ov_SC03_015/ov_SC03_015_o0b.o": 0.075,
"build/src/ov_SC03_015/ov_SC03_015_o0c.o": 0.072,
"build/src/ov_SC03_015/ov_SC03_015_o0d.o": 0.139,
"build/src/ov_SC03_015/ov_SC03_015_o0e.o": 0.118,
"build/src/ov_SC04_011/ov_SC04_011.o": 0.21,
"build/src/ov_SC04_011/ov_SC04_011_after.o": 0.539,
"build/src/ov_SC04_011/ov_SC04_011_jr_8012ACE0.o": 0.432,
"build/src/ov_SC04_011/ov_SC04_011_jr_80135888.o": 0.103,
"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.162,
"build/src/ov_SC04_011/ov_SC04_011_jr_801380E0.o": 0.183,
"build/src/ov_SC04_011/ov_SC04_011_jr_8013C98C.o": 0.136,
"build/src/ov_SC04_011/ov_SC04_011_jr_8013F350.o": 0.102,
"build/src/ov_SC04_011/ov_SC04_011_jr_8013FFD8.o": 0.07,
"build/src/ov_SC04_011/ov_SC04_011_jr_80140608.o": 0.283,
"build/src/ov_SC04_011/ov_SC04_011_jr_8015444C.o": 0.095,
"build/src/ov_SC04_011/ov_SC04_011_jr_80154C24.o": 0.255,
"build/src/ov_SC04_011/ov_SC04_011_jr_801588CC.o": 0.137,
"build/src/ov_SC04_011/ov_SC04_011_jr_80159C84.o": 0.123,
"build/src/ov_SC04_011/ov_SC04_011_jr_8015A3C8.o": 0.087,
"build/src/ov_SC04_011/ov_SC04_011_jr_8015AE2C.o": 0.167,
"build/src/ov_SC04_011/ov_SC04_011_jr_8015C32C.o": 0.481,
"build/src/ov_SC04_011/ov_SC04_011_jr_8016AB6C.o": 0.278,
"build/src/ov_SC04_011/ov_SC04_011_jr_80171B4C.o": 0.13,
"build/src/ov_SC04_011/ov_SC04_011_jr_801734BC.o": 0.217,
"build/src/ov_SC04_011/ov_SC04_011_jr_801789AC.o": 0.15,
"build/src/ov_SC04_011/ov_SC04_011_jr_80178D40.o": 0.141,
"build/src/ov_SC04_011/ov_SC04_011_jr_8017A4AC.o": 0.104,
"build/src/ov_SC04_011/ov_SC04_011_jr_8017AE2C.o": 0.159,
"build/src/ov_SC04_011/ov_SC04_011_jr_8017D494.o": 0.668,
"build/src/ov_SC04_011/ov_SC04_011_o0b.o": 0.096,
"build/src/ov_SC04_011/ov_SC04_011_o0c.o": 0.146
},
"ok": true,
"seconds": 3.2
"seconds": 3.5
}
+10
View File
@@ -0,0 +1,10 @@
delever --recipes: control 3/3 — the identity splice reproduces its text and the untouched file its object
delever --recipes: 300 RESIDUE bodies in 244 TU(s) + 1 header(s), cap 40, 24 worker(s)
[25/300] 0 closed · 1056 compiles · 0.5 min · 49 bodies/min
[50/300] 0 closed · 2132 compiles · 0.8 min · 63 bodies/min
[75/300] 0 closed · 3151 compiles · 1.2 min · 62 bodies/min
[100/300] 0 closed · 4185 compiles · 1.5 min · 67 bodies/min
[125/300] 0 closed · 5182 compiles · 2.2 min · 58 bodies/min
[150/300] 0 closed · 6222 compiles · 2.4 min · 62 bodies/min
[175/300] 0 closed · 7262 compiles · 2.7 min · 65 bodies/min
[200/300] 0 closed · 8206 compiles · 3.5 min · 58 bodies/min
+111 -57
View File
@@ -1569,20 +1569,33 @@ def recipes(a):
def recs_for(tu):
return [r for t_ in inc.get(tu, []) for r in by_src.get(t_, [])] if tu.endswith(".h") else by_src.get(tu, [])
def judge(tu, cand):
inflight = {}
def judge(tu, cand, tag="rec"):
"""judge one candidate, and be killable: the oracle writes the candidate into the tree to compile it, so a SIGTERM
between the write and the restore leaves a candidate in `src/`. The original text goes into inflight.json first, the
same file `--restore` reads (P35's rule: a tool restores from its OWN snapshot, never `git checkout`) — S99 killed a
run mid-judge and found exactly that leftover."""
between the write and the restore leaves a candidate in `src/`. Every in-flight file's ORIGINAL text is held in
inflight.json, the same file `--restore` reads (P35's rule: a tool restores from its OWN snapshot, never
`git checkout`) — S99 killed a run mid-judge and found exactly that leftover. The map is per-FILE and written under
the lock, so a killed parallel run restores every worker's file and not just the last one's.
`tag` names the scratch object: `compile_obj` writes `<object>.<tag>.o`, so two workers on the same object would
clobber each other's output — which is why a worker owns a whole TU and headers stay serial."""
path = REPO / tu
raw, st = path.read_text(errors="surrogateescape"), path.stat()
RUN.mkdir(parents=True, exist_ok=True)
INFLIGHT.write_text(json.dumps({tu: raw}))
with _LOCK:
RUN.mkdir(parents=True, exist_ok=True)
inflight[tu] = raw
INFLIGHT.write_text(json.dumps(inflight))
try:
return oracle.judge_all(recs_for(tu), cand, tag="rec", write_path=(tu if tu.endswith(".h") else None))
return oracle.judge_all(recs_for(tu), cand, tag=tag, write_path=(tu if tu.endswith(".h") else None))
finally:
restore_file(path, raw, st)
INFLIGHT.unlink(missing_ok=True)
with _LOCK:
inflight.pop(tu, None)
if inflight:
INFLIGHT.write_text(json.dumps(inflight))
else:
INFLIGHT.unlink(missing_ok=True)
def lever_free(tu, raw, fn):
m, ls = same_len_mask(raw), line_starts(raw)
@@ -1628,58 +1641,99 @@ def recipes(a):
for b in bad[:5]:
print(f" CONTROL FAILED {b[0]}:{b[1]} -> {b[2]} {b[3]}")
sys.exit("delever --recipes: the control did not pass — no verdict from this run is usable (R39)")
print(f"delever --recipes: {len(todo)} RESIDUE bodies", flush=True)
rows, won, tried, compiles = [], 0, 0, 0
# THE SWEEP, TU-PARALLEL. A worker owns a WHOLE translation unit: the oracle writes each candidate to the real source
# path and names its scratch object after the object it builds, so two workers sharing a TU would overwrite each other's
# source AND their scratch objects. Shared headers stay SERIAL for the same reason one level up — two different headers
# can be included by the same TU, and both would compile that includer's object at once (`--apply` draws them the same
# way). Bodies of one TU are judged in that worker, in order, against that file's own text.
by_tu = collections.OrderedDict()
for k, r in todo:
by_tu.setdefault(k[0], []).append((k, r))
# BOTTOM-UP WITHIN A FILE: a banked body changes the line numbers of everything below it, and the census positions this
# sweep rewrites from were taken before the run. Judging a file's bodies in descending order means an accepted edit never
# moves a body still to come (the alternative is a REFUSED token mismatch on every later body of a file that banked one).
for tu in by_tu:
by_tu[tu].sort(key=lambda kr: -min((s["line"] for s in sites_by[kr[0]]), default=0))
tus = [tu for tu in by_tu if not tu.endswith(".h")]
hdrs = [tu for tu in by_tu if tu.endswith(".h")]
print(f"delever --recipes: {len(todo)} RESIDUE bodies in {len(tus)} TU(s) + {len(hdrs)} header(s), "
f"cap {a.cap}, {a.jobs} worker(s)", flush=True)
state = dict(won=0, tried=0, compiles=0, done=0, skipped=0)
rows = []
t0 = time.time()
for n_body, ((tu, fn), r) in enumerate(todo, 1):
path = REPO / tu
raw = path.read_text(errors="surrogateescape")
names = pin_names(sites_by[(tu, fn)]) # may be empty: R5 needs no pinned declaration
try:
free = lever_free(tu, raw, fn)
except Refuse:
continue
cands = recipe_candidates(free, tu, fn, names, cap=a.cap)
if not cands:
continue
tried += 1
hit = None
for rec, desc, cand in cands:
v, dt, err = judge(tu, cand)
compiles += len(recs_for(tu))
if v == "IDENTICAL":
hit = (rec, desc, cand)
break
if n_body % 10 == 0 or hit: # R55: a lane that runs unattended leaves evidence
print(f" [{n_body}/{len(todo)}] {won} closed · {compiles} compiles · {(time.time() - t0) / 60:.1f} min",
flush=True)
row = dict(ts=time.strftime("%Y-%m-%d %H:%M:%S"), label=a.label, rung="R", calib=dict(head=oracle.head(), stamp=oracle.config_stamp()),
tu=tu, fn=fn, addr=fn_addr(fn, tu), aliases=r.get("aliases"), header=tu.endswith(".h"),
nhash_before=r.get("nhash_after"), nhash_after=None, candidates=len(cands), pins=len(names),
verdict=("LEVER-FREE" if hit else "RESIDUE"), recipe=(hit[0] if hit else None), how=(hit[1] if hit else None),
sites=([] if hit else r.get("sites", [])))
if hit:
path.write_text(hit[2], errors="surrogateescape")
# the body's own markers are now orphans (its levers are gone); every OTHER body's marker is still honest, so the
# scrub is scoped to this body's line span — a file-wide scrub would leave the census with UNMARKED sites elsewhere
recs_ = sc.scan_text(hit[2], tu, shared_defs=None)
d_ = next((x for x in recs_ if x["form"] == "def" and x["name"] == fn), None)
span = range(d_["line"], d_["end"] + 1) if d_ else range(0)
scrub = scrub_edits(hit[2], [i + 1 for i, l in enumerate(hit[2].split("\n")) if FAKE in l and i + 1 in span])
if scrub:
cand2 = apply_edits(hit[2], scrub)
v2, _, _ = judge(tu, cand2)
if v2 == "IDENTICAL":
path.write_text(cand2, errors="surrogateescape")
walk = lc.walk_file(path.read_text(errors="surrogateescape"), tu, tu.endswith(".h"))
row["nhash_after"] = next((x["nhash"] for x in walk["defs"] if x["name"] == fn), None)
won += 1
print(f" {tu}:{fn} — {hit[0]} {hit[1]} IDENTICAL ({len(names)} pin(s) gone)", flush=True)
rows.append(row)
def work_tu(tu, tag):
out = []
for (tu_, fn), r in by_tu[tu]:
path = REPO / tu
raw = path.read_text(errors="surrogateescape")
names = pin_names(sites_by[(tu, fn)]) # may be empty: R5/R7 need no pinned declaration
try:
free = lever_free(tu, raw, fn)
except Refuse:
with _LOCK:
state["skipped"] += 1
state["done"] += 1
continue
cands = recipe_candidates(free, tu, fn, names, cap=a.cap)
if not cands:
with _LOCK:
state["skipped"] += 1
state["done"] += 1
continue
hit, n_c = None, 0
for rec, desc, cand in cands:
v, dt, err = judge(tu, cand, tag=tag)
n_c += len(recs_for(tu))
if v == "IDENTICAL":
hit = (rec, desc, cand)
break
row = dict(ts=time.strftime("%Y-%m-%d %H:%M:%S"), label=a.label, rung="R",
calib=dict(head=oracle.head(), stamp=oracle.config_stamp()),
tu=tu, fn=fn, addr=fn_addr(fn, tu), aliases=r.get("aliases"), header=tu.endswith(".h"),
nhash_before=r.get("nhash_after"), nhash_after=None, candidates=len(cands), pins=len(names),
verdict=("LEVER-FREE" if hit else "RESIDUE"), recipe=(hit[0] if hit else None),
how=(hit[1] if hit else None), sites=([] if hit else r.get("sites", [])))
if hit:
path.write_text(hit[2], errors="surrogateescape")
# the body's own markers are now orphans (its levers are gone); every OTHER body's marker is still honest,
# so the scrub is scoped to this body's line span — a file-wide scrub would leave the census UNMARKED elsewhere
recs2 = sc.scan_text(hit[2], tu, shared_defs=None)
d_ = next((x for x in recs2 if x["form"] == "def" and x["name"] == fn), None)
span = range(d_["line"], d_["end"] + 1) if d_ else range(0)
scrub = scrub_edits(hit[2], [i + 1 for i, l in enumerate(hit[2].split("\n")) if FAKE in l and i + 1 in span])
if scrub:
cand2 = apply_edits(hit[2], scrub)
v2, _, _ = judge(tu, cand2, tag=tag)
n_c += len(recs_for(tu))
if v2 == "IDENTICAL":
path.write_text(cand2, errors="surrogateescape")
walk = lc.walk_file(path.read_text(errors="surrogateescape"), tu, tu.endswith(".h"))
row["nhash_after"] = next((x["nhash"] for x in walk["defs"] if x["name"] == fn), None)
out.append(row)
with _LOCK:
state["tried"] += 1
state["compiles"] += n_c
state["done"] += 1
if hit:
state["won"] += 1
print(f" {tu}:{fn} — {hit[0]} {hit[1]} IDENTICAL ({len(names)} pin(s) gone)", flush=True)
if state["done"] % 25 == 0: # R55: a lane that runs unattended leaves evidence
el = (time.time() - t0) / 60
print(f" [{state['done']}/{len(todo)}] {state['won']} closed · {state['compiles']} compiles · "
f"{el:.1f} min · {state['done'] / max(el, 0.01):.0f} bodies/min", flush=True)
return out
with ThreadPoolExecutor(max_workers=max(1, a.jobs)) as pool:
for res in pool.map(lambda it: work_tu(it[1], f"r{it[0] % max(1, a.jobs)}"), list(enumerate(tus))):
rows += res
for n, tu in enumerate(hdrs): # serial: two headers can share an includer's object
rows += work_tu(tu, "rh")
ledger_append(rows)
needed = sum(len([s for s in r.get("sites", []) if s.get("verdict") == "NEEDED"]) for _, r in todo)
print(f"recipes: {won} of {tried} bodies closed lever-free ({needed} NEEDED sites in the {len(todo)} drawn), "
f"{compiles} compiles in {(time.time() - t0) / 60:.1f} min")
print(f"recipes: {state['won']} of {state['tried']} bodies closed lever-free ({needed} NEEDED sites in the "
f"{len(todo)} drawn, {state['skipped']} with no candidate), {state['compiles']} compiles in "
f"{(time.time() - t0) / 60:.1f} min")
return 0