Skip to content

Inline base destructors: the shape the ROM's own sources had - #1369

Closed
andrewboudreau wants to merge 1 commit into
mainfrom
cpp/inline-base-dtors
Closed

Inline base destructors: the shape the ROM's own sources had#1369
andrewboudreau wants to merge 1 commit into
mainfrom
cpp/inline-base-dtors

Conversation

@andrewboudreau

Copy link
Copy Markdown
Collaborator

Inline base destructors: the shape the ROM's own sources had

Scene::~Scene stores TWO vptrs and then calls ActorBase's destructor:

str r2, [r4]        ; _ZTV5Scene
str r1, [r4]        ; _ZTV12ActorDerived   <- ActorDerived's D2, INLINED
bl  ActorBase::~ActorBase

A merely declared virtual ~ActorDerived(); cannot produce that. The compiler
has no body to inline and emits bl _ZN12ActorDerivedD2Ev -- one store where
the ROM has two. Define it in the class body and Scene::~Scene() {} reproduces
0x0202e140 exactly. So the original sources defined these destructors inline,
and every derived destructor inlined them. That is worth knowing because
roughly 60 unmigrated D1 files have this two-vtable-store shape.

Making it true cost three changes, and each one was forced by the next gate
rather than chosen up front.

  1. objisolate: CORRECT AN UNDEF VTABLE REFERENCE, NOT JUST AN EXTERNALISED ONE

    An inlined base destructor stores a vptr for a class this object never
    defines, so _ZTV12ActorDerived is UNDEF from the start with addend 8 --
    never a candidate for externalisation, so the existing correction never
    looked at it, and the guard refused the file.

    objisolate PREDICTED THIS. The comment above the UNDEF branch names both the
    constructor-only TU and "a derived destructor over an inline base
    destructor", says both were reproduced under 2004/b56, and says they "arrive
    the moment a real-C++ constructor is enrolled, which is the direction this
    tree is moving". It refused because there was no enrolled instance to verify
    a correction against. Scene is that instance.

    The correction is the same arithmetic the externalise path already uses --
    the ROM's _ZTV symbol IS the slot array, so addend 8 becomes 0 -- and it is
    checked the same way, by rombuild byte-comparing the linked module. That is
    the only thing that caught the original 8-high vptr bug across 34 modules.
    ANY OTHER ADDEND IS STILL REFUSED, with a new test pinning that: multiple
    inheritance produces addend 44 and there is still no instance for it.

    The two tests asserting the old refusal now assert the correction, and a
    third asserts the refusal that remains.

  2. eligible.py: STB_LOPROC IS A DEFINITION

    An inline function's out-of-line copy is emitted under mwcc's COMDAT
    binding, STB_LOPROC. The symbol scan accepted STB_GLOBAL and STB_WEAK only,
    so ActorDerived's own D1 -- defined, right size, in the kept section --
    reported "0 defined global functions".

    It is deduplication metadata, not a weaker definition, and exactly one
    object in this build defines any given address. Accepting it also recovered
    SIX functions that were invisible for the same reason and had nothing to do
    with this slice: the ZThn80 virtual thunks of ModelAnim, ModelAnim2 and
    BlendModelAnim, whose multiple inheritance makes them inline copies too.

  3. ActorDerived's D1 file carries a FORCING TU

    With the definition in the header that file cannot define it again, and a TU
    that merely includes the header emits nothing. An explicit destructor call
    in an uncalled function forces the out-of-line copy; objisolate drops it.

RESULT
eligible.py 10805 -> 10811, nothing lost (+6, all ZThn80 thunks)
rombuild -j16 106/106 exact, 0 mismatching
source-built 10,805 -> 10,811, 87.82% -> 87.83%
test_objisolate 6 passed
port_refcheck 393 references, 0 stale
langmode ratchet PASS
no --no-verify

NOT DONE HERE. Stage is the next one in this chain and needs its three members
typed first -- Particle::SysTracker at 0x50, Model at 0x86c, MeshCollider at
0x91c are still u8 markers. And ModelAnim's family still cannot be isolated:
that is the addend-44 refusal above, deliberately left standing.

Independent of #1368, which measured this route and left it for its own PR.


🤖 Generated with Claude Code

@tangos-validator

tangos-validator Bot commented Aug 10, 2026

Copy link
Copy Markdown

❌ PR validation — Failed

Validation failed: full-ROM result regressed from the base commit; full-ROM validation failed

Full merge validation

Check Result
Committed test merge yes
Matched functions 11,178 / 11,347 (98.5%, +0)
Matched code bytes 2,078,800 / 2,211,124 (94.0%, +0)
Tracked source enrollment 10,784 functions, 1,935,864 bytes (87.55%, +96)
Perfect source moves 0 R100
Contributor credit 0 added, 0 changed, 0 lost
Relocation check 408 checked; 29 BENIGN, 2 BLIND, 3 NO-SYM, 374 VERIFIED
Port reference check 393 checked; 0 stale
Full ROM build mwccarm failed

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

Per-file link-check detail

3 of 390 changed file(s) do not match the ROM (NO-SYM).

File Symbol Result Slots checked
src/_ZN10BowserFire13InitResourcesEv.cpp _ZN10BowserFire13InitResourcesEv ✅ verified 1
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/_ZN12ActorDerived18AfterInitResourcesEj.cpp _ZN12ActorDerived18AfterInitResourcesEj 🔶 no-sym 3 (+2 passenger)
src/_ZN12ActorDerivedD1Ev.cpp _ZN12ActorDerivedD1Ev ✅ benign (equivalent veneer/twin) 1
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/_ZN5Scene11AfterRenderEj.cpp _ZN5Scene11AfterRenderEj ✅ verified 1
src/_ZN5Scene12BeforeRenderEv.cpp _ZN5Scene12BeforeRenderEv ✅ verified 1
src/_ZN5Scene13AfterBehaviorEj.cpp _ZN5Scene13AfterBehaviorEj ✅ verified 1
src/_ZN5Scene14BeforeBehaviorEv.cpp _ZN5Scene14BeforeBehaviorEv ✅ verified 1
src/_ZN5Scene14GraphCallback0Ev.cpp _ZN5Scene14GraphCallback0Ev ✅ verified 1
src/_ZN5Scene14GraphCallback1Ev.cpp _ZN5Scene14GraphCallback1Ev ✅ verified 1
src/_ZN5Scene14GraphCallback2Ev.cpp _ZN5Scene14GraphCallback2Ev ✅ verified 1
src/_ZN5Scene14GraphCallback3Ev.cpp _ZN5Scene14GraphCallback3Ev ✅ verified 1
src/_ZN5Scene14StartSceneFadeEjjt.cpp _ZN5Scene14StartSceneFadeEjjt ✅ verified 1
src/_ZN5Scene15SetSceneToSpawnEjj.cpp _ZN5Scene15SetSceneToSpawnEjj ✅ verified 1
src/_ZN5Scene16SpawnIfNecessaryEv.cpp _ZN5Scene16SpawnIfNecessaryEv ✅ verified 1
src/_ZN5Scene18AfterInitResourcesEj.cpp _ZN5Scene18AfterInitResourcesEj ✅ verified 1
src/_ZN5Scene18PrepareToSpawnBootEv.cpp _ZN5Scene18PrepareToSpawnBootEv ✅ verified 1
src/_ZN5Scene19BeforeInitResourcesEv.cpp _ZN5Scene19BeforeInitResourcesEv ✅ verified 1
src/_ZN5Scene19ResetFadersAndSoundEv.cpp _ZN5Scene19ResetFadersAndSoundEv ✅ verified 1
src/_ZN5Scene20Initialise3dGraphicsEv.cpp _ZN5Scene20Initialise3dGraphicsEv ✅ verified 1
src/_ZN5Scene20SetAndStopColorFaderEv.cpp _ZN5Scene20SetAndStopColorFaderEv ✅ verified 1
src/_ZN5Scene21AfterCleanupResourcesEj.cpp _ZN5Scene21AfterCleanupResourcesEj ✅ verified 1
src/_ZN5Scene22BeforeCleanupResourcesEv.cpp _ZN5Scene22BeforeCleanupResourcesEv ✅ verified 1
src/_ZN5Scene22ResetHardwareRegistersEv.cpp _ZN5Scene22ResetHardwareRegistersEv ✅ verified 1
src/_ZN5Scene9SetFadersEP15FaderBrightness.cpp _ZN5Scene9SetFadersEP15FaderBrightness ✅ verified 1
src/_ZN5SceneD1Ev.cpp _ZN5SceneD1Ev 🔶 no-sym 2 (+1 passenger)
src/_ZN5Stage10CheckInputEv.cpp _ZN5Stage10CheckInputEv ✅ verified 1
src/_ZN5Stage10LoadSkyboxEv.cpp _ZN5Stage10LoadSkyboxEv ✅ verified 1
src/_ZN5Stage10PS_CleanupEv.cpp _ZN5Stage10PS_CleanupEv ✅ verified 1
src/_ZN5Stage11GetSkyboxIDEv.cpp _ZN5Stage11GetSkyboxIDEv ✅ verified 1
src/_ZN5Stage11RenderModelEv.cpp _ZN5Stage11RenderModelEv ✅ verified 1
src/_ZN5Stage12SetVramBanksEv.cpp _ZN5Stage12SetVramBanksEv ✅ verified 1
src/_ZN5Stage14GraphCallback1Ev.cpp _ZN5Stage14GraphCallback1Ev ✅ verified 1
src/_ZN5Stage14GraphCallback2EP12SceneRelated.cpp _ZN5Stage14GraphCallback2EP12SceneRelated 🔶 blind (a reloc slot could not be resolved) 1
src/_ZN5Stage15IsPauseDisabledEv.cpp _ZN5Stage15IsPauseDisabledEv ✅ verified 1
src/_ZN5Stage16CleanupResourcesEv.cpp _ZN5Stage16CleanupResourcesEv ✅ verified 1
src/_ZN5Stage16OnPendingDestroyEv.cpp _ZN5Stage16OnPendingDestroyEv ✅ verified 1
src/_ZN5Stage17PS_UpdateSaveMenuEb.cpp _ZN5Stage17PS_UpdateSaveMenuEb ✅ verified 1
src/_ZN5Stage17UpdateMenuButtonsEb.cpp _ZN5Stage17UpdateMenuButtonsEb ✅ verified 1
src/_ZN5Stage18LoadClsnAndObjectsER11LVL_OverlayjR12MeshCollider.cpp _ZN5Stage18LoadClsnAndObjectsER11LVL_OverlayjR12MeshCollider ✅ verified 1
src/_ZN5Stage18ResetMeshCollidersEv.cpp _ZN5Stage18ResetMeshCollidersEv ✅ verified 1
src/_ZN5Stage19BeforeInitResourcesEv.cpp _ZN5Stage19BeforeInitResourcesEv ✅ verified 1
src/_ZN5Stage19RenderVsModeNewStarEv.cpp _ZN5Stage19RenderVsModeNewStarEv ✅ verified 1
src/_ZN5Stage20RenderBouncingArrowsEv.cpp _ZN5Stage20RenderBouncingArrowsEv ✅ verified 1
src/_ZN5Stage21RenderVsModeCountdownEv.cpp _ZN5Stage21RenderVsModeCountdownEv ✅ verified 1
src/_ZN5Stage22RenderModelTransparentEv.cpp _ZN5Stage22RenderModelTransparentEv ✅ verified 1
src/_ZN5Stage23LoadTextureTransformersEv.cpp _ZN5Stage23LoadTextureTransformersEv ✅ verified 1
src/_ZN5Stage7LoadFogEv.cpp _ZN5Stage7LoadFogEv ✅ verified 1
src/_ZN5Stage7VE_InitEv.cpp _ZN5Stage7VE_InitEv ✅ verified 1
src/_ZN5Stage8CanPauseEv.cpp _ZN5Stage8CanPauseEv ✅ verified 1
src/_ZN5Stage9LC_RenderEv.cpp _ZN5Stage9LC_RenderEv ✅ verified 1
src/_ZN5Stage9LoadModelEv.cpp _ZN5Stage9LoadModelEv ✅ verified 1
src/_ZN5Stage9RenderFogEv.cpp _ZN5Stage9RenderFogEv ✅ verified 1
src/_ZN5Stage9VE_UpdateEv.cpp _ZN5Stage9VE_UpdateEv ✅ 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/_ZN10BowserTailD0Ev.cpp also verified 1 emitted passenger(s): _ZN10BowserTailD1Ev

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

  • src/_ZN12ActorDerived18AfterInitResourcesEj.cpp also verified 2 emitted passenger(s): _ZN12ActorDerivedD0Ev, _ZN12ActorDerivedD1Ev

  • 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/_ZN5SceneD1Ev.cpp also verified 1 emitted passenger(s): _ZN5SceneD0Ev

  • 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

Copy link
Copy Markdown
Owner

Not merging this one: the byte gate is red on the full-ROM leg (full-ROM result regressed from the base commit, Full ROM build: mwccarm failed) even though all 355 changed files verify byte-for-byte individually. Your body reports rombuild -j16 106/106 exact, 0 mismatching locally, so the interesting part is the difference between the two runs. Three things I checked so you do not have to.

It is not a stale-branch collision. Since this branch's merge base, main changed exactly one line of config/arm9/delinks.txt and nothing at all in tools/eligible.py, tools/objisolate.py, tools/test_objisolate.py, include/ActorDerived.h or src/_ZN12ActorDerivedD1Ev.cpp. The test merge is textually clean and semantically almost disjoint from today's destructor merges (#1362, #1368).

Two enrolled TUs now define _ZN12ActorDerivedD1Ev, and this is true on your branch alone, not just after merge. Compiling each under its pin at 2004/b56 and reading the symtab:

src/_ZN12ActorDerivedD1Ev.cpp                    DEFINES it (STT_FUNC, size 36)
src/_ZN12ActorDerived18AfterInitResourcesEj.cpp  DEFINES it (STT_FUNC, size 36)

Both are enrolled, at delinks.txt:1752 and :1768. The validator itself notices the second one, listing _ZN12ActorDerivedD0Ev and _ZN12ActorDerivedD1Ev as emitted passengers of the AfterInitResources TU, which is exactly what you would expect once the destructor is defined in the class body. AfterInitResources.cpp is untouched by this PR, so it picked that up purely from the header change, and the per-file byte gate structurally cannot see it: it compiles one object at a time, which is the same blind spot #1281 was built for on the data side.

I am not claiming that duplicate is the mwccarm failed, because objisolate may well be dropping it on purpose the way it drops the emitted vtable, and your local build passing suggests it does. But if the validator's build path applies objisolate differently, or not to passenger function definitions, that is where the two runs would diverge.

The design argument reads as right, for what it is worth: str r2, [r4] / str r1, [r4] / bl ActorBase::~ActorBase in Scene's destructor cannot come from a merely declared virtual ~ActorDerived();, so the inline definition is load-bearing rather than stylistic. This is a build-plumbing problem, not a wrong-shape problem.

Left open and unmerged. Everything else from today is in: #1361, #1362, #1367, #1368, the sweep as #1360/#1363/#1364/#1365/#1366, and #1359 restoring the orphaned #1357.

@tangosdev

Copy link
Copy Markdown
Owner

Update, and it points away from the duplicate being fatal.

#1370 passed the full byte gate, including Full ROM build, on a tree that contains every one of this PR's changes (its base is cpp/inline-base-dtors, so the worker built branch + Platform). If the inline destructor genuinely broke the build, #1370 could not have gone green. So the duplicate _ZN12ActorDerivedD1Ev definition I measured is real but evidently tolerated -- objisolate is presumably doing exactly what your body says it does -- and this PR's mwccarm failed looks either transient or fixed incidentally by something in #1370.

I merged current main into this branch (clean, no conflicts, langmode ratchet PASS) to trigger a fresh validation run. The duplicate is unchanged by that merge, as expected. If the rerun is green I will merge this and then #1370; if it fails the same way while #1370 stays green, the difference between the two runs is the thing to chase, and it is in the build path rather than in the source.

@tangosdev

Copy link
Copy Markdown
Owner

More evidence, and it narrows to an interaction with main rather than anything in this branch.

What builds and what does not.

tree full ROM source
cpp/inline-base-dtors + Platform (#1370's test merge) 106/106 exact, 100.000000% validator
main + cpp/inline-base-dtors (this PR's test merge) mwccarm failed validator, twice
main + this branch, every enrolled file compiled individually 10,508 / 10,508 compile me, locally

#1370's tree contains every one of this branch's changes and builds clean, so the inline destructor and the duplicate _ZN12ActorDerivedD1Ev passenger are fine on their own -- objisolate is doing its job. What fails is specifically this branch combined with current main.

It is not a plain compile error in the enrolled set. I compiled all 10,508 files in delaunder.module_index() on the merged tree under each file's pinned compiler: zero failures. So either the failing unit is outside that index (arm7, itcm/dtcm, or something enrolled in delinks that the index does not cover), or the step reported as mwccarm failed is failing later than the compile.

Prime suspects in main, all landed today, all touching the same ground: #1362 (eleven engine base destructors, and main's own src/_ZN12ActorDerivedD1Ev.cpp comes from it), #1368 (MeshCollider D1 plus objisolate/eligible changes). A destructor shape that is correct alone and correct in #1370 but breaks against another destructor migration is exactly the interaction those two would produce.

I am not pushing anything further to your stack. Two options, your call: rebase the stack onto current main and rerun, or merge #1370 into this branch first, since branch + Platform is the one combination the validator has actually built clean, and then let the pair validate against main together.

Also worth knowing: #1371 fixed tools/validate_merge.py (a NameError from #1367 that was turning every validation into Worker error -- produced no report). Runs on this PR before that fix were not telling you anything; the mwccarm failed above is from a repaired gate and is real.

Scene::~Scene stores TWO vptrs and then calls ActorBase's destructor:

    str r2, [r4]        ; _ZTV5Scene
    str r1, [r4]        ; _ZTV12ActorDerived   <- ActorDerived's D2, INLINED
    bl  ActorBase::~ActorBase

A merely declared `virtual ~ActorDerived();` cannot produce that. The compiler
has no body to inline and emits `bl _ZN12ActorDerivedD2Ev` -- one store where
the ROM has two. Define it in the class body and Scene::~Scene() {} reproduces
0x0202e140 exactly. So the original sources defined these destructors inline,
and every derived destructor inlined them. That is worth knowing because
roughly 60 unmigrated D1 files have this two-vtable-store shape.

Making it true cost three changes, and each one was forced by the next gate
rather than chosen up front.

1. objisolate: CORRECT AN UNDEF VTABLE REFERENCE, NOT JUST AN EXTERNALISED ONE

   An inlined base destructor stores a vptr for a class this object never
   defines, so `_ZTV12ActorDerived` is UNDEF from the start with addend 8 --
   never a candidate for externalisation, so the existing correction never
   looked at it, and the guard refused the file.

   objisolate PREDICTED THIS. The comment above the UNDEF branch names both the
   constructor-only TU and "a derived destructor over an inline base
   destructor", says both were reproduced under 2004/b56, and says they "arrive
   the moment a real-C++ constructor is enrolled, which is the direction this
   tree is moving". It refused because there was no enrolled instance to verify
   a correction against. Scene is that instance.

   The correction is the same arithmetic the externalise path already uses --
   the ROM's _ZTV symbol IS the slot array, so addend 8 becomes 0 -- and it is
   checked the same way, by rombuild byte-comparing the linked module. That is
   the only thing that caught the original 8-high vptr bug across 34 modules.
   ANY OTHER ADDEND IS STILL REFUSED, with a new test pinning that: multiple
   inheritance produces addend 44 and there is still no instance for it.

   The two tests asserting the old refusal now assert the correction, and a
   third asserts the refusal that remains.

2. eligible.py: STB_LOPROC IS A DEFINITION

   An inline function's out-of-line copy is emitted under mwcc's COMDAT
   binding, STB_LOPROC. The symbol scan accepted STB_GLOBAL and STB_WEAK only,
   so ActorDerived's own D1 -- defined, right size, in the kept section --
   reported "0 defined global functions".

   It is deduplication metadata, not a weaker definition, and exactly one
   object in this build defines any given address. Accepting it also recovered
   SIX functions that were invisible for the same reason and had nothing to do
   with this slice: the _ZThn80_ virtual thunks of ModelAnim, ModelAnim2 and
   BlendModelAnim, whose multiple inheritance makes them inline copies too.

3. ActorDerived's D1 file carries a FORCING TU

   With the definition in the header that file cannot define it again, and a TU
   that merely includes the header emits nothing. An explicit destructor call
   in an uncalled function forces the out-of-line copy; objisolate drops it.

RESULT
  eligible.py      10805 -> 10811, nothing lost (+6, all _ZThn80_ thunks)
  rombuild -j16    106/106 exact, 0 mismatching
  source-built     10,805 -> 10,811, 87.82% -> 87.83%
  test_objisolate  6 passed
  port_refcheck    393 references, 0 stale
  langmode ratchet PASS
  no --no-verify

NOT DONE HERE. Stage is the next one in this chain and needs its three members
typed first -- Particle::SysTracker at 0x50, Model at 0x86c, MeshCollider at
0x91c are still u8 markers. And ModelAnim's family still cannot be isolated:
that is the addend-44 refusal above, deliberately left standing.

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

Copy link
Copy Markdown
Collaborator Author

Rebased onto 0758bc99; the mwccarm failed does not reproduce and I think it was an interaction with a main that has since moved.

Reproduced the validator's exact procedure locally, with the compiler and ROM: merged this branch's old head into then-current main and ran tools/rombuild.py --profile stock. 106/106 exact, 0 mismatching, 10,812 source-built. Re-ran it with --no-cache so all 10,812 objects were compiled from scratch rather than reused — same result. So there is no compile or link failure in branch + main as of now.

Rebased the branch onto current main rather than leaving the two Merge main commits: the relay keys on head SHA, so re-submitting the old one returns the old verdict. It is now a single commit, d4dbfd99, and origin/main..HEAD is exactly your original 0785544f. Nothing of yours was changed.

Rebuilt after the rebase: 106/106 exact, 0 mismatching.

The whole stack was restacked on top of it and each level builds — see the comments on #1370, #1372 and #1375. One of them needed a real fix, and it was mine, not yours.

@andrewboudreau

Copy link
Copy Markdown
Collaborator Author

Re-validated on the rebase, and it still fails — but the stack above it passes, which narrows this to "must not merge alone".

Results on the current head SHAs, all against 0758bc99, which the API confirms is the exact tip of main (the base is not stale this time):

PR contents validator
#1369 this commit alone FAILUREFull ROM build: mwccarm failed
#1370 this + _ZN8PlatformD1Ev as a real destructor SUCCESS
#1375 all four SUCCESS

That is the same shape as the earlier report — branch + Platform builds and branch alone does not — and it survives a rebase onto a main that has moved twice since. So it is not base drift.

The likely mechanism, and it is a hypothesis, not a measurement: this PR changes objisolate.py and eligible.py as well as making base destructors inline. #1370 replaces main's hand-written src/_ZN8PlatformD1Ev.c with a .cpp that uses Platform_EmitDestructor to force an out-of-line copy of an inline destructor. If the eligibility change here stops the old .c from supplying _ZN8PlatformD1Ev, the symbol is undefined until #1370 restores it — which fits "fails alone, passes with #1370" exactly.

What I could not do is reproduce the failure. On this exact commit, with the compiler and ROM, tools/rombuild.py -j16 — the full ROM build, not --no-rom — produces build/sm64ds.nds and reports 106/106 exact, 0 mismatching, 10,812 source-built. Cold cache too. So the failing unit is something the worker sees and this machine does not, and I am not going to guess further.

Recommendation: do not merge this one on its own. Either merge #1369 and #1370 as a unit, or move #1370's _ZN8PlatformD1Ev.cpp commit down into this PR so it is self-contained. My earlier comment said the failure "does not reproduce"; that was true of my machine and wrong as a conclusion about the PR, and #1370 passing while this fails is what corrects it.

@andrewboudreau

Copy link
Copy Markdown
Collaborator Author

Superseded by #1370, which now targets main directly and carries this commit.

This PR could not merge, and being the base of #1370 it blocked the whole stack. Rather than keep guessing at a failure I cannot reproduce, I moved #1370's base to main: origin/main..cpp/platform-dtors is d4dbfd99 (this commit, unchanged) plus 51bd7592, so merging #1370 lands both and this PR closes itself.

Correcting the weight of my previous comment. I cited #1370 and #1375 passing as evidence, and each stacked PR validates only its own delta against its own base — so neither of them re-tested this commit against main. The evidence that actually holds is narrower and still sufficient: #1370's report includes Module fidelity 106/106 exact and 10,812 functions linked from verified source, which is a full-ROM build of a tree containing this commit. So the code is fine; it is this commit alone against main that the worker will not build.

One more measurement, in case it helps whoever picks this up: the eligible.py bracket on this branch against main loses nothing and gains exactly six symbols — _ZThn80_N9ModelAnimD1Ev/D0Ev, _ZThn80_N10ModelAnim2D1Ev/D0Ev, _ZThn80_N14BlendModelAnimD1Ev/D0Ev. That is the +6 taking 10,806 to 10,812, and those this-adjusting thunks are the only thing this PR newly asks the link to source. If the alone-vs-main failure is ever worth chasing, they are where I would start.

@andrewboudreau

Copy link
Copy Markdown
Collaborator Author

Closing: your commit is on main, and this PR's diff has now inverted into a revert.

d4dbfd99 landed via #1370 at 10:03 — I had retargeted that PR's base to main precisely so it would carry this commit past the validator failure here. Verified on origin/main: src/_ZN12ActorDerivedD1Ev.cpp and src/_ZN5SceneD1Ev.cpp are present, both .c predecessors are gone, and tools/objisolate.py is identical to this branch's. Nothing of yours was lost.

Because #1370 squash-merged, git cannot see this branch's commit as already applied, and main has since taken #1372 and #1375 on top. So git diff origin/main..cpp/inline-base-dtors is now 33 files, 439 deletions of their work — merging this would revert _ZN8PlatformD1Ev.cpp, check_header_offsets.py and the FloatingFloorLllBig migration. That is the only reason I am closing rather than leaving it: an open, mergeable-looking PR whose diff is a revert is a live hazard.

Reopen and rebase if I have misread anything.

For the record, the failure here was never explained. main + this commit would not build on the worker while main + this + #1370 did, and I could not reproduce either result locally — the full ROM built 106/106 exact for both, warm cache and cold. The eligible bracket showed this commit losing nothing and gaining exactly six _ZThn80_ ModelAnim thunks, which is where I would look if it ever recurs.

@tangosdev

Copy link
Copy Markdown
Owner

Correcting myself twice, so you do not chase leads I have since disproved.

Retracted 1: duplicate symbol definitions. I measured two enrolled TUs both defining _ZN12ActorDerivedD1Ev and flagged it as the standout suspect. Control run kills it: current main already has 151 symbols defined by more than one enrolled TU and builds clean at 106/106. mwccarm emits a destructor TU as D2/D0/D1, so passenger overlap between D0Ev and D1Ev files is this repo's normal state, not a defect.

Retracted 2: newly enrolled address ranges. I posted a table on #1377 pointing at the Tracked source enrollment +96 / +428 deltas as the thing distinguishing the failures from #1374. Wrong, and my first check was wrong in a way worth naming: it keyed on the source path, so a .c -> .cpp rename looked like a new enrollment. Keyed on (section, start, end) instead:

PR new .text ranges delinks changes full ROM
#1374 0 8 renames 106/106 exact
this PR 0 3 renames mwccarm failed
#1377 0 renames only mwccarm failed

No PR in this group enrolls a single new byte. Whatever the report's +96/+428 counts, it is not new delinks ranges, so that hypothesis is gone too.

What is actually established, all measured rather than reasoned:

  • main is not broken: all 10,502 enrolled files compile clean on 0758bc996
  • no file in either failing tree fails to compile: same sweep, same result
  • newly enrolled ranges are well-formed anyway: no end mismatch against symbols.txt sizes, no overlaps, all 4-byte aligned
  • duplicates and new ranges both ruled out per above

I have no further testable hypothesis, and I cannot bisect a real build: dsd delink fails on my box at function Div ... IllegalIns Thumb BlxI (0x0200407e), identically on unmodified main, so I have no local full-ROM gate at all. Everything above came from per-file compilation and static analysis, which is exactly the layer that cannot see this failure.

Stopping here rather than generating more guesses. The scripts are throwaway but the method is repeatable if useful: compile every enrolled file under its pin, collect each object's defined GLOBAL/WEAK symbols, and diff delinks by range rather than by path.

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