Files
BFM-decomp/cookbook/C0339.md
T

4.2 KiB
Raw Blame History

§305 — "CARVE-REFUSED" AT GATE TIME IS THREE NAMED, DETERMINISTIC CLASSES — NONE OF THEM A CARVE (P31 S62 T3; 28 resolver drafts autopsied 28/28)

The gate's CARVE-REFUSED verdict (harvest_verify §59(3)) is the label for "jtbl_carve declined after the isolate branch", and the isolate branch's own output never reached a log (the worker's stdout is swallowed — fixed in spirit here by naming the classes). Reproduce any instance by hand: splice the draft, jr_isolate_all <ov> --only <fn> --dry-run, then the real isolate + make extract + jtbl_carve --func; restore with git checkout -- src/<ov> config/ + git clean -f src/<ov>/ + re-extract. The S62 census over all 28:

  1. A mangled definition in the TU (1 TU, 7 drafts): s32 FUNC_80180a08(...) — a matched body committed under a case-mangled name resolves to no address, so jr_isolate_all refuses to partition the whole TU ("construct(s) with no resolvable address"). Fix: rename to the canonical func_XXXXXXXX (byte-neutral; the sig spells IMAGE-derived names lowercase, the project uppercase — both are the same address). Fleet census: exactly one instance.
  2. A TU-local naming type the region cannot carry (10 drafts): "carry the naming type (file_scope_types) or add it to src/shared/engine_types.h" — Block4, Blk4_E960, Rec80182744, MATRIX_80188114, D80190448_t. Fix: tools/lift_types.py --types … --apply (dry-run first: it reports divergent per-overlay variants and keeps those local), then R22 — a shared-header change recompiles the fleet.
  3. Tables in BOTH the data asm and the fn's own .s after isolation (9 drafts, 3 of them the func_8015444C family): the fresh small c-segment makes spimdisasm migrate the table into the function's new .s while the un-carved tail still emits it; jtbl_carve's R32 guard read the overlap as an unprecedented half-migrated layout. When the data side covers EVERY table the function references it is the ordinary tail state: carve it, and the post-carve re-extract resolves the duplicate (jtbl_carve now says so and proceeds; a partial overlap still refuses).

Denominators: of the 90 drafts the S62 resolver staged, 54 banked at the gate, 28 were CARVE-REFUSED (this section), 2 DIFF, 6 CC1/PLUMBING decl conflicts. The tell that a "carve wall" is plumbing: jtbl_carve --probe says tail (a standard §8a carve) yet the gate refused — the carve was never the problem.

§305 addendum (same session, after the fixes above shipped). Three more deterministic sub-classes surfaced once classes 1–3 were cleared, each a one-line tool fix: 4. A carried decl line that GLUES code-emitting invocations — extern s32 aF…(…) __asm__(""); DEFINE_func_8014C4AC() DEFINE_func_8014C568() … on ONE line in the TU. jr_isolate_all's decl carrier copied it whole into the new region and re-instantiated the shared bodies there (nameless .globl/.ent → "junk at end of line … :"). Carry only the ;-terminated declaration segments; carry each glued macro's implied prototype instead. 5. The lifted typedef the isolator could not see — typedef struct {…} __attribute__((packed, aligned(1))) Block4; puts the attribute between } and the name, so _engine_types() never listed Block4 and every extern Block4 D_… was "a decl that could not be placed" even after the lift. Pattern added. 6. A jr function that LEADS its object (ov_SC06_029_jr_8017C954 starts at func_8017C954): the cut at its address equals the object start → an empty region 0 at the same offset → "code subseg … out of order". A cut equal to the object start is a no-op; drop it. And the shared-file race behind §302's drifts, now closed at the root: mk_write.write_overlays_mk takes base= (the text the caller read) and merges only the caller's changed # --- <ov> blocks into the CURRENT file under the lock; a block that moved on disk since the caller's read is a conflict and is refused (R43). harvest_verify snapshots/restores only its binary's block. The gate's parallelism (-j N) was the amplifier: every whole-file write or restore of overlays.mk by one binary's gate clobbered another's.