From 85afa0dc8114c5346bf1a5dfc68bc46911d522e9 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Sat, 20 Jun 2026 17:12:00 -0600 Subject: [PATCH] =?UTF-8?q?feat(phase-19):=20T2=20recovery=20tooling=20?= =?UTF-8?q?=E2=80=94=20canon=5Fresident=5Fcalls=20+=20no-proto=20caller=20?= =?UTF-8?q?fix=20(3=20matches)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - R14 finding: the 3 Phase-18 "implicit-int / propagate-first" near-misses are NOT implicit-int (reproduced each through the byte-gate). Real classes: (a) resident-callee LINK-miss: draft calls func_ but the addr has a curated name (0x8004CFEC = ratan2) -> "undefined reference to func_8004CFEC". NEW tools/canon_resident_calls.py rewrites func_ -> curated name (pure draft text, body bytes unchanged) -> run FIRST in the recovery pipeline. (b) shared-caller ARITY conflict: an engine_core.h caller macro declares the callee file-scope `extern void func_X(void)` then calls func_X(); the real def takes an arg -> "conflicting types". FIX = caller extern -> no-proto `extern void func_X();` (byte-neutral for the caller; compatible with promotion-safe params int/long/ptr). - 3 matches banked in ov_SC01_077: func_8017209C (ratan2 rewrite), func_80147514 (s32), func_80168F40 (void*); 2 no-proto lines in src/shared/engine_core.h - recovery pipeline: draft -> canon_resident_calls -> sig_unify -> harvest_verify --chunk 1 - make check-all 136/136 BYTE-IDENTICAL (full extract, R22); dedup 1450 validated/0 failed; 0 NON_MATCHING in any default build (G4); fleet 56.64% (the 3 are ov_SC01_077-local, x134 propagation rides T3/Phase-20) - cookbook §17a-3 corrected (R14/R16); SETUP tool inventory (R21); CURRENT_PHASE T2 done --- docs/SETUP.md | 1 + docs/difficulty.ov_SC01_077.md | 180 ++++++++++++++++----------------- docs/duplicates.ov_SC01_077.md | 152 ++++++++++++++++++++++++++++ docs/matching-cookbook.md | 34 ++++++- docs/progress.fleet.md | 8 +- docs/progress.ov_SC01_077.md | 15 +-- phase-ends/CURRENT_PHASE.md | 7 +- src/ov_SC01_077/ov_SC01_077.c | 110 +++++++++++++++++++- src/shared/engine_core.h | 4 +- tools/canon_resident_calls.py | 94 +++++++++++++++++ 10 files changed, 492 insertions(+), 113 deletions(-) create mode 100644 docs/duplicates.ov_SC01_077.md create mode 100644 tools/canon_resident_calls.py diff --git a/docs/SETUP.md b/docs/SETUP.md index 31056494c3..8d8b3914b5 100644 --- a/docs/SETUP.md +++ b/docs/SETUP.md @@ -669,6 +669,7 @@ Every script under `tools/` (plus the two report make-targets), grouped by purpo | | `tools/dedup_propagate.py` | **(Phase 15, cookbook §14)** Match-once → propagate-many: lift a matched body, author a `DEFINE_func_()` macro in `src/shared/engine_core.h`, instantiate it at every onboarded overlay sharing that `h_exact`, byte-gate each (fail-closed), register in `dedup.us.yaml`. `--addr`/`--auto-from`/`--check-only`. `find_site` accepts brace on the same OR next line (Phase-15 fix — next-line-brace defs were silently un-propagated). | | | `tools/sig_unify.py` | **(Phase 15, cookbook §14d)** Deterministic hard-tail recovery: unify a gate-failing draft's FULL signature set — callee externs **and** the draft's OWN definition signature — to the banked-canonical decls (`--overlay`/`--in`/`--out`); the whole-binary byte-gate stays the arbiter. Recovered 32 of 191 standalone-MATCH conflict-blocked drafts, zero agent tokens. | | | `tools/gen_harvest_targets.py` / `tools/canon_draft_decls.py` / `tools/build_engine_types.py` | Callee-sig-aware target manifest (§14b/c) / callee-extern canonicalizer (§14c) / additive shared-types-header extractor (`src/shared/engine_types.h`, §14 struct). | +| | `tools/canon_resident_calls.py` | **(Phase 19 / T2, cookbook §17a-3a)** Link-miss recovery: rewrite each `func_` in a draft to the **curated** resident symbol name when that address has one in the stacked symbol files (`0x8004CFEC`→`ratan2`), so the linker resolves it. Pure draft-text (body bytes unchanged); **run FIRST** in the recovery pipeline `draft → canon_resident_calls → sig_unify → harvest_verify`. | | | `config/dedup.us.yaml` / `src/shared/*.h` | The code-share registry + the shared bodies (one macro → N sites, byte-gated). | | | `make report` / `make sig-refresh` / `make sig-overlays` | Convenience targets: reports (+`--cross`) / Ghidra signature-dump / Ghidra-free sign all 134 overlays. | diff --git a/docs/difficulty.ov_SC01_077.md b/docs/difficulty.ov_SC01_077.md index ff58a209ea..bb47f3c0a5 100644 --- a/docs/difficulty.ov_SC01_077.md +++ b/docs/difficulty.ov_SC01_077.md @@ -1,95 +1,23 @@ # Unmatched difficulty inventory (generated by tools/difficulty.py — harvest queue) -unmatched functions : 1801 -trivial (<=5 ins) : 14 -non-jtbl leaves : 236 (best harvest targets) +unmatched functions : 858 +trivial (<=5 ins) : 0 +non-jtbl leaves : 108 (best harvest targets) jump-table funcs : 58 (deferred — need the rodata-island workflow, Task 2') ## Easiest 120 unmatched (score asc) — the work queue | score | name | nins | br | calls | jtbl | leaf | |---|---|---|---|---|---|---| -| 3 | func_80147054 | 3 | 0 | 0 | - | Y | -| 3 | func_80147060 | 3 | 0 | 0 | - | Y | -| 3 | func_8014706C | 3 | 0 | 0 | - | Y | -| 3 | func_8014708C | 3 | 0 | 0 | - | Y | -| 3 | func_801470A0 | 3 | 0 | 0 | - | Y | -| 3 | func_801470B4 | 3 | 0 | 0 | - | Y | -| 4 | func_8012DFBC | 4 | 0 | 0 | - | Y | -| 4 | func_80165900 | 4 | 0 | 0 | - | Y | -| 5 | func_80129428 | 5 | 0 | 0 | - | Y | -| 5 | func_8012AD50 | 5 | 0 | 0 | - | Y | -| 5 | func_8012AD6C | 5 | 0 | 0 | - | Y | -| 5 | func_8012BF54 | 5 | 0 | 0 | - | Y | -| 5 | func_801472DC | 5 | 0 | 0 | - | Y | -| 5 | func_801658EC | 5 | 0 | 0 | - | Y | -| 6 | func_80148D24 | 6 | 0 | 0 | - | Y | | 8 | func_80174684 | 8 | 0 | 0 | - | Y | -| 9 | func_8012A304 | 9 | 0 | 0 | - | Y | -| 9 | func_80151184 | 9 | 0 | 0 | - | Y | | 9 | func_80174650 | 9 | 0 | 0 | - | Y | -| 10 | func_8012A0E0 | 8 | 0 | 1 | - | - | -| 10 | func_8013C964 | 10 | 0 | 0 | - | Y | | 10 | func_8014C8C8 | 10 | 0 | 0 | - | Y | -| 10 | func_80150E84 | 8 | 0 | 1 | - | - | -| 10 | func_80150EA4 | 8 | 0 | 1 | - | - | | 10 | func_80165A50 | 10 | 0 | 0 | - | Y | -| 11 | func_8012CC64 | 9 | 0 | 1 | - | - | -| 11 | func_8013C938 | 11 | 0 | 0 | - | Y | -| 11 | func_80143C74 | 9 | 0 | 1 | - | - | -| 11 | func_80147264 | 11 | 0 | 0 | - | Y | -| 11 | func_8014C860 | 11 | 0 | 0 | - | Y | -| 11 | func_80150BA4 | 9 | 0 | 1 | - | - | -| 11 | func_8017AE08 | 9 | 0 | 1 | - | - | -| 12 | func_8012CBA4 | 10 | 0 | 1 | - | - | -| 12 | func_8012CBCC | 10 | 0 | 1 | - | - | -| 12 | func_8012CBF4 | 10 | 0 | 1 | - | - | -| 12 | func_8013B568 | 12 | 0 | 0 | - | Y | -| 12 | func_80144A68 | 10 | 0 | 1 | - | - | -| 12 | func_80146D90 | 10 | 0 | 1 | - | - | -| 12 | func_8014B12C | 10 | 0 | 1 | - | - | -| 12 | func_8014B2A8 | 10 | 0 | 1 | - | - | -| 12 | func_8014B2D0 | 10 | 0 | 1 | - | - | -| 12 | func_80156648 | 10 | 0 | 1 | - | - | -| 12 | func_80172560 | 10 | 0 | 1 | - | - | -| 12 | func_80172738 | 10 | 0 | 1 | - | - | -| 12 | func_80173174 | 10 | 0 | 1 | - | - | -| 12 | func_8017427C | 10 | 0 | 1 | - | - | -| 12 | func_8017435C | 10 | 0 | 1 | - | - | -| 12 | func_80174784 | 10 | 0 | 1 | - | - | -| 12 | func_80174824 | 10 | 0 | 1 | - | - | -| 12 | func_8017A220 | 10 | 0 | 1 | - | - | -| 12 | func_8017A248 | 10 | 0 | 1 | - | - | -| 12 | func_8017A270 | 10 | 0 | 1 | - | - | -| 13 | func_8014AD7C | 11 | 0 | 1 | - | - | -| 13 | func_80165910 | 10 | 1 | 0 | - | Y | -| 13 | func_80179E48 | 11 | 0 | 1 | - | - | -| 13 | func_80179E74 | 11 | 0 | 1 | - | - | -| 14 | func_80129220 | 10 | 0 | 2 | - | - | -| 14 | func_8012A018 | 12 | 0 | 1 | - | - | -| 14 | func_80130AC4 | 11 | 1 | 0 | - | Y | -| 14 | func_80131C78 | 12 | 0 | 1 | - | - | -| 14 | func_8013A9F8 | 11 | 1 | 0 | - | Y | -| 14 | func_80146DB8 | 12 | 0 | 1 | - | - | -| 14 | func_8014BCC0 | 11 | 1 | 0 | - | Y | | 14 | func_80153C44 | 12 | 0 | 1 | - | - | | 14 | func_80155F80 | 12 | 0 | 1 | - | - | -| 14 | func_80172B14 | 12 | 0 | 1 | - | - | -| 14 | func_801737B8 | 12 | 0 | 1 | - | - | -| 14 | func_801738DC | 12 | 0 | 1 | - | - | -| 14 | func_80174C80 | 12 | 0 | 1 | - | - | -| 14 | func_80179F14 | 12 | 0 | 1 | - | - | -| 14 | func_8017A094 | 12 | 0 | 1 | - | - | -| 14 | func_8017A0C4 | 12 | 0 | 1 | - | - | -| 15 | func_8012E4C8 | 15 | 0 | 0 | - | Y | -| 15 | func_80131FA0 | 15 | 0 | 0 | - | Y | -| 15 | func_80131FDC | 15 | 0 | 0 | - | Y | -| 15 | func_801425CC | 15 | 0 | 0 | - | Y | -| 15 | func_80146994 | 13 | 0 | 1 | - | - | | 15 | func_8014C568 | 13 | 0 | 1 | - | - | | 15 | func_80151944 | 15 | 0 | 0 | - | Y | | 15 | func_8015CC74 | 15 | 0 | 0 | - | Y | | 15 | func_8015CFC0 | 15 | 0 | 0 | - | Y | -| 15 | func_8015D4E8 | 15 | 0 | 0 | - | Y | | 15 | func_8015DAF8 | 15 | 0 | 0 | - | Y | | 15 | func_8015DE58 | 15 | 0 | 0 | - | Y | | 15 | func_8015E1B8 | 15 | 0 | 0 | - | Y | @@ -104,27 +32,99 @@ jump-table funcs : 58 (deferred — need the rodata-island workflow, Task | 15 | func_8016084C | 15 | 0 | 0 | - | Y | | 15 | func_80160B34 | 15 | 0 | 0 | - | Y | | 15 | func_80160EA4 | 15 | 0 | 0 | - | Y | -| 15 | func_80161A00 | 12 | 1 | 0 | - | Y | -| 15 | func_80161A30 | 12 | 1 | 0 | - | Y | -| 15 | func_80161A60 | 12 | 1 | 0 | - | Y | -| 15 | func_80165624 | 13 | 0 | 1 | - | - | | 15 | func_8016CB84 | 15 | 0 | 0 | - | Y | -| 15 | func_8016FFA8 | 13 | 0 | 1 | - | - | -| 15 | func_801735B8 | 13 | 0 | 1 | - | - | | 15 | func_801855A0 | 15 | 0 | 0 | - | Y | | 15 | func_801855DC | 15 | 0 | 0 | - | Y | | 15 | func_80185870 | 15 | 0 | 0 | - | Y | | 15 | func_80185970 | 15 | 0 | 0 | - | Y | | 15 | func_801867E0 | 15 | 0 | 0 | - | Y | -| 16 | func_8012A828 | 14 | 0 | 1 | - | - | -| 16 | func_8012A8B0 | 14 | 0 | 1 | - | - | -| 16 | func_8012BEE8 | 10 | 2 | 0 | - | Y | -| 16 | func_80144988 | 16 | 0 | 0 | - | Y | | 16 | func_80146360 | 16 | 0 | 0 | - | Y | -| 16 | func_80146E98 | 10 | 2 | 0 | - | Y | -| 16 | func_8014B160 | 12 | 0 | 2 | - | - | -| 16 | func_8014C278 | 14 | 0 | 1 | - | - | | 16 | func_801542A4 | 14 | 0 | 1 | - | - | -| 16 | func_80158AB4 | 12 | 0 | 2 | - | - | | 16 | func_8015BE94 | 12 | 0 | 2 | - | - | -| 16 | func_8016197C | 10 | 2 | 0 | - | Y | +| 16 | func_8016F4C4 | 12 | 0 | 2 | - | - | +| 16 | func_801705C0 | 14 | 0 | 1 | - | - | +| 16 | func_801732C4 | 12 | 0 | 2 | - | - | +| 16 | func_8017331C | 12 | 0 | 2 | - | - | +| 16 | func_80173374 | 12 | 0 | 2 | - | - | +| 16 | func_80174554 | 12 | 0 | 2 | - | - | +| 16 | func_801745AC | 12 | 0 | 2 | - | - | +| 16 | func_8017EA2C | 12 | 0 | 2 | - | - | +| 17 | func_8015AD08 | 13 | 0 | 2 | - | - | +| 17 | func_8015CC0C | 13 | 0 | 2 | - | - | +| 17 | func_8015CF58 | 13 | 0 | 2 | - | - | +| 17 | func_8015D4B4 | 13 | 0 | 2 | - | - | +| 17 | func_8015E184 | 13 | 0 | 2 | - | - | +| 17 | func_8015EDD4 | 13 | 0 | 2 | - | - | +| 17 | func_8015F7A0 | 13 | 0 | 2 | - | - | +| 17 | func_80160B00 | 13 | 0 | 2 | - | - | +| 18 | func_8013B7AC | 18 | 0 | 0 | - | Y | +| 18 | func_80161208 | 14 | 0 | 2 | - | - | +| 18 | func_8016F0AC | 14 | 0 | 2 | - | - | +| 18 | func_801726D0 | 16 | 0 | 1 | - | - | +| 18 | func_801746A4 | 14 | 0 | 2 | - | - | +| 19 | func_80141C0C | 17 | 0 | 1 | - | - | +| 19 | func_80161C98 | 14 | 1 | 1 | - | - | +| 19 | func_80161D20 | 14 | 1 | 1 | - | - | +| 19 | func_80171928 | 17 | 0 | 1 | - | - | +| 19 | func_80175414 | 16 | 1 | 0 | - | Y | +| 19 | func_80181B58 | 17 | 0 | 1 | - | - | +| 19 | func_801829E0 | 17 | 0 | 1 | - | - | +| 20 | func_80146A6C | 18 | 0 | 1 | - | - | +| 20 | func_8014BD60 | 14 | 2 | 0 | - | Y | +| 20 | func_8014C168 | 14 | 2 | 0 | - | Y | +| 20 | func_80157788 | 16 | 0 | 2 | - | - | +| 20 | func_801577C8 | 16 | 0 | 2 | - | - | +| 20 | func_8016E918 | 17 | 1 | 0 | - | Y | +| 20 | func_80178970 | 15 | 1 | 1 | - | - | +| 20 | func_8017E0B4 | 14 | 0 | 3 | - | - | +| 20 | func_8017E6BC | 14 | 0 | 3 | - | - | +| 20 | func_8017E830 | 14 | 0 | 3 | - | - | +| 20 | func_80181B9C | 18 | 0 | 1 | - | - | +| 21 | func_80142740 | 14 | 1 | 2 | - | - | +| 21 | func_80158880 | 19 | 0 | 1 | - | - | +| 21 | func_801653B8 | 15 | 0 | 3 | - | - | +| 21 | func_8016DA30 | 19 | 0 | 1 | - | - | +| 21 | func_801710DC | 17 | 0 | 2 | - | - | +| 21 | func_801711FC | 15 | 0 | 3 | - | - | +| 21 | func_80175268 | 21 | 0 | 0 | - | Y | +| 21 | func_8017DD9C | 19 | 0 | 1 | - | - | +| 21 | func_80182FD0 | 19 | 0 | 1 | - | - | +| 22 | func_801427EC | 19 | 1 | 0 | - | Y | +| 22 | func_8014292C | 19 | 1 | 0 | - | Y | +| 22 | func_80142978 | 19 | 1 | 0 | - | Y | +| 22 | func_801429C4 | 19 | 1 | 0 | - | Y | +| 22 | func_801627E8 | 19 | 1 | 0 | - | Y | +| 22 | func_8016D64C | 15 | 1 | 2 | - | - | +| 22 | func_8016E778 | 20 | 0 | 1 | - | - | +| 22 | func_80172C50 | 20 | 0 | 1 | - | - | +| 22 | func_80175218 | 20 | 0 | 1 | - | - | +| 22 | func_80178B70 | 18 | 0 | 2 | - | - | +| 22 | func_8017B8E8 | 22 | 0 | 0 | - | Y | +| 22 | func_8017E128 | 18 | 0 | 2 | - | - | +| 22 | func_8017E170 | 17 | 1 | 1 | - | - | +| 22 | func_80184278 | 20 | 0 | 1 | - | - | +| 23 | func_8013373C | 18 | 1 | 1 | - | - | +| 23 | func_80138BE0 | 20 | 1 | 0 | - | Y | +| 23 | func_8015430C | 19 | 0 | 2 | - | - | +| 23 | func_80163408 | 21 | 0 | 1 | - | - | +| 23 | func_801741A8 | 17 | 0 | 3 | - | - | +| 23 | func_80182E30 | 19 | 0 | 2 | - | - | +| 23 | func_80185A94 | 16 | 1 | 2 | - | - | +| 24 | func_801288E8 | 22 | 0 | 1 | - | - | +| 24 | func_80128940 | 22 | 0 | 1 | - | - | +| 24 | func_80128998 | 22 | 0 | 1 | - | - | +| 24 | func_8013BC7C | 24 | 0 | 0 | - | Y | +| 24 | func_8014CCB4 | 22 | 0 | 1 | - | - | +| 24 | func_8014D04C | 22 | 0 | 1 | - | - | +| 24 | func_8014D3E0 | 22 | 0 | 1 | - | - | +| 24 | func_8014D738 | 22 | 0 | 1 | - | - | +| 24 | func_8014DF3C | 22 | 0 | 1 | - | - | +| 24 | func_8014E434 | 22 | 0 | 1 | - | - | +| 24 | func_8014E6A0 | 22 | 0 | 1 | - | - | +| 24 | func_8014E934 | 22 | 0 | 1 | - | - | +| 24 | func_8014ED28 | 22 | 0 | 1 | - | - | +| 24 | func_8014F1F4 | 22 | 0 | 1 | - | - | +| 24 | func_8014F468 | 22 | 0 | 1 | - | - | +| 24 | func_8014F6F4 | 22 | 0 | 1 | - | - | +| 24 | func_8014FBC0 | 22 | 0 | 1 | - | - | +| 24 | func_8014FCFC | 22 | 0 | 1 | - | - | diff --git a/docs/duplicates.ov_SC01_077.md b/docs/duplicates.ov_SC01_077.md new file mode 100644 index 0000000000..39ac008205 --- /dev/null +++ b/docs/duplicates.ov_SC01_077.md @@ -0,0 +1,152 @@ +# EXE-wide duplicate function groups (generated by tools/dup_report.py) +# sig: .run/sig.ov_SC01_077.jsonl sha1=7a50e451e5a100d77579cb3c1979f9ec1782612f (2585 funcs, 2274 with nins>=8) +# Match the representative once -> share the body to the duplicates (h_exact = guaranteed +# byte-match; h_norm = same source, re-point any single address constant). + +## h_exact (byte-identical) — nins>=8: 24 groups, 36 redundant (collapsible) +| score | nins | count | representative | duplicates | +|---|---|---|---|---| +| 328 | 41 | 8 | func_80151fb4 (0x80151fb4) | 0x801522cc 0x801525f4 0x80152ac8 0x80152c80 0x80152fbc 0x8015327c 0x80153550 | +| 186 | 93 | 2 | func_8014ffdc (0x8014ffdc) | 0x801502ec | +| 94 | 47 | 2 | func_8015dcb8 (0x8015dcb8) | 0x8015e018 | +| 90 | 18 | 5 | func_8015220c (0x8015220c) | 0x80152a08 0x80152efc 0x801531bc 0x80153490 | +| 57 | 19 | 3 | func_80134310 (0x80134310) | 0x80134a28 0x80134fb8 | +| 54 | 27 | 2 | func_801530e4 (0x801530e4) | 0x801533a4 | +| 42 | 21 | 2 | func_8017e668 (0x8017e668) | 0x8017e7dc | +| 40 | 20 | 2 | func_80170068 (0x80170068) | 0x80170100 | +| 39 | 13 | 3 | func_8015a1c8 (0x8015a1c8) | 0x8015ac90 0x8015cf24 | +| 38 | 19 | 2 | func_8015773c (0x8015773c) | 0x801585ec | +| 34 | 17 | 2 | func_8015bd8c (0x8015bd8c) | 0x8015bf04 | +| 32 | 16 | 2 | func_80169fe0 (0x80169fe0) | 0x8016dee0 | +| 28 | 14 | 2 | func_8012a828 (0x8012a828) | 0x8012a8b0 | +| 28 | 14 | 2 | func_8017e6bc (0x8017e6bc) | 0x8017e830 | +| 26 | 13 | 2 | func_8012931c (0x8012931c) | 0x80162fc0 | +| 26 | 13 | 2 | func_8015da5c (0x8015da5c) | 0x8015dfe4 | +| 24 | 8 | 3 | func_8015d524 (0x8015d524) | 0x8015fa24 0x80165c58 | +| 24 | 12 | 2 | func_8016f4c4 (0x8016f4c4) | 0x8017ea2c | +| 24 | 12 | 2 | func_8016f5e0 (0x8016f5e0) | 0x80170c44 | +| 22 | 11 | 2 | func_8016fb50 (0x8016fb50) | 0x8016fc64 | +| 20 | 10 | 2 | func_801732f4 (0x801732f4) | 0x801733a4 | +| 18 | 9 | 2 | func_801598bc (0x801598bc) | 0x80162414 | +| 16 | 8 | 2 | func_80150150 (0x80150150) | 0x80150460 | +| 16 | 8 | 2 | func_80168a88 (0x80168a88) | 0x8016ed6c | + +## h_norm (structural) — nins>=8: 115 groups, 333 redundant (collapsible) +| score | nins | count | representative | duplicates | +|---|---|---|---|---| +| 384 | 8 | 48 | func_80128158 (0x80128158) | 0x80128178 0x80128198 0x801281b8 0x801281d8 0x801281f8 0x80128228 0x80128248 0x80128268 0x8012a8e8 0x80136c1c 0x80149704 0x80149724 0x80149788 0x80149864 0x801498c0 0x80149c94 0x80149cb4 0x8014a218 0x8014a4fc 0x8014a830 0x8014ab5c 0x8014abf0 0x80151110 0x80151924 0x80155f60 0x8015be74 0x8015bec4 0x8015bee4 0x8015ccb0 0x8015cffc 0x8015f360 0x80160ee0 0x80164db0 0x80168a88 0x8016ed6c 0x8016efa8 0x80172760 0x801747ac 0x801749a8 0x8017ade8 0x8017dacc 0x8017de64 0x8017e1b4 0x80180910 0x80182968 0x80183a50 0x8018448c | +| 384 | 12 | 32 | func_8014b160 (0x8014b160) | 0x80158ab4 0x8015be94 0x80161d58 0x80165a20 0x8016f494 0x8016f4c4 0x8016f5b0 0x8016f5e0 0x8016f680 0x8016f6b0 0x8016f7d4 0x8017041c 0x801704ec 0x801706e8 0x80170718 0x80170c14 0x80170c44 0x8017115c 0x801717f4 0x80171824 0x80171854 0x801732c4 0x8017331c 0x80173374 0x801733cc 0x80174158 0x801743c0 0x801744b0 0x80174554 0x801745ac 0x8017ea2c | +| 336 | 14 | 24 | func_80142740 (0x80142740) | 0x801555bc 0x80157e00 0x80158000 0x80158288 0x80159bac 0x8015a2a0 0x8015ad78 0x8015c08c 0x8015c750 0x8015d544 0x8015db34 0x8015de94 0x8015e1f4 0x8015e924 0x8015ee44 0x8015f048 0x8015f810 0x80160174 0x801603d8 0x80160888 0x8016fd7c 0x80183a70 0x80184aec | +| 330 | 22 | 15 | func_8014ccb4 (0x8014ccb4) | 0x8014d04c 0x8014d3e0 0x8014d738 0x8014df3c 0x8014e434 0x8014e6a0 0x8014e934 0x8014ed28 0x8014f1f4 0x8014f468 0x8014f6f4 0x8014fbc0 0x8014fcfc 0x80150480 | +| 328 | 41 | 8 | func_80151fb4 (0x80151fb4) | 0x801522cc 0x801525f4 0x80152ac8 0x80152c80 0x80152fbc 0x8015327c 0x80153550 | +| 224 | 14 | 16 | func_8016f540 (0x8016f540) | 0x8016f578 0x8016f610 0x8016f648 0x8017280c 0x80172920 0x80172cdc 0x80172de8 0x80173580 0x80173738 0x80173824 0x80173948 0x80173b88 0x801742e0 0x8017e6bc 0x8017e830 | +| 216 | 108 | 2 | func_8014dd8c (0x8014dd8c) | 0x8014e284 | +| 190 | 10 | 19 | func_8014b12c (0x8014b12c) | 0x8014b2a8 0x8014b2d0 0x8015e588 0x80171884 0x80172738 0x80172ed4 0x80172efc 0x80172f24 0x80173174 0x8017329c 0x801732f4 0x8017334c 0x801733a4 0x8017427c 0x8017435c 0x8017452c 0x80174584 0x801745dc | +| 190 | 95 | 2 | func_8014fe60 (0x8014fe60) | 0x80150170 | +| 186 | 93 | 2 | func_8014ffdc (0x8014ffdc) | 0x801502ec | +| 162 | 18 | 9 | func_80151980 (0x80151980) | 0x80152094 0x801523ac 0x80152868 0x80152ba8 0x80152d60 0x8015309c 0x8015335c 0x80153d34 | +| 150 | 75 | 2 | func_8012b8e4 (0x8012b8e4) | 0x8012ba10 | +| 150 | 30 | 5 | func_80152254 (0x80152254) | 0x80152a50 0x80152f44 0x80153204 0x801534d8 | +| 148 | 37 | 4 | func_80142838 (0x80142838) | 0x80142f68 0x801430f4 0x801432fc | +| 135 | 15 | 9 | func_8016fccc (0x8016fccc) | 0x8017018c 0x80170338 0x80170584 0x80170634 0x80170f38 0x80170fec 0x801710a0 0x801711fc | +| 124 | 62 | 2 | func_80145934 (0x80145934) | 0x80145a2c | +| 123 | 41 | 3 | func_8012b2cc (0x8012b2cc) | 0x8012b370 0x8012b414 | +| 118 | 59 | 2 | func_80176ff4 (0x80176ff4) | 0x80177340 | +| 114 | 57 | 2 | func_8012c354 (0x8012c354) | 0x8012c438 | +| 110 | 22 | 5 | func_80166244 (0x80166244) | 0x8016629c 0x801662f4 0x8016634c 0x801663a4 | +| 108 | 27 | 4 | func_801320d8 (0x801320d8) | 0x80132144 0x801321b0 0x8013221c | +| 108 | 18 | 6 | func_80170928 (0x80170928) | 0x80170970 0x801709b8 0x80170a00 0x80170a48 0x80170a90 | +| 96 | 24 | 4 | func_801428cc (0x801428cc) | 0x80142ffc 0x80143188 0x80143390 | +| 94 | 47 | 2 | func_8015dcb8 (0x8015dcb8) | 0x8015e018 | +| 90 | 18 | 5 | func_8015220c (0x8015220c) | 0x80152a08 0x80152efc 0x801531bc 0x80153490 | +| 88 | 44 | 2 | func_8015dbd4 (0x8015dbd4) | 0x8015df34 | +| 78 | 13 | 6 | func_8015da5c (0x8015da5c) | 0x8015dc84 0x8015dfe4 0x8015e84c 0x8015e880 0x8015e8b4 | +| 75 | 15 | 5 | func_8016f870 (0x8016f870) | 0x8016f920 0x8016fdf0 0x8016ff6c 0x8017027c | +| 74 | 37 | 2 | func_8014ed80 (0x8014ed80) | 0x8014f24c | +| 72 | 36 | 2 | func_8017eec0 (0x8017eec0) | 0x8017f024 | +| 70 | 14 | 5 | func_80161208 (0x80161208) | 0x80161418 0x80161450 0x801614e4 0x8016151c | +| 68 | 34 | 2 | func_801495c4 (0x801495c4) | 0x8014964c | +| 68 | 34 | 2 | func_8014d0a4 (0x8014d0a4) | 0x8014d438 | +| 60 | 20 | 3 | func_80172780 (0x80172780) | 0x80172894 0x80172c50 | +| 58 | 29 | 2 | func_80155e30 (0x80155e30) | 0x801576a8 | +| 57 | 19 | 3 | func_80134310 (0x80134310) | 0x80134a28 0x80134fb8 | +| 54 | 27 | 2 | func_801530e4 (0x801530e4) | 0x801533a4 | +| 54 | 27 | 2 | func_80157158 (0x80157158) | 0x80163664 | +| 52 | 13 | 4 | func_8015a1c8 (0x8015a1c8) | 0x8015ac90 0x8015cf24 0x8015f738 | +| 52 | 13 | 4 | func_8015a1fc (0x8015a1fc) | 0x8015a230 0x8016b3f4 0x80170b14 | +| 52 | 26 | 2 | func_8015db6c (0x8015db6c) | 0x8015decc | +| 52 | 26 | 2 | func_801657d8 (0x801657d8) | 0x80165874 | +| 50 | 10 | 5 | func_80146d90 (0x80146d90) | 0x80147a84 0x80147aac 0x80147f50 0x80163234 | +| 48 | 8 | 6 | func_8012d38c (0x8012d38c) | 0x801376c8 0x80150cc4 0x8016b428 0x8016ba48 0x80174c60 | +| 48 | 8 | 6 | func_80147928 (0x80147928) | 0x8014799c 0x80147a10 0x80162f60 0x80162f80 0x80162fa0 | +| 48 | 16 | 3 | func_801526d4 (0x801526d4) | 0x80152c40 0x80157880 | +| 46 | 23 | 2 | func_8014ca14 (0x8014ca14) | 0x8014ca88 | +| 44 | 22 | 2 | func_80147860 (0x80147860) | 0x80162f08 | +| 42 | 14 | 3 | func_80161240 (0x80161240) | 0x80161554 0x8016158c | +| 42 | 21 | 2 | func_8016edec (0x8016edec) | 0x8016ee40 | +| 42 | 21 | 2 | func_8017e668 (0x8017e668) | 0x8017e7dc | +| 40 | 20 | 2 | func_80170068 (0x80170068) | 0x80170100 | +| 40 | 20 | 2 | func_80172f9c (0x80172f9c) | 0x80172fec | +| 38 | 19 | 2 | func_8015773c (0x8015773c) | 0x801585ec | +| 36 | 18 | 2 | func_80146a6c (0x80146a6c) | 0x80146ab4 | +| 36 | 9 | 4 | func_8016f264 (0x8016f264) | 0x8016f2c8 0x8016f30c 0x8016f350 | +| 36 | 18 | 2 | func_80170b48 (0x80170b48) | 0x801730b4 | +| 36 | 12 | 3 | func_80172b14 (0x80172b14) | 0x801737b8 0x801738dc | +| 34 | 17 | 2 | func_8012a68c (0x8012a68c) | 0x8012a758 | +| 34 | 17 | 2 | func_80147ad4 (0x80147ad4) | 0x80147b18 | +| 34 | 17 | 2 | func_8015bd8c (0x8015bd8c) | 0x8015bf04 | +| 32 | 16 | 2 | func_8012b864 (0x8012b864) | 0x8012b8a4 | +| 32 | 16 | 2 | func_80149544 (0x80149544) | 0x80149584 | +| 32 | 16 | 2 | func_80154150 (0x80154150) | 0x801541d8 | +| 32 | 16 | 2 | func_80154a74 (0x80154a74) | 0x80154ae0 | +| 32 | 16 | 2 | func_80157788 (0x80157788) | 0x801577c8 | +| 32 | 16 | 2 | func_80169fe0 (0x80169fe0) | 0x8016dee0 | +| 32 | 8 | 4 | func_8016f288 (0x8016f288) | 0x8016f2a8 0x8016f2ec 0x8016f330 | +| 32 | 16 | 2 | func_8016fa44 (0x8016fa44) | 0x8016fc24 | +| 32 | 16 | 2 | func_8016fb10 (0x8016fb10) | 0x80172a8c | +| 32 | 16 | 2 | func_801743f0 (0x801743f0) | 0x801751d8 | +| 32 | 16 | 2 | func_801757a0 (0x801757a0) | 0x801757e0 | +| 30 | 15 | 2 | func_80170da4 (0x80170da4) | 0x80170e70 | +| 28 | 14 | 2 | func_801288b0 (0x801288b0) | 0x801289f0 | +| 28 | 14 | 2 | func_8012a828 (0x8012a828) | 0x8012a8b0 | +| 28 | 14 | 2 | func_8012e32c (0x8012e32c) | 0x8016f0ac | +| 28 | 14 | 2 | func_801746a4 (0x801746a4) | 0x801746dc | +| 26 | 13 | 2 | func_8012931c (0x8012931c) | 0x80162fc0 | +| 26 | 13 | 2 | func_80155518 (0x80155518) | 0x8015554c | +| 26 | 13 | 2 | func_801574dc (0x801574dc) | 0x80157510 | +| 26 | 13 | 2 | func_80159b08 (0x80159b08) | 0x80159b3c | +| 26 | 13 | 2 | func_8015bdd0 (0x8015bdd0) | 0x8015be04 | +| 26 | 13 | 2 | func_8015bf48 (0x8015bf48) | 0x8015bf7c | +| 26 | 13 | 2 | func_8015c6ac (0x8015c6ac) | 0x8015c6e0 | +| 26 | 13 | 2 | func_8015cc0c (0x8015cc0c) | 0x8015cc40 | +| 26 | 13 | 2 | func_8015cf58 (0x8015cf58) | 0x8015cf8c | +| 26 | 13 | 2 | func_8015d480 (0x8015d480) | 0x8015d4b4 | +| 26 | 13 | 2 | func_8015da90 (0x8015da90) | 0x8015dac4 | +| 26 | 13 | 2 | func_8015ddf0 (0x8015ddf0) | 0x8015de24 | +| 26 | 13 | 2 | func_8015e150 (0x8015e150) | 0x8015e184 | +| 26 | 13 | 2 | func_8015eda0 (0x8015eda0) | 0x8015edd4 | +| 26 | 13 | 2 | func_8015efa4 (0x8015efa4) | 0x8015efd8 | +| 26 | 13 | 2 | func_8015f2bc (0x8015f2bc) | 0x8015f2f0 | +| 26 | 13 | 2 | func_8015f76c (0x8015f76c) | 0x8015f7a0 | +| 26 | 13 | 2 | func_8015fa44 (0x8015fa44) | 0x8015fa78 | +| 26 | 13 | 2 | func_801600d0 (0x801600d0) | 0x80160104 | +| 26 | 13 | 2 | func_80160334 (0x80160334) | 0x80160368 | +| 26 | 13 | 2 | func_801607e4 (0x801607e4) | 0x80160818 | +| 26 | 13 | 2 | func_80160acc (0x80160acc) | 0x80160b00 | +| 26 | 13 | 2 | func_80160e3c (0x80160e3c) | 0x80160e70 | +| 26 | 13 | 2 | func_8016ffa8 (0x8016ffa8) | 0x801735b8 | +| 24 | 8 | 3 | func_80153c9c (0x80153c9c) | 0x80165958 0x80165988 | +| 24 | 12 | 2 | func_80154274 (0x80154274) | 0x801542dc | +| 24 | 12 | 2 | func_80154b4c (0x80154b4c) | 0x80154b98 | +| 24 | 8 | 3 | func_8015d524 (0x8015d524) | 0x8015fa24 0x80165c58 | +| 24 | 12 | 2 | func_8016ed8c (0x8016ed8c) | 0x8016edbc | +| 22 | 11 | 2 | func_8016fb50 (0x8016fb50) | 0x8016fc64 | +| 20 | 10 | 2 | func_8012bee8 (0x8012bee8) | 0x80146e98 | +| 20 | 10 | 2 | func_80174784 (0x80174784) | 0x80174824 | +| 18 | 9 | 2 | func_80146578 (0x80146578) | 0x8014659c | +| 18 | 9 | 2 | func_80149350 (0x80149350) | 0x8014942c | +| 18 | 9 | 2 | func_80155fb0 (0x80155fb0) | 0x80155fd4 | +| 18 | 9 | 2 | func_801598bc (0x801598bc) | 0x80162414 | +| 16 | 8 | 2 | func_80146534 (0x80146534) | 0x80165938 | +| 16 | 8 | 2 | func_80150150 (0x80150150) | 0x80150460 | + diff --git a/docs/matching-cookbook.md b/docs/matching-cookbook.md index 65e06d0320..325e39b22a 100644 --- a/docs/matching-cookbook.md +++ b/docs/matching-cookbook.md @@ -1142,11 +1142,35 @@ worked-example templates). Measured on ov_SC01_077 tractable reach-134 residuals which conflicts with your real def. FIX = reconcile that one line to the real sig (`void func_X(void);`). (Proven: func_8012A418.) A standalone `match_one` MATCH that fails the whole-binary gate with `conflicting types for func_X / previous declaration` is this class — grep the overlay `.c` for `func_X`. -3. **Implicit-int caller plumbing (deferred class).** If an EARLIER-positioned caller in the same `.c` calls - `func_X` with no visible decl, gcc-2.7.2 (K&R) creates an implicit `int func_X()` that conflicts with the - later real def — but there is NO sibling decl to grep. Adding a forward extern at the file top can itself - collide; the clean resolution is that `dedup_propagate` puts the def in `engine_core.h` (included first) → - the implicit-int never forms. (3 such fns deferred to Phase 19 — propagate-first, gate-after.) +3. **~~Implicit-int caller plumbing~~ → CORRECTED (Phase 19 / T2, R14): two distinct real classes, NOT + implicit-int, and propagate-first does NOT fix them.** The 3 "deferred" fns (func_80147514, func_80168F40, + func_8017209C) were reproduced through the gate to find the ACTUAL blocker (R14 — verify the framing against + the bytes). Neither is implicit-int; `dedup_propagate` (def → `engine_core.h`) would NOT have resolved + either (the def still lands at its address-order site, after any file-scope caller extern). The two classes: + - **(3a) Resident-callee LINK-miss** (func_8017209C). The draft calls a resident EXE/engine function by + `func_`, but that address carries a **curated name** in `config/symbols.us.txt` (e.g. + `0x8004CFEC = ratan2`). The linker resolves the curated name, not `func_` → the draft *compiles* but + fails to **link** (`undefined reference to func_8004CFEC`) → the gate (correctly) reverts. **FIX = + `tools/canon_resident_calls.py`** rewrites every `func_` whose address has a curated `// func` name to + that name (extern + call), a pure draft-text transform (body bytes unchanged) → **run it FIRST in the + recovery pipeline.** Proven: func_8017209C byte-identical after `func_8004CFEC`→`ratan2`. + - **(3b) Shared-caller ARITY conflict** (func_80147514 = `s32`, func_80168F40 = `void *`). An already-banked + **shared caller macro** in `engine_core.h` (e.g. `DEFINE_func_80147478`, instantiated at a *lower* address) + declares the callee **file-scope** as `extern void func_X(void);` (void = no args) then calls `func_X();` — + but func_X's real def takes an argument → `conflicting types for func_X / previous declaration` (NOT + implicit-int; it's an explicit `(void)` proto). **FIX = change that caller macro's extern to no-prototype + `extern void func_X();`** (K&R): byte-neutral for the caller (the empty call is identical), and a no-proto + decl is **compatible** with a def whose params are **default-promotion-safe** (`int`/`s32`/`long`/pointer — + NOT `char`/`short`/`float`; the narrow-param wall §3 of the toolkit still applies there). The macro lives in + the shared header, so **fleet-re-gate** (`make check-all`). Proven: func_80147514 + func_80168F40, all + 136/136 byte-identical, byte-neutral on every overlay (only ov_SC01_077 carries the def; the other 133 keep + the stub, where a declaration-only change emits no code). + + **The recovery pipeline is therefore: `draft → canon_resident_calls → sig_unify → harvest_verify --chunk 1`** + (canon_resident_calls first so link-miss names are fixed before any signature unification; sig_unify still + mandatory for def/callee-sig canonicalization). The 3b no-proto move is a separate, one-time edit per + caller/callee pair (it touches the shared header) — apply it when the gate reports `conflicting types … (void)` + from a shared-caller macro and the def's params are promotion-safe. **Two NEW residual classes found at scale (beyond the §17 quirks):** - **Per-file `-O0` class.** ~18 functions in ov_SC01_077 were built `-O0` (prologue sig `21F0A003` = diff --git a/docs/progress.fleet.md b/docs/progress.fleet.md index 6a1b626550..15ae4f86f6 100644 --- a/docs/progress.fleet.md +++ b/docs/progress.fleet.md @@ -3,11 +3,11 @@ # source-derived (committed src/*.c + config/dedup.us.yaml). Live byte gate: `make check-all`; # cross-binary collapsible-byte leverage: docs/duplicates.cross.md. -FLEET REAL substantive : 193192 (of which dedup-shared 192702 via 1450 groups / 192746 instances) +FLEET REAL substantive : 193201 (of which dedup-shared 192702 via 1450 groups / 192746 instances) FLEET LINKED PsyQ objs : 959 -FLEET byte-identical : 194839 / 344010 = 56.64% (REAL+LINKED+empties) +FLEET byte-identical : 194848 / 344010 = 56.64% (REAL+LINKED+empties) FLEET NON_MATCHING : 7 (0 in any default build — G4) -FLEET INCLUDE_ASM stubs : 149164 +FLEET INCLUDE_ASM stubs : 149155 FLEET matchable : 344010 | binary | REAL | shared | LINKED | byte-ident | matchable | byte-ident % | @@ -22,7 +22,7 @@ FLEET matchable : 344010 | ov_SC01_008 | 1434 | 1434 | 0 | 1436 | 2428 | 59.1% | | ov_SC01_009 | 1434 | 1434 | 0 | 1435 | 2510 | 57.2% | | ov_SC01_074 | 1434 | 1434 | 0 | 1436 | 2427 | 59.2% | -| ov_SC01_077 | 1717 | 1402 | 0 | 1719 | 2586 | 66.5% | +| ov_SC01_077 | 1726 | 1402 | 0 | 1728 | 2586 | 66.8% | | ov_SC01_080 | 1438 | 1438 | 0 | 1438 | 2515 | 57.2% | | ov_SC01_084 | 1438 | 1438 | 0 | 1443 | 2581 | 55.9% | | ov_SC02_000 | 1442 | 1442 | 0 | 1449 | 2684 | 54.0% | diff --git a/docs/progress.ov_SC01_077.md b/docs/progress.ov_SC01_077.md index a06eadfc64..5128526acc 100644 --- a/docs/progress.ov_SC01_077.md +++ b/docs/progress.ov_SC01_077.md @@ -1,18 +1,21 @@ # BFM matching progress (generated by tools/progress.py — authoritative) -REAL substantive matches : 704 <- the Gen1-exit >=25 bar counts THIS +REAL substantive matches : 1726 <- the Gen1-exit >=25 bar counts THIS + (of which dedup-shared : 1402 one body -> N sites, config/dedup.us.yaml) LINKED real PsyQ objects : 0 <- byte-identical via linked SDK objects NON_MATCHING (near-miss) : 0 -splat-auto empty no-ops : 81 -INCLUDE_ASM stubs : 1801 +splat-auto empty no-ops : 2 +INCLUDE_ASM stubs : 858 data blobs (excluded) : 0 ---------------------------------------- matchable functions : 2586 -REAL / matchable : 704 / 2586 = 27.22% -byte-identical/ matchable: 785 / 2586 = 30.36% (REAL+LINKED+empties) +REAL / matchable : 1726 / 2586 = 66.74% +byte-identical/ matchable: 1728 / 2586 = 66.82% (REAL+LINKED+empties) LINKED subsegs: (0 fns) -REAL matches: func_80128158 func_80128178 func_80128198 func_801281B8 func_801281D8 func_801281F8 func_80128218 func_80128228 func_80128248 func_80128268 func_80128288 func_801282CC func_8012853C func_801285D4 func_801288B0 func_801289F0 func_80128EA8 func_80129248 func_80129258 func_8012931C func_80129350 func_80129374 func_8012943C func_80129FF4 func_8012A048 func_8012A100 func_8012A2F4 func_8012A568 func_8012A5F8 func_8012A79C func_8012A8E8 func_8012AD44 func_8012AD64 func_8012ADE4 func_8012B14C func_8012B200 func_8012B21C func_8012B23C func_8012B6D4 func_8012B70C func_8012B744 func_8012BD14 func_8012BE54 func_8012BF4C func_8012BF68 func_8012BF7C func_8012C194 func_8012C1B8 func_8012C724 func_8012CC1C func_8012CC40 func_8012D38C func_8012D624 func_8012E27C func_8012E32C func_8012E88C func_8012E8A8 func_8012E8C4 func_8012FCA4 func_80130D0C func_80131E00 func_80131EEC func_80131F28 func_80131F64 func_80132EC4 func_80134310 func_80136C1C func_80136C54 func_801375EC func_801376C8 func_801379D8 func_801379EC func_80138948 func_80138C30 func_80138DB8 func_801391F0 func_801392C8 func_80139788 func_80139A34 func_80139A44 func_80139A68 func_80139DC8 func_80139FBC func_8013A8B0 func_8013A9B4 func_8013C98C func_8013CABC func_8013CAE8 func_8013CB20 func_8013CB5C func_8013D13C func_8013D164 func_8013E054 func_8013E298 func_8013E558 func_8013E67C func_8013E814 func_8014168C func_80141788 func_801417C4 func_80142C84 func_80142DB8 func_80143970 func_80143994 func_80143B30 func_80143C38 func_80143C98 func_80143E68 func_80144054 func_801449C8 func_80144A04 func_80144A2C func_80144AEC func_80146534 func_80146554 func_80146578 func_8014659C func_801465C0 func_801465E4 func_801466B4 func_80146C98 func_80146CA0 func_80146CB4 func_80146D80 func_80146DE8 func_80146E90 func_8014704C func_80147078 func_80147084 func_80147098 func_801470AC func_80147290 func_801472B4 func_801472C8 func_801472F0 func_80147300 func_801473DC func_80147460 func_801474D8 func_801474EC func_80147788 func_801477A8 func_801477C8 func_801477E8 func_80147928 func_8014799C func_80147A10 func_80147A84 func_80147AAC func_80147F50 func_801484B0 func_80148534 func_80148634 func_801487F4 func_80148800 func_8014880C func_80148818 func_80148C18 func_80148C20 func_80148C34 func_80148C4C func_80148C64 func_80148C7C func_80148C84 func_80148C9C func_80148CB4 func_80148CCC func_80148CE4 func_80148CEC func_80148CF4 func_80148D0C func_80148D3C func_80148F60 func_80148F68 func_80148F74 func_80148F80 func_80148F8C func_80148F98 func_80148FA0 func_80148FAC func_80148FB8 func_80148FC4 func_80148FD0 func_80148FD8 func_80148FE0 func_80148FEC func_80148FF8 func_80149004 func_8014900C func_80149020 func_80149034 func_80149048 func_8014905C func_801490E0 func_801490E8 func_801490F0 func_80149204 func_80149210 func_80149284 func_80149350 func_8014942C func_801496D4 func_80149704 func_80149724 func_80149788 func_80149864 func_801498C0 func_80149AA8 func_80149BEC func_80149C94 func_80149CB4 func_8014A218 func_8014A4FC func_8014A638 func_8014A674 func_8014A680 func_8014A69C func_8014A6A8 func_8014A71C func_8014A830 func_8014AA04 func_8014AB5C func_8014ABF0 func_8014ACC0 func_8014ADA8 func_8014B00C func_8014B154 func_8014B2F8 func_8014B310 func_8014B33C func_8014B4C4 func_8014B4D4 func_8014B598 func_8014B5B0 func_8014B5B8 func_8014B5C4 func_8014B5D0 func_8014B768 func_8014BB0C func_8014BC44 func_8014BD98 func_8014BDC8 func_8014BE78 func_8014BE9C func_8014BEC0 func_8014BEF8 func_8014BF18 func_8014BF48 func_8014BF6C func_8014BF8C func_8014BFB0 func_8014BFD4 func_8014BFF4 func_8014C010 func_8014C1A0 func_8014C3A4 func_8014C59C func_8014C5D0 func_8014C6AC func_8014C6C0 func_8014C6D0 func_8014C6E0 func_8014C88C func_8014C8F0 func_8014C968 func_8014C978 func_8014C98C func_8014CA00 func_8014CA70 func_8014CAE4 func_8014CAFC func_8014CB0C func_8014CB1C func_8014CB2C func_8014CB58 func_8014CB68 func_8014CB7C func_8014CB8C func_8014CB9C func_8014CBD8 func_8014CBE8 func_8014CBF8 func_80150150 func_80150460 func_80150CA0 func_80150CC4 func_80150CE4 func_80150D04 func_80150D24 func_80150D44 func_80150D64 func_80150D84 func_80150DA4 func_80150DC4 func_80150DE4 func_80150E04 func_80150E24 func_80150E44 func_80150E64 func_80150FB4 func_80151014 func_80151070 func_80151094 func_801510C8 func_801510EC func_80151110 func_80151138 func_8015115C func_80151164 func_801511A8 func_801511C4 func_801511E0 func_80151238 func_80151924 func_80151D24 func_80152058 func_80152370 func_80152698 func_8015282C func_80152B6C func_80152D24 func_80153060 func_80153320 func_8015369C func_80153BD8 func_80153BF0 func_80153C18 func_80153C30 func_80153C74 func_80153C8C func_80153C9C func_80153CBC func_8015410C func_80154134 func_80154274 func_801542DC func_80154418 func_80154AB4 func_80154B20 func_80154B7C func_80154BC8 func_80154BE4 func_80155394 func_801553A8 func_80155440 func_80155580 func_80155F60 func_80155FB0 func_80155FD4 func_801563EC func_80156A14 func_80157544 func_8015771C func_80157A8C func_80157DC4 func_80157FC4 func_8015824C func_801585A4 func_801593E4 func_80159404 func_80159434 func_80159698 func_801596D4 func_80159874 func_8015987C func_801598BC func_80159968 func_801599A4 func_801599E0 func_80159B70 func_8015A264 func_8015AD3C func_8015BE38 func_8015BE74 func_8015BEC4 func_8015BEE4 func_8015BFF4 func_8015C714 func_8015CCB0 func_8015CFFC func_8015D524 func_8015DC84 func_8015DFE4 func_8015E588 func_8015ED6C func_8015F360 func_8015FA24 func_8016004C func_801607B8 func_80160EE0 func_80161104 func_80161240 func_80161418 func_80161450 func_801614E4 func_8016151C func_80161554 func_8016158C func_801619A4 func_801619D0 func_80161D58 func_80162330 func_80162414 func_801627C0 func_80162834 func_80162AC0 func_80162ACC func_80162AE0 func_80162AF4 func_80162F60 func_80162F80 func_80162FA0 func_80162FC0 func_80163234 func_801632E0 func_80163A58 func_80164BA0 func_80164DB0 func_80164EA4 func_80165124 func_80165658 func_80165670 func_80165694 func_801656D0 func_801656E8 func_80165700 func_80165770 func_801657A0 func_80165840 func_801658DC func_80165938 func_80165958 func_80165978 func_80165988 func_801659A8 func_801659B8 func_801659CC func_801659DC func_80165A20 func_80165AC8 func_80165B28 func_80165C58 func_80165C78 func_80166018 func_801663FC func_80166618 func_80166654 func_801678B4 func_80167A9C func_80168640 func_80168744 func_801689D8 func_80168A88 func_80168AA8 func_80168D58 func_8016901C func_801693CC func_80169830 func_80169B80 func_80169F00 func_8016A020 func_8016A05C func_8016A700 func_8016AB30 func_8016B428 func_8016B4BC func_8016B964 func_8016BA48 func_8016BBA4 func_8016BF34 func_8016BFA8 func_8016C14C func_8016D19C func_8016D428 func_8016DA04 func_8016DEA4 func_8016DF20 func_8016E5B8 func_8016E8F0 func_8016ED6C func_8016ED8C func_8016EDBC func_8016EFA8 func_8016F094 func_8016F1AC func_8016F250 func_8016F264 func_8016F288 func_8016F2A8 func_8016F2C8 func_8016F2EC func_8016F30C func_8016F330 func_8016F350 func_8016F374 func_8016F388 func_8016F44C func_8016F470 func_8016F494 func_8016F6E0 func_8016F798 func_8016F804 func_8016F834 func_8016F8E4 func_8016F9C4 func_8016FA84 func_8016FB50 func_8016FB7C func_8016FC64 func_8016FC90 func_8016FDB4 func_8016FF30 func_8016FFDC func_80170150 func_80170240 func_801702FC func_801703E0 func_801704B0 func_8017051C func_80170548 func_801705F8 func_801706AC func_80170748 func_80170810 func_80170AD8 func_80170B14 func_80170BD8 func_80170C74 func_80170D68 func_80170E34 func_80170EFC func_80170FB0 func_80171064 func_80171120 func_801711C0 func_80171238 func_80171260 func_801714E4 func_80171884 func_80171904 func_8017196C func_8017197C func_80171990 func_80171A04 func_80171A10 func_80171A1C func_80171A34 func_80171A44 func_80171A58 func_80171A6C func_80171A80 func_80171B10 func_80171B44 func_80172304 func_801724EC func_80172588 func_80172590 func_801725A4 func_801725B8 func_801725CC func_801725E0 func_801725F4 func_80172608 func_8017261C func_80172630 func_80172644 func_80172658 func_80172664 func_80172670 func_8017267C func_80172688 func_80172694 func_801726A0 func_801726AC func_801726B8 func_801726C4 func_80172710 func_80172760 func_801727D0 func_801728E4 func_801729F0 func_80172B44 func_80172CA0 func_80172DAC func_80172ED4 func_80172EFC func_80172F24 func_80173078 func_8017319C func_8017329C func_801732F4 func_8017334C func_801733A4 func_80173544 func_801736FC func_801737E8 func_8017390C func_80173A28 func_80173B4C func_80174188 func_801742A4 func_80174384 func_80174474 func_8017452C func_80174584 func_801745DC func_80174604 func_80174630 func_80174674 func_80174754 func_80174764 func_80174774 func_801747AC func_801747CC func_80174808 func_80174888 func_801748C4 func_8017496C func_801749A8 func_80174BBC func_80174C60 func_80174ED4 func_80174F28 func_80175494 func_80175624 func_80175668 func_80177784 func_80178BB8 func_80178D18 func_80179DCC func_80179DF8 func_80179E1C func_80179EE8 func_80179F44 func_80179F6C func_8017A0F4 func_8017A11C func_8017A144 func_8017A180 func_8017A1A8 func_8017A1D0 func_8017A1F8 func_8017A298 func_8017A2C0 func_8017A2E8 func_8017A310 func_8017A338 func_8017A360 func_8017A388 func_8017A3B0 func_8017ADE8 func_8017BE60 func_8017BEBC func_8017C150 func_8017D8DC func_8017D8F0 func_8017DA08 func_8017DACC func_8017DCB0 func_8017DD3C func_8017DD60 func_8017DE64 func_8017DE84 func_8017E0EC func_8017E1B4 func_8017E1D4 func_8017E210 func_8017E748 func_8017E868 func_8017EA5C func_8017EA98 func_8017EC40 func_8017ED4C func_8017EDE4 func_8017EE20 func_8017F3E8 func_8017F424 func_8017F6D8 func_8018021C func_80180258 func_80180294 func_801806A8 func_801808DC func_80180910 func_80182254 func_801822E4 func_801822FC func_8018294C func_80182968 func_80183A50 func_80183A70 func_80184238 func_80184254 func_80184484 func_8018448C func_80184554 func_801846F8 func_80184890 func_801848CC func_80184908 func_80184AEC func_80184ED8 func_801853EC func_8018681C +REAL matches: func_80128158 func_80128178 func_80128198 func_801281B8 func_801281D8 func_801281F8 func_80128218 func_80128228 func_80128248 func_80128268 func_80128288 func_801282CC func_801282EC func_8012832C func_80128420 func_801284B8 func_801284F0 func_8012853C func_80128564 func_801285D4 func_80128678 func_801288B0 func_801289F0 func_80128A28 func_80128AF4 func_80128C14 func_80128D60 func_80128EA8 func_80128FAC func_80129010 func_801290DC func_8012913C func_801291C0 func_80129220 func_80129248 func_80129258 func_8012927C func_801292C8 func_8012931C func_80129350 func_80129374 func_80129398 func_80129428 func_8012943C func_801298F4 func_80129FF4 func_8012A018 func_8012A048 func_8012A094 func_8012A0E0 func_8012A100 func_8012A110 func_8012A2F4 func_8012A304 func_8012A418 func_8012A464 func_8012A4BC func_8012A568 func_8012A5F8 func_8012A68C func_8012A758 func_8012A79C func_8012A7D4 func_8012A828 func_8012A860 func_8012A8B0 func_8012A8E8 func_8012A908 func_8012A988 func_8012ACA0 func_8012AD44 func_8012AD50 func_8012AD64 func_8012AD6C func_8012AD80 func_8012ADE4 func_8012AE00 func_8012AF0C func_8012B030 func_8012B14C func_8012B178 func_8012B1B4 func_8012B200 func_8012B21C func_8012B23C func_8012B260 func_8012B2CC func_8012B370 func_8012B414 func_8012B608 func_8012B6D4 func_8012B70C func_8012B744 func_8012B864 func_8012B8A4 func_8012B8E4 func_8012BA10 func_8012BB3C func_8012BC60 func_8012BCCC func_8012BD14 func_8012BD3C func_8012BDBC func_8012BE54 func_8012BE98 func_8012BEE8 func_8012BF10 func_8012BF4C func_8012BF54 func_8012BF68 func_8012BF7C func_8012C044 func_8012C194 func_8012C1B8 func_8012C1DC func_8012C218 func_8012C284 func_8012C31C func_8012C354 func_8012C438 func_8012C51C func_8012C588 func_8012C658 func_8012C724 func_8012C820 func_8012CAE4 func_8012CB64 func_8012CBA4 func_8012CBCC func_8012CBF4 func_8012CC1C func_8012CC40 func_8012CC64 func_8012CE2C func_8012CEB0 func_8012D38C func_8012D3AC func_8012D3B4 func_8012D5DC func_8012D5E4 func_8012D624 func_8012DB84 func_8012DEB8 func_8012DF34 func_8012DFBC func_8012DFCC func_8012DFD4 func_8012E27C func_8012E284 func_8012E32C func_8012E470 func_8012E4C8 func_8012E504 func_8012E544 func_8012E57C func_8012E88C func_8012E8A8 func_8012E8C4 func_8012E8E0 func_8012EECC func_8012EF34 func_8012EF70 func_8012F0BC func_8012F1A4 func_8012F214 func_8012F2E8 func_8012F374 func_8012F5F4 func_8012F68C func_8012F75C func_8012F7B4 func_8012F87C func_8012F91C func_8012FB54 func_8012FC30 func_8012FCA4 func_8012FE70 func_8012FF00 func_8012FF4C func_8012FF98 func_8013001C func_80130088 func_801301E8 func_80130278 func_80130314 func_80130360 func_801303A0 func_801303EC func_801305CC func_80130740 func_801307B0 func_80130858 func_80130898 func_801308DC func_80130AC4 func_80130D0C func_801319E0 func_80131AC8 func_80131C78 func_80131E00 func_80131E38 func_80131E7C func_80131EE4 func_80131EEC func_80131F28 func_80131F64 func_80131FA0 func_80131FDC func_801320D0 func_8013240C func_8013277C func_80132DC4 func_80132E6C func_80132EC4 func_80132EF4 func_80133060 func_8013361C func_80134310 func_8013435C func_80134A28 func_80134FB8 func_80136BC4 func_80136C1C func_80136C3C func_80136C44 func_80136C4C func_80136C54 func_80136D00 func_80136EC4 func_80136ECC func_801375EC func_8013767C func_801376C8 func_801377B4 func_80137840 func_801379D8 func_801379EC func_80137BD8 func_80137FD8 func_80138948 func_8013895C func_80138AB4 func_80138B88 func_80138C30 func_80138D58 func_80138DB8 func_8013914C func_801391F0 func_80139220 func_801392C8 func_801395D4 func_80139634 func_80139680 func_80139788 func_80139914 func_80139954 func_801399A8 func_801399F0 func_80139A34 func_80139A44 func_80139A68 func_80139A8C func_80139B18 func_80139C7C func_80139D04 func_80139DC8 func_80139DEC func_80139DF4 func_80139E84 func_80139F0C func_80139FBC func_80139FE8 func_8013A0A4 func_8013A164 func_8013A1E8 func_8013A250 func_8013A378 func_8013A380 func_8013A448 func_8013A4C4 func_8013A860 func_8013A8B0 func_8013A8BC func_8013A8FC func_8013A9B4 func_8013A9F8 func_8013AA24 func_8013AB54 func_8013B204 func_8013B568 func_8013B7F4 func_8013BD34 func_8013C360 func_8013C938 func_8013C964 func_8013C98C func_8013C9C4 func_8013CABC func_8013CAE8 func_8013CB20 func_8013CB5C func_8013D13C func_8013D164 func_8013E054 func_8013E064 func_8013E0FC func_8013E194 func_8013E22C func_8013E298 func_8013E370 func_8013E410 func_8013E4B4 func_8013E558 func_8013E67C func_8013E814 func_8013ED6C func_8013F1BC func_8014168C func_80141788 func_801417C4 func_801417F8 func_80141C04 func_80141C50 func_80142414 func_80142454 func_801425CC func_801426D4 func_80142778 func_801427DC func_801427E4 func_80142838 func_801428CC func_80142C7C func_80142C84 func_80142D38 func_80142DB8 func_80142F68 func_80142FFC func_801430F4 func_80143188 func_801432FC func_80143390 func_801433F0 func_8014350C func_80143640 func_801437D8 func_80143970 func_80143994 func_801439C0 func_80143B30 func_80143B6C func_80143BDC func_80143C38 func_80143C74 func_80143C98 func_80143CD4 func_80143E68 func_80143EA4 func_80143EAC func_80143EB4 func_80143EBC func_80144054 func_80144458 func_8014462C func_80144988 func_801449C8 func_80144A04 func_80144A2C func_80144A68 func_80144A90 func_80144A98 func_80144AEC func_801458E0 func_801458E8 func_80145BF8 func_80146014 func_80146074 func_80146534 func_80146554 func_80146578 func_8014659C func_801465C0 func_801465E4 func_80146608 func_801466B4 func_801468C8 func_80146924 func_80146994 func_801469C8 func_80146AB4 func_80146C98 func_80146CA0 func_80146CB4 func_80146CC8 func_80146D30 func_80146D80 func_80146D90 func_80146DB8 func_80146DE8 func_80146DF8 func_80146E90 func_80146E98 func_80146EC0 func_80146F58 func_80146FC4 func_8014704C func_80147054 func_80147060 func_8014706C func_80147078 func_80147084 func_8014708C func_80147098 func_801470A0 func_801470AC func_801470B4 func_801470C0 func_80147118 func_80147264 func_80147290 func_801472B4 func_801472C8 func_801472DC func_801472F0 func_80147300 func_80147324 func_801473DC func_801473EC func_80147460 func_80147478 func_801474D8 func_801474EC func_80147514 func_80147628 func_80147718 func_80147788 func_801477A8 func_801477C8 func_801477E8 func_80147814 func_80147860 func_801478B8 func_80147928 func_80147948 func_8014799C func_801479BC func_80147A10 func_80147A30 func_80147A84 func_80147AAC func_80147AD4 func_80147B18 func_80147B5C func_80147CC8 func_80147D38 func_80147DC0 func_80147F50 func_80148038 func_801484B0 func_801484E8 func_80148534 func_8014856C func_801485B8 func_80148634 func_80148648 func_801487F4 func_80148800 func_8014880C func_80148818 func_801488A8 func_8014891C func_80148980 func_801489E8 func_80148A48 func_80148AAC func_80148C18 func_80148C20 func_80148C34 func_80148C4C func_80148C64 func_80148C7C func_80148C84 func_80148C9C func_80148CB4 func_80148CCC func_80148CE4 func_80148CEC func_80148CF4 func_80148D0C func_80148D24 func_80148D3C func_80148F60 func_80148F68 func_80148F74 func_80148F80 func_80148F8C func_80148F98 func_80148FA0 func_80148FAC func_80148FB8 func_80148FC4 func_80148FD0 func_80148FD8 func_80148FE0 func_80148FEC func_80148FF8 func_80149004 func_8014900C func_80149020 func_80149034 func_80149048 func_8014905C func_80149078 func_801490E0 func_801490E8 func_801490F0 func_801490F8 func_80149184 func_801491C4 func_80149204 func_80149210 func_80149228 func_80149284 func_80149290 func_80149350 func_8014942C func_80149544 func_80149584 func_801496D4 func_80149704 func_80149724 func_80149744 func_80149788 func_80149864 func_80149884 func_801498C0 func_801498E0 func_80149954 func_80149A64 func_80149AA8 func_80149AD4 func_80149B14 func_80149B54 func_80149BAC func_80149BEC func_80149C94 func_80149CB4 func_80149CD4 func_80149D10 func_80149D9C func_80149DD8 func_80149FA8 func_8014A1B0 func_8014A218 func_8014A380 func_8014A3E0 func_8014A454 func_8014A4B4 func_8014A4FC func_8014A638 func_8014A674 func_8014A680 func_8014A69C func_8014A6A8 func_8014A6C4 func_8014A71C func_8014A830 func_8014AA04 func_8014AA28 func_8014AB5C func_8014ABF0 func_8014ACC0 func_8014ACE8 func_8014AD30 func_8014AD7C func_8014ADA8 func_8014B00C func_8014B034 func_8014B084 func_8014B12C func_8014B154 func_8014B160 func_8014B190 func_8014B2A8 func_8014B2D0 func_8014B2F8 func_8014B310 func_8014B33C func_8014B350 func_8014B4C4 func_8014B4D4 func_8014B504 func_8014B598 func_8014B5B0 func_8014B5B8 func_8014B5C4 func_8014B5D0 func_8014B5D8 func_8014B6F0 func_8014B768 func_8014BB0C func_8014BB24 func_8014BC0C func_8014BC44 func_8014BC80 func_8014BCC0 func_8014BCEC func_8014BD24 func_8014BD98 func_8014BDC8 func_8014BDE0 func_8014BDE8 func_8014BE78 func_8014BE9C func_8014BEC0 func_8014BEF8 func_8014BF18 func_8014BF48 func_8014BF6C func_8014BF8C func_8014BFB0 func_8014BFD4 func_8014BFF4 func_8014C010 func_8014C050 func_8014C088 func_8014C0C8 func_8014C118 func_8014C1A0 func_8014C278 func_8014C2B0 func_8014C3A4 func_8014C3D0 func_8014C43C func_8014C59C func_8014C5D0 func_8014C5FC func_8014C6AC func_8014C6C0 func_8014C6D0 func_8014C6E0 func_8014C860 func_8014C88C func_8014C8F0 func_8014C918 func_8014C968 func_8014C978 func_8014C98C func_8014C99C func_8014CA00 func_8014CA14 func_8014CA70 func_8014CA88 func_8014CAE4 func_8014CAFC func_8014CB0C func_8014CB1C func_8014CB2C func_8014CB58 func_8014CB68 func_8014CB7C func_8014CB8C func_8014CB9C func_8014CBD8 func_8014CBE8 func_8014CBF8 func_8014CC28 func_8014CD0C func_8014D0A4 func_8014D438 func_8014D790 func_8014DF94 func_8014E48C func_8014E514 func_8014E6F8 func_8014E790 func_8014E83C func_8014E98C func_8014ED80 func_8014F24C func_8014FA70 func_8014FC18 func_8014FDF4 func_80150150 func_80150460 func_801504D8 func_801505FC func_80150820 func_801508B4 func_801508F8 func_80150B9C func_80150BA4 func_80150BC8 func_80150C48 func_80150CA0 func_80150CC4 func_80150CE4 func_80150D04 func_80150D24 func_80150D44 func_80150D64 func_80150D84 func_80150DA4 func_80150DC4 func_80150DE4 func_80150E04 func_80150E24 func_80150E44 func_80150E64 func_80150E84 func_80150EA4 func_80150EC4 func_80150F78 func_80150F80 func_80150FB4 func_80150FD8 func_80151014 func_80151038 func_80151070 func_80151094 func_801510B8 func_801510C0 func_801510C8 func_801510EC func_80151110 func_80151130 func_80151138 func_8015115C func_80151164 func_80151184 func_801511A8 func_801511C4 func_801511E0 func_80151204 func_80151238 func_801516F0 func_8015173C func_80151878 func_80151880 func_801518D8 func_80151924 func_80151980 func_80151D24 func_80151D60 func_80151E78 func_80151ECC func_80151F38 func_80151FB4 func_80152058 func_80152094 func_801520DC func_80152194 func_8015220C func_80152254 func_80152370 func_801523AC func_801525F4 func_80152698 func_801526D4 func_80152714 func_80152790 func_8015282C func_80152868 func_801528B0 func_8015294C func_80152A08 func_80152A50 func_80152AC8 func_80152B6C func_80152BA8 func_80152BF0 func_80152C40 func_80152D24 func_80152D60 func_80152DA8 func_80152E4C func_80152EFC func_80152F44 func_80152FBC func_80153060 func_8015309C func_801530E4 func_80153150 func_801531BC func_80153204 func_8015327C func_80153320 func_8015335C func_801533A4 func_80153410 func_80153490 func_801534D8 func_80153550 func_8015369C func_80153978 func_80153B58 func_80153BD8 func_80153BF0 func_80153C18 func_80153C30 func_80153C74 func_80153C8C func_80153C9C func_80153CBC func_80153D34 func_8015410C func_80154134 func_80154150 func_80154190 func_801541D8 func_80154218 func_80154274 func_801542DC func_80154358 func_80154418 func_80154A74 func_80154AB4 func_80154AE0 func_80154B20 func_80154B4C func_80154B7C func_80154B98 func_80154BC8 func_80154BE4 func_80154ED8 func_80154F9C func_801552F4 func_80155344 func_80155394 func_801553A8 func_801553C0 func_80155440 func_801554B8 func_80155518 func_8015554C func_80155580 func_801555BC func_80155B20 func_80155B9C func_80155C0C func_80155E30 func_80155F58 func_80155F60 func_80155FB0 func_80155FD4 func_80155FF8 func_801563EC func_8015640C func_801564B0 func_801565C0 func_80156648 func_801567BC func_80156A14 func_80156A88 func_80157158 func_801574DC func_80157510 func_80157544 func_801575E4 func_8015771C func_8015773C func_80157880 func_80157A8C func_80157BC8 func_80157CCC func_80157D74 func_80157DC4 func_80157E00 func_80157E38 func_80157EA4 func_80157F64 func_80157FC4 func_80158000 func_801580B4 func_801581AC func_8015824C func_80158288 func_801582C0 func_80158344 func_801585A4 func_801585AC func_801585EC func_80158794 func_80158AB4 func_80158BB0 func_80158C40 func_80158CD8 func_80158D60 func_80159070 func_80159120 func_801592CC func_8015934C func_801593E4 func_80159404 func_80159434 func_80159698 func_801596D4 func_80159874 func_8015987C func_801598BC func_801598E0 func_80159968 func_801599A4 func_801599E0 func_80159A18 func_80159B08 func_80159B3C func_80159B70 func_80159BAC func_8015A1C8 func_8015A1FC func_8015A230 func_8015A264 func_8015A2A0 func_8015AB7C func_8015ABD4 func_8015AC90 func_8015AD3C func_8015AD78 func_8015B7B4 func_8015B858 func_8015B8F8 func_8015BD8C func_8015BDD0 func_8015BE04 func_8015BE38 func_8015BE74 func_8015BEC4 func_8015BEE4 func_8015BF04 func_8015BF48 func_8015BF7C func_8015BFB0 func_8015BFF4 func_8015C08C func_8015C0C4 func_8015C6A4 func_8015C6AC func_8015C6E0 func_8015C714 func_8015C750 func_8015C788 func_8015CB94 func_8015CBCC func_8015CBD4 func_8015CBDC func_8015CBE4 func_8015CBEC func_8015CBF4 func_8015CBFC func_8015CC04 func_8015CC40 func_8015CCB0 func_8015CF24 func_8015CF8C func_8015CFFC func_8015D480 func_8015D4E8 func_8015D524 func_8015D544 func_8015D57C func_8015DA5C func_8015DA90 func_8015DAC4 func_8015DB34 func_8015DB6C func_8015DC84 func_8015DDF0 func_8015DE24 func_8015DE94 func_8015DECC func_8015DFE4 func_8015E0D4 func_8015E150 func_8015E1F4 func_8015E22C func_8015E288 func_8015E40C func_8015E588 func_8015E5B0 func_8015E714 func_8015E84C func_8015E880 func_8015E8B4 func_8015E924 func_8015E95C func_8015E9B8 func_8015ED6C func_8015EDA0 func_8015EE44 func_8015EF9C func_8015EFA4 func_8015EFD8 func_8015F048 func_8015F080 func_8015F260 func_8015F2BC func_8015F2F0 func_8015F360 func_8015F738 func_8015F76C func_8015F810 func_8015F848 func_8015F89C func_8015F9A4 func_8015FA24 func_8015FA44 func_8015FA78 func_8015FDCC func_8016004C func_8016007C func_801600D0 func_80160104 func_80160174 func_801601AC func_801601E4 func_80160244 func_8016032C func_80160334 func_80160368 func_801603D8 func_801607B8 func_801607E4 func_80160818 func_80160888 func_801608C0 func_80160A28 func_80160A74 func_80160ACC func_80160B70 func_80160BB4 func_80160CB4 func_80160DEC func_80160E3C func_80160E70 func_80160EE0 func_80160F70 func_80160FE0 func_80161094 func_801610FC func_80161104 func_80161124 func_80161240 func_80161278 func_80161418 func_80161450 func_80161488 func_801614E4 func_8016151C func_80161554 func_8016158C func_8016197C func_801619A4 func_801619D0 func_80161A00 func_80161A30 func_80161A60 func_80161B18 func_80161B84 func_80161D58 func_801620C4 func_80162120 func_80162330 func_8016236C func_801623B8 func_80162414 func_801626B8 func_80162714 func_801627C0 func_80162834 func_801628F4 func_80162AC0 func_80162ACC func_80162AE0 func_80162AF4 func_80162B1C func_80162CC4 func_80162D28 func_80162D88 func_80162DE8 func_80162E48 func_80162EA8 func_80162F08 func_80162F60 func_80162F80 func_80162FA0 func_80162FC0 func_80162FF4 func_801630C4 func_80163194 func_80163234 func_8016325C func_801632E0 func_801632F0 func_80163328 func_801633A8 func_8016345C func_80163664 func_801636D0 func_8016380C func_801638A0 func_80163950 func_80163A58 func_80164270 func_801642AC func_80164410 func_80164864 func_80164A74 func_80164ACC func_80164BA0 func_80164CD4 func_80164DB0 func_80164DD0 func_80164EA4 func_80164F44 func_80165024 func_80165064 func_801650C4 func_80165124 func_8016533C func_80165374 func_801653F4 func_801655E4 func_80165624 func_80165658 func_80165670 func_80165694 func_801656D0 func_801656E8 func_80165700 func_80165718 func_80165770 func_801657A0 func_801657D8 func_80165840 func_80165874 func_801658DC func_801658EC func_80165900 func_80165910 func_80165938 func_80165958 func_80165978 func_80165988 func_801659A8 func_801659B8 func_801659CC func_801659DC func_80165A18 func_80165A20 func_80165A78 func_80165AC8 func_80165B08 func_80165B10 func_80165B18 func_80165B20 func_80165B28 func_80165B6C func_80165BB4 func_80165BFC func_80165C58 func_80165C78 func_80165E2C func_80165E90 func_80166018 func_8016629C func_801662F4 func_8016634C func_801663A4 func_801663FC func_80166438 func_801665B4 func_80166618 func_80166654 func_801678B4 func_80167A9C func_80167AD8 func_8016829C func_801684B4 func_801685EC func_80168640 func_80168664 func_80168744 func_80168780 func_801689D8 func_80168A14 func_80168A88 func_80168AA8 func_80168AE4 func_80168D58 func_80168EC4 func_80168F40 func_8016901C func_801691B8 func_801693CC func_80169830 func_8016986C func_80169A4C func_80169B80 func_80169E44 func_80169F00 func_80169FE0 func_8016A020 func_8016A05C func_8016A700 func_8016AB30 func_8016AFB0 func_8016B114 func_8016B3F4 func_8016B428 func_8016B448 func_8016B4BC func_8016B964 func_8016B984 func_8016BA48 func_8016BADC func_8016BBA4 func_8016BCC0 func_8016BF34 func_8016BFA8 func_8016C14C func_8016C374 func_8016C74C func_8016D19C func_8016D428 func_8016D464 func_8016D4DC func_8016D5EC func_8016D778 func_8016D848 func_8016D984 func_8016DA04 func_8016DBD8 func_8016DEA4 func_8016DEE0 func_8016DF20 func_8016E1CC func_8016E26C func_8016E2E8 func_8016E358 func_8016E3CC func_8016E5B8 func_8016E688 func_8016E6E4 func_8016E728 func_8016E8F0 func_8016ED6C func_8016ED8C func_8016EDBC func_8016EE94 func_8016EF78 func_8016EFA8 func_8016F094 func_8016F14C func_8016F1AC func_8016F250 func_8016F264 func_8016F288 func_8016F2A8 func_8016F2C8 func_8016F2EC func_8016F30C func_8016F330 func_8016F350 func_8016F374 func_8016F388 func_8016F398 func_8016F410 func_8016F44C func_8016F470 func_8016F494 func_8016F4F4 func_8016F4FC func_8016F540 func_8016F578 func_8016F5B0 func_8016F5E0 func_8016F610 func_8016F648 func_8016F680 func_8016F6B0 func_8016F6E0 func_8016F71C func_8016F764 func_8016F798 func_8016F7D4 func_8016F804 func_8016F834 func_8016F870 func_8016F8AC func_8016F8E4 func_8016F920 func_8016F95C func_8016F9C4 func_8016FA00 func_8016FA44 func_8016FA84 func_8016FAC0 func_8016FB10 func_8016FB50 func_8016FB7C func_8016FBB8 func_8016FC24 func_8016FC64 func_8016FC90 func_8016FCCC func_8016FD08 func_8016FD7C func_8016FDB4 func_8016FDF0 func_8016FE2C func_8016FE78 func_8016FED0 func_8016FF30 func_8016FF6C func_8016FFA8 func_8016FFDC func_80170018 func_80170068 func_801700B8 func_80170100 func_80170150 func_8017018C func_801701C8 func_80170240 func_8017027C func_801702B8 func_801702FC func_80170338 func_80170374 func_801703E0 func_8017041C func_8017044C func_801704B0 func_801704EC func_8017051C func_80170548 func_80170584 func_801705F8 func_80170634 func_80170670 func_801706AC func_801706E8 func_80170718 func_80170748 func_80170784 func_801707D4 func_80170810 func_8017084C func_80170928 func_80170970 func_801709B8 func_80170A00 func_80170A48 func_80170A90 func_80170AD8 func_80170B14 func_80170B48 func_80170B90 func_80170BD8 func_80170C14 func_80170C44 func_80170C74 func_80170CB0 func_80170D68 func_80170DA4 func_80170E34 func_80170E70 func_80170EFC func_80170F38 func_80170F74 func_80170FB0 func_80170FEC func_80171028 func_80171064 func_801710A0 func_80171120 func_8017115C func_8017118C func_801711C0 func_80171238 func_80171260 func_80171384 func_801714E4 func_80171520 func_8017162C func_801717A0 func_801717F4 func_80171824 func_80171854 func_80171884 func_80171904 func_8017196C func_8017197C func_80171990 func_80171A04 func_80171A10 func_80171A1C func_80171A34 func_80171A44 func_80171A58 func_80171A6C func_80171A80 func_80171A88 func_80171B10 func_80171B44 func_80171CC4 func_80171D1C func_80171D78 func_80171E08 func_80171EC8 func_8017209C func_80172170 func_801722CC func_80172304 func_80172310 func_80172358 func_80172414 func_801724EC func_8017250C func_80172560 func_80172588 func_80172590 func_801725A4 func_801725B8 func_801725CC func_801725E0 func_801725F4 func_80172608 func_8017261C func_80172630 func_80172644 func_80172658 func_80172664 func_80172670 func_8017267C func_80172688 func_80172694 func_801726A0 func_801726AC func_801726B8 func_801726C4 func_80172710 func_80172738 func_80172760 func_80172780 func_801727D0 func_8017280C func_80172844 func_8017288C func_80172894 func_801728E4 func_80172920 func_80172958 func_801729A8 func_801729B0 func_801729F0 func_80172A8C func_80172ACC func_80172B0C func_80172B14 func_80172B44 func_80172B80 func_80172BC8 func_80172C48 func_80172CA0 func_80172CDC func_80172D14 func_80172D60 func_80172D68 func_80172DAC func_80172DE8 func_80172E20 func_80172E8C func_80172E94 func_80172ED4 func_80172EFC func_80172F24 func_80172F4C func_80172F9C func_80172FEC func_8017303C func_80173078 func_801730FC func_8017316C func_80173174 func_8017319C func_801731D8 func_80173220 func_80173294 func_8017329C func_801732F4 func_8017334C func_801733A4 func_801733CC func_80173460 func_80173544 func_80173580 func_801735B8 func_801735EC func_80173648 func_801736A8 func_801736B0 func_801736FC func_80173738 func_80173770 func_801737B0 func_801737B8 func_801737E8 func_80173824 func_8017385C func_801738D4 func_801738DC func_8017390C func_80173948 func_80173980 func_801739D8 func_80173A20 func_80173A28 func_80173B4C func_80173B88 func_80173C64 func_80174158 func_80174188 func_801741EC func_80174274 func_8017427C func_801742A4 func_801742E0 func_80174318 func_80174354 func_8017435C func_80174384 func_801743C0 func_801743F0 func_80174430 func_80174438 func_80174474 func_801744B0 func_801744E0 func_80174524 func_8017452C func_80174584 func_801745DC func_80174604 func_80174630 func_80174674 func_801746DC func_80174714 func_80174754 func_80174764 func_80174774 func_80174784 func_801747AC func_801747CC func_80174808 func_8017481C func_80174824 func_8017484C func_80174888 func_801748C4 func_801748E4 func_801748EC func_8017496C func_801749A8 func_80174B6C func_80174BBC func_80174C60 func_80174C80 func_80174E9C func_80174ED4 func_80174EF0 func_80174F28 func_80174F64 func_80174FBC func_80175014 func_8017509C func_80175114 func_80175150 func_801751D8 func_801752BC func_80175454 func_80175494 func_80175624 func_80175668 func_80175798 func_801757A0 func_801757E0 func_80176D00 func_80176FF4 func_80177340 func_801776EC func_80177784 func_801783D0 func_80178438 func_80178608 func_8017869C func_80178744 func_801787D4 func_801788B8 func_80178BB8 func_80178CBC func_80178D18 func_80179B28 func_80179D30 func_80179D78 func_80179DCC func_80179DF8 func_80179E1C func_80179E48 func_80179E74 func_80179EA0 func_80179EE8 func_80179F14 func_80179F44 func_80179F6C func_80179F98 func_80179FEC func_8017A040 func_8017A094 func_8017A0C4 func_8017A0F4 func_8017A11C func_8017A144 func_8017A180 func_8017A1A8 func_8017A1D0 func_8017A1F8 func_8017A220 func_8017A248 func_8017A270 func_8017A298 func_8017A2C0 func_8017A2E8 func_8017A310 func_8017A338 func_8017A360 func_8017A388 func_8017A3B0 func_8017AD0C func_8017ADE8 func_8017AE08 func_8017B1D8 func_8017B824 func_8017BE60 func_8017BE9C func_8017BEA4 func_8017BEAC func_8017BEB4 func_8017BEBC func_8017C0BC func_8017C150 func_8017C230 func_8017C66C func_8017C908 func_8017D840 func_8017D8DC func_8017D8F0 func_8017DA08 func_8017DA44 func_8017DACC func_8017DCB0 func_8017DD3C func_8017DD60 func_8017DDE8 func_8017DE64 func_8017DE84 func_8017DEC0 func_8017DEFC func_8017E0EC func_8017E1B4 func_8017E1D4 func_8017E210 func_8017E350 func_8017E460 func_8017E4B4 func_8017E51C func_8017E668 func_8017E748 func_8017E784 func_8017E7DC func_8017E868 func_8017E9C0 func_8017EA5C func_8017EA98 func_8017EC40 func_8017ED4C func_8017ED88 func_8017EDE4 func_8017EE20 func_8017F0B4 func_8017F3E8 func_8017F424 func_8017F694 func_8017F6D8 func_8018021C func_80180258 func_80180294 func_801806A8 func_80180898 func_801808DC func_80180910 func_80182254 func_801822E4 func_801822FC func_8018294C func_80182968 func_80183A50 func_80183A70 func_80184238 func_80184254 func_80184484 func_8018448C func_801844F4 func_80184554 func_801846F8 func_80184890 func_801848CC func_80184908 func_801849A8 func_80184AEC func_80184ED8 func_801853EC func_80185B5C func_80186330 func_8018681C NON_MATCHING: build SHA1: d19c9580a02dc63ba1f0e7e0c770f3b10de35635 (byte-identical) + +empties audit: 2/2 genuine jr;nop (all clean) diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index a52362bf80..ef87e9d5bd 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -15,7 +15,7 @@ ## Tasks - [x] **T1 — Per-file -O0 split-file lever** — DONE (re-scoped by Drew: bank infra + 6, defer rest). The 3-object split works (`ov_SC01_077_a` before / `ov_SC01_077_o0` -O0 / `ov_SC01_077` after — a single object's .text can't be split around a middle object). **6/16 -O0 fns matched** byte-perfect (`func_8013B568/B7F4/BD34/C360/C938/C964`). **DEFERRED to Phase 20:** the 10 remaining -O0 fns hit an indexed-global `%lo`-folding codegen quirk (gcc-source research, R17 — our cc1 materializes the address, the original folds %lo); AND the ×134 per-overlay rollout (engine_core.h compiles -O2, can't carry -O0 fns → each overlay needs its own -O0 split). Two findings corrected the Phase-18 backlog's "afternoon, free ×134" premise (R14). -- [ ] **T2 — Recovery tooling.** `tools/cast_call_sites.py` (call-site fn-ptr casts) + implicit-int propagate-first. Build/validate on `.run/drafts-p18s1/` near-misses. +- [x] **T2 — Recovery tooling (light) — DONE.** R14 finding overturned the Phase-18 "implicit-int / propagate-first" framing: reproducing the 3 deferred near-misses through the gate showed **3 distinct real classes** (none implicit-int). (a) **Resident-callee link-miss** (func_8017209C calls `func_8004CFEC` = curated `ratan2`) → built **`tools/canon_resident_calls.py`** (rewrite `func_`→curated name; pipeline runs it FIRST). (b) **Shared-caller arity conflict** (func_80147514 `s32`, func_80168F40 `void*`): an engine_core.h caller macro declares the callee file-scope `extern void func_X(void)` → `conflicting types`; **FIX = caller extern → no-proto `extern void func_X();`** (byte-neutral, promotion-safe params). `cast_call_sites.py` NOT needed (the §17a "call-site cast = #1 miss" did not appear here; deferred to T3 if real near-misses need it). **3 matches banked** in ov_SC01_077 (byte-gated); 2 no-proto lines in engine_core.h; **`make check-all` 136/136 byte-identical** (R22); dedup-check 1450 validated/0 failed. Recovery pipeline = `draft → canon_resident_calls → sig_unify → harvest_verify --chunk 1` (cookbook §17a corrected, SETUP inventory, R16/R21). - [ ] **T3 — Scale waves (2–3 batches of 50, Ultracode).** Regen Ghidra-C for fresh targets, `gen_harvest_targets.py` manifest, Step-1 wave prompt → recovery (T2) → gate → `dedup_propagate` ×134 → checkpoint → improve. Each batch = a progress report. - [ ] **T4 — (CONDITIONAL) gcc-research spike.** Only on a blocking residual class (loop-guard order `func_8012C2D0`; §10 schedule `func_8014F2E0`). - [ ] **PhaseEnd** — verify all checkboxes (P7), demonstrate milestone, write `PhaseEnd_Phase19.md` (+ `## Plain-English Recap`, R25; Phase-20 backlog), archive worklog (R19). @@ -28,13 +28,14 @@ - 2026-06-20 — Phase started; plan approved (gate 1); task list built (R28); CURRENT_PHASE.md created. Beginning T1. - 2026-06-20 — T1: built + proved the 3-object -O0 split infra; matched 6/16 -O0 fns (ov_SC01_077 d19c9580). Two consults with Drew on T1 scope: (1) full -O0 rollout chosen, then (2) on discovering the remaining fns are research-grade (the %lo quirk), Drew chose "bank 6 + infra, defer rest to Phase 20." Fleet unchanged (the 6 are ov_SC01_077-local until rollout). Verified main/resident/ov_SC01_077/+2 byte-identical. Committed (commit:0158 + cookbook §18 commit:0159). → T2. - 2026-06-20 — T2 scoping finding (R14): examined Phase-18's actual near-misses (.run/drafts-p18s1-recover*/) — the recoveries were mostly **def-signature canonicalization** (ret→void, params→void*/int), which **`sig_unify` already does**, + a data-type reconcile (`struct Q16`→`BigCopy`) + a whitespace fix. The §17a "call-site casts = #1 miss" did NOT show up in these. So T2 is lighter than planned: confirm sig_unify is wired draft→`sig_unify`→gate, add the implicit-int **propagate-first** helper (3 fns: func_80147514/80168F40/8017209C → def into engine_core.h, gate after) + a small data-type-reconcile, and treat call-site-casts as a thin add only if T3's real near-misses need it. **SESSION CHECKPOINT here (Drew) — resume fresh.** +- 2026-06-20 — **T2 DONE.** Resumed fresh, rebuilt task list (R28), /effort max. Reproduced the 3 deferred near-misses through the gate (R14) → the "implicit-int / propagate-first" premise was WRONG: real classes are (a) resident-callee link-miss → new `tools/canon_resident_calls.py` (func_8017209C ✓), (b) shared-caller arity conflict → caller-extern no-proto fix (func_80147514 + func_80168F40 ✓). func_8012A418 isn't a stub in ov_SC01_077 (not a target; already Phase-18-reconciled). **3 matches banked**, 2 engine_core.h no-proto lines, **make check-all 136/136 byte-identical** (full extract + R22), dedup 1450/0, fleet 56.64% (194,848 — the 3 are ov_SC01_077-local, ×134 propagation rides T3/Phase-20: func_80147514/F40 inline named structs need engine_types.h lifting, func_8017209C propagatable). Cookbook §17a corrected, SETUP inventory updated. Pipeline now `draft → canon_resident_calls → sig_unify → harvest_verify`. → **T3 (the +3-5% lever).** ## ▶ RESUME HERE (fresh session) 1. Re-read load order + this file. Rebuild the harness task list (R28). `/effort max`. -2. **T2 (light):** wire/confirm the draft→`sig_unify`→`harvest_verify` recovery pipeline; build the implicit-int propagate-first helper + data-type-reconcile; validate on the `.run/drafts-p18s1-recover*` near-misses; commit. (cast_call_sites.py only if T3 near-misses actually need it.) +2. ~~T2~~ **DONE** (committed) — `canon_resident_calls.py` + the no-proto caller-extern fix; 3 matches banked; check-all 136/136. Recovery pipeline = `draft → canon_resident_calls → sig_unify → harvest_verify`. 3. **T3 (the main lever, +3-5%):** regen Ghidra-C for fresh tractable reach-134 fns (`DecompileFunctions.java`, headless — MCP stopped, R23/R29); `gen_harvest_targets.py` manifest; then **PROMPT Drew for `/effort ultracode` (R26/R27) and WAIT** before launching the wave. Run 2-3 batches of 50 (recover→gate→`dedup_propagate` ×134→checkpoint→improve between batches). 4. Then T4 (conditional) / PhaseEnd. -- State at checkpoint: 2 commits landed (commit:0158, commit:0159); tree clean; fleet 56.64% (T1's 6 are ov_SC01_077-local, not yet fleet-counted — they bank fleet-% only after the Phase-20 ×134 rollout). +- State after T2: commits commit:0158, commit:0159, commit:0160 (T1) + the T2 commit landed; fleet 56.64% (T1's 6 + T2's 3 are ov_SC01_077-local, not yet fleet-counted — they bank fleet-% only after the ×134 rollout). Next = T3. ## Blockers *(none)* diff --git a/src/ov_SC01_077/ov_SC01_077.c b/src/ov_SC01_077/ov_SC01_077.c index ab779e70dc..00535b3f47 100644 --- a/src/ov_SC01_077/ov_SC01_077.c +++ b/src/ov_SC01_077/ov_SC01_077.c @@ -749,7 +749,34 @@ DEFINE_func_801474D8() /* dedup: shared engine-core @0x801474D8 (src/shared) */ DEFINE_func_801474EC() /* dedup: shared engine-core @0x801474EC (src/shared) */ -INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077", func_80147514); +#include "common.h" + +struct V4s80147514 { s16 a, b, c, d; }; + +extern s32 func_80012C6C(s32 a0, s32 a1, s32 a2); +extern s32 func_800129CC(s32 a0, s32 a1); + +void func_80147514(s32 arg0) { + s16 buf[8]; + + *(struct V4s80147514 *)buf = *(struct V4s80147514 *)(arg0 + 0x120); + if (((u16)buf[0] | (u16)buf[1] | (u16)buf[2]) == 0) { + buf[1] = -0xFFF; + } + if (*(s16 *)(arg0 + 0x12E) != 0) { + buf[0] = (u16)buf[0] + *(u16 *)(arg0 + 0x128); + buf[1] = (u16)buf[1] + *(u16 *)(arg0 + 0x12A); + buf[2] = (u16)buf[2] + *(u16 *)(arg0 + 0x12C); + } + *(s16 *)(arg0 + 0x118) = func_80012C6C(*(s16 *)(arg0 + 0x118), buf[0], 8); + *(s16 *)(arg0 + 0x11A) = func_80012C6C(*(s16 *)(arg0 + 0x11A), buf[1], 8); + *(s16 *)(arg0 + 0x11C) = func_80012C6C(*(s16 *)(arg0 + 0x11C), buf[2], 8); + buf[0] = *(u16 *)(arg0 + 0x118); + buf[1] = *(u16 *)(arg0 + 0x11A); + buf[2] = *(u16 *)(arg0 + 0x11C); + func_800129CC((s32)buf, arg0 + 0x100); +} + DEFINE_func_80147628() /* dedup: shared engine-core @0x80147628 (src/shared) */ @@ -3605,7 +3632,51 @@ INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077", func_80168D94); DEFINE_func_80168EC4() /* dedup: shared engine-core @0x80168EC4 (src/shared) */ -INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077", func_80168F40); +#include "common.h" + +extern s32 func_80016A5C(); +extern Blk20 D_800AE620; + +/* First stack record: sp+0x10 .. sp+0x28 (struct-relative offsets). Mixed widths; + * offsets 0x06/0x0E/0x13/0x17 are never written (alignment gaps). */ +struct A { + u16 unk00; u16 unk02; u16 unk04; /* 0x10 0x12 0x14 */ + u16 unk06; /* 0x16 (gap) */ + u16 unk08; u16 unk0A; u16 unk0C; /* 0x18 0x1A 0x1C */ + u16 unk0E; /* 0x1E (gap) */ + u8 unk10; u8 unk11; u8 unk12; /* 0x20 0x21 0x22 */ + u8 unk13; /* 0x23 (gap) */ + u8 unk14; u8 unk15; u8 unk16; /* 0x24 0x25 0x26 */ + u8 unk17; /* 0x27 (gap) */ + s32 unk18; /* 0x28 */ +}; + +/* Second stack record at sp+0x30. 40 bytes reserved (the frame is 0x60); only the + * leading 8 words (0x30..0x4C) are populated from D_800AE620 via the Bv view. */ +struct B { s32 w[8]; s32 tail[2]; }; +struct Bv { s32 w[8]; }; + +void func_80168F40(void *arg0) { + struct A a; + struct B b; + + a.unk00 = *(u16 *)((u8 *)arg0 + 0x10); + a.unk02 = *(u16 *)((u8 *)arg0 + 0x14); + a.unk04 = *(u16 *)((u8 *)arg0 + 0x18); + a.unk08 = *(u16 *)((u8 *)arg0 + 0x6); + a.unk0A = *(u16 *)((u8 *)arg0 + 0xA); + a.unk0C = *(u16 *)((u8 *)arg0 + 0xE); + a.unk10 = 8; + a.unk14 = 0xC0; + a.unk12 = 0; + a.unk11 = 0; + a.unk16 = 0x80; + a.unk15 = 0x80; + *(struct Bv *)&b = *(struct Bv *)&D_800AE620; + a.unk18 = 0x50000000; + func_80016A5C(&a, &b); +} + typedef int (*DispatchFn)(); @@ -4586,7 +4657,40 @@ DEFINE_func_80171EC8() /* dedup: shared engine-core @0x80171EC8 (src/shared) */ INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077", func_80171FFC); -INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077", func_8017209C); + +extern s32 func_8017248C(s32 a0, s32 a1); +extern void func_80146D90(s32 a0); +extern s32 ratan2(s32 a0, s32 a1); /* ratan2 */ +extern s32 func_80012DBC(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80172170(s32 a0, s32 a1); + +s32 func_8017209C(void *arg0, void *arg1, s32 arg2, s32 arg3) { + s32 ret; + register s32 ang __asm__("$3"); /* $v1 */ + register s32 a3p __asm__("$19"); /* $s3 = arg3 */ + register s32 a2p __asm__("$20"); /* $s4 = arg2 */ + + a3p = arg3; + a2p = arg2; + + ret = func_8017248C((s32)arg0, (s32)arg1); + if (ret != 0) { + func_80146D90((s32)arg0); + return ret; + } + + ang = (ratan2((s32)*(s16 *)((u8 *)arg1 + 0) - (s32)*(s16 *)((u8 *)arg0 + 6), + (s32)*(s16 *)((u8 *)arg1 + 4) - (s32)*(s16 *)((u8 *)arg0 + 0xE)) + + 0x800) & 0xFFF; + if (a3p != 0) { + ang = (s16)func_80012DBC((s32)*(s16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x12), + ang, (s16)a3p, 1); + } + *(s16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x12) = ang; + func_80172170((s32)arg0, a2p & 0xFF); + return 0; +} + DEFINE_func_80172170() /* dedup: shared engine-core @0x80172170 (src/shared) */ diff --git a/src/shared/engine_core.h b/src/shared/engine_core.h index 33437de5c3..88f433c6af 100644 --- a/src/shared/engine_core.h +++ b/src/shared/engine_core.h @@ -6023,7 +6023,7 @@ } #define DEFINE_func_80147478() \ - extern void func_80147514(void); \ + extern void func_80147514(); \ extern void func_80147628(s32 a0); \ void func_80147478(s32 a0) { \ if ((*(s32 *)(a0 + 0x44) & 0x40000000) == 0) { \ @@ -15525,7 +15525,7 @@ } #define DEFINE_func_80168EC4() \ - extern void func_80168F40(void); \ + extern void func_80168F40(); \ extern void func_800D22E4(s32 a0); \ extern void func_80146C3C(void); \ void func_80168EC4(s32 a0) { \ diff --git a/tools/canon_resident_calls.py b/tools/canon_resident_calls.py new file mode 100644 index 0000000000..544695b927 --- /dev/null +++ b/tools/canon_resident_calls.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python3 +"""canon_resident_calls.py — rewrite `func_` references in a harvest draft to the +CURATED resident symbol name when that address has one (Phase 19 / T2 recovery). + +The link-miss recovery class. Overlay drafts call resident EXE/engine functions by their +`func_` name, but ~927 resident functions carry a *curated* name in config/symbols.us.txt +(e.g. 0x8004CFEC = `ratan2`). The linker resolves the curated name, NOT `func_8004CFEC`, so a +draft that calls `func_8004CFEC(...)` compiles fine but fails to LINK +(`undefined reference to func_8004CFEC`) -> the whole-binary byte-gate (correctly) reverts it. + +This pass maps every address that has a `// func` curated (non-`func_`) name in the stacked +symbol files (symbols.us + symbols.resident + symbols.) and rewrites each `func_` +token at such an address to that name, in both the extern declaration and the call. A pure +draft-text transform (like sig_unify): the body bytes are unchanged (same call target, same +address) -> the whole-binary `harvest_verify` byte-gate remains the sole arbiter (G3/P9). + +Proven on func_8017209C (calls ratan2 @0x8004CFEC). Run BEFORE sig_unify in the recovery +pipeline: draft -> canon_resident_calls -> sig_unify -> harvest_verify --chunk 1 + +Usage: + tools/canon_resident_calls.py --overlay ov_SC01_077 --in .run/drafts-X --out .run/drafts-X-cn + tools/canon_resident_calls.py --symbols config/symbols.us.txt,... --in ... --out ... +""" +import argparse, os, re, glob + +REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + +# `name = 0xADDR; // func` (curated function symbols; data is `// data` and uses D_ refs, not func_) +SYM_RE = re.compile(r'^\s*([A-Za-z_]\w*)\s*=\s*0x([0-9A-Fa-f]+)\s*;\s*//\s*func\b') +FUNC_TOK = re.compile(r'\bfunc_([0-9A-Fa-f]{8})\b') + + +def load_name_map(symbol_paths): + """addr(int) -> curated name, for every `// func` symbol whose name is NOT func_. + Later files in the stack override earlier (overlay-local wins), mirroring splat's stacking.""" + out = {} + for p in symbol_paths: + if not os.path.exists(p): + continue + for ln in open(p): + m = SYM_RE.match(ln) + if not m: + continue + name, addr = m.group(1), int(m.group(2), 16) + if name.lower() != f'func_{addr:08x}': # skip auto func_ names (no-op rewrites) + out[addr] = name + return out + + +def rewrite(text, name_map): + n = [0] + + def repl(m): + addr = int(m.group(1), 16) + nm = name_map.get(addr) + if nm and nm != m.group(0): + n[0] += 1 + return nm + return m.group(0) + + return FUNC_TOK.sub(repl, text), n[0] + + +def main(): + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument('--overlay', default='ov_SC01_077') + ap.add_argument('--symbols', help='comma-separated symbol files (default: us + resident + overlay)') + ap.add_argument('--in', dest='indir', required=True) + ap.add_argument('--out', dest='outdir', required=True) + a = ap.parse_args() + + if a.symbols: + sym_paths = [os.path.join(REPO, p) for p in a.symbols.split(',')] + else: + sym_paths = [os.path.join(REPO, p) for p in ( + 'config/symbols.us.txt', 'config/symbols.resident.txt', + f'config/symbols.{a.overlay}.txt')] + name_map = load_name_map(sym_paths) + + os.makedirs(os.path.join(REPO, a.outdir), exist_ok=True) + drafts = touched = total = 0 + for p in sorted(glob.glob(os.path.join(REPO, a.indir, '*.c'))): + new, k = rewrite(open(p).read(), name_map) + open(os.path.join(REPO, a.outdir, os.path.basename(p)), 'w').write(new) + drafts += 1 + if k: + touched += 1 + total += k + print(f'curated func names: {len(name_map)}; drafts: {drafts}; ' + f'rewritten: {touched} draft(s), {total} ref(s)') + + +if __name__ == '__main__': + main()