mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-10-06 09:06:04 -04:00
a1f1a948af
- BANKED (each whole-binary byte-gated; make check-all -> 140 passed, 0 failed of 140): func_80130D48 ×4 (1,064) · func_8018F3E4 (478) · func_8018B3D0 (478) · 13 × 223-ins siblings of func_8017E6D8 (2,899). distinct-code 3,833,224 -> 3,838,143 = 68.0% -> 68.1%. - TWO OF MY OWN COUNTS COLLAPSED UNDER SCRUTINY BEFORE I ACTED ON EITHER (R14/R35): "func_8017CA80's family = 102 unmatched" was really 13 -- my count tallied family members whose NAME appears as a stub anywhere in the fleet, not instances actually unmatched (a semantics error, not arithmetic). "56,267 ins remappable" was really 8,114 -- 86% was the known -O0 / deferred set (the func_80144B9C whale, the func_8013C414 cluster). I nearly recommended a target on the first number. - THE §77 CARRY GAP IS THE DOMINANT COST OF MECHANICAL REMAP: 23 of 27 first-pass CC1-FAILs. NEW .run/giants/s19_remap_tu.py sources the preamble from the exemplar's OVERLAY TU (the block between the previous top-level `}` and the def), applies family_remap's own substitution map, and adds the two includes match_one never adds -> 21 drafts went 0 MATCH -> 14 MATCH. The 13 223-ins siblings share ONE exemplar, so a single preamble fix cleared all 13. - USEFUL ASYMMETRY: func_8018F3E4/func_8018B3D0 FAILED match_one but BANKED in the whole-binary gate -- the real TU supplies decls the standalone compile lacks. A match_one CC1 FAIL is not a reason to skip the real gate on a remapped sibling. - RESIDUAL 3,195 ins, causes NAMED not guessed: func_8017D5C0 (952) matches standalone, gate reports `conflicting types for memcpy` = the §58 red-herring (a warning from an unrelated TU position; SESSION-14 hit the same label and the true cause needed a hand-splice + real cc1 stderr). func_80166994 ×3 + func_8016A290 ×4 still CC1-FAIL after the TU carry. - FULL R22 DEFERRED DELIBERATELY: make clean wipes asm/, which the concurrently-running BF14 agent reads on every probe. This batch changed only src/*.c (no config), so check-all is sound; the clean R22 must still run once the agent finishes.
29 lines
1.4 KiB
Python
29 lines
1.4 KiB
Python
#!/usr/bin/env python3
|
|
"""Side-by-side index-wise listing of a compiled object vs func_8017BF14 target .s over a range.
|
|
usage: bf14_side.py <obj.o> <lo> <hi>"""
|
|
import sys, os, re, subprocess, shutil
|
|
sys.path.insert(0, '/home/musashi/bfm-decomp/tools')
|
|
import masked_diff
|
|
OBJ = sys.argv[1]; LO = int(sys.argv[2]); HI = int(sys.argv[3])
|
|
FN = 'func_8017BF14'
|
|
TGT = '/home/musashi/bfm-decomp/asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8017AE2C/%s.s' % FN
|
|
OD = [c for c in ["mips-linux-gnu-objdump", "mipsel-linux-gnu-objdump"] if shutil.which(c)][0]
|
|
out = subprocess.run([OD, "-drz", OBJ], capture_output=True, text=True).stdout
|
|
mt = []; inside = False
|
|
for line in out.splitlines():
|
|
if re.match(r'^[0-9a-f]+ <%s>:' % FN, line): inside = True; continue
|
|
if inside:
|
|
if re.match(r'^[0-9a-f]+ <', line): break
|
|
m = re.match(r'\s*[0-9a-f]+:\s+[0-9a-f]{8}\s+(.*)', line)
|
|
if m: mt.append(re.sub(r'\s+', ' ', m.group(1).strip()))
|
|
tt = []
|
|
for line in open(TGT):
|
|
m = re.match(r'\s*/\* \w+ [0-9A-F]{8} [0-9A-F]{8} \*/\s+(.*)', line)
|
|
if m: tt.append(re.sub(r'\s+', ' ', m.group(1).strip().rstrip()))
|
|
mine = masked_diff.insns_from_object(OBJ, FN)
|
|
tgt = masked_diff.insns_from_s(TGT)
|
|
diffs = {i for i, a, b in masked_diff.structured_diff(mine, tgt)}
|
|
for k in range(LO, min(HI, max(len(mt), len(tt)))):
|
|
flag = '*' if k in diffs else ' '
|
|
print('%s %4d | %-40s | %s' % (flag, k, mt[k] if k < len(mt) else '', tt[k] if k < len(tt) else ''))
|