Promote daIDonketu_c (ChillBully) to one snake_case translation unit - #2156
Conversation
ov027's Bully-on-the-ice: seven per-function sources collapsed into
src/actors/d_a_i_donketu.cpp, one `complete` delinks span, and the class
renamed to the name the cartridge itself carries.
THE RENAME AND THE PROMOTION ARE ONE EDIT. They cannot be split into two
building commits: inlining the destructor (which the promotion requires, see
below) makes the two surviving per-function destructor sources redefine it --
`object 'daIDonketu_c::~daIDonketu_c()' redefined` in both
src/_ZN12daIDonketu_cD0Ev.cpp:20 and D1Ev.cpp:17. Measured, not assumed.
THE NAME IS THE ROM'S. Read out of extracted/overlays/overlay_0027.bin: the
vtable object's preamble at 0x02113928 is [0, 0x021138b0]; the typeinfo record
there reads [_ZTVN3abi20__si_class_type_infoE, 0x021138c8, 0x021138bc]; the
name string at 0x021138c8 is "12daIDonketu_c" and the base's at 0x021138a4 is
"7daOts_c", which the tree already spells that way. The coined `ChillBully`
reached no symbol home, so its _ZTI/_ZTS/_ZTV could never be word-compared
against the cartridge and this TU could not have declared a verifiable
compiler_only_output.
INLINE DESTRUCTOR, KEY FUNCTION Behavior. Out of line, mwccarm emits D0 before
D1 -- the reverse of ROM order, which objisolate refuses for the whole TU (this
entry's own pre-promotion block recorded `ordinal pair(s) not in ROM order:
[(0, 1)]`) -- plus a homeless D2. Inline gives the retail D1/D0 pair in ROM
order and no D2. The key function is then the first DECLARED non-inline
virtual, Behavior, so this TU still owns the class's _ZTV/_ZTI/_ZTS group; all
fourteen vague-linkage outputs are licensed as deadstrip-data in the manifest.
EVIDENCE
tubuild.py verify 7/7 MATCH, objisolate clean, reloc destinations
clean, all seven in ROM-ascending emission order,
nothing unlicensed
rombuild.py -j16 106/106 exact, 100.000000% of compared bytes,
mismatching 0
romdata_check per-symbol 8 VERIFIED / 5 PARTIAL, 0 DIFFERS, blindWords 0
throughout. _ZTV12daIDonketu_c: 148 emitted bytes
compared, 37 slots, all equal. _ZTI12daIDonketu_c,
_ZTI7daOts_c, _ZTS7daOts_c and four base _ZTIs
VERIFIED. Every PARTIAL is a _ZTS name string
whose symbols.txt extent runs past the string into
padding -- the known extent condition, not a
disagreement.
tubuild.py linkcheck --baseline --module ov027
modules PASS. Its one FAIL (`func_01ff9e2c` in
ITCM not found in the linked binary) reproduces on
the baseline and belongs to the tree.
The factory's second vptr store is `&_ZTV12daIDonketu_c[2]`: this TU now
defines the vtable, and mwccarm's symbol addresses the object start with its
two-word preamble while symbols.txt's names the slot array. _ZTV7daOts_c is not
defined here and takes no bias.
Three class_rename.py prose blind spots were audited and fixed by hand:
include/daOts_c.h collapsed the coined/ROM name pair into a tautology,
notes/archive/n64-decomp-cross-reference.md lost the historical name, and
notes/dscene-c-siblings-census.md named a file that no longer exists.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FsXWgEM3Gtbqs6zEdwLMYV
✅ PR validation — PassedCommitted merge passes; 5 contributor credit reassignment(s) noted, not a blocker. Full merge validation
Contributor credit moved (5)
Byte-verified means the range carries Warnings: contributor attribution changed, not a blocker (5 changed, 0 lost -- src/actors/d_a_i_donketu.cpp: andrewboudreau -> github-actions[bot]; src/actors/d_a_i_donketu.cpp: andrewboudreau -> github-actions[bot]; src/actors/d_a_i_donketu.cpp: andrewboudreau -> github-actions[bot]; +2 more); 7 address range(s) left the byte-verified set while enrolled totals held steady: ov027:0x021115c4-0x02111618, ov027:0x02111618-0x02111680, ov027:0x02111680-0x021116f0, ov027:0x021116f0-0x02111770, ov027:0x02111770-0x0211181c, +2 more; 6 more function(s) now claim a match that nothing compiles; enroll them in a delinks.txt to have the ROM build check them. Per-file link-check detailAll 40 changed file(s) compile to the ROM byte-for-byte with correct relocation targets.
The private worker commits a test merge, builds the stock ROM profile, compares every executable module, measures matched and source-built code, checks contributor lineage, and verifies affected relocations. The mod profile is opt-in and is not part of this merge gate. |
# Conflicts: # attribution.json
|
Merged current
|
# Conflicts: # notes/cpp-tu-current-state.md
# Conflicts: # notes/cpp-tu-current-state.md
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
# Conflicts: # config/converted-baseline.json # notes/cpp-tu-current-state.md
ov027's Bully-on-the-ice. Seven per-function sources collapsed into
actors/d_a_i_donketu.cpp(source-owned), onecompletedelinks span, and the classrenamed to the name the cartridge itself carries.
The rename and the promotion are one edit
They cannot be split into two building commits. The promotion needs the destructor
inline; inlining it makes the two surviving per-function destructor sources redefine it:
Measured, not assumed — that is why this is one commit.
The name is the ROM's
Read out of
extracted/overlays/overlay_0027.bin: the vtable object's preamble at0x02113928is[0, 0x021138b0]; the typeinfo record there reads[_ZTVN3abi20__si_class_type_infoE, 0x021138c8, 0x021138bc]; the name string at0x021138c8is"12daIDonketu_c"and the base's at0x021138a4is"7daOts_c", whichthe tree already spells that way. The measurement is written out at the top of
include/daIDonketu_c.h.The coined
ChillBullyreached no symbol home, so its_ZTI/_ZTS/_ZTVcould never beword-compared against the cartridge and this TU could not have declared a verifiable
compiler_only_output. The rename is what makes the promotion possible at all.Inline destructor, key function
BehaviorOut of line, mwccarm emits D0 before D1 — the reverse of ROM order, which
objisolaterefuses for the whole TU (this entry's own pre-promotion block recorded
ordinal pair(s) not in ROM order: [(0, 1)]) — plus a homeless D2. Inline gives the retail D1/D0 pair inROM order and no D2. The key function is then the first declared non-inline virtual,
Behavior, so this TU still owns the class's_ZTV/_ZTI/_ZTSgroup; all fourteenvague-linkage outputs are licensed as
deadstrip-datain the manifest.The factory's second vptr store is
&_ZTV12daIDonketu_c[2]: this TU now defines thevtable, and mwccarm's symbol addresses the object start with its two-word preamble while
symbols.txt's names the slot array._ZTV7daOts_cis not defined here and takes no bias.Evidence
tubuild.py verifyrombuild.py -j16romdata_checkper-symbolblindWords0 throughouttubuild.py linkcheck --baseline --module ov027check_data_definitions,check_dead_references,check_duplicate_sources,check_header_offsets --changed,check_layout_free,check_src_tu,check_tubuild_conflictsall pass_ZTV12daIDonketu_c: 148 emitted bytes compared word-for-word, 37 slots, all equal._ZTI12daIDonketu_c,_ZTI7daOts_c,_ZTS7daOts_cand four base_ZTIs VERIFIED. EveryPARTIAL is a
_ZTSname string whosesymbols.txtextent runs past the string intopadding — the known extent condition, not a disagreement.
linkcheck's one FAIL (Symbol 'func_01ff9e2c' in ITCM at 0x01ff9e2c not found in linked binary) reproduces on the baseline and belongs to the tree, not to this TU.check_decl_return_types's threedScMgBase_cdisagreements also reproduce on the basecommit
a6c2ece38and are untouched by this change.Prose blind spots, audited by hand
class_rename.pymangled three passages; all were fixed:include/daOts_c.hcollapsed the coined/ROM name pair into a tautology.notes/archive/n64-decomp-cross-reference.mdlost the historical name.notes/plan-cpp-conversion-queue.md§3 is a captured pilot transcript; the rewriteinvented a path that never existed in any state of the tree. The historical spelling is
restored, the section is marked HISTORICAL, and the one dead reference is banked in
config/dead-reference-baseline.json(exactly one row added, none removed).notes/dscene-c-siblings-census.mdnamed a file that no longer exists; it now points atthe TU and the header.
🤖 Generated with Claude Code
https://claude.ai/code/session_01FsXWgEM3Gtbqs6zEdwLMYV