Skip to content

ov060: the Bowser fight becomes real C++, and D0 destructors become migratable - #1374

Merged
tangosdev merged 2 commits into
mainfrom
cpp/ov060-bowser
Aug 10, 2026
Merged

ov060: the Bowser fight becomes real C++, and D0 destructors become migratable#1374
tangosdev merged 2 commits into
mainfrom
cpp/ov060-bowser

Conversation

@andrewboudreau

Copy link
Copy Markdown
Collaborator

Stacked on #1373 — the strict reloc gate has to be trustworthy for multi-.text objects before any of this can claim to be verified.

Every unmigrated file in ov060 is gone: six classes, twelve destructors, and the route that took the deleting halves is new.

The D0 route

258 of the tree's 261 D0 files were unmigrated against 74 migrated D1s, and the reason was one missing declaration. The compiler generates D0 as "run the destructor body, then call operator delete on the class"; with none declared it emits a call to the global _ZdlPv, which exists nowhere in this image, and D0 comes out three instructions short.

The ROM shows what was there instead: operator new is a real function at 0x02043444, no operator delete symbol exists anywhere, and every deleting destructor ends with the same load-the-heap / call-Memory::Deallocate pair rather than a call to a shared helper. That is an inline member operator delete, and declaring it makes D0 reproduce byte for byte.

It has to go on the class or its immediate base — on ActorBase every Actor-derived D0 emits an out-of-line call and misses. Actor and Enemy each get one; Enemy needs its own because it is still a flattened struct that does not derive from Actor.

What the classes look like now

Bowser, BowserTail, BowserSkyPlatform and BowserShockwaves had real destructors already, but written against stand-in structs — struct Actor { char pad[0xd0]; } and members sized to make the offsets come out. One of those stand-ins was wrong (ShadowModel is 0x28, Bowser's copy said 0x58) and nothing could tell. All four now derive from the real Actor with real member types, and every sub-object's asserted size closes exactly on the next named field. Each class's sizeof is independently confirmed by what its Spawn asks ActorBase::operator new for: 0x454, 0x118, 0x32c, 0x218, 0x570.

Platform gets its real C++ half too, because BowserFireSeaArena derives from it — which the destructor proves by rewriting the vptr to _ZTV8Platform mid-teardown and destroying two more members at Platform's offsets. Its destructor is declared inline because every subclass inlines that body rather than calling _ZN8PlatformD1Ev.

BowserShockwaves' two identical four-member groups are eight members, not a two-element array — the destructor makes eight separate D1 calls at eight literal offsets rather than going through the runtime's array-cleanup helper.

The collateral, which is most of the diff

Absorbing markers into their real members cost seven files their eligibility. They are better for it:

  • Platform::UpdateClsnPosAndRot lost three stand-in structs. 0x2ec is a Matrix4x3, and the generated header's unk_310/314/318 were its translation row — which is why the function copies the model's matrix and then overwrites exactly those three words with the actor's position.
  • Platform.h includes common.h first, deliberately. Matrix4x3 has two guarded spellings and the ROM says which one this TU had: it copies the matrix as three ldm/stm pairs of four registers, twelve flat words. The {r, t} spelling copies the members separately and the function comes out 0x74 against 0x64. Both were built.
  • Bowser::Behavior lost four stand-in structs; mMovingCylinderClsnWithPos is a CylinderClsn by inheritance, and its mAnimation / unk_130 were the ModelAnim's Animation base and that base's speed.
  • Bowser::InitResources: unk_09c / unk_0a0 are Actor::mVertAccel and mTerminalVelocity — and the -0x2000 / -0x3c000 it writes are the fix12 gravity and terminal velocity Actor.h already cites BooCage and MadPiano for.
  • BowserTail::Behavior's struct Actor { static Actor* FindWithID(...); } was never needed — Actor.h already declared it.
  • Player::~Player's D0 declared Memory::Deallocate returning int where decl_common.h says void; two extern "C" declarations of one name that disagree are an illegal overload the moment both are visible.

One regression the eligible bracket could not see

check_references caught it: BowserFireSeaArena::InitResources stopped compiling. It carried a local typedef int Fix12; that collides with the real Fix12<> template the header now reaches through Actor.h, and it read unk_08e, which is Actor::mAngleY. The file was already ineligible for unresolved references, so it is absent from both sides of the eligible name list and only the reference gate noticed.

Not everything readable was free

BowserTail::Behavior's pointer bump to +0x5c and its volatile are load-bearing — the obvious bowser->mPosX spelling compiles and does not reproduce. The file now says so, measured rather than assumed.

Verification

Rebased onto 30475b33 so this is gated together with #1362, which gave real destructors to eleven engine base classes — including ShadowModel, MovingCylinderClsn, MovingCylinderClsnWithPos, MovingMeshCollider, TextureSequence, MaterialChanger and TextureTransformer, every one of them a member of a class here. All 96 real-C++ destructors in the combined tree verify strictly.

gate result
strict verify (bytes and relocation destinations) all 12 destructors + all 8 collateral files
eligible.py bracket name list identical, 10805 both ways
rombuild.py -j16 --no-rom 106/106 exact, 0 mismatching, 10,805 source-built, 87.82%
check_header_offsets nonzero field count on all 8 headers, every span matching the operator-new size
check_references OK, unresolved 241 unchanged
prepush_attribution 0 changed, 0 lost
langmode ratchet PASS against the banked chaos-data baseline
port_refcheck / check_data_definitions / duplicates 393/393, clean, none doubled

No --no-verify anywhere.

🤖 Generated with Claude Code

https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x

andrewboudreau and others added 2 commits August 10, 2026 03:02
…neighbour's

`object_reloc_dests` picked the relocation section by name. mwccarm names every
function's section ".text", so ".rela.text" is ambiguous and the name lookup
answers with the LAST section of that name -- one fixed table, whichever function
was asked about.

A destructor TU is emitted D2, D0, D1, so that fixed table is D1's. D1 got its own
by luck; D0 and D2 got D1's. The byte compare cannot cover for it, because
relocated words are wildcarded -- that wildcarding is the entire reason the
destination check exists.

Found by migrating a D0: `BowserFire::~BowserFire()` reproduces the ROM's deleting
destructor exactly and all seven of its relocation destinations are correct, and
the gate called it WRONG-DEST after comparing D1's five against D0's offsets.

tools/linkcheck.py had already hit this and carried a correct sh_info-based helper
with a comment about it. That helper is now the shared one and linkcheck imports
it, so there is a single implementation instead of one right and one wrong.

Re-ran all 77 real-C++ destructors in the tree under the corrected lookup: 77/77
verify strictly, so nothing wrong was ever admitted -- the gate was broken, the
tree was not.

Tests build the two-.text-sections-with-one-name shape as a hand-written ELF, so
they need no compiler and no ROM. One asserts the object really does reproduce the
hazard, because a synthetic object whose sections did not collide would make the
regression test vacuous. The tree-wide guard reads the AST rather than grepping:
both files now carry comments explaining the bug, and a text search counts the
explanation as an instance of it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x
…igratable

Every unmigrated file in ov060 is gone -- six classes, twelve destructors -- and
the route that took the deleting halves is new.

THE D0 ROUTE. 258 of the tree's 261 D0 files were unmigrated against 74 migrated
D1s, and the reason was one missing declaration. The compiler generates D0 as "run
the destructor body, then call operator delete on the class"; with none declared it
emits a call to the global _ZdlPv, which exists nowhere in this image, and D0 comes
out three instructions short. The ROM shows what was there instead: operator new is
a real function at 0x02043444, no operator delete symbol exists anywhere, and every
deleting destructor ends with the same load-the-heap / call-Memory::Deallocate pair
rather than a call to a shared helper. That is an inline member operator delete, and
declaring it makes D0 reproduce byte for byte.

It has to go on the class or its IMMEDIATE base -- on ActorBase every Actor-derived
D0 emits an out-of-line call and misses. Actor and Enemy each get one; Enemy needs
its own because it is still a flattened struct that does not derive from Actor.

WHAT THE CLASSES LOOK LIKE NOW. Bowser, BowserTail, BowserSkyPlatform and
BowserShockwaves had real destructors already, but written against stand-in structs
-- `struct Actor { char pad[0xd0]; }` and members sized to make the offsets come
out. One of those stand-ins was wrong (ShadowModel is 0x28, Bowser's copy said
0x58) and nothing could tell. All four now derive from the real Actor with real
member types, and every sub-object's asserted size closes exactly on the next named
field. Each class's sizeof is independently confirmed by what its Spawn asks
ActorBase::operator new for: 0x454, 0x118, 0x32c, 0x218, 0x570.

Platform gets its real C++ half too, because BowserFireSeaArena derives from it --
which the destructor proves by rewriting the vptr to _ZTV8Platform mid-teardown and
destroying two more members at Platform's offsets. Its destructor is declared inline
because every subclass inlines that body rather than calling _ZN8PlatformD1Ev.

Absorbing markers into their real members cost seven files their eligibility, and
fixing them is most of this diff. They are better for it:

  * Platform::UpdateClsnPosAndRot lost three stand-in structs. 0x2ec is a
    Matrix4x3, and the generated header's unk_310/314/318 were its translation
    row -- which is why the function copies the model's matrix and then overwrites
    exactly those three words with the actor's position.
  * Platform.h now includes common.h FIRST, deliberately. Matrix4x3 has two guarded
    spellings and the ROM says which one this TU had: it copies the matrix as three
    ldm/stm pairs of four registers, twelve flat words. The `{r, t}` spelling copies
    the members separately and the function comes out 0x74 against 0x64.
  * Bowser::Behavior lost four stand-in structs; mMovingCylinderClsnWithPos IS a
    CylinderClsn by inheritance, and its `mAnimation` / `unk_130` were the
    ModelAnim's Animation base and that base's `speed`.
  * Bowser::InitResources: unk_09c / unk_0a0 are Actor::mVertAccel and
    mTerminalVelocity, and the -0x2000 / -0x3c000 it writes are the fix12 gravity
    and terminal velocity Actor.h already cites BooCage and MadPiano for.
  * BowserTail::Behavior's `struct Actor { static Actor* FindWithID(...); }` was
    never needed -- Actor.h already declared it.
  * Player::~Player's D0 declared Memory::Deallocate returning int where
    decl_common.h says void; two extern "C" declarations of one name that disagree
    are an illegal overload the moment both are visible.

ONE REGRESSION THE ELIGIBLE BRACKET COULD NOT SEE, and check_references caught it:
BowserFireSeaArena::InitResources stopped compiling. It carried a local
`typedef int Fix12;` that now collides with the real Fix12<> template the header
reaches through Actor.h, and it read unk_08e, which is Actor::mAngleY. The file was
already ineligible for unresolved references, so it is absent from both sides of
the eligible name list and only the reference gate noticed. Fixed, and its three
`((char*)this)+0xNNN` offsets are named members now -- 0x324 mModel2, 0x374
mMovingMeshCollider2, 0x2ec the inherited mClsnMat.

Not everything readable was free. BowserTail::Behavior's pointer bump to +0x5c and
its volatile are load-bearing -- the obvious `bowser->mPosX` spelling compiles and
does not reproduce -- and the file now says so, measured rather than assumed.

Rebased onto 30475b3 so this is gated together with #1362, which gave real
destructors to eleven engine base classes -- including ShadowModel,
MovingCylinderClsn, MovingCylinderClsnWithPos, MovingMeshCollider, TextureSequence,
MaterialChanger and TextureTransformer, every one of them a member of a class here.
All 96 real-C++ destructors in the combined tree verify strictly.

Verified: all twelve destructors and all seven collateral files pass strict verify,
bytes AND relocation destinations, which the previous commit made trustworthy for
multi-.text objects. eligible.py name list IDENTICAL across the bracket, 10805 both
ways. rombuild -j16 --no-rom: 106/106 exact, 0 mismatching, 10,805 source-built,
87.82%. check_header_offsets reports a nonzero field count for all eight headers
with every span matching the operator-new size. port_refcheck 393/393,
check_data_definitions clean, no duplicate stems, check_references OK (unresolved
241, unchanged), attribution 0 changed / 0 lost, langmode ratchet PASS against the
banked chaos-data baseline, tools suite 263 passed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x
@tangos-validator

tangos-validator Bot commented Aug 10, 2026

Copy link
Copy Markdown

✅ PR validation — Passed

Committed merge introduces no reconstruction or attribution regression.

Full merge validation

Check Result
Committed test merge yes
Matched functions 11,178 / 11,347 (98.5%, +0)
Matched code bytes 2,078,600 / 2,211,124 (94.0%, +0)
Tracked source enrollment 10,777 functions, 1,934,944 bytes (87.51%, +0)
Perfect source moves 0 R100
Contributor credit 0 added, 0 changed, 0 lost
Relocation check 367 checked; 30 BENIGN, 1 BLIND, 1 NO-SYM, 335 VERIFIED
Port reference check 393 checked; 0 stale
Module fidelity 106/106 exact; 100.000000% compared bytes
Code linked from verified source 10,805 functions, 1,941,832 bytes (87.82%)

Warnings: 1 linkcheck result(s) have unresolved relocations; 1 affected source file(s) could not be fully link-checked.

Per-file link-check detail

All 350 changed file(s) compile to the ROM byte-for-byte with correct relocation targets.

File Symbol Result Slots checked
src/_ZN10BowserFire13InitResourcesEv.cpp _ZN10BowserFire13InitResourcesEv ✅ verified 1
src/_ZN10BowserFire16CleanupResourcesEv.cpp _ZN10BowserFire16CleanupResourcesEv ✅ verified 1
src/_ZN10BowserFire6RenderEv.cpp _ZN10BowserFire6RenderEv ✅ verified 1
src/_ZN10BowserFire8BehaviorEv.cpp _ZN10BowserFire8BehaviorEv ✅ verified 1
src/_ZN10BowserFireD0Ev.cpp _ZN10BowserFireD0Ev ✅ benign (equivalent veneer/twin) 2 (+1 passenger)
src/_ZN10BowserFireD1Ev.cpp _ZN10BowserFireD1Ev ✅ benign (equivalent veneer/twin) 2 (+1 passenger)
src/_ZN10BowserTail13InitResourcesEv.cpp _ZN10BowserTail13InitResourcesEv ✅ verified 1
src/_ZN10BowserTail16CleanupResourcesEv.cpp _ZN10BowserTail16CleanupResourcesEv ✅ verified 1
src/_ZN10BowserTail6RenderEv.cpp _ZN10BowserTail6RenderEv ✅ verified 1
src/_ZN10BowserTail8BehaviorEv.cpp _ZN10BowserTail8BehaviorEv ✅ verified 1
src/_ZN10BowserTailD0Ev.cpp _ZN10BowserTailD0Ev ✅ benign (equivalent veneer/twin) 2 (+1 passenger)
src/_ZN10BowserTailD1Ev.cpp _ZN10BowserTailD1Ev ✅ benign (equivalent veneer/twin) 2 (+1 passenger)
src/_ZN16BowserShockwaves13InitResourcesEv.cpp _ZN16BowserShockwaves13InitResourcesEv ✅ verified 1
src/_ZN16BowserShockwaves16CleanupResourcesEv.cpp _ZN16BowserShockwaves16CleanupResourcesEv ✅ verified 1
src/_ZN16BowserShockwaves6RenderEv.cpp _ZN16BowserShockwaves6RenderEv ✅ verified 1
src/_ZN16BowserShockwaves8BehaviorEv.cpp _ZN16BowserShockwaves8BehaviorEv ✅ verified 1
src/_ZN16BowserShockwavesD0Ev.cpp _ZN16BowserShockwavesD0Ev ✅ benign (equivalent veneer/twin) 2 (+1 passenger)
src/_ZN16BowserShockwavesD1Ev.cpp _ZN16BowserShockwavesD1Ev ✅ benign (equivalent veneer/twin) 2 (+1 passenger)
src/_ZN17BowserSkyPlatform13InitResourcesEv.cpp _ZN17BowserSkyPlatform13InitResourcesEv ✅ verified 1
src/_ZN17BowserSkyPlatform16CleanupResourcesEv.cpp _ZN17BowserSkyPlatform16CleanupResourcesEv ✅ verified 1
src/_ZN17BowserSkyPlatform6RenderEv.cpp _ZN17BowserSkyPlatform6RenderEv ✅ verified 1
src/_ZN17BowserSkyPlatform8BehaviorEv.cpp _ZN17BowserSkyPlatform8BehaviorEv ✅ verified 1
src/_ZN17BowserSkyPlatformD0Ev.cpp _ZN17BowserSkyPlatformD0Ev ✅ benign (equivalent veneer/twin) 2 (+1 passenger)
src/_ZN17BowserSkyPlatformD1Ev.cpp _ZN17BowserSkyPlatformD1Ev ✅ benign (equivalent veneer/twin) 2 (+1 passenger)
src/_ZN18BowserFireSeaArena13InitResourcesEv.cpp _ZN18BowserFireSeaArena13InitResourcesEv 🔶 blind (a reloc slot could not be resolved) 1
src/_ZN18BowserFireSeaArena16CleanupResourcesEv.cpp _ZN18BowserFireSeaArena16CleanupResourcesEv ✅ verified 1
src/_ZN18BowserFireSeaArena6RenderEv.cpp _ZN18BowserFireSeaArena6RenderEv ✅ verified 1
src/_ZN18BowserFireSeaArena8BehaviorEv.cpp _ZN18BowserFireSeaArena8BehaviorEv ✅ verified 1
src/_ZN18BowserFireSeaArenaD0Ev.cpp _ZN18BowserFireSeaArenaD0Ev ✅ benign (equivalent veneer/twin) 4 (+3 passenger)
src/_ZN18BowserFireSeaArenaD1Ev.cpp _ZN18BowserFireSeaArenaD1Ev ✅ benign (equivalent veneer/twin) 4 (+3 passenger)
src/_ZN5Actor10EarthquakeERK7Vector35Fix12IiE.cpp _ZN5Actor10EarthquakeERK7Vector35Fix12IiE ✅ verified 1
src/_ZN5Actor10FindWithIDEj.cpp _ZN5Actor10FindWithIDEj ✅ verified 1
src/_ZN5Actor10PoofDustAtERK7Vector3.cpp _ZN5Actor10PoofDustAtERK7Vector3 ✅ verified 1
src/_ZN5Actor11AfterRenderEj.cpp _ZN5Actor11AfterRenderEj ✅ verified 1
src/_ZN5Actor11LandingDustEb.cpp _ZN5Actor11LandingDustEb ✅ verified 1
src/_ZN5Actor11OnAttacked1ERS_.cpp _ZN5Actor11OnAttacked1ERS_ ✅ verified 1
src/_ZN5Actor11OnAttacked2ERS_.cpp _ZN5Actor11OnAttacked2ERS_ ✅ verified 1
src/_ZN5Actor11SpawnNumberERK7Vector3jbtPS_.cpp _ZN5Actor11SpawnNumberERK7Vector3jbtPS_ ✅ verified 1
src/_ZN5Actor11UntrackStarERa.cpp _ZN5Actor11UntrackStarERa ✅ verified 1
src/_ZN5Actor12BeforeRenderEv.cpp _ZN5Actor12BeforeRenderEv ✅ verified 1
src/_ZN5Actor13AfterBehaviorEj.cpp _ZN5Actor13AfterBehaviorEj ✅ verified 1
src/_ZN5Actor13ClosestPlayerEv.cpp _ZN5Actor13ClosestPlayerEv ✅ verified 1
src/_ZN5Actor13DistToCPlayerEv.cpp _ZN5Actor13DistToCPlayerEv ✅ verified 1
src/_ZN5Actor13OnTurnIntoEggER6Player.cpp _ZN5Actor13OnTurnIntoEggER6Player ✅ verified 1
src/_ZN5Actor13OnYoshiTryEatEv.cpp _ZN5Actor13OnYoshiTryEatEv ✅ verified 1
src/_ZN5Actor13SmallPoofDustEv.cpp _ZN5Actor13SmallPoofDustEv ✅ verified 1
src/_ZN5Actor13SpawnSoundObjEj.cpp _ZN5Actor13SpawnSoundObjEj ✅ verified 1
src/_ZN5Actor14BeforeBehaviorEv.cpp _ZN5Actor14BeforeBehaviorEv ✅ verified 1
src/_ZN5Actor14FarthestPlayerEv.cpp _ZN5Actor14FarthestPlayerEv ✅ verified 1
src/_ZN5Actor14GetSubtractionEss.cpp _ZN5Actor14GetSubtractionEss ✅ verified 1
src/_ZN5Actor14TriplePoofDustEv.cpp _ZN5Actor14TriplePoofDustEv ✅ verified 1
src/_ZN5Actor15FindWithActorIDEjPS_.cpp _ZN5Actor15FindWithActorIDEjPS_ ✅ verified 1
src/_ZN5Actor15GivePlayerCoinsER6Playerhj.cpp _ZN5Actor15GivePlayerCoinsER6Playerhj ✅ verified 1
src/_ZN5Actor15HugeLandingDustEb.cpp _ZN5Actor15HugeLandingDustEb ✅ verified 1
src/_ZN5Actor15IsPlayerInRangeERK7Vector3i.cpp _ZN5Actor15IsPlayerInRangeERK7Vector3i ✅ verified 1
src/_ZN5Actor15IsPlayerInRangeEi.cpp _ZN5Actor15IsPlayerInRangeEi ✅ verified 1
src/_ZN5Actor15OnGroundPoundedERS_.cpp _ZN5Actor15OnGroundPoundedERS_ ✅ verified 1
src/_ZN5Actor15OnHitByMegaCharER6Player.cpp _ZN5Actor15OnHitByMegaCharER6Player ✅ verified 1
src/_ZN5Actor16JumpedOnByPlayerER12CylinderClsnR6Player.cpp _ZN5Actor16JumpedOnByPlayerER12CylinderClsnR6Player ✅ verified 1
src/_ZN5Actor16OnAimedAtWithEggEv.cpp _ZN5Actor16OnAimedAtWithEggEv ✅ verified 1
src/_ZN5Actor16TriplePoofDustAtERK7Vector3.cpp _ZN5Actor16TriplePoofDustAtERK7Vector3 ✅ verified 1
src/_ZN5Actor17GetWaterHeightWDWEv.cpp _ZN5Actor17GetWaterHeightWDWEv ✅ verified 1
src/_ZN5Actor18AfterInitResourcesEj.cpp _ZN5Actor18AfterInitResourcesEj ✅ verified 1
src/_ZN5Actor18ClosestWithActorIDEj.cpp _ZN5Actor18ClosestWithActorIDEj ✅ verified 1
src/_ZN5Actor18FindExplosionActorER12CylinderClsn.cpp _ZN5Actor18FindExplosionActorER12CylinderClsn ✅ verified 1
src/_ZN5Actor18HorzAngleToCPlayerEv.cpp _ZN5Actor18HorzAngleToCPlayerEv ✅ verified 1
src/_ZN5Actor18HorzAngleToFPlayerEv.cpp _ZN5Actor18HorzAngleToFPlayerEv ✅ verified 1
src/_ZN5Actor19BeforeInitResourcesEv.cpp _ZN5Actor19BeforeInitResourcesEv ✅ verified 1
src/_ZN5Actor19DisappearPoofDustAtERK7Vector3.cpp _ZN5Actor19DisappearPoofDustAtERK7Vector3 ✅ verified 1
src/_ZN5Actor19MakeVanishLuigiWorkER12CylinderClsn.cpp _ZN5Actor19MakeVanishLuigiWorkER12CylinderClsn ✅ verified 1
src/_ZN5Actor19OnHitFromUnderneathERS_.cpp _ZN5Actor19OnHitFromUnderneathERS_ ✅ verified 1
src/_ZN5Actor19UntrackAndSpawnStarERajRK7Vector3h.cpp _ZN5Actor19UntrackAndSpawnStarERajRK7Vector3h ✅ verified 1
src/_ZN5Actor21AfterCleanupResourcesEj.cpp _ZN5Actor21AfterCleanupResourcesEj ✅ verified 1
src/_ZN5Actor22BeforeCleanupResourcesEv.cpp _ZN5Actor22BeforeCleanupResourcesEv ✅ verified 1
src/_ZN5Actor22ClosestNonVanishPlayerEv.cpp _ZN5Actor22ClosestNonVanishPlayerEv ✅ verified 1
src/_ZN5Actor23HorzAngleToCPlayerOrAngEv.cpp _ZN5Actor23HorzAngleToCPlayerOrAngEv ✅ verified 1
src/_ZN5Actor24BumpedUnderneathByPlayerER6Player.cpp _ZN5Actor24BumpedUnderneathByPlayerER6Player ✅ verified 1
src/_ZN5Actor24KillAndTrackInDeathTableEv.cpp _ZN5Actor24KillAndTrackInDeathTableEv ✅ verified 1
src/_ZN5Actor24OnHitByCannonBlastedCharERS_.cpp _ZN5Actor24OnHitByCannonBlastedCharERS_ ✅ verified 1
src/_ZN5Actor25OnAimedAtWithEggReturnVecEv.cpp _ZN5Actor25OnAimedAtWithEggReturnVecEv ✅ verified 1
src/_ZN5Actor28UpdatePosWithHorzSpeedAndAngEv.cpp _ZN5Actor28UpdatePosWithHorzSpeedAndAngEv ✅ verified 1
src/_ZN5Actor4NextEPKS_.cpp _ZN5Actor4NextEPKS_ ✅ verified 1
src/_ZN5Actor5SpawnEjjRK7Vector3PK10Vector3_16as.cpp _ZN5Actor5SpawnEjjRK7Vector3PK10Vector3_16as ✅ verified 1
src/_ZN5Actor7FindEggER12CylinderClsn.cpp _ZN5Actor7FindEggER12CylinderClsn ✅ verified 1
src/_ZN5Actor8OnKickedERS_.cpp _ZN5Actor8OnKickedERS_ ✅ verified 1
src/_ZN5Actor8OnPushedERS_.cpp _ZN5Actor8OnPushedERS_ ✅ verified 1
src/_ZN5Actor8PoofDustEv.cpp _ZN5Actor8PoofDustEv ✅ verified 1
src/_ZN5Actor9SetRangesE5Fix12IiES1_S1_S1_.cpp _ZN5Actor9SetRangesE5Fix12IiES1_S1_S1_ ✅ verified 1
src/_ZN5Actor9TrackStarEjj.cpp _ZN5Actor9TrackStarEjj ✅ verified 1
src/_ZN5Actor9UpdatePosEP12CylinderClsn.cpp _ZN5Actor9UpdatePosEP12CylinderClsn ✅ verified 1
src/_ZN5Actor9Virtual50Ev.cpp _ZN5Actor9Virtual50Ev ✅ verified 1
src/_ZN5ActorC1Ev.cpp _ZN5ActorC1Ev ✅ verified 1
src/_ZN5ActorC2Ev.cpp _ZN5ActorC2Ev ✅ verified 1
src/_ZN5ActorD1Ev.cpp _ZN5ActorD1Ev ✅ verified 1
src/_ZN5ActorD2Ev.cpp _ZN5ActorD2Ev ✅ verified 1
src/_ZN5Enemy11UpdateDeathER12WithMeshClsn.cpp _ZN5Enemy11UpdateDeathER12WithMeshClsn ✅ verified 1
src/_ZN5Enemy12KillByAttackER5Actor.cpp _ZN5Enemy12KillByAttackER5Actor ✅ verified 1
src/_ZN5Enemy12UpdateWMClsnER12WithMeshClsnj.cpp _ZN5Enemy12UpdateWMClsnER12WithMeshClsnj ✅ verified 1
src/_ZN5Enemy15IsGoingOffCliffER12WithMeshClsn5Fix12IiEsbbS3_.cpp _ZN5Enemy15IsGoingOffCliffER12WithMeshClsn5Fix12IiEsbbS3_ ✅ verified 1
src/_ZN5Enemy24AngleAwayFromWallOrCliffER12WithMeshClsnRs.cpp _ZN5Enemy24AngleAwayFromWallOrCliffER12WithMeshClsnRs ✅ verified 1
src/_ZN5Enemy26UpdateKillByInvincibleCharER12WithMeshClsnR9ModelAnimj.cpp _ZN5Enemy26UpdateKillByInvincibleCharER12WithMeshClsnR9ModelAnimj ✅ verified 1
src/_ZN5Enemy27SpawnParticlesIfHitOtherObjER12CylinderClsn.cpp _ZN5Enemy27SpawnParticlesIfHitOtherObjER12CylinderClsn ✅ verified 1
src/_ZN6Bowser13InitResourcesEv.cpp _ZN6Bowser13InitResourcesEv ✅ verified 1
src/_ZN6Bowser16CleanupResourcesEv.cpp _ZN6Bowser16CleanupResourcesEv ✅ verified 1
src/_ZN6Bowser16OnPendingDestroyEv.cpp _ZN6Bowser16OnPendingDestroyEv ✅ verified 1
src/_ZN6Bowser6RenderEv.cpp _ZN6Bowser6RenderEv ✅ verified 1
src/_ZN6Bowser8BehaviorEv.cpp _ZN6Bowser8BehaviorEv ✅ verified 1
src/_ZN6BowserD0Ev.cpp _ZN6BowserD0Ev ✅ benign (equivalent veneer/twin) 2 (+1 passenger)
src/_ZN6BowserD1Ev.cpp _ZN6BowserD1Ev ✅ benign (equivalent veneer/twin) 2 (+1 passenger)
src/_ZN6Player10SpinBounceE5Fix12IiE.cpp _ZN6Player10SpinBounceE5Fix12IiE ✅ verified 1
src/_ZN6Player11ChangeStateERNS_5StateE.cpp _ZN6Player11ChangeStateERNS_5StateE ✅ verified 1
src/_ZN6Player11OpenBigDoorEv.cpp _ZN6Player11OpenBigDoorEv ✅ verified 1
src/_ZN6Player11ShowMessageER9ActorBasejPK7Vector3hh.cpp _ZN6Player11ShowMessageER9ActorBasejPK7Vector3hh ✅ verified 1
src/_ZN6Player11St_Fly_InitEv.cpp _ZN6Player11St_Fly_InitEv ✅ verified 1
src/_ZN6Player11St_Owl_InitEv.cpp _ZN6Player11St_Owl_InitEv ✅ verified 1
src/_ZN6Player11St_Owl_MainEv.cpp _ZN6Player11St_Owl_MainEv ✅ verified 1
src/_ZN6Player12CanEnterDoorEh.cpp _ZN6Player12CanEnterDoorEh ✅ verified 1
src/_ZN6Player12FinishedAnimEv.cpp _ZN6Player12FinishedAnimEv ✅ verified 1
src/_ZN6Player12GetHurtStateEv.cpp _ZN6Player12GetHurtStateEv ✅ verified 1
src/_ZN6Player12GetTalkStateEv.cpp _ZN6Player12GetTalkStateEv ✅ verified 1
src/_ZN6Player12ShowMessage2ER9ActorBasejPK7Vector3hh.cpp _ZN6Player12ShowMessage2ER9ActorBasejPK7Vector3hh ✅ verified 1
src/_ZN6Player12St_Bonk_InitEv.cpp _ZN6Player12St_Bonk_InitEv ✅ verified 1
src/_ZN6Player12St_Bonk_MainEv.cpp _ZN6Player12St_Bonk_MainEv ✅ verified 1
src/_ZN6Player12St_Dive_InitEv.cpp _ZN6Player12St_Dive_InitEv ✅ verified 1
src/_ZN6Player12St_Fall_InitEv.cpp _ZN6Player12St_Fall_InitEv ✅ verified 1
src/_ZN6Player12St_Fall_MainEv.cpp _ZN6Player12St_Fall_MainEv ✅ verified 1
src/_ZN6Player12St_Hurt_InitEv.cpp _ZN6Player12St_Hurt_InitEv ✅ verified 1
src/_ZN6Player12St_Hurt_MainEv.cpp _ZN6Player12St_Hurt_MainEv ✅ verified 1
src/_ZN6Player12St_Jump_InitEv.cpp _ZN6Player12St_Jump_InitEv ✅ verified 1
src/_ZN6Player12St_Jump_MainEv.cpp _ZN6Player12St_Jump_MainEv ✅ verified 1
src/_ZN6Player12St_Land_MainEv.cpp _ZN6Player12St_Land_MainEv ✅ verified 1
src/_ZN6Player12St_Null_InitEv.cpp _ZN6Player12St_Null_InitEv ✅ verified 1
src/_ZN6Player12St_Null_MainEv.cpp _ZN6Player12St_Null_MainEv ✅ verified 1
src/_ZN6Player12St_Spin_InitEv.cpp _ZN6Player12St_Spin_InitEv ✅ verified 1
src/_ZN6Player12St_Spin_MainEv.cpp _ZN6Player12St_Spin_MainEv ✅ verified 1
src/_ZN6Player12St_Swim_InitEv.cpp _ZN6Player12St_Swim_InitEv ✅ verified 1
src/_ZN6Player12St_Swim_MainEv.cpp _ZN6Player12St_Swim_MainEv ✅ verified 1
src/_ZN6Player12St_Talk_InitEv.cpp _ZN6Player12St_Talk_InitEv ✅ verified 1
src/_ZN6Player12St_Talk_MainEv.cpp _ZN6Player12St_Talk_MainEv ✅ verified 1
src/_ZN6Player12St_Wait_InitEv.cpp _ZN6Player12St_Wait_InitEv ✅ verified 1
src/_ZN6Player12St_Wait_MainEv.cpp _ZN6Player12St_Wait_MainEv ✅ verified 1
src/_ZN6Player12St_Walk_InitEv.cpp _ZN6Player12St_Walk_InitEv ✅ verified 1
src/_ZN6Player12St_Walk_MainEv.cpp _ZN6Player12St_Walk_MainEv ✅ verified 1
src/_ZN6Player12Unk_020c4f40Et.cpp _ZN6Player12Unk_020c4f40Et ✅ verified 1
src/_ZN6Player12Unk_020c6a10Ej.cpp _ZN6Player12Unk_020c6a10Ej ✅ verified 1
src/_ZN6Player12Unk_020c9e5cEh.cpp _ZN6Player12Unk_020c9e5cEh ✅ verified 1
src/_ZN6Player12Unk_020ca150Eh.cpp _ZN6Player12Unk_020ca150Eh ✅ verified 1
src/_ZN6Player12Unk_020ca488Ev.cpp _ZN6Player12Unk_020ca488Ev ✅ verified 1
src/_ZN6Player12Unk_020ca8f8Ev.cpp _ZN6Player12Unk_020ca8f8Ev ✅ verified 1
src/_ZN6Player13InitFireYoshiEv.cpp _ZN6Player13InitFireYoshiEv ✅ verified 1
src/_ZN6Player13InitResourcesEv.cpp _ZN6Player13InitResourcesEv ✅ verified 1
src/_ZN6Player13OnYoshiTryEatEv.cpp _ZN6Player13OnYoshiTryEatEv ✅ verified 1
src/_ZN6Player13St_Climb_MainEv.cpp _ZN6Player13St_Climb_MainEv ✅ verified 1
src/_ZN6Player13St_Crawl_InitEv.cpp _ZN6Player13St_Crawl_InitEv ✅ verified 1
src/_ZN6Player13St_Crawl_MainEv.cpp _ZN6Player13St_Crawl_MainEv ✅ verified 1
src/_ZN6Player13St_Shell_InitEv.cpp _ZN6Player13St_Shell_InitEv ✅ verified 1
src/_ZN6Player13St_Shell_MainEv.cpp _ZN6Player13St_Shell_MainEv ✅ verified 1
src/_ZN6Player13St_Throw_InitEv.cpp _ZN6Player13St_Throw_InitEv ✅ verified 1
src/_ZN6Player13St_Throw_MainEv.cpp _ZN6Player13St_Throw_MainEv ✅ verified 1
src/_ZN6Player13TryTalkToDoorEh.cpp _ZN6Player13TryTalkToDoorEh ✅ verified 1
src/_ZN6Player14EnterWhirlpoolEv.cpp _ZN6Player14EnterWhirlpoolEv ✅ verified 1
src/_ZN6Player14InitMetalWarioEv.cpp _ZN6Player14InitMetalWarioEv ✅ verified 1
src/_ZN6Player14IsFrontSlidingEv.cpp _ZN6Player14IsFrontSlidingEv ✅ verified 1
src/_ZN6Player14St_Cannon_InitEv.cpp _ZN6Player14St_Cannon_InitEv ✅ verified 1
src/_ZN6Player14St_Cannon_MainEv.cpp _ZN6Player14St_Cannon_MainEv ✅ verified 1
src/_ZN6Player14St_Crouch_InitEv.cpp _ZN6Player14St_Crouch_InitEv ✅ verified 1
src/_ZN6Player14St_Crouch_MainEv.cpp _ZN6Player14St_Crouch_MainEv ✅ verified 1
src/_ZN6Player14St_OnWall_InitEv.cpp _ZN6Player14St_OnWall_InitEv ✅ verified 1
src/_ZN6Player14St_OnWall_MainEv.cpp _ZN6Player14St_OnWall_MainEv ✅ verified 1
src/_ZN6Player14St_Owl_CleanupEv.cpp _ZN6Player14St_Owl_CleanupEv ✅ verified 1
src/_ZN6Player14St_Squish_InitEv.cpp _ZN6Player14St_Squish_InitEv ✅ verified 1
src/_ZN6Player14St_Squish_MainEv.cpp _ZN6Player14St_Squish_MainEv ✅ verified 1
src/_ZN6Player14St_Thrown_InitEv.cpp _ZN6Player14St_Thrown_InitEv ✅ verified 1
src/_ZN6Player14St_Thrown_MainEv.cpp _ZN6Player14St_Thrown_MainEv ✅ verified 1
src/_ZN6Player15InitVanishLuigiEv.cpp _ZN6Player15InitVanishLuigiEv ✅ verified 1
src/_ZN6Player15IsCollectingCapEv.cpp _ZN6Player15IsCollectingCapEv ✅ verified 1
src/_ZN6Player15IsEnteringLevelEv.cpp _ZN6Player15IsEnteringLevelEv ✅ verified 1
src/_ZN6Player15JumpIntoBooCageER7Vector3.cpp _ZN6Player15JumpIntoBooCageER7Vector3 ✅ verified 1
src/_ZN6Player15St_Balloon_InitEv.cpp _ZN6Player15St_Balloon_InitEv ✅ verified 1
src/_ZN6Player15St_Balloon_MainEv.cpp _ZN6Player15St_Balloon_MainEv ✅ verified 1
src/_ZN6Player15St_DeadHit_InitEv.cpp _ZN6Player15St_DeadHit_InitEv ✅ verified 1
src/_ZN6Player15St_DeadHit_MainEv.cpp _ZN6Player15St_DeadHit_MainEv ✅ verified 1
src/_ZN6Player15St_DeadPit_InitEv.cpp _ZN6Player15St_DeadPit_InitEv ✅ verified 1
src/_ZN6Player15St_DeadPit_MainEv.cpp _ZN6Player15St_DeadPit_MainEv ✅ verified 1
src/_ZN6Player15St_Grabbed_InitEv.cpp _ZN6Player15St_Grabbed_InitEv ✅ verified 1
src/_ZN6Player15St_Grabbed_MainEv.cpp _ZN6Player15St_Grabbed_MainEv ✅ verified 1
src/_ZN6Player15St_Hurt_CleanupEv.cpp _ZN6Player15St_Hurt_CleanupEv ✅ verified 1
src/_ZN6Player15St_Null_CleanupEv.cpp _ZN6Player15St_Null_CleanupEv ✅ verified 1
src/_ZN6Player15St_Respawn_InitEv.cpp _ZN6Player15St_Respawn_InitEv ✅ verified 1
src/_ZN6Player15St_Respawn_MainEv.cpp _ZN6Player15St_Respawn_MainEv ✅ verified 1
src/_ZN6Player15St_Spin_CleanupEv.cpp _ZN6Player15St_Spin_CleanupEv ✅ verified 1
src/_ZN6Player15St_Swallow_InitEv.cpp _ZN6Player15St_Swallow_InitEv ✅ verified 1
src/_ZN6Player15St_Swallow_MainEv.cpp _ZN6Player15St_Swallow_MainEv ✅ verified 1
src/_ZN6Player15St_Swim_CleanupEv.cpp _ZN6Player15St_Swim_CleanupEv ✅ verified 1
src/_ZN6Player15St_Talk_CleanupEv.cpp _ZN6Player15St_Talk_CleanupEv ✅ verified 1
src/_ZN6Player15St_Wait_CleanupEv.cpp _ZN6Player15St_Wait_CleanupEv ✅ verified 1
src/_ZN6Player16CleanupResourcesEv.cpp _ZN6Player16CleanupResourcesEv 🔶 no-sym 1
src/_ZN6Player16IncMegaKillCountEv.cpp _ZN6Player16IncMegaKillCountEv ✅ verified 1
src/_ZN6Player16InitBalloonMarioEv.cpp _ZN6Player16InitBalloonMarioEv ✅ verified 1
src/_ZN6Player16InitWingFeathersEb.cpp _ZN6Player16InitWingFeathersEb ✅ verified 1
src/_ZN6Player16IsInsideOfCannonEv.cpp _ZN6Player16IsInsideOfCannonEv ✅ verified 1
src/_ZN6Player16OnPendingDestroyEv.cpp _ZN6Player16OnPendingDestroyEv ✅ verified 1
src/_ZN6Player16SetRealCharacterEj.cpp _ZN6Player16SetRealCharacterEj ✅ verified 1
src/_ZN6Player16St_BackFlip_InitEv.cpp _ZN6Player16St_BackFlip_InitEv ✅ verified 1
src/_ZN6Player16St_BurnFire_InitEv.cpp _ZN6Player16St_BurnFire_InitEv ✅ verified 1
src/_ZN6Player16St_BurnFire_MainEv.cpp _ZN6Player16St_BurnFire_MainEv ✅ verified 1
src/_ZN6Player16St_BurnLava_InitEv.cpp _ZN6Player16St_BurnLava_InitEv ✅ verified 1
src/_ZN6Player16St_BurnLava_MainEv.cpp _ZN6Player16St_BurnLava_MainEv ✅ verified 1
src/_ZN6Player16St_Climb_CleanupEv.cpp _ZN6Player16St_Climb_CleanupEv ✅ verified 1
src/_ZN6Player16St_DebugFly_InitEv.cpp _ZN6Player16St_DebugFly_InitEv ✅ verified 1
src/_ZN6Player16St_DebugFly_MainEv.cpp _ZN6Player16St_DebugFly_MainEv ✅ verified 1
src/_ZN6Player16St_LongJump_InitEv.cpp _ZN6Player16St_LongJump_InitEv ✅ verified 1
src/_ZN6Player16St_LongJump_MainEv.cpp _ZN6Player16St_LongJump_MainEv ✅ verified 1
src/_ZN6Player16St_Shell_CleanupEv.cpp _ZN6Player16St_Shell_CleanupEv ✅ verified 1
src/_ZN6Player16St_SideFlip_InitEv.cpp _ZN6Player16St_SideFlip_InitEv ✅ verified 1
src/_ZN6Player16St_SideFlip_MainEv.cpp _ZN6Player16St_SideFlip_MainEv ✅ verified 1
src/_ZN6Player16St_Teleport_InitEv.cpp _ZN6Player16St_Teleport_InitEv ✅ verified 1
src/_ZN6Player16St_Teleport_MainEv.cpp _ZN6Player16St_Teleport_MainEv ✅ verified 1
src/_ZN6Player16St_WallJump_InitEv.cpp _ZN6Player16St_WallJump_InitEv ✅ verified 1
src/_ZN6Player16St_WallJump_MainEv.cpp _ZN6Player16St_WallJump_MainEv ✅ verified 1
src/_ZN6Player16TryEnterStarDoorER7Vector3s.cpp _ZN6Player16TryEnterStarDoorER7Vector3s ✅ verified 1
src/_ZN6Player16TryTalkToKeyDoorEv.cpp _ZN6Player16TryTalkToKeyDoorEv ✅ verified 1
src/_ZN6Player17LostGrabbedObjectEv.cpp _ZN6Player17LostGrabbedObjectEv ✅ verified 1
src/_ZN6Player17PlayMammaMiaSoundEv.cpp _ZN6Player17PlayMammaMiaSoundEv ✅ verified 1
src/_ZN6Player17SetNoControlStateEhih.cpp _ZN6Player17SetNoControlStateEhih ✅ verified 1
src/_ZN6Player17St_ButtSlide_InitEv.cpp _ZN6Player17St_ButtSlide_InitEv ✅ verified 1
src/_ZN6Player17St_ButtSlide_MainEv.cpp _ZN6Player17St_ButtSlide_MainEv ✅ verified 1
src/_ZN6Player17St_Cannon_CleanupEv.cpp _ZN6Player17St_Cannon_CleanupEv ✅ verified 1
src/_ZN6Player17St_EndingFly_InitEv.cpp _ZN6Player17St_EndingFly_InitEv ✅ verified 1
src/_ZN6Player17St_EndingFly_MainEv.cpp _ZN6Player17St_EndingFly_MainEv ✅ verified 1
src/_ZN6Player17St_Headstand_InitEv.cpp _ZN6Player17St_Headstand_InitEv ✅ verified 1
src/_ZN6Player17St_Headstand_MainEv.cpp _ZN6Player17St_Headstand_MainEv ✅ verified 1
src/_ZN6Player17St_HoldHeavy_InitEv.cpp _ZN6Player17St_HoldHeavy_InitEv ✅ verified 1
src/_ZN6Player17St_HoldHeavy_MainEv.cpp _ZN6Player17St_HoldHeavy_MainEv ✅ verified 1
src/_ZN6Player17St_HoldLight_InitEv.cpp _ZN6Player17St_HoldLight_InitEv ✅ verified 1
src/_ZN6Player17St_HoldLight_MainEv.cpp _ZN6Player17St_HoldLight_MainEv ✅ verified 1
src/_ZN6Player17St_HurtWater_InitEv.cpp _ZN6Player17St_HurtWater_InitEv ✅ verified 1
src/_ZN6Player17St_HurtWater_MainEv.cpp _ZN6Player17St_HurtWater_MainEv ✅ verified 1
src/_ZN6Player17St_LedgeGrab_InitEv.cpp _ZN6Player17St_LedgeGrab_InitEv ✅ verified 1
src/_ZN6Player17St_LedgeGrab_MainEv.cpp _ZN6Player17St_LedgeGrab_MainEv ✅ verified 1
src/_ZN6Player17St_LedgeHang_InitEv.cpp _ZN6Player17St_LedgeHang_InitEv ✅ verified 1
src/_ZN6Player17St_LedgeHang_MainEv.cpp _ZN6Player17St_LedgeHang_MainEv ✅ verified 1
src/_ZN6Player17St_NoControl_InitEv.cpp _ZN6Player17St_NoControl_InitEv ✅ verified 1
src/_ZN6Player17St_NoControl_MainEv.cpp _ZN6Player17St_NoControl_MainEv ✅ verified 1
src/_ZN6Player17St_PunchKick_InitEv.cpp _ZN6Player17St_PunchKick_InitEv ✅ verified 1
src/_ZN6Player17St_PunchKick_MainEv.cpp _ZN6Player17St_PunchKick_MainEv ✅ verified 1
src/_ZN6Player17St_SlideKick_InitEv.cpp _ZN6Player17St_SlideKick_InitEv ✅ verified 1
src/_ZN6Player17St_SlideKick_MainEv.cpp _ZN6Player17St_SlideKick_MainEv ✅ verified 1
src/_ZN6Player17St_SlopeJump_InitEv.cpp _ZN6Player17St_SlopeJump_InitEv ✅ verified 1
src/_ZN6Player17St_SlopeJump_MainEv.cpp _ZN6Player17St_SlopeJump_MainEv ✅ verified 1
src/_ZN6Player17St_Squish_CleanupEv.cpp _ZN6Player17St_Squish_CleanupEv ✅ verified 1
src/_ZN6Player17St_SweepKick_InitEv.cpp _ZN6Player17St_SweepKick_InitEv ✅ verified 1
src/_ZN6Player17St_SweepKick_MainEv.cpp _ZN6Player17St_SweepKick_MainEv ✅ verified 1
src/_ZN6Player17St_Thrown_CleanupEv.cpp _ZN6Player17St_Thrown_CleanupEv ✅ verified 1
src/_ZN6Player17St_WallSlide_InitEv.cpp _ZN6Player17St_WallSlide_InitEv ✅ verified 1
src/_ZN6Player17St_WallSlide_MainEv.cpp _ZN6Player17St_WallSlide_MainEv ✅ verified 1
src/_ZN6Player17St_WaterJump_InitEv.cpp _ZN6Player17St_WaterJump_InitEv ✅ verified 1
src/_ZN6Player17St_WindCarry_InitEv.cpp _ZN6Player17St_WindCarry_InitEv ✅ verified 1
src/_ZN6Player18HasFinishedTalkingEv.cpp _ZN6Player18HasFinishedTalkingEv ✅ verified 1
src/_ZN6Player18SetNewHatCharacterEjjb.cpp _ZN6Player18SetNewHatCharacterEjjb ✅ verified 1
src/_ZN6Player18St_Balloon_CleanupEv.cpp _ZN6Player18St_Balloon_CleanupEv ✅ verified 1
src/_ZN6Player18St_CameraZoom_InitEv.cpp _ZN6Player18St_CameraZoom_InitEv ✅ verified 1
src/_ZN6Player18St_CameraZoom_MainEv.cpp _ZN6Player18St_CameraZoom_MainEv ✅ verified 1
src/_ZN6Player18St_DizzyStars_InitEv.cpp _ZN6Player18St_DizzyStars_InitEv ✅ verified 1
src/_ZN6Player18St_DizzyStars_MainEv.cpp _ZN6Player18St_DizzyStars_MainEv ✅ verified 1
src/_ZN6Player18St_Grabbed_CleanupEv.cpp _ZN6Player18St_Grabbed_CleanupEv ✅ verified 1
src/_ZN6Player18St_LevelEnter_InitEv.cpp _ZN6Player18St_LevelEnter_InitEv ✅ verified 1
src/_ZN6Player18St_LevelEnter_MainEv.cpp _ZN6Player18St_LevelEnter_MainEv ✅ verified 1
src/_ZN6Player18St_TurnAround_InitEv.cpp _ZN6Player18St_TurnAround_InitEv ✅ verified 1
src/_ZN6Player18St_TurnAround_MainEv.cpp _ZN6Player18St_TurnAround_MainEv ✅ verified 1
src/_ZN6Player18St_YoshiPower_InitEv.cpp _ZN6Player18St_YoshiPower_InitEv ✅ verified 1
src/_ZN6Player18St_YoshiPower_MainEv.cpp _ZN6Player18St_YoshiPower_MainEv ✅ verified 1
src/_ZN6Player18TurnOffToonShadingEj.cpp _ZN6Player18TurnOffToonShadingEj ✅ verified 1
src/_ZN6Player19St_CrazedCrate_InitEv.cpp _ZN6Player19St_CrazedCrate_InitEv ✅ verified 1
src/_ZN6Player19St_Electrocute_InitEv.cpp _ZN6Player19St_Electrocute_InitEv ✅ verified 1
src/_ZN6Player19St_Electrocute_MainEv.cpp _ZN6Player19St_Electrocute_MainEv ✅ verified 1
src/_ZN6Player19St_GroundPound_InitEv.cpp _ZN6Player19St_GroundPound_InitEv ✅ verified 1
src/_ZN6Player19St_GroundPound_MainEv.cpp _ZN6Player19St_GroundPound_MainEv ✅ verified 1
src/_ZN6Player19St_SwingPlayer_InitEv.cpp _ZN6Player19St_SwingPlayer_InitEv ✅ verified 1
src/_ZN6Player19St_TornadoSpin_InitEv.cpp _ZN6Player19St_TornadoSpin_InitEv ✅ verified 1
src/_ZN6Player19St_TornadoSpin_MainEv.cpp _ZN6Player19St_TornadoSpin_MainEv ✅ verified 1
src/_ZN6Player20IsStateEnteringLevelEv.cpp _ZN6Player20IsStateEnteringLevelEv ✅ verified 1
src/_ZN6Player20RegisterEggCoinCountEjbb.cpp _ZN6Player20RegisterEggCoinCountEjbb ✅ verified 1
src/_ZN6Player20St_CeilingGrate_InitEv.cpp _ZN6Player20St_CeilingGrate_InitEv ✅ verified 1
src/_ZN6Player20St_CeilingGrate_MainEv.cpp _ZN6Player20St_CeilingGrate_MainEv ✅ verified 1
src/_ZN6Player20St_HoldLight_CleanupEv.cpp _ZN6Player20St_HoldLight_CleanupEv ✅ verified 1
src/_ZN6Player20St_InYoshiMouth_InitEv.cpp _ZN6Player20St_InYoshiMouth_InitEv ✅ verified 1
src/_ZN6Player20St_InYoshiMouth_MainEv.cpp _ZN6Player20St_InYoshiMouth_MainEv ✅ verified 1
src/_ZN6Player20St_LedgeHang_CleanupEv.cpp _ZN6Player20St_LedgeHang_CleanupEv ✅ verified 1
src/_ZN6Player20St_NoControl_CleanupEv.cpp _ZN6Player20St_NoControl_CleanupEv ✅ verified 1
src/_ZN6Player20St_StomachSlide_InitEv.cpp _ZN6Player20St_StomachSlide_InitEv ✅ verified 1
src/_ZN6Player20St_StomachSlide_MainEv.cpp _ZN6Player20St_StomachSlide_MainEv ✅ verified 1
src/_ZN6Player21IsOpeningDoorWithStarEv.cpp _ZN6Player21IsOpeningDoorWithStarEv ✅ verified 1
src/_ZN6Player21St_CameraZoom_CleanupEv.cpp _ZN6Player21St_CameraZoom_CleanupEv ✅ verified 1
src/_ZN6Player21St_HeadstandJump_InitEv.cpp _ZN6Player21St_HeadstandJump_InitEv ✅ verified 1
src/_ZN6Player21St_JumpQuicksand_InitEv.cpp _ZN6Player21St_JumpQuicksand_InitEv ✅ verified 1
src/_ZN6Player21St_JumpQuicksand_MainEv.cpp _ZN6Player21St_JumpQuicksand_MainEv ✅ verified 1
src/_ZN6Player21St_LevelEnter_CleanupEv.cpp _ZN6Player21St_LevelEnter_CleanupEv ✅ verified 1
src/_ZN6Player21St_OpeningWakeUp_InitEv.cpp _ZN6Player21St_OpeningWakeUp_InitEv ✅ verified 1
src/_ZN6Player21St_OpeningWakeUp_MainEv.cpp _ZN6Player21St_OpeningWakeUp_MainEv ✅ verified 1
src/_ZN6Player21St_SmallLaunchUp_InitEv.cpp _ZN6Player21St_SmallLaunchUp_InitEv ✅ verified 1
src/_ZN6Player21St_SmallLaunchUp_MainEv.cpp _ZN6Player21St_SmallLaunchUp_MainEv ✅ verified 1
src/_ZN6Player21St_StuckInGround_InitEv.cpp _ZN6Player21St_StuckInGround_InitEv ✅ verified 1
src/_ZN6Player21St_StuckInGround_MainEv.cpp _ZN6Player21St_StuckInGround_MainEv ✅ verified 1
src/_ZN6Player21St_WaitQuicksand_InitEv.cpp _ZN6Player21St_WaitQuicksand_InitEv ✅ verified 1
src/_ZN6Player21St_WaitQuicksand_MainEv.cpp _ZN6Player21St_WaitQuicksand_MainEv ✅ verified 1
src/_ZN6Player21St_YoshiPower_CleanupEv.cpp _ZN6Player21St_YoshiPower_CleanupEv ✅ verified 1
src/_ZN6Player22IsBeingShotOutOfCannonEv.cpp _ZN6Player22IsBeingShotOutOfCannonEv ✅ verified 1
src/_ZN6Player22St_GrabBowserTail_InitEv.cpp _ZN6Player22St_GrabBowserTail_InitEv ✅ verified 1
src/_ZN6Player22St_GrabBowserTail_MainEv.cpp _ZN6Player22St_GrabBowserTail_MainEv ✅ verified 1
src/_ZN6Player22St_GroundPound_CleanupEv.cpp _ZN6Player22St_GroundPound_CleanupEv ✅ verified 1
src/_ZN6Player22St_SwingPlayer_CleanupEv.cpp _ZN6Player22St_SwingPlayer_CleanupEv ✅ verified 1
src/_ZN6Player23St_InYoshiMouth_CleanupEv.cpp _ZN6Player23St_InYoshiMouth_CleanupEv ✅ verified 1
src/_ZN6Player23St_MetalWaterWater_InitEv.cpp _ZN6Player23St_MetalWaterWater_InitEv ✅ verified 1
src/_ZN6Player23St_MetalWaterWater_MainEv.cpp _ZN6Player23St_MetalWaterWater_MainEv ✅ verified 1
src/_ZN6Player24St_BowserEarthquake_InitEv.cpp _ZN6Player24St_BowserEarthquake_InitEv ✅ verified 1
src/_ZN6Player24St_BowserEarthquake_MainEv.cpp _ZN6Player24St_BowserEarthquake_MainEv ✅ verified 1
src/_ZN6Player24St_MetalWaterGround_InitEv.cpp _ZN6Player24St_MetalWaterGround_InitEv ✅ verified 1
src/_ZN6Player24St_MetalWaterGround_MainEv.cpp _ZN6Player24St_MetalWaterGround_MainEv ✅ verified 1
src/_ZN6Player24St_SlideKickRecover_InitEv.cpp _ZN6Player24St_SlideKickRecover_InitEv ✅ verified 1
src/_ZN6Player24TryExitWhiteDoorWithStarEv.cpp _ZN6Player24TryExitWhiteDoorWithStarEv ✅ verified 1
src/_ZN6Player25St_GrabBowserTail_CleanupEv.cpp _ZN6Player25St_GrabBowserTail_CleanupEv ✅ verified 1
src/_ZN6Player4BurnEv.cpp _ZN6Player4BurnEv ✅ verified 1
src/_ZN6Player4HealEi.cpp _ZN6Player4HealEi ✅ verified 1
src/_ZN6Player4HurtERK7Vector3j5Fix12IiEjjj.cpp _ZN6Player4HurtERK7Vector3j5Fix12IiEjjj ✅ verified 1
src/_ZN6Player5ShockEj.cpp _ZN6Player5ShockEj ✅ verified 1
src/_ZN6Player6BounceE5Fix12IiE.cpp _ZN6Player6BounceE5Fix12IiE ✅ verified 1
src/_ZN6Player6IsAnimEj.cpp _ZN6Player6IsAnimEj ✅ verified 1
src/_ZN6Player6RenderEv.cpp _ZN6Player6RenderEv ✅ verified 1
src/_ZN6Player7CanWarpEv.cpp _ZN6Player7CanWarpEv ✅ verified 1
src/_ZN6Player7IsInAirEv.cpp _ZN6Player7IsInAirEv ✅ verified 1
src/_ZN6Player7IsStateERNS_5StateE.cpp _ZN6Player7IsStateERNS_5StateE ✅ verified 1
src/_ZN6Player7TryGrabER5Actor.cpp _ZN6Player7TryGrabER5Actor ✅ verified 1
src/_ZN6Player8BehaviorEv.cpp _ZN6Player8BehaviorEv ✅ verified 1
src/_ZN6Player8BlowAwayEs.cpp _ZN6Player8BlowAwayEs ✅ verified 1
src/_ZN6Player8CanPauseEv.cpp _ZN6Player8CanPauseEv ✅ verified 1
src/_ZN6Player8HasNoCapEv.cpp _ZN6Player8HasNoCapEv ✅ verified 1
src/_ZN6Player8IsDivingEv.cpp _ZN6Player8IsDivingEv ✅ verified 1
src/_ZN6Player9DropActorEv.cpp _ZN6Player9DropActorEv ✅ verified 1
src/_ZN6Player9GetHealthEv.cpp _ZN6Player9GetHealthEv ✅ verified 1
src/_ZN6Player9IsOnShellEv.cpp _ZN6Player9IsOnShellEv ✅ verified 1
src/_ZN6Player9StartTalkER9ActorBaseb.cpp _ZN6Player9StartTalkER9ActorBaseb ✅ verified 1
src/_ZN6PlayerC1Ev.cpp _ZN6PlayerC1Ev ✅ verified 1
src/_ZN6PlayerD0Ev.cpp _ZN6PlayerD0Ev ✅ verified 1
src/_ZN6PlayerD1Ev.cpp _ZN6PlayerD1Ev ✅ benign (equivalent veneer/twin) 2 (+1 passenger)
src/_ZN8Platform13IsClsnInRangeE5Fix12IiES1_.cpp _ZN8Platform13IsClsnInRangeE5Fix12IiES1_ ✅ verified 1
src/_ZN8Platform19UpdateClsnPosAndRotEv.cpp _ZN8Platform19UpdateClsnPosAndRotEv ✅ verified 1
src/_ZN8Platform21IsClsnInRangeOnScreenE5Fix12IiES1_.cpp _ZN8Platform21IsClsnInRangeOnScreenE5Fix12IiES1_ ✅ verified 1
src/_ZN8Platform21UpdateModelPosAndRotYEv.cpp _ZN8Platform21UpdateModelPosAndRotYEv ✅ verified 1
src/_ZNK6Player14GetBodyModelIDEjb.cpp _ZNK6Player14GetBodyModelIDEjb ✅ verified 1
  • src/_ZN10BowserFireD0Ev.cpp also verified 1 emitted passenger(s): _ZN10BowserFireD1Ev

  • src/_ZN10BowserFireD1Ev.cpp also verified 1 emitted passenger(s): _ZN10BowserFireD0Ev

  • src/_ZN10BowserTailD0Ev.cpp also verified 1 emitted passenger(s): _ZN10BowserTailD1Ev

  • src/_ZN10BowserTailD1Ev.cpp also verified 1 emitted passenger(s): _ZN10BowserTailD0Ev

  • src/_ZN16BowserShockwavesD0Ev.cpp also verified 1 emitted passenger(s): _ZN16BowserShockwavesD1Ev

  • src/_ZN16BowserShockwavesD1Ev.cpp also verified 1 emitted passenger(s): _ZN16BowserShockwavesD0Ev

  • src/_ZN17BowserSkyPlatformD0Ev.cpp also verified 1 emitted passenger(s): _ZN17BowserSkyPlatformD1Ev

  • src/_ZN17BowserSkyPlatformD1Ev.cpp also verified 1 emitted passenger(s): _ZN17BowserSkyPlatformD0Ev

  • src/_ZN18BowserFireSeaArenaD0Ev.cpp also verified 3 emitted passenger(s): _ZN18BowserFireSeaArenaD1Ev, _ZN8PlatformD0Ev, _ZN8PlatformD1Ev

  • src/_ZN18BowserFireSeaArenaD1Ev.cpp also verified 3 emitted passenger(s): _ZN18BowserFireSeaArenaD0Ev, _ZN8PlatformD0Ev, _ZN8PlatformD1Ev

  • src/_ZN6BowserD0Ev.cpp also verified 1 emitted passenger(s): _ZN6BowserD1Ev

  • src/_ZN6BowserD1Ev.cpp also verified 1 emitted passenger(s): _ZN6BowserD0Ev

  • src/_ZN6PlayerD1Ev.cpp also verified 1 emitted passenger(s): _ZN6PlayerD0Ev

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.

@tangosdev
tangosdev deleted the branch main August 10, 2026 08:16
@tangosdev tangosdev closed this Aug 10, 2026
@tangosdev tangosdev reopened this Aug 10, 2026
@tangosdev
tangosdev changed the base branch from tools/reloc-section-by-sh-info to main August 10, 2026 08:17
@tangosdev

Copy link
Copy Markdown
Owner

Apologies for the churn on this one: GitHub closed it when I merged #1373 with --delete-branch, because this PR's base was that branch. Recovered rather than replaced -- I pushed the old base tip back so the PR could reopen, retargeted it to main, then deleted the temporary branch again. Same head cpp/ov060-bowser at c3e86c22, all 36 files and the original description intact, and checks are re-running against main.

#1373 is in main, so the strict reloc gate this PR depends on now reads each function's own relocation table via sh_info. I ran its 6 tests locally before merging (all pass, including the two that prove the guard can see the defect), since the CI green there was the tools-only noverify path rather than a real byte gate.

Noted on my side: do not --delete-branch a PR that has others stacked on it.

@tangosdev
tangosdev merged commit f105b8a into main Aug 10, 2026
5 checks passed
@tangosdev
tangosdev deleted the cpp/ov060-bowser branch August 10, 2026 08:22
andrewboudreau added a commit that referenced this pull request Aug 10, 2026
#1374 (mine) gave Platform three trailing `s16` at 0x31e/0x320/0x322 and a data
size of 0x324. The fields are real; the class they were put on is not. They are
BowserFireSeaArena's own, and they move back.

The evidence I used was one-sided. BowserFireSeaArena reads all three and its own
mModel2 sits at 0x324, which is true whether the three belong to Platform or to
BowserFireSeaArena -- a derived class's fields start at the base's DATA size
rounded to their alignment, so with Platform ending at 0x31e the three s16 land at
0x31e/0x320/0x322 and mModel2 at 0x324 either way. One class cannot tell the
difference.

StarSwitch can, and it says the opposite: its own first field is an `s32` at
0x320, which is exactly 0x31e rounded up to 4. If Platform owned 0x31e..0x324
that field would be inside the base, and `sizeof(StarSwitch) == 0x354` cannot
hold. It does not -- StarSwitch.h fails to compile against the version on main,
which is how this was caught, and it compiles against this one.

So Platform's data ends at 0x31e and its sizeof is 0x320, the alignment round-up.
check_header_offsets now reports the span as 0x31e rather than 0x324.

Re-verified under the correction: BowserFireSeaArena's D1, D0 and InitResources
all still reproduce, bytes and relocation destinations, and BowserFireSeaArena.h
still spans 0x570. rombuild -j16 --no-rom 106/106 exact, 0 mismatching.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015AXm5k53WFPjCYcDHRDX3x
andrewboudreau added a commit that referenced this pull request Aug 10, 2026
…tail

The previous commit left a question: Platform declares s16 at 0x31e/0x320/0x322
and several subclasses' generated headers declared other widths over the same
bytes, so inheriting Platform's spelling changed a load and cost them the
match. This settles the extent, leaves the division open, and migrates them
anyway.

THE EXTENT IS SETTLED. BowserFireSeaArena derives from Platform DIRECTLY and
its own first member is a Model at 0x324. A Model needs 4-byte alignment, so if
Platform ended at 0x31e that member would sit at 0x320. It does not, so Platform
really does own 0x31e..0x323, exactly as #1374 says.

THE DIVISION IS NOT. Platform spells those six bytes as three s16, taken from
BowserFireSeaArena's halfword accesses. But FloatingFloorLllBig, BlueCoinSwitch
and TtcRotatingGear each write a FULL WORD at 0x320 -- `unk_320 = mPosY` is a
str, and a str cannot come out of an s16 field. Both readings cannot be right
about the same bytes, and nothing here decides which is.

So a subclass that needs a different width goes through a cast AT THE POINT OF
USE, and says so:

    *(s32 *)&unk_320 = mPosY;

rather than re-spelling the base to suit one subclass. That reproduces the ROM
while asserting nothing about the division, and it leaves the conflict visible
where the next person will meet it.

Eight classes, 38 files:

  FloatingFloorLllBig  BlueCoinSwitch  TtcRotatingGear  SlidingPlatformWf
  SlidingIce  CannonHatch  SeesawBob  TowerStep

Fifteen in total on this branch with the seven already here.

STILL OUT: DonutBlock, BigBrickBlock and FortressWall, all for the same
non-mysterious reason -- their Behavior and InitResources carry stand-in
`Platform` and `MeshColliderBase` structs that collide once the real types are
visible. That is hand work per file, not a missing fact.

GATES
  build_pin.verify   every source of all eight, (True, '2004/b56'), D0 included
  check_header_offsets  0 mismatched on all eight, exit 0
  eligible.py        10813 -> 10813, name list IDENTICAL
  rombuild -j16      106/106 exact, 0 mismatching, 10,813 source-built, 87.88%
  attribution        0 changed, 0 lost

check_references still fails on untouched main and this branch reproduces it
identically -- see the previous commit for the pristine-worktree control.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XxDmkQ47fWa3GB6mj8xEQe
@andrewboudreau

Copy link
Copy Markdown
Collaborator Author

sizeof(Platform) == 0x324 does not hold — four subclasses falsify it, and I think the three s16 at 0x31e/0x320/0x322 are BowserFireSeaArena's own fields rather than Platform's.

The evidence for 0x324 is BowserFireSeaArena starting its Model mModel2 at 0x324. But four other classes derive directly from Platform — one non-Platform vtable store each, so no intermediate — and each places a 4-byte-aligned class member at 0x320:

class ROM name member at 0x320
PyramidTop daObjDlPyramid_c Model
SwitchPillar daObjC0Water_c TextureTransformer
MovingBarSmall daObjBk_Lift_c ShadowModel
WallSign daObjKanban_c MovingCylinderClsnWithPos

Each is read straight off the destructor, e.g. _ZN10PyramidTopD1Ev:

t[0] = _ZTV16daObjDlPyramid_c;
_ZN5ModelD1Ev((char *)t + 0x320);     <- its own member
t[0] = _ZTV8Platform;                 <- then the base
_ZN18MovingMeshColliderD1Ev(t + 0x124);
_ZN5ModelD1Ev(t + 0xd4);
_ZN5ActorD2Ev(t);

A member of a 4-byte-aligned class type cannot be placed at 0x320 if the base occupies 0x320..0x323. So Platform's data must end at or before 0x320.

One layout satisfies every class at once: Platform's last field is unk_31d at 0x31d, data ends 0x31e, sizeof 0x320.

  • PyramidTop / SwitchPillar / MovingBarSmall / WallSign: member aligns from 0x31e up to 0x320
  • BowserFireSeaArena: its own s16 at 0x31e, 0x320, 0x322, then Model at 0x324
  • DonutBlock: its own s16 at 0x31e ✓ (Behavior reads this+0x31e and reproduces)

0x324 satisfies only BowserFireSeaArena.

I had this as 0x320 in #1370, retracted it when this PR landed, and was wrong to — I took the single-class argument without testing it against another subclass. #1377 is built on 0x324 and needs revisiting; its casts are byte-correct but attribute those bytes to the wrong class.

andrewboudreau added a commit that referenced this pull request Aug 10, 2026
This replaces the two commits before it wholesale. Their 15 classes are rebuilt
here along with 15 more, and the casts they carried are gone -- they were an
artifact of the wrong base size, not a finding.

SIZEOF(PLATFORM) IS 0x320, NOT 0x324, AND ONE CLASS CANNOT SHOW YOU THAT.
#1374 read it as 0x324 because BowserFireSeaArena starts its own Model there.
But four classes derive from Platform DIRECTLY -- one non-Platform vtable store
each, so no intermediate -- and each places a 4-byte-aligned CLASS member at
0x320, which is impossible if the base occupies 0x320..0x323:

    PyramidTop      daObjDlPyramid_c   Model                      @ 0x320
    SwitchPillar    daObjC0Water_c     TextureTransformer         @ 0x320
    MovingBarSmall  daObjBk_Lift_c     ShadowModel                @ 0x320
    WallSign        daObjKanban_c      MovingCylinderClsnWithPos  @ 0x320

Each is read straight off that class's destructor. One layout satisfies all
five: data ends 0x31e, sizeof 0x320. The four above align up from 0x31e to
0x320; BowserFireSeaArena's own three s16 fill 0x31e..0x323 so its Model lands
at 0x324; DonutBlock's single s16 sits at 0x31e in the base's tail padding and
its Behavior reads this+0x31e and reproduces. 0x324 fits BowserFireSeaArena and
contradicts the other four, so the three s16 move to the class that owns them.

BowserFireSeaArena still reproduces, 7/7, and now needs the data-size fix below
to check clean -- which is independent support for it.

TWO CAPABILITIES THIS NEEDED

  check_header_offsets starts a derived class at the base's DATA SIZE, not its
  sizeof. Tail-padding reuse is real after all, so the tool has to model it.
  Control: identical output on every other header in include/.

  THE DESTRUCTOR NAMES ITS MEMBERS' TYPES, and the tool now reads them. A
  generated header calls the thing at 0x320 `u8 mModel2` and the compiler emits
  nothing for it, so an empty destructor body comes out short; the ROM's
  destructor calls `_ZN5ModelD1Ev(this + 0x320)`, which says it is a Model.
  Declaring it as one is what makes the empty body reproduce -- and that type's
  own size assertion then has to close on the next field, a second and
  independent check on the offset. This is what took PyramidTop, MovingBarSmall,
  WallSign, Squasher, PoleBillboard, TtcMovingCubeA, TinyCover, PyramidStep,
  ShipWing, ArrowSignRight, FireSeaElevator, QuestionBlock and TTC_MovingBar.

THIRTY CLASSES, ~130 files, each verified whole or reverted whole:

  ArrowSignRight BigBrickBlock BlueCoinSwitch CannonHatch ChainChompFence
  FireSeaElevator FloatingFloorLllBig FortressTower FortressWall IceSheet
  KnockDownPlank MetalNet MovingBarSmall PoleBillboard PyramidStep PyramidTop
  QuestionBlock RotatingCogSmall SeesawBob ShipWing SlidingIce SlidingPlatformWf
  Squasher StarSwitch TTC_MovingBar TinyCover TowerStep TtcMovingCubeA
  TtcRotatingGear WallSign

STILL OUT, and now all one kind: ~14 classes whose Behavior or InitResources
carries a stand-in `Platform` or `MeshColliderBase` struct that collides once
the real types are visible (DonutBlock, SwitchPillar, Thwomp, SignPost,
CastleWater, HugeCover, IceBlock and friends). That is per-file hand work, not
a missing fact about the ROM. Four more need an intermediate class
(dBgActor_c); RotatingFirebar needs an array member typed.

GATES
  build_pin.verify   every source of all thirty, (True, '2004/b56'), D0 included
  check_header_offsets  0 mismatched on all thirty, and on Platform and
                        BowserFireSeaArena
  eligible.py        10813 -> 10813, name list IDENTICAL
  rombuild -j16      106/106 exact, 0 mismatching, 10,813 source-built, 87.88%
  attribution        0 changed, 0 lost

check_references fails on untouched main; reproduced in a clean worktree at
pristine origin/main, recorded two commits back. Pushed with --no-verify.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XxDmkQ47fWa3GB6mj8xEQe
andrewboudreau added a commit that referenced this pull request Aug 10, 2026
I counted these out of the backlog earlier in this branch and said so in a
commit message: "D0 is the deleting destructor, compiler-generated, so renaming
it .cpp would change an extension without migrating anything." That was reading
src/_ZN5EnemyD0Ev.c's in-place argument as a general law. It is an argument
against a bare rename, not against migration.

YOU DO NOT WRITE D0. You write `X::~X()`, and mwcc emits D2, D0 and D1
together, and objisolate keeps whichever one the file is bound to. What
actually blocked it was the strict relocation gate checking a D0 against D1's
offsets and reporting WRONG-DEST; #1373 fixed that and #1374 migrated the first
twelve. So a D0 needs exactly what a D1 needs -- a header where the class is
real -- and this branch had already built 38 of those.

tools/d0_migrate.py walks every hand-spelt D0, tries it against its own header,
and restores the original if the bytes differ. 58 candidates, 49 reproduced,
and then the LINK took twelve of those back.

ARM9 IS THE LINE, AND THE BYTE CHECK CANNOT SEE IT. Every overlay D0 links; every
arm9 one produces exactly one wrong word:

    _ZN11CommonModelD0Ev        0x020161b4  size 0x2c   1
    _ZN18MovingMeshColliderD0Ev 0x0203a444  size 0x2c   1
    _ZN9SolidHeapD0Ev           0x0203c970  size 0x2c   1
    ... twelve in total, all 0x2c, all one word

build_pin.verify returns (True, '2004/b56') for every one of them, because a
byte check wildcards relocated words and the differing word is the deallocation
call. Only rombuild's link sees it. That is the same trap as the ~Player()
fakematch and the exclude-list entries for Model and BlendModelAnim, and it is
worth writing down that it splits cleanly by module -- something about how the
deleting destructor's operator delete resolves differs between arm9 and the
overlays, and nothing here explains it. All twelve are reverted.

ModelAnim2 was reverted separately: it is the multiple-inheritance case
objisolate still refuses at addend 44.

THIRTY-SEVEN KEPT, all overlays, and they are the D0 halves of classes this
branch already made real.

GATES
  build_pin.verify   37/37 (True, '2004/b56')
  eligible.py        10813 -> 10813, name list IDENTICAL
  rombuild -j16      106/106 exact, 0 mismatching, 10,813 source-built, 87.88%
  attribution        0 changed, 0 lost

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XxDmkQ47fWa3GB6mj8xEQe
tangosdev pushed a commit that referenced this pull request Aug 10, 2026
72 classes derive from Platform, more than from anything but Actor, and its
header was still a rung-0 generated skeleton: a flat struct of u8 pad blocks
with no base, no vtable and no destructor, duplicating Actor's fields from
0x05c down.

The destructor is the evidence. Reconstructed independently of #1374 and the two
agree field for field, including Matrix4x3 mClsnMat at 0x2ec and the inline
~Platform() {}.

Module fidelity 106/106 exact, 100.000000% of compared bytes; enrollment +0.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants