From e477c4a9927c2ee8d6c07c7edce28892b92fa8d9 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Wed, 30 Sep 2026 16:44:09 -0600 Subject: [PATCH] T5.1.c7: struct_twins: UNBOUND causes from use sites, SDK as note, fixed order; ## Twins regenerated --- docs/struct-map.md | 10 +- docs/struct-twins.md | 735 ++++++++++++++++++++++++++++++++++++++---- tools/struct_twins.py | 130 ++++++-- 3 files changed, 772 insertions(+), 103 deletions(-) diff --git a/docs/struct-map.md b/docs/struct-map.md index 5f089451a6..717c5ed784 100644 --- a/docs/struct-map.md +++ b/docs/struct-map.md @@ -1,8 +1,8 @@ # The struct map — the types the fleet's cast sites need (Phase 37 T1) -> **Generated by `tools/type_census.py` at `343b718b21` (2026-09-30T21:12:15Z); never typed (R75).** Every raw pointer-cast dereference in `src/` was assigned to a base (a parameter, a local, a global by value or by address, an absolute address) and the bases were clustered by EVIDENCE only — the same global symbol, an argument passed to a callee's parameter, an assignment or return, a pointer field read, a shared body's fleet-wide identity — never by a similar offset signature. Each cluster is one type the tree needs. Names are placeholders (`Unkstruct_`: the lowest global instance's address, else the lowest member function's); fields are placeholders (`unk`) until Phase 38 cites evidence. +> **Generated by `tools/type_census.py` at `7a54682a25` (2026-09-30T22:44:05Z); never typed (R75).** Every raw pointer-cast dereference in `src/` was assigned to a base (a parameter, a local, a global by value or by address, an absolute address) and the bases were clustered by EVIDENCE only — the same global symbol, an argument passed to a callee's parameter, an assignment or return, a pointer field read, a shared body's fleet-wide identity — never by a similar offset signature. Each cluster is one type the tree needs. Names are placeholders (`Unkstruct_`: the lowest global instance's address, else the lowest member function's); fields are placeholders (`unk`) until Phase 38 cites evidence. -**19124 types explain 498868 of 502988 dereference sites (99.2 %); 4120 sites have a base the census could not classify; 857 types carry a width conflict.** Merges by evidence: param 38876, assign 16783, arg 10825, field 9904, ret-of 4335, return 1524, assign& 1184, arg& 270. +**19124 types explain 498868 of 502988 dereference sites (99.2 %); 4120 sites have a base the census could not classify; 857 types carry a width conflict.** Merges by evidence: param 38876, assign 16781, arg 10825, field 9896, ret-of 4335, return 1524, assign& 1184, arg& 270. | # | type | sites | bodies | fields | size ≥ | width conflicts (+sign mixes) | instance globals | pointer globals | |---:|---|---:|---:|---:|---:|---:|---|---| @@ -136,7 +136,7 @@ | 128 | `Unkstruct_db0ee441` | 516 | 129 | 4 | 0x38 | 0 (+0 sign) | | | | 129 | `Unkstruct_290ce261` | 504 | 126 | 3 | 0xfe | 0 (+0 sign) | | | | 130 | `Unkstruct_d6100faa` | 504 | 126 | 3 | 0x20 | 0 (+0 sign) | | | -| 131 | `Unkstruct_5ebcbddc` | 504 | 126 | 3 | 0xe | 0 (+0 sign) | | | +| 131 | `Unkstruct_fc43506c` | 504 | 126 | 3 | 0xe | 0 (+0 sign) | | | | 132 | `Unkstruct_7cb40b10` | 500 | 500 | 1 | 0x4 | 0 (+0 sign) | | | | 133 | `Unkstruct_4e078af8` | 496 | 124 | 2 | 0x4 | 0 (+2 sign) | | | | 134 | `Unkstruct_494cef68` | 496 | 124 | 2 | 0x188 | 0 (+0 sign) | | | @@ -167,7 +167,7 @@ | 159 | `Unkstruct_e1c73ac0` | 378 | 126 | 3 | 0x6 | 0 (+0 sign) | | | | 160 | `Unkstruct_8ba4da0a` | 378 | 126 | 3 | 0x1c | 0 (+0 sign) | | | | 161 | `Unkstruct_93e44aed` | 378 | 126 | 2 | 0x1c | 0 (+0 sign) | | | -| 162 | `Unkstruct_24687968` | 378 | 126 | 3 | 0xe | 0 (+0 sign) | | | +| 162 | `Unkstruct_8dd0822e` | 378 | 126 | 3 | 0xe | 0 (+0 sign) | | | | 163 | `Unkstruct_89684c99` | 375 | 125 | 3 | 0x6 | 0 (+0 sign) | | | | 164 | `Unkstruct_d0754cca` | 375 | 125 | 2 | 0x24 | 0 (+0 sign) | | | | 165 | `Unkstruct_89f82b52` | 372 | 124 | 3 | 0x1ca | 0 (+0 sign) | | | @@ -178,7 +178,7 @@ | 170 | `Unkstruct_39de3511` | 372 | 124 | 3 | 0x12 | 0 (+0 sign) | | | | 171 | `Unkstruct_1b4331f0` | 369 | 123 | 3 | 0x5e | 0 (+0 sign) | | | | 172 | `Unkstruct_75e9a6af` | 369 | 123 | 3 | 0x10 | 0 (+0 sign) | | | -| 173 | `Unkstruct_b39064df` | 366 | 14 | 24 | 0xa2 | 3 (+3 sign) | | | +| 173 | `Unkstruct_c59d6379` | 366 | 14 | 24 | 0xa2 | 3 (+3 sign) | | | | 174 | `Unkstruct_5c635b4b` | 364 | 14 | 13 | 0x34 | 0 (+0 sign) | | | | 175 | `Unkstruct_800AE620` | 325 | 322 | 0 | 0x0 | 0 (+0 sign) | D_800AE620 | | | 176 | `Unkstruct_814e4d87` | 300 | 75 | 0 | 0x0 | 0 (+0 sign) | | | diff --git a/docs/struct-twins.md b/docs/struct-twins.md index d119506b03..7a3c616f5c 100644 --- a/docs/struct-twins.md +++ b/docs/struct-twins.md @@ -12,6 +12,524 @@ +### 4cc70dd1aeae:opaque +names: B4_80165140, B4_8017F154, B4_8018750C, B4_8018AD9C, B4_8018C334, B4_CB578, B4_SC03_014_8018A860, BYTES_800CFAD0, Blk4_8017CE90_8017CE90, Blk4_8017D5DC, Blk4_8017D7A0, Blk4_8017E808, Blk4_80180518, Blk4_801815D4, Blk4_80181EDC, Blk4_80181EDC_8017FEA0, Blk4_80182194, Blk4_80183AF4, Blk4_80183FCC, Blk4_80185D4C, Blk4_8018B4E0, Blk4_8018B5E4, Blk4_8018B948, Blk4_8018BDD0, Blk4_8018CC28, Blk4_8018CE04_80186D40, Blk4_8018CE04_80188C34, Blk4_8018CE04_8018A724, Blk4_8018FF98, Blk4_80191320_80191070, Blk4_801EC660, Blk4_9B4, Blk4_E960, Blk4_SC06_018_8018AB00, Blk4_SC07_000_8017F8B8, Block4, Col4, EffectSlot4, EffectSlot4_8017E32C, EffectSlot4_801811D4, EffectSlot4_80186494, EffectSlot4_801878E8, EffectSlot4_80189454, EffectSlot4_8018AF48, EffectSlot4_8018AF9C, EffectSlot4_8018F9C0, M4_801A0168, M4_801AE734, M4_801AEB04, Q_80138C60, Quad4_800CCB14, Quad_801EA880_8017D900, Src, V4_80181EB8, W4_80181E88, W4_td +cause: 56 names (4 B, all members placeholders) bound to 431 distinct objects, none bound to two names: 0x800CC114, 0x800CCB14, 0x80114E7C, 0x8017D8D0, 0x8017E2AC, 0x8017E2E8, 0x8017E374, 0x8017E5A4 …; same layout as PsyQ CVECTOR, CdlLOC, no name of the row bound to it; full list: tools/struct_twins.py --show 4cc70dd1aeae:opaque +- `B4_80165140`: 2 obj — ov_MAIN_012/0x80165140:param_1, ov_SC01_000/0x80165140:param_1 +- `B4_8017F154`: 7 obj — 0x8019E28C, 0x8019E290, 0x8019E294, 0x8019F95C, 0x8019F960, 0x8019F9A0, ov_SC06_016/0x8017F154:blk +- `B4_8018750C`: 3 obj — 0x8018750C(arg1), ov_SC06_032/0x8018750C:p, ov_SC06_032/0x8018750C:param_2 +- `B4_8018AD9C`: 2 obj — ov_SC06_033/0x8018AD9C:param_4, ov_SC06_033/0x8018AD9C:pkt +- `B4_8018C334`: 2 obj — ov_SC06_018/0x8018C334:p, ov_SC06_018/0x8018C334:param_2 +- `B4_CB578`: 2 obj — 0x800CC114, md_MAIN_019/0x800CB578:clr +- `B4_SC03_014_8018A860`: 3 obj — ov_SC03_014/0x8018A860:a2, ov_SC03_014/0x8018A860:a3, ov_SC03_014/0x8018A860:s1 +- `BYTES_800CFAD0`: 1 obj — 0x80114E7C +- `Blk4_8017CE90_8017CE90`: 9 obj — 0x8018A924, 0x8018BCA0, 0x8018D380, 0x801AE628, 0x801C11B0, 0x801D4228, 0x801EA840, ov_SC03_024/0x8017CE90:s2 (+1) +- `Blk4_8017D5DC`: 4 obj — 0x8018E24C, 0x8018E250, 0x8018F59C, ov_SC04_010/0x8017D5DC:s0 +- `Blk4_8017D7A0`: 3 obj — 0x8019BA08, 0x8019BA0C, ov_SC05_007/0x8017D7A0:p_buf +- `Blk4_8017E808`: 4 obj — 0x8019DBF8, 0x8019DBFC, 0x8019EFF8, 0x8019EFFC +- `Blk4_80180518`: 14 obj — 0x8019EBCC, 0x8019EBD0, 0x8019EBD4, 0x8019FFA0, 0x8019FFA4, 0x8019FFE0, 0x8019FFE4, 0x801ABF54 (+6) +- `Blk4_801815D4`: 5 obj — 0x80189C3C, 0x80189C58, 0x80189C74, 0x80189C90, ov_SC03_102/0x801815D4:col +- `Blk4_80181EDC`: 5 obj — 0x801D1A8C, 0x801D1A90, 0x801D3100, 0x801D3104, ov_SC02_028/0x80181EDC:s0 +- `Blk4_80181EDC_8017FEA0`: 6 obj — 0x801A94BC, 0x801A94C0, 0x801AAAE0, 0x801AAAE4, ov_SC03_097/0x8017FEA0:s0, ov_SC03_097/0x80180304:sp10 +- `Blk4_80182194`: 8 obj — 0x8019C980, 0x8019C984, 0x801D1A94, 0x801D1A98, ov_SC02_028/0x80182194:sp10, ov_SC02_028/0x80182194:sp18, ov_SC03_101/0x801806B8:sp10, ov_SC03_101/0x801806B8:sp18 +- `Blk4_80183AF4`: 4 obj — 0x801BED14, 0x801BED18, ov_SC03_104/0x80183AF4:pos, ov_SC03_104/0x80183AF4:vel +- `Blk4_80183FCC`: 4 obj — 0x801E2E70, 0x801E2E74, 0x801E44A4, ov_SC02_005/0x80183FCC:s2 +- `Blk4_80185D4C`: 4 obj — 0x801CF0DC, 0x801CF0E4, 0x801D0D80, ov_SC06_032/0x80185D4C:dst +- `Blk4_8018B4E0`: 3 obj — aED994_8018B4E0, aEFD80_8018B4E0, aEFD84_8018B4E0 +- `Blk4_8018B5E4`: 3 obj — aED994_8018B5E4, aEFD80_8018B5E4, aEFD84_8018B5E4 +- `Blk4_8018B948`: 2 obj — 0x801ED9B4, ov_SC04_011/0x8018B948:ptr +- `Blk4_8018BDD0`: 4 obj — 0x801E2F50, 0x801E2F54, 0x801E4918, 0x801E491C +- `Blk4_8018CC28`: 4 obj — 0x801E2F58, 0x801E2F5C, 0x801E4958, 0x801E495C +- `Blk4_8018CE04_80186D40`: 4 obj — 0x801C5B80, 0x801C5B84, 0x801C7E7C, 0x801C7E80 +- `Blk4_8018CE04_80188C34`: 4 obj — 0x801B82E0, 0x801B82E4, 0x801BCA08, 0x801BCA0C +- `Blk4_8018CE04_8018A724`: 4 obj — 0x801EA170, 0x801EA174, 0x801EC458, 0x801EC45C +- `Blk4_8018FF98`: 8 obj — 0x801CF1A4, 0x801CF1A8, 0x801D0E40, 0x801D0E44, 0x801D3B14, 0x801D3B18, 0x801D59F0, 0x801D59F4 +- `Blk4_80191320_80191070`: 5 obj — 0x801CF0E8, 0x801CF0F0, 0x801D0FC0, ov_SC06_032/0x80191070:col, ov_SC06_032/0x80191070:p +- `Blk4_801EC660`: 3 obj — 0x801EC660, 0x801EC664, ov_SC01_001/0x801824EC:aD801F2A50 +- `Blk4_9B4`: 4 obj — 0x801865A8, 0x801D0620, 0x801D0624, aD_801CE7A4 +- `Blk4_E960`: 3 obj — 0x80186540, 0x801CE6E0, ov_SC07_000/0x8017E960:s0 +- `Blk4_SC06_018_8018AB00`: 5 obj — 0x801D3B08, 0x801D3B0C, 0x801D3B10, 0x801D57B0, 0x801D57B4 +- `Blk4_SC07_000_8017F8B8`: 3 obj — 0x801865C0, 0x801CE7A4, ov_SC07_000/0x8017FBE8:s0 +- `Block4`: 28 obj — 0x80191968, 0x8019196C, 0x801AD2DC, 0x801AECC8, 0x801B2BCC, 0x801B2BD0, 0x801B41C8, 0x801BFD90 (+20) +- `Col4`: 3 obj — ov_SC06_006/0x8017ED24:buf, ov_SC06_006/0x8017ED24:param_1, ov_SC06_006/0x8017ED24:param_2 +- `EffectSlot4`: 10 obj — 0x80196D68, 0x80196DCC, 0x80196DF4, 0x80196DF8, 0x80196E28, 0x80196E2C, 0x80196E5C, 0x80196E60 (+2) +- `EffectSlot4_8017E32C`: 10 obj — 0x8018BB0C, 0x8018BB70, 0x8018BB98, 0x8018BB9C, 0x8018BBCC, 0x8018BBD0, 0x8018BC00, 0x8018BC04 (+2) +- `EffectSlot4_801811D4`: 10 obj — 0x801F53F4, 0x801F5458, 0x801F5480, 0x801F5484, 0x801F54B4, 0x801F54B8, 0x801F54E8, 0x801F54EC (+2) +- `EffectSlot4_80186494`: 10 obj — 0x80198A64, 0x80198AC8, 0x80198AF0, 0x80198AF4, 0x80198B24, 0x80198B28, 0x80198B58, 0x80198B5C (+2) +- `EffectSlot4_801878E8`: 10 obj — 0x801C3BB4, 0x801C3C18, 0x801C3C40, 0x801C3C44, 0x801C3C74, 0x801C3C78, 0x801C3CA8, 0x801C3CAC (+2) +- `EffectSlot4_80189454`: 10 obj — 0x8018F354, 0x8018F3B8, 0x8018F3E0, 0x8018F3E4, 0x8018F414, 0x8018F418, 0x8018F448, 0x8018F44C (+2) +- `EffectSlot4_8018AF48`: 10 obj — 0x801D714C, 0x801D71B0, 0x801D71D8, 0x801D71DC, 0x801D720C, 0x801D7210, 0x801D7240, 0x801D7244 (+2) +- `EffectSlot4_8018AF9C`: 10 obj — 0x80190CEC, 0x80190D50, 0x80190D78, 0x80190D7C, 0x80190DAC, 0x80190DB0, 0x80190DE0, 0x80190DE4 (+2) +- `EffectSlot4_8018F9C0`: 10 obj — 0x801EBCFC, 0x801EBD60, 0x801EBD88, 0x801EBD8C, 0x801EBDBC, 0x801EBDC0, 0x801EBDF0, 0x801EBDF4 (+2) +- `M4_801A0168`: 4 obj — 0x801A0168, md_SC07_004/0x801A19C0:sp10, md_SC07_004/0x801A1F3C:sp10, md_SC07_004/0x801A2400:sp58 +- `M4_801AE734`: 3 obj — 0x801B0838, md_SC07_004/0x801ADA10:d, md_SC07_004/0x801AE734:t1 +- `M4_801AEB04`: 2 obj — 0x801A022C, md_SC07_004/0x801AEB04:a0 +- `Q_80138C60`: 134 obj — 0x8017D8D0, 0x8017E2AC, 0x8017E2E8, 0x8017E374, 0x8017E5A4, 0x8017E718, 0x8017E76C, 0x8017E814 (+126) +- `Quad4_800CCB14`: 1 obj — 0x800CCB14 +- `Quad_801EA880_8017D900`: 10 obj — 0x801AE66C, 0x801AE670, 0x801AE674, 0x801C11F4, 0x801C11F8, 0x801C11FC, 0x801D426C, 0x801D4270 (+2) +- `Src`: 1 obj — src/resident/0x800D185C:arg0 +- `V4_80181EB8`: 2 obj — 0x801CE7A8, ov_SC07_000/0x80181EB8:pv +- `W4_80181E88`: 1 obj — ov_SC02_031/0x80181E88:a0 +- `W4_td`: 1 obj — ov_SC02_031/0x80181C2C:p + +### 64533110def7:opaque +names: Blk8S16, Blk8_80126940, Blk8_80180A38, D_80195AF4_t, D_80195AF6_t, ElemK, Elem_801347A0, Entry_80186A04, M8012AF0C, Node_80189244, P16, Rec_801897BC, Rec_8018A6A4, S8, S8_80172780, SV4L, SV4_8017DE40, SV4_8017E910, SV4_8017EA48, SV4_8018256C, SV4_80182818, SV4_801836B8, SV4_80186C20, SV4_8018A86C, SV4_FC6C, SV4_L_8017BEBC, SV4x_80180ACC, SV4x_80184754, SV4x_80184B30, SV4x_80184B30_801829C4, SV892CC, SV_801821E0, SVec801A8E34, SVec8_8017F694, Spawn8_80182848, Stk801395D4, Stride8_s16_80182868, Stride8_s16_80182868_80180970, TBL_80186144, V4s80147514, V8x_80180D2C, V8x_8018466C, V8x_801A3788, Vec3, Vec4s_80180F94, Vec8_c1 +cause: 46 names (8 B, all members placeholders); 1 bound to no object (UNBOUND), used only by: type Obj_80189244 (0x80189244(arg0)); the other 45 bound to 124 distinct objects, none bound to two names: 0x801152A8, 0x80126940, 0x80126AF0, 0x80126B30, 0x801270A8, 0x801897BC, 0x8018A860(arg1), 0x8018BD34 …; same layout as PsyQ RECT, SVECTOR, no name of the row bound to it; full list: tools/struct_twins.py --show 64533110def7:opaque +- `Blk8S16`: 3 obj — 0x801E9DA8, ov_SC02_011/0x80182714:base, ov_SC02_011/0x80182714:buf +- `Blk8_80126940`: 11 obj — 0x80126940, ov_SC02_035/0x8017D130:sp10, ov_SC02_039/0x8017D110:sp10, ov_SC02_039/0x8017D110:sp18, ov_SC03_014/0x80183A54:sp10, ov_SC03_102/0x80180558:sp10, ov_SC03_105/0x8017E180:arr, ov_SC04_012/0x8017D190:sp10 (+3) +- `Blk8_80180A38`: 2 obj — ov_SC03_102/0x80180A38:param_1, ov_SC03_102/0x80180A38:pos +- `D_80195AF4_t`: 1 obj — 0x80195AF4 +- `D_80195AF6_t`: 2 obj — 0x80195AF6, ov_SC02_005/0x80184828:p +- `ElemK`: 2 obj — ov_MAIN_012/0x80133CD4:base, ov_SC01_000/0x80133CD4:base +- `Elem_801347A0`: 3 obj — 0x801152A8, ov_SC01_000/0x801347A0:arg2, ov_SC01_000/0x801347A0:pElem +- `Entry_80186A04`: 5 obj — 0x801961B8, 0x801961E0, ov_SC02_005/0x80186A04:a2, ov_SC02_005/0x80186A04:p, ov_SC02_005/0x80186A04:t0 +- `M8012AF0C`: 4 obj — ov_SC03_001/0x8017D5F0:spB, ov_SC03_001/0x8017D5F0:spC, shared/ov/0x8012AF0C:spB, shared/ov/0x8012AF0C:spC +- `Node_80189244`: 0 obj — used by type Obj_80189244 (0x80189244(arg0)) +- `P16`: 1 obj — ov_SC03_097/0x80180158:p +- `Rec_801897BC`: 1 obj — 0x801897BC +- `Rec_8018A6A4`: 3 obj — 0x8018A860(arg1), ov_SC03_014/0x8018A6A4:sp10, ov_SC03_014/0x8018A808:a0 +- `S8`: 2 obj — 0x80126AF0, 0x801270A8 +- `S8_80172780`: 3 obj — 0x80126B30, shared/ov/0x80172780:a0, shared/ov/0x80172C50:a0 +- `SV4L`: 4 obj — ov_SC06_016/0x801807C4:out1, ov_SC06_016/0x801807C4:out2, ov_SC06_016/0x801807C4:sv1, ov_SC06_016/0x801807C4:sv2 +- `SV4_8017DE40`: 1 obj — ov_SC03_007/0x8017DE40:svec_in +- `SV4_8017E910`: 1 obj — 0x8019B5AC +- `SV4_8017EA48`: 6 obj — 0x8018BD34, ov_SC03_007/0x8017EA48:buf, ov_SC03_007/0x8017EA48:c0, ov_SC03_007/0x8017EA48:c1, ov_SC03_007/0x8017EA48:v0, ov_SC03_007/0x8017EA48:v1 +- `SV4_8018256C`: 6 obj — 0x8018C340, ov_SC03_007/0x8018256C:buf, ov_SC03_007/0x8018256C:c0, ov_SC03_007/0x8018256C:c1, ov_SC03_007/0x8018256C:v0, ov_SC03_007/0x8018256C:v1 +- `SV4_80182818`: 1 obj — ov_SC07_002/0x80182818:sv +- `SV4_801836B8`: 6 obj — 0x8018C524, ov_SC03_007/0x801836B8:buf, ov_SC03_007/0x801836B8:c0, ov_SC03_007/0x801836B8:c1, ov_SC03_007/0x801836B8:v0, ov_SC03_007/0x801836B8:v1 +- `SV4_80186C20`: 4 obj — ov_SC03_024/0x80186C20:out, ov_SC03_024/0x80186C20:sv, ov_SC05_006/0x8017F16C:out, ov_SC05_006/0x8017F16C:sv +- `SV4_8018A86C`: 2 obj — ov_SC06_018/0x8018A86C:buf1, ov_SC06_018/0x8018A86C:buf2 +- `SV4_FC6C`: 2 obj — ov_SC03_007/0x8017FC6C:sv0, ov_SC03_007/0x8017FC6C:sv1 +- `SV4_L_8017BEBC`: 1 obj — ov_SC02_028/0x8017BEBC:vec +- `SV4x_80180ACC`: 2 obj — ov_SC02_041/0x80180ACC:s0, ov_SC02_041/0x80180ACC:s1 +- `SV4x_80184754`: 2 obj — ov_SC02_017/0x80184754:a0, ov_SC02_017/0x80184754:s1 +- `SV4x_80184B30`: 2 obj — ov_SC03_090/0x80184B30:s0, ov_SC03_090/0x80184B30:s1 +- `SV4x_80184B30_801829C4`: 2 obj — ov_SC03_104/0x801829C4:s0, ov_SC03_104/0x801829C4:s1 +- `SV892CC`: 6 obj — ov_SC02_005/0x801892CC:o0, ov_SC02_005/0x801892CC:o1, ov_SC02_005/0x801892CC:o2, ov_SC02_005/0x801892CC:o3, ov_SC02_005/0x801892CC:v0, ov_SC02_005/0x801892CC:v1 +- `SV_801821E0`: 2 obj — ov_SC04_004/0x801821E0:out, ov_SC04_004/0x801821E0:v +- `SVec801A8E34`: 1 obj — md_SC07_004/0x801A8E34:h +- `SVec8_8017F694`: 2 obj — ov_SC06_016/0x8017F694:arg0, ov_SC06_016/0x8017F694:ptr2 +- `Spawn8_80182848`: 2 obj — ov_SC02_031/0x80182848:a1, ov_SC02_031/0x80182848:sp +- `Stk801395D4`: 1 obj — shared/ov/0x801395D4:sp10 +- `Stride8_s16_80182868`: 1 obj — 0x801AB676 +- `Stride8_s16_80182868_80180970`: 1 obj — 0x801A4D12 +- `TBL_80186144`: 1 obj — 0x80195AF8 +- `V4s80147514`: 2 obj — shared/ov/0x80147514:arg0, shared/ov/0x80147514:buf +- `V8x_80180D2C`: 6 obj — ov_SC03_108/0x801809A0:out, ov_SC03_108/0x801809A0:s0, ov_SC03_110/0x80180D2C:out, ov_SC03_110/0x80180D2C:s0, ov_SC03_112/0x80182944:out, ov_SC03_112/0x80182944:s0 +- `V8x_8018466C`: 2 obj — ov_SC05_001/0x8018466C:buf, ov_SC05_001/0x8018466C:s0 +- `V8x_801A3788`: 2 obj — md_SC07_003/0x801A3788:arg0, md_SC07_003/0x801A3788:s1 +- `Vec3`: 3 obj — shared/ov/0x8014964C:in, shared/ov/0x8014964C:out, shared/ov/0x8014964C:pin +- `Vec4s_80180F94`: 3 obj — ov_SC04_015/0x80180F94:loc_10, ov_SC04_015/0x80180F94:loc_18, ov_SC04_015/0x80180F94:loc_20 +- `Vec8_c1`: 4 obj — shared/ov/0x8014FFDC:save, shared/ov/0x8014FFDC:test, shared/ov/0x801502EC:save, shared/ov/0x801502EC:test + +### b53d46e36006:opaque +names: B8, B8_17F474, B8_80165140, B8_801851A8, B8_8018750C, B8_8018C334, B8_8018F060, B8_801AEB04, B8_CB578, Blk8L, Blk8_8017B238_8017B238, Blk8_8017B614, Blk8_8017DAFC, Blk8_8017E224, Blk8_8017E6A4, Blk8_801809B0, Blk8_801812AC, Blk8_80181324, Blk8_801813B0, Blk8_801827C4, Blk8_80182844, Blk8_80182B08, Blk8_8018495C, Blk8_801859DC, Blk8_80186594, Blk8_801867AC, Blk8_801870AC, Blk8_8018B1B4, Blk8_80191320, Blk8_80191320_8018D05C, Blk8_820F8, Blk8_E08, Blk8_EBB8, Blk8_FE08, Blk8_func_8017E3AC, Blk8x, Copy8, ImgRect8, M8_tag, S6C, S8_80184F08, St_801E6C9C, Un8_8018613C, V8_SC06_000_8017E35C, XV8 +cause: 45 names (8 B, all members placeholders) bound to 559 distinct objects, none bound to two names: 0x80126BE0, 0x80128120, 0x80128138, 0x8017F12C, 0x8017FB08, 0x8017FB44, 0x8017FBD0, 0x8017FE00 …; full list: tools/struct_twins.py --show b53d46e36006:opaque +- `B8`: 3 obj — 0x80128120, 0x80128138, shared/ov/0x80156B74:auStack_20 +- `B8_17F474`: 2 obj — 0x8018A790, ov_SC01_084/0x8017F474:a0 +- `B8_80165140`: 2 obj — ov_MAIN_012/0x80165140:param_1, ov_SC01_000/0x80165140:param_1 +- `B8_801851A8`: 2 obj — ov_SC03_089/0x801851A8:dst, ov_SC03_089/0x801851A8:out +- `B8_8018750C`: 2 obj — ov_SC06_032/0x8018750C:param_1, ov_SC06_032/0x8018750C:q +- `B8_8018C334`: 2 obj — ov_SC06_018/0x8018C334:p, ov_SC06_018/0x8018C334:param_1 +- `B8_8018F060`: 2 obj — ov_SC06_018/0x8018F060:out, ov_SC06_018/0x8018F060:pkt +- `B8_801AEB04`: 2 obj — md_SC07_004/0x801AEB04:a0, md_SC07_004/0x801AEB04:a2 +- `B8_CB578`: 3 obj — md_MAIN_019/0x800CB578:arg0, md_MAIN_019/0x800CB578:p, md_MAIN_019/0x800CB578:pos +- `Blk8L`: 2 obj — 0x801E9DA0, ov_SC02_011/0x80181EF4:buffer +- `Blk8_8017B238_8017B238`: 4 obj — ov_SC01_000/0x8017B238:buf, ov_SC01_000/0x8017B238:p78C, ov_SC01_000/0x8017B238:p794, ov_SC01_000/0x8017B238:src +- `Blk8_8017B614`: 270 obj — 0x801853BC, 0x801853C4, 0x8018F564, 0x8018F56C, 0x8018F984, 0x8018F98C, 0x8018F9D4, 0x8018F9DC (+262) +- `Blk8_8017DAFC`: 2 obj — 0x801E06BC, ov_SC03_030/0x8017DAFC:buffer +- `Blk8_8017E224`: 2 obj — 0x801D90F0, ov_SC01_077/0x8017E224:buffer +- `Blk8_8017E6A4`: 2 obj — 0x80126BE0, ov_SC05_008/0x8017E6A4:buf +- `Blk8_801809B0`: 2 obj — 0x8019C988, ov_SC03_101/0x801809B0:vec +- `Blk8_801812AC`: 1 obj — ov_SC03_116/0x801812AC:pr +- `Blk8_80181324`: 2 obj — 0x8018AA14, ov_SC05_018/0x80181324:local +- `Blk8_801813B0`: 2 obj — ov_SC06_016/0x801813B0:dst, ov_SC06_016/0x801813B0:src +- `Blk8_801827C4`: 2 obj — 0x801EE3F4, ov_SC02_017/0x801827C4:buffer +- `Blk8_80182844`: 5 obj — 0x801E4F60, 0x801E4F68, ov_SC05_018/0x80182844:blk1, ov_SC05_018/0x80182844:blk2, ov_SC05_018/0x80182844:out +- `Blk8_80182B08`: 2 obj — 0x801BED04, ov_SC03_104/0x80182B08:buffer +- `Blk8_8018495C`: 2 obj — ov_SC02_017/0x8018495C:s0, ov_SC02_017/0x8018495C:s1 +- `Blk8_801859DC`: 1 obj — ov_SC02_027/0x801859DC:tmp +- `Blk8_80186594`: 4 obj — ov_SC02_026/0x8017EF64:s0, ov_SC02_026/0x8017EF64:t0, ov_SC02_027/0x80186594:s0, ov_SC02_027/0x80186594:t0 +- `Blk8_801867AC`: 2 obj — 0x801AFBD0, ov_SC02_027/0x801867AC:sv +- `Blk8_801870AC`: 1 obj — ov_SC02_028/0x801870AC:sv +- `Blk8_8018B1B4`: 2 obj — 0x80194BA4, ov_SC04_011/0x8018B1B4:out +- `Blk8_80191320`: 2 obj — ov_SC06_018/0x80191320:p, ov_SC06_018/0x80191320:src +- `Blk8_80191320_8018D05C`: 2 obj — ov_SC06_033/0x8018D05C:p, ov_SC06_033/0x8018D05C:src +- `Blk8_820F8`: 3 obj — 0x801CDE20, ov_SC01_005/0x801820F8:pd8, ov_SC01_005/0x801820F8:t1 +- `Blk8_E08`: 2 obj — 0x801E2E08, ov_SC02_005/0x80180E08:buf +- `Blk8_EBB8`: 3 obj — ov_SC05_008/0x8017EBB8:copy, ov_SC05_008/0x8017EBB8:ent, ov_SC05_008/0x8017EBB8:s1 +- `Blk8_FE08`: 2 obj — 0x801E2DE0, ov_SC02_005/0x8017FE08:buffer +- `Blk8_func_8017E3AC`: 2 obj — ov_SC02_026/0x8017E3AC:sp10, ov_SC02_026/0x8017E3AC:sp18 +- `Blk8x`: 4 obj — 0x801E2DD0, 0x801E2DE8, ov_SC02_005/0x8017F748:buffer, ov_SC02_005/0x8017FFF0:buffer +- `Copy8`: 2 obj — ov_SC01_080/0x801819D0:a0, ov_SC01_080/0x801819D0:sp18 +- `ImgRect8`: 133 obj — 0x8017F12C, 0x8017FB08, 0x8017FB44, 0x8017FBD0, 0x8017FE00, 0x8017FF74, 0x8017FFC8, 0x80180070 (+125) +- `M8_tag`: 1 obj — shared/ov/0x8016380C:local +- `S6C`: 1 obj — 0x80185D6C +- `S8_80184F08`: 32 obj — ov_SC01_077/0x80184F08:s50, ov_SC01_077/0x80184F08:s60, ov_SC01_084/0x80185E98:s50, ov_SC01_084/0x80185E98:s60, ov_SC02_000/0x8018A690:s50, ov_SC02_000/0x8018A690:s60, ov_SC02_011/0x8018F4B8:s50, ov_SC02_011/0x8018F4B8:s60 (+24) +- `St_801E6C9C`: 2 obj — 0x801E6C9C, ov_SC02_000/0x80183098:buf +- `Un8_8018613C`: 18 obj — ov_SC03_001/0x80188BFC:v0, ov_SC03_001/0x80188BFC:v1, ov_SC03_002/0x801846E8:v0, ov_SC03_002/0x801846E8:v1, ov_SC03_124/0x80185864:v0, ov_SC03_124/0x80185864:v1, ov_SC03_125/0x80182F6C:v0, ov_SC03_125/0x80182F6C:v1 (+10) +- `V8_SC06_000_8017E35C`: 6 obj — ov_SC06_000/0x8017E35C:va, ov_SC06_000/0x8017E35C:vb, ov_SC06_000/0x8017E35C:vbuf, ov_SC06_000/0x8017E35C:vc, ov_SC06_000/0x8017E35C:vd, ov_SC06_000/0x8017E35C:vdbuf +- `XV8`: 14 obj — ov_SC06_010/0x8017BEBC:va, ov_SC06_010/0x8017BEBC:vb, ov_SC06_010/0x8017BEBC:vc, ov_SC06_010/0x8017BEBC:vd, ov_SC06_010/0x8017BEBC:vd8, ov_SC06_010/0x8017BEBC:vt, ov_SC06_010/0x8017BEBC:vtp, ov_SC06_010/0x8017CAD4:va (+6) + +### 8d605044e3bf:opaque +names: Args_80182194, Blk8017FD54, Blk8_801A6AD0, Blk8_801AD914, Blk8_801E0764, Blk8_801E076C, Blk8_md_SC07_004_801AA9D4, Blk_80178D40, DBlock_8019F04C, D_801D0630_s, DataBlock, Data_t_80181CE0, Ent8_80188, Entry8_801A5D68, Rec8_801863EC, Rec8_801A57E8, SC05_F3E4_Tbl8, SV4U, SVec_801347A0, Stride8_u16_80182868, Stride8_u16_80182868_80180970, Tbl8_801AFF3C, Tbl_80181574, Tbl_80184F18, U16x4, UAlign8_80181F40, UAlign8_8018833C, Unk_80126940, V4U_8014C4AC, V8_SC07_002_8017C8D0, Vec4x16, Vec8_801A0E28, Vec8_801A1924, Vec8_md_SC07_003_801A3334 +cause: 34 names (8 B, all members placeholders) bound to 323 distinct objects, none bound to two names: 0x80126940, 0x8017D890, 0x8017D898, 0x8017E26C, 0x8017E274, 0x8017E2A8, 0x8017E2B0, 0x8017E334 …; full list: tools/struct_twins.py --show 8d605044e3bf:opaque +- `Args_80182194`: 2 obj — ov_SC02_028/0x80182194:arg, ov_SC03_101/0x801806B8:arg +- `Blk8017FD54`: 2 obj — 0x80185EB0, ov_SC07_010/0x8017FD54:param_1 +- `Blk8_801A6AD0`: 1 obj — md_SC07_004/0x801A6AD0:arg0 +- `Blk8_801AD914`: 2 obj — md_SC07_004/0x801AD914:arg1, md_SC07_004/0x801AD914:sp0 +- `Blk8_801E0764`: 2 obj — 0x801E0764, ov_SC03_030/0x8017EDD4:buf +- `Blk8_801E076C`: 3 obj — 0x801E076C, ov_SC03_030/0x8017EEE0:local_18, ov_SC03_030/0x8017EEE0:local_20 +- `Blk8_md_SC07_004_801AA9D4`: 2 obj — md_SC07_004/0x801AA9D4:a1, md_SC07_004/0x801AA9D4:ptr +- `Blk_80178D40`: 5 obj — ov_MAIN_012/0x80178D40:Cmd_80178D40, ov_SC01_000/0x80178D40:Cmd_80178D40, ov_SC02_037/0x80178D40:Cmd_80178D40, ov_SC07_006/0x80178D40:Cmd_80178D40, ov_SC07_010/0x80178D40:Cmd_80178D40 +- `DBlock_8019F04C`: 2 obj — 0x8019F04C, ov_SC07_002/0x801804D4:a0 +- `D_801D0630_s`: 1 obj — 0x801D0630 +- `DataBlock`: 2 obj — ov_SC02_011/0x8018A1A4:a1, ov_SC02_011/0x8018A1A4:s0 +- `Data_t_80181CE0`: 1 obj — ov_SC03_099/0x80181CE0:buf_src +- `Ent8_80188`: 2 obj — 0x801888CC, 0x801888EC +- `Entry8_801A5D68`: 1 obj — md_SC07_004/0x801A5D68:buf +- `Rec8_801863EC`: 2 obj — ov_SC02_026/0x8017EDBC:a0, ov_SC02_027/0x801863EC:a0 +- `Rec8_801A57E8`: 4 obj — 0x801AFE44, 0x801B0174, md_SC07_004/0x801AD2CC:rect, md_SC07_004/0x801ADE1C:rect +- `SC05_F3E4_Tbl8`: 4 obj — 0x80189748, 0x8018974E, 0x801897B8, ov_SC05_001/0x8017F3E4:e +- `SV4U`: 1 obj — ov_SC01_077/0x8018470C:svec +- `SVec_801347A0`: 248 obj — 0x8017D890, 0x8017D898, 0x8017E26C, 0x8017E274, 0x8017E2A8, 0x8017E2B0, 0x8017E334, 0x8017E33C (+240) +- `Stride8_u16_80182868`: 3 obj — 0x801AB670, 0x801AB672, 0x801AB674 +- `Stride8_u16_80182868_80180970`: 3 obj — 0x801A4D0C, 0x801A4D0E, 0x801A4D10 +- `Tbl8_801AFF3C`: 2 obj — 0x801AFF3C, ov_SC06_025/0x8017EA74:tbl +- `Tbl_80181574`: 2 obj — 0x80188B88, ov_SC03_111/0x80181574:p +- `Tbl_80184F18`: 2 obj — 0x8018EFB0, ov_SC03_118/0x80184F18:p +- `U16x4`: 3 obj — 0x801F8EA0, md_SC07_004/0x801AE990:a0, md_SC07_004/0x801AE990:dst +- `UAlign8_80181F40`: 4 obj — ov_SC06_020/0x80181F40:dst, ov_SC06_020/0x80181F40:param_1, ov_SC06_020/0x80181F40:src, ov_SC06_020/0x80181F40:t1 +- `UAlign8_8018833C`: 4 obj — ov_SC06_024/0x8018833C:dst, ov_SC06_024/0x8018833C:param_1, ov_SC06_024/0x8018833C:src, ov_SC06_024/0x8018833C:t1 +- `Unk_80126940`: 2 obj — 0x80126940, ov_SC03_112/0x8017E160:pos +- `V4U_8014C4AC`: 2 obj — shared/ov/0x8014C4AC:a0, shared/ov/0x8014C4AC:a3 +- `V8_SC07_002_8017C8D0`: 2 obj — 0x8018A2E0, 0x8019F060 +- `Vec4x16`: 2 obj — 0x801850D8(arg4), ov_SC03_105/0x801850D8:obj +- `Vec8_801A0E28`: 2 obj — 0x801F4310, md_SC07_003/0x801A0E28:sp30 +- `Vec8_801A1924`: 1 obj — md_SC07_003/0x801A1924:sp30 +- `Vec8_md_SC07_003_801A3334`: 2 obj — md_SC07_003/0x801A3334:s1, md_SC07_003/0x801A3334:s2 + +### 5f4b599a9ffa:opaque +names: Blk20_8017D110, Buf8017BF34_8017BF34, Buf8017BF50_8017C234, Loc_80180E10, LocalStruct, LocalStruct_8018A968, Local_80180ABC, Pkt_8018626C, Prim293C, Prim80180A38, PrimBE4, PrimF790, PrimSpec80182A6C, Prim_80180BDC, Prim_SC01_077_80182268, Rec8017F39C, Rec_SC06_029_80180A70, S80143BDC, S80190C84, S80190C84L, S80190C84_8018483C, S80190C84_846B4, S845EC_in, Spawn801A143C, Sprite8_801861D8, St_8017D118, St_8017EDC4, St_80182784, St_80182784_801817E4, Struct_8017D25C, buf_8017F5BC, sprite8 +cause: 32 names (20 B, all members placeholders) bound to 56 distinct objects, none bound to two names: md_SC07_003/0x801A143C:stk, md_SC07_003/0x801A293C:prim, md_SC07_003/0x801A3490:sp, ov_SC01_005/0x8017F790:sp, ov_SC01_005/0x80180A38:sp, ov_SC01_009/0x8017F39C:rec, ov_SC01_077/0x8017F5BC:sp, ov_SC01_077/0x80181BE4:sp …; full list: tools/struct_twins.py --show 5f4b599a9ffa:opaque +- `Blk20_8017D110`: 1 obj — ov_SC03_114/0x8017D110:sp10 +- `Buf8017BF34_8017BF34`: 1 obj — ov_SC03_105/0x8017BF34:buf +- `Buf8017BF50_8017C234`: 1 obj — ov_SC03_002/0x8017C234:buf +- `Loc_80180E10`: 1 obj — ov_SC03_110/0x80180E10:loc +- `LocalStruct`: 1 obj — ov_SC02_005/0x8018D608:local_struct +- `LocalStruct_8018A968`: 1 obj — ov_SC02_005/0x8018A968:local +- `Local_80180ABC`: 1 obj — ov_SC03_105/0x80180ABC:local +- `Pkt_8018626C`: 1 obj — ov_SC02_000/0x8018626C:pkt +- `Prim293C`: 1 obj — md_SC07_003/0x801A293C:prim +- `Prim80180A38`: 1 obj — ov_SC01_005/0x80180A38:sp +- `PrimBE4`: 1 obj — ov_SC01_077/0x80181BE4:sp +- `PrimF790`: 1 obj — ov_SC01_005/0x8017F790:sp +- `PrimSpec80182A6C`: 1 obj — ov_SC04_002/0x80182A6C:prim +- `Prim_80180BDC`: 1 obj — ov_SC04_005/0x80180BDC:sp +- `Prim_SC01_077_80182268`: 1 obj — ov_SC01_077/0x80182A24:sp +- `Rec8017F39C`: 1 obj — ov_SC01_009/0x8017F39C:rec +- `Rec_SC06_029_80180A70`: 1 obj — ov_SC06_029/0x80180A70:rec +- `S80143BDC`: 2 obj — ov_SC04_003/0x8017E07C:sp, shared/ov/0x80143BDC:sp +- `S80190C84`: 20 obj — md_SC07_003/0x801A3490:sp, ov_SC02_000/0x80185F8C:stk, ov_SC02_011/0x80190C84:sp, ov_SC02_016/0x801815DC:sp, ov_SC02_017/0x80187178:sp10, ov_SC02_017/0x8018A428:sp, ov_SC02_041/0x80184D20:sp, ov_SC03_006/0x8018C090:sp (+12) +- `S80190C84L`: 1 obj — ov_SC05_003/0x80181C00:sp +- `S80190C84_8018483C`: 1 obj — ov_SC02_000/0x8018483C:sp +- `S80190C84_846B4`: 1 obj — ov_SC01_084/0x801846B4:tmp +- `S845EC_in`: 1 obj — ov_SC01_084/0x801845EC:in +- `Spawn801A143C`: 1 obj — md_SC07_003/0x801A143C:stk +- `Sprite8_801861D8`: 1 obj — ov_SC02_000/0x801861D8:spr +- `St_8017D118`: 1 obj — ov_SC04_016/0x8017D118:st +- `St_8017EDC4`: 2 obj — ov_SC04_016/0x8017EDC4:st, ov_SC04_016/0x8017EE20:st +- `St_80182784`: 1 obj — ov_SC02_041/0x80182784:s +- `St_80182784_801817E4`: 1 obj — ov_SC04_007/0x801817E4:s +- `Struct_8017D25C`: 1 obj — ov_SC05_011/0x8017D25C:sp10 +- `buf_8017F5BC`: 1 obj — ov_SC01_077/0x8017F5BC:sp +- `sprite8`: 4 obj — ov_SC01_077/0x8018470C:spr, ov_SC02_000/0x80187480:spr, ov_SC02_000/0x80187558:spr, ov_SC02_000/0x8018762C:spr + +### d4b0395bb0af:opaque +names: Blk16X, Blk16_8017ECD4, Blk16_8018A4C4, Blk16_8018A8B8, Blk16_801E2F08, Blk16_956C, Blk16_SC01_084_8017DAF8, Blk16_md_MAIN_016, Blk_800CBAD0, CB4A4_V4, DStruct, M16, Q16, Quad, Quad_8018797C, Quad_8018797C_8017F26C, Rec16_8017DDC4, Rec16_8017DDC4_8018034C, Rec16_8017DDC4_80180F08, Rec16_8017DDC4_80182244, Rec16_8018066C, S16_md_MAIN_014_800CB254, Struct16, Vec801A8E34, func_800CB0B0_Blk16, func_800CB164_Blk16, func_800CB188_Blk16, func_800CB4D8_Blk16 +cause: 28 names (16 B, all members placeholders) bound to 247 distinct objects, none bound to two names: 0x800A5E88, 0x801151D4, 0x8011F920, 0x80126948, 0x801843A4, 0x80189460, 0x8018E54C, 0x8018E96C …; full list: tools/struct_twins.py --show d4b0395bb0af:opaque +- `Blk16X`: 4 obj — md_MAIN_039/0x800CB0B4:dstp, md_MAIN_039/0x800CB0B4:srcp, md_MAIN_039/0x800CB228:m, md_MAIN_039/0x800CB228:obj +- `Blk16_8017ECD4`: 4 obj — 0x801A0E44, 0x801A0E54, ov_SC03_011/0x8017ECD4:va, ov_SC03_011/0x8017ECD4:vb +- `Blk16_8018A4C4`: 2 obj — 0x801E2F38, ov_SC02_005/0x8018A4C4:blobB +- `Blk16_8018A8B8`: 49 obj — 0x800A5E88, 0x8019510C, 0x80195144, 0x80197D30, 0x80197D68, 0x8019927C, 0x801992B4, 0x8019B244 (+41) +- `Blk16_801E2F08`: 2 obj — 0x801E2F08, ov_SC02_005/0x80189FC4:blk16 +- `Blk16_956C`: 4 obj — ov_MAIN_012/0x8012956C:base, ov_MAIN_012/0x8012956C:dst, ov_MAIN_012/0x8012956C:sp0, ov_MAIN_012/0x8012956C:src +- `Blk16_SC01_084_8017DAF8`: 5 obj — 0x8011F920, 0x80126948, ov_SC01_084/0x8017DAF8:dst, ov_SC01_084/0x8017DAF8:end, ov_SC01_084/0x8017DAF8:src +- `Blk16_md_MAIN_016`: 2 obj — md_MAIN_016/0x800CB228:ent, md_MAIN_016/0x800CB228:p +- `Blk_800CBAD0`: 2 obj — md_MAIN_028/0x800CBAD0:a0, md_MAIN_028/0x800CBAD0:v +- `CB4A4_V4`: 3 obj — md_MAIN_027/0x800CB4A4:bak, md_MAIN_027/0x800CB4A4:s1, md_MAIN_027/0x800CB4A4:s2 +- `DStruct`: 134 obj — 0x801843A4, 0x8018E54C, 0x8018E96C, 0x8018E9BC, 0x8018ED24, 0x8018F0C4, 0x8018F2E4, 0x8018F344 (+126) +- `M16`: 2 obj — md_MAIN_025/0x800CB300:mat, md_MAIN_025/0x800CB300:s0 +- `Q16`: 4 obj — 0x801151D4, shared/ov/0x8012A418:dst, shared/ov/0x8012A418:end, shared/ov/0x8012A418:src +- `Quad`: 2 obj — shared/ov/0x8014DCE0:arg0, shared/ov/0x8014DCE0:buf +- `Quad_8018797C`: 2 obj — ov_SC02_011/0x8018797C:entry, ov_SC02_011/0x8018797C:tmp +- `Quad_8018797C_8017F26C`: 2 obj — ov_SC03_030/0x8017F26C:entry, ov_SC03_030/0x8017F26C:tmp +- `Rec16_8017DDC4`: 1 obj — 0x801A42B8 +- `Rec16_8017DDC4_8018034C`: 1 obj — 0x801A4C38 +- `Rec16_8017DDC4_80180F08`: 1 obj — 0x801AC62C +- `Rec16_8017DDC4_80182244`: 1 obj — 0x801AB59C +- `Rec16_8018066C`: 1 obj — 0x80189460 +- `S16_md_MAIN_014_800CB254`: 4 obj — md_MAIN_014/0x800CB254:a0, md_MAIN_014/0x800CB254:v0, md_MAIN_028/0x800CBBA0:a0, md_MAIN_028/0x800CBBA0:v0 +- `Struct16`: 6 obj — md_MAIN_016/0x800CB158:arg0, md_MAIN_016/0x800CB158:v0, md_MAIN_016/0x800CB458:s0, md_MAIN_016/0x800CB458:v0, md_MAIN_028/0x800CBDD0:a0, md_MAIN_028/0x800CBDD0:v0 +- `Vec801A8E34`: 1 obj — md_SC07_004/0x801A8E34:st +- `func_800CB0B0_Blk16`: 2 obj — md_MAIN_032/0x800CB0B0:s0, md_MAIN_032/0x800CB0B0:src +- `func_800CB164_Blk16`: 2 obj — md_MAIN_014/0x800CB164:a0, md_MAIN_014/0x800CB164:obj +- `func_800CB188_Blk16`: 2 obj — md_MAIN_032/0x800CB188:s1, md_MAIN_032/0x800CB188:v0 +- `func_800CB4D8_Blk16`: 2 obj — md_MAIN_014/0x800CB4D8:a0, md_MAIN_014/0x800CB4D8:src + +### b85caab442ac:opaque +names: Blk20_8016DF5C, Blk20_80180B78, Blk20_80184694, Blk32L_80133298, Blk32_80017E8C, Blk32_80180E8C, Blk32_8018287C, Blk32_80183F10, Blk32_801A5194, Blk32_801E8788, Blk32_998, Block32, Copy32, D_800D942C_entry, MTX8L_80180750, MTX8L_80181BD4, MTX8L_801821E0, MTX_L1, Mat_80167540, Mtx8_8017C910_8017E924, Mtx_8017F370, Oct_801853D0, S_md_MAIN_033_800CB3D8, Vec8, W8__md_MAIN_044 +cause: 25 names (32 B, all members placeholders); 1 bound to no object (UNBOUND), used only by: type Mat_800CB658; the other 24 bound to 64 distinct objects, none bound to two names: 0x800AE620, 0x800D942C, 0x80114F24, 0x801151D4, 0x801E06C4, 0x801E06E4, 0x801E0704, 0x801E0724 …; full list: tools/struct_twins.py --show b85caab442ac:opaque +- `Blk20_8016DF5C`: 11 obj — 0x800AE620, ov_MAIN_012/0x8016DF5C:iVar8, ov_MAIN_012/0x8016DF5C:localMatrix, ov_MAIN_012/0x8016DF5C:param_1, ov_SC01_000/0x8016DF5C:iVar8, ov_SC01_000/0x8016DF5C:localMatrix, ov_SC01_000/0x8016DF5C:param_1, ov_SC02_037/0x8016DF5C:aD800AE620 (+3) +- `Blk20_80180B78`: 2 obj — aAE620_80180B78, ov_SC04_003/0x80180B78:m +- `Blk20_80184694`: 2 obj — ov_SC03_029/0x80184694:aD800AE620_80184694, ov_SC03_029/0x80184694:m +- `Blk32L_80133298`: 2 obj — shared/ov/0x80133298:a0, shared/ov/0x80133298:m +- `Blk32_80017E8C`: 2 obj — main/0x80017E8C:arg0, main/0x80017E8C:m +- `Blk32_80180E8C`: 2 obj — aAE620_80180E8C, ov_SC04_003/0x80180E8C:m +- `Blk32_8018287C`: 2 obj — ov_SC02_017/0x8018287C:dst, ov_SC02_017/0x8018287C:s1 +- `Blk32_80183F10`: 2 obj — aAE620_80183F10, ov_SC04_011/0x80183F10:m +- `Blk32_801A5194`: 1 obj — md_SC07_004/0x801A5194:arg0 +- `Blk32_801E8788`: 2 obj — 0x801E8788, ov_SC02_000/0x8018453C:s5 +- `Blk32_998`: 2 obj — ov_MAIN_012/0x8016C998:param_1, ov_MAIN_012/0x8016C998:r +- `Block32`: 2 obj — md_MAIN_043/0x800CD404:dstp, md_MAIN_043/0x800CD404:srcp +- `Copy32`: 10 obj — 0x801E06C4, 0x801E06E4, 0x801E0704, 0x801E0724, 0x801E0744, ov_SC03_030/0x8017E7D4:b0, ov_SC03_030/0x8017E7D4:b1, ov_SC03_030/0x8017E7D4:b2 (+2) +- `D_800D942C_entry`: 1 obj — 0x800D942C +- `MTX8L_80180750`: 2 obj — ov_SC04_004/0x80180750:aD800AE620, ov_SC04_004/0x80180750:m +- `MTX8L_80181BD4`: 2 obj — ov_SC04_004/0x80181BD4:aD800AE620, ov_SC04_004/0x80181BD4:m +- `MTX8L_801821E0`: 2 obj — ov_SC04_004/0x801821E0:aD800AE620, ov_SC04_004/0x801821E0:m +- `MTX_L1`: 2 obj — ov_SC01_000/0x8016D1D8:mtx, ov_SC02_037/0x8016D1D8:mtx +- `Mat_80167540`: 0 obj — used by type Mat_800CB658 +- `Mtx8_8017C910_8017E924`: 4 obj — aD800AE620, ov_SC04_002/0x801821C4:m, shared/ov/0x8017E924:aD800AE620, shared/ov/0x8017E924:mtx +- `Mtx_8017F370`: 1 obj — ov_SC03_011/0x8017F370:m +- `Oct_801853D0`: 2 obj — ov_SC04_011/0x801853D0:l, ov_SC04_011/0x801853D0:obj +- `S_md_MAIN_033_800CB3D8`: 2 obj — md_MAIN_033/0x800CB3D8:ptr, md_MAIN_033/0x800CB3D8:st +- `Vec8`: 2 obj — 0x80114F24, 0x801151D4 +- `W8__md_MAIN_044`: 2 obj — md_MAIN_044/0x800CD63C:a1, md_MAIN_044/0x800CD63C:sp20 + +### c1767d5293b8:opaque +names: D80190448_t, Pt6_8017D65C, ResMapCol, S6, S8012D664_8012D664, S845EC_out, SV3, SV3_801802D0, SV3_8018287C, SV3_80182938, SV3_8018495C, SV3_80184C98, SV3_80184D50, SV3_80184E00, SV3_80184F48, SV3_80187654, SV3_801891E8, SV3_846B4, SV3x_80180ACC, SV3x_80184B30, SV3x_80184B30_801829C4, Trio, Vec3s16_8018388C, Vec3s16_80185380, VecB +cause: 25 names (6 B, all members placeholders) bound to 63 distinct objects, none bound to two names: 0x800D4A5C, 0x8013E22C(arg1), 0x80190448, md_MAIN_011/0x800D04F4:sp18, ov_SC01_000/0x8012D664:s, ov_SC01_005/0x801800C0:sp, ov_SC01_077/0x80184D50:out, ov_SC01_077/0x801856F8:in …; full list: tools/struct_twins.py --show c1767d5293b8:opaque +- `D80190448_t`: 2 obj — 0x80190448, ov_SC06_029/0x80181170:p3 +- `Pt6_8017D65C`: 2 obj — ov_SC03_121/0x8017D65C:p1, ov_SC03_121/0x8017D65C:p2 +- `ResMapCol`: 3 obj — aD_8006313A, aD_8006313C, aResourceIdMap +- `S6`: 2 obj — 0x800D4A5C, md_MAIN_011/0x800D04F4:sp18 +- `S8012D664_8012D664`: 1 obj — ov_SC01_000/0x8012D664:s +- `S845EC_out`: 1 obj — ov_SC01_084/0x801845EC:out +- `SV3`: 27 obj — ov_SC01_077/0x80184D50:out, ov_SC01_077/0x801856F8:in, ov_SC01_077/0x801856F8:out, ov_SC01_084/0x80186688:in, ov_SC01_084/0x80186688:out, ov_SC02_000/0x8018A128:in, ov_SC02_000/0x8018A128:out, ov_SC02_011/0x8018C5A4:out (+19) +- `SV3_801802D0`: 1 obj — ov_SC04_004/0x801802D0:pos +- `SV3_8018287C`: 1 obj — ov_SC02_017/0x8018287C:out +- `SV3_80182938`: 1 obj — ov_SC02_017/0x80182938:out +- `SV3_8018495C`: 1 obj — ov_SC02_017/0x8018495C:out +- `SV3_80184C98`: 1 obj — ov_SC02_011/0x80184C98:pt +- `SV3_80184D50`: 1 obj — ov_SC02_011/0x80184D50:pt +- `SV3_80184E00`: 3 obj — ov_SC02_011/0x80184E00:pt, ov_SC02_011/0x80184E00:sv1, ov_SC02_011/0x80184E00:sv2 +- `SV3_80184F48`: 3 obj — ov_SC02_011/0x80184F48:pt, ov_SC02_011/0x80184F48:sv1, ov_SC02_011/0x80184F48:sv2 +- `SV3_80187654`: 1 obj — ov_SC02_011/0x80187654:out +- `SV3_801891E8`: 1 obj — ov_SC02_011/0x801891E8:pt +- `SV3_846B4`: 1 obj — ov_SC01_084/0x801846B4:out +- `SV3x_80180ACC`: 1 obj — ov_SC02_041/0x80180ACC:out +- `SV3x_80184B30`: 1 obj — ov_SC03_090/0x80184B30:out +- `SV3x_80184B30_801829C4`: 1 obj — ov_SC03_104/0x801829C4:out +- `Trio`: 1 obj — ov_SC01_005/0x801800C0:sp +- `Vec3s16_8018388C`: 3 obj — ov_SC03_105/0x8018388C:diff, ov_SC03_105/0x8018388C:s, ov_SC03_105/0x8018388C:s1 +- `Vec3s16_80185380`: 2 obj — ov_SC03_105/0x80185380:diff, ov_SC03_105/0x80185380:s +- `VecB`: 1 obj — 0x8013E22C(arg1) + +### 846e0acadd6a +names: B8014, Blk8_80133CD4, Blk8_801463A0, Blk8_8017FF80, Blk8_8018048C, Blk8_801828E4, Blk8_SC01_077_801842C8, Blk8_SC03_001_80186B54, Blk8_SC07_007_8017D288, Blk8_SC07_007_8017D684, Blk8_md_MAIN_031, Blk8_md_SC07_003_801A3638, Blob8_80187664, Blob8_801876B0, Blob8_80189B30, Blob8_8018A47C, Blob8_8018A47C_8017DEA4, Blob8_8018A4C4, M8_801312D0, M8_8014C6F4, U8, V8 +cause: 22 names (8 B, all members placeholders) bound to 179 distinct objects, none bound to two names: 0x801152B0, 0x80126BE0, 0x80126BE8, 0x80126C38, 0x80126C40, 0x801274E8, 0x801274F0, 0x8017D7B8 …; full list: tools/struct_twins.py --show 846e0acadd6a +- `B8014`: 2 obj — shared/ov/0x8014BDE8:s0, shared/ov/0x8014BDE8:sp10 +- `Blk8_80133CD4`: 2 obj — 0x801152B0, ov_MAIN_012/0x80133CD4:s3 +- `Blk8_801463A0`: 2 obj — 0x80126BE0, 0x80126BE8 +- `Blk8_8017FF80`: 2 obj — ov_SC05_008/0x8017FF80:v0, ov_SC05_008/0x8017FF80:v1 +- `Blk8_8018048C`: 1 obj — ov_SC06_016/0x8018048C:out +- `Blk8_801828E4`: 6 obj — 0x801DDB48, ov_SC06_029/0x801828E4:dst, ov_SC06_029/0x801828E4:local, ov_SC06_029/0x801828E4:obj, ov_SC06_029/0x80184564:sv, ov_SC06_029/0x80184FF8:local +- `Blk8_SC01_077_801842C8`: 2 obj — ov_SC01_077/0x801842C8:a3, ov_SC01_077/0x801842C8:v0 +- `Blk8_SC03_001_80186B54`: 4 obj — ov_SC03_001/0x80186B54:dst, ov_SC03_001/0x80186B54:ent, ov_SC03_001/0x80186B54:next, ov_SC03_001/0x80186B54:src +- `Blk8_SC07_007_8017D288`: 2 obj — 0x801274F0, 0x801869C0 +- `Blk8_SC07_007_8017D684`: 3 obj — 0x80186A00, ov_SC07_007/0x8017D684:base, ov_SC07_007/0x8017D684:buffer +- `Blk8_md_MAIN_031`: 2 obj — md_MAIN_031/0x800CBCD4:a2, md_MAIN_031/0x800CBCD4:a3 +- `Blk8_md_SC07_003_801A3638`: 2 obj — md_SC07_003/0x801A3638:dst, md_SC07_003/0x801A3638:src +- `Blob8_80187664`: 2 obj — 0x801E2EF0, ov_SC02_005/0x80187664:tmp +- `Blob8_801876B0`: 2 obj — 0x801E2EF8, ov_SC02_005/0x801876B0:tmp +- `Blob8_80189B30`: 4 obj — 0x80126C38, 0x80126C40, 0x801E2F00, ov_SC02_005/0x80189B30:blob +- `Blob8_8018A47C`: 4 obj — 0x801E2F28, 0x801E2F48, ov_SC02_005/0x8018A47C:tmp, ov_SC02_005/0x8018A658:tmp +- `Blob8_8018A47C_8017DEA4`: 4 obj — 0x801274E8, 0x80185C5C, 0x80185C64, ov_SC07_010/0x8017DEA4:tmp +- `Blob8_8018A4C4`: 2 obj — 0x801E2F30, ov_SC02_005/0x8018A4C4:blobA +- `M8_801312D0`: 126 obj — 0x8017D7B8, 0x8017E194, 0x8017E1D0, 0x8017E25C, 0x8017E48C, 0x8017E600, 0x8017E654, 0x8017E6FC (+118) +- `M8_8014C6F4`: 1 obj — shared/ov/0x8014C6F4:a +- `U8`: 2 obj — shared/ov/0x80172358:a0, shared/ov/0x80172358:a1 +- `V8`: 2 obj — shared/ov/0x8012AE00:sp18, shared/ov/0x8012AE00:sp20 + +### ce8acea75f2c +names: Blk12, Prim126, PrimC59C, PrimC974, PrimCF90, PrimD538, PrimDF98, Prim_8017C710_t3f3d6beb, Prim_8017CD9C, Prim_8017CDF0, Prim_8017FB38, Prim_SC02_011_80180FE4, Prim_SC02_031_8017F5B4, Prim_SC03_014_8017FA5C, Prim_SC03_092_8017CE58, Prim_SC03_116_8017BF14, Prim_SC06_000_8017E35C, Prim_SC06_000_8017EF68, Prim_SC06_029_8017C954 +cause: 19 names (12 B, all members placeholders) bound to 38 distinct objects, none bound to two names: main/0x8002B00C:d, main/0x8002B00C:s, ov_SC01_077/0x8017C974:end, ov_SC01_077/0x8017C974:prim, ov_SC01_080/0x8017C59C:end, ov_SC01_080/0x8017C59C:prim, ov_SC02_000/0x8017D538:end, ov_SC02_000/0x8017D538:prim …; full list: tools/struct_twins.py --show ce8acea75f2c +- `Blk12`: 2 obj — main/0x8002B00C:d, main/0x8002B00C:s +- `Prim126`: 2 obj — ov_SC03_003/0x8017C6F4:end, ov_SC03_003/0x8017C6F4:prim +- `PrimC59C`: 2 obj — ov_SC01_080/0x8017C59C:end, ov_SC01_080/0x8017C59C:prim +- `PrimC974`: 2 obj — ov_SC01_077/0x8017C974:end, ov_SC01_077/0x8017C974:prim +- `PrimCF90`: 2 obj — ov_SC02_005/0x8017CF90:end, ov_SC02_005/0x8017CF90:prim +- `PrimD538`: 2 obj — ov_SC02_000/0x8017D538:end, ov_SC02_000/0x8017D538:prim +- `PrimDF98`: 2 obj — ov_SC03_028/0x8017DF98:end, ov_SC03_028/0x8017DF98:prim +- `Prim_8017C710_t3f3d6beb`: 2 obj — shared/ov/0x8017C710:part, shared/ov/0x8017C710:prim +- `Prim_8017CD9C`: 2 obj — ov_SC05_002/0x8017CD9C:part, ov_SC05_002/0x8017CD9C:prim +- `Prim_8017CDF0`: 2 obj — shared/ov/0x8017CDF0:part, shared/ov/0x8017CDF0:prim +- `Prim_8017FB38`: 2 obj — ov_SC03_111/0x8017FB38:part, ov_SC03_111/0x8017FB38:prim +- `Prim_SC02_011_80180FE4`: 2 obj — ov_SC02_011/0x80180FE4:part, ov_SC02_011/0x80180FE4:prim +- `Prim_SC02_031_8017F5B4`: 2 obj — ov_SC02_031/0x8017F5B4:part, ov_SC02_031/0x8017F5B4:prim +- `Prim_SC03_014_8017FA5C`: 2 obj — ov_SC03_014/0x8017FA5C:part, ov_SC03_014/0x8017FA5C:prim +- `Prim_SC03_092_8017CE58`: 2 obj — ov_SC03_092/0x8017CE58:part, ov_SC03_092/0x8017CE58:prim +- `Prim_SC03_116_8017BF14`: 2 obj — ov_SC03_116/0x8017BF14:part, ov_SC03_116/0x8017BF14:prim +- `Prim_SC06_000_8017E35C`: 2 obj — ov_SC06_000/0x8017E35C:part, ov_SC06_000/0x8017E35C:prim +- `Prim_SC06_000_8017EF68`: 2 obj — ov_SC06_000/0x8017EF68:part, ov_SC06_000/0x8017EF68:prim +- `Prim_SC06_029_8017C954`: 2 obj — ov_SC06_029/0x8017C954:part, ov_SC06_029/0x8017C954:prim + +### 142564f85464:opaque +names: D_801D0660_s, Ent_80186AE4, P4, Pair4_801B02DC, Prim4_8017DD28, Prim4_801E46A0, Prim4_801E9BE0, Prim4_801EFA40, Rec4, S9E, U16x2, U16x2L, U16x2N, UV_80181574 +cause: 14 names (4 B, all members placeholders); 1 bound to no object (UNBOUND), used only by: type Desc_80181574 (ov_SC03_111/0x80181574:d, ov_SC03_111/0x80181574:desc); the other 13 bound to 21 distinct objects, none bound to two names: 0x8011511A, 0x801202A0, 0x80185D5A, 0x80185D9E, 0x8018A3C0, 0x8018A3C2, 0x801B02DC, 0x801B02DE …; full list: tools/struct_twins.py --show 142564f85464:opaque +- `D_801D0660_s`: 2 obj — 0x801D0660, 0x801D0662 +- `Ent_80186AE4`: 2 obj — 0x801202A0, ov_SC02_000/0x80186AE4:p +- `P4`: 1 obj — 0x80185D5A +- `Pair4_801B02DC`: 2 obj — 0x801B02DC, 0x801B02DE +- `Prim4_8017DD28`: 1 obj — ov_MAIN_012/0x8017DD28:q +- `Prim4_801E46A0`: 1 obj — md_SC03_135/0x801E46A0:q +- `Prim4_801E9BE0`: 2 obj — 0x8011511A, md_SC04_027/0x801E9BE0:q +- `Prim4_801EFA40`: 1 obj — md_SC05_026/0x801EFA40:q +- `Rec4`: 2 obj — 0x8018A3C0, 0x8018A3C2 +- `S9E`: 1 obj — 0x80185D9E +- `U16x2`: 2 obj — md_SC07_004/0x801AE408:s1, md_SC07_004/0x801AE408:tmp +- `U16x2L`: 2 obj — md_SC07_004/0x801AE520:s1, md_SC07_004/0x801AE520:tmp +- `U16x2N`: 2 obj — md_SC07_004/0x801AB818:s1, md_SC07_004/0x801AB818:tmp +- `UV_80181574`: 0 obj — used by type Desc_80181574 (ov_SC03_111/0x80181574:d, ov_SC03_111/0x80181574:desc) + +### 6c480babe175:opaque +names: CdFileLoc, Cmd_801805C8, M8_8016B6BC, Pair8_8017DDC4, Pair8_8017DDC4_8018034C, Pair8_8017DDC4_80180F08, Pair8_8017DDC4_80182244, Pair_801B5E30, Rec8, Rec_80189AEC, S_D2394B, Struct_8017E784, Struct_80184C18, Tbl8_8017FC44 +cause: 14 names (8 B, all members placeholders) bound to 160 distinct objects, none bound to two names: 0x800D2394(arg5), 0x800D3764, 0x800D3768, 0x801804C4, 0x80180EA0, 0x80180EDC, 0x80180F68, 0x80181198 …; full list: tools/struct_twins.py --show 6c480babe175:opaque +- `CdFileLoc`: 7 obj — 0x800D3764, 0x800D3768, src/resident/0x800CFE60:cdFileLocTable, src/resident/0x800D0214:cdFileLocTable, src/resident/0x800D02D0:cdFileLocTable, src/resident/0x800D0488:cdFileLocTable, cdFileLocTable +- `Cmd_801805C8`: 2 obj — ov_SC03_095/0x801805C8:arg0, ov_SC03_095/0x801805C8:ptr +- `M8_8016B6BC`: 134 obj — 0x801804C4, 0x80180EA0, 0x80180EDC, 0x80180F68, 0x80181198, 0x8018130C, 0x80181360, 0x80181408 (+126) +- `Pair8_8017DDC4`: 1 obj — 0x801D0120 +- `Pair8_8017DDC4_8018034C`: 1 obj — 0x801D30D8 +- `Pair8_8017DDC4_80180F08`: 1 obj — 0x801B2EB0 +- `Pair8_8017DDC4_80182244`: 1 obj — 0x801DA750 +- `Pair_801B5E30`: 1 obj — 0x801B5E30 +- `Rec8`: 2 obj — 0x8019F074, 0x8019F078 +- `Rec_80189AEC`: 2 obj — 0x801F0020, 0x801F00A0 +- `S_D2394B`: 1 obj — 0x800D2394(arg5) +- `Struct_8017E784`: 2 obj — ov_SC03_096/0x8017E784:a0, ov_SC03_096/0x8017E784:ptr +- `Struct_80184C18`: 2 obj — 0x80183B84, 0x80184C18 +- `Tbl8_8017FC44`: 3 obj — 0x80189380, ov_SC03_092/0x8017FA74:rec, ov_SC03_092/0x8017FC44:p + +### 03b738d15c44 +names: Unkstruct_8017E2EC_2, Unkstruct_8017F8A8_2, Unkstruct_80181658_2, Unkstruct_80187B34_2, Unkstruct_80187EDC_2, Unkstruct_8018CD04_2, Unkstruct_8018F02C_2, Unkstruct_801AF368_2, VMask, W_8018893C, W_S40_8018B238, W_S40_8018B238_80187EA0 +cause: 12 names (4 B, all members placeholders); 8 bound to no object (UNBOUND), used only by: md_SC07_004/0x801AF368, ov_SC03_114/0x8017E2EC, ov_SC04_011/0x8018F02C, ov_SC04_016/0x8017F8A8, ov_SC06_000/0x80187B34, ov_SC06_006/0x80181658, ov_SC06_018/0x8018CD04, ov_SC06_032/0x80187EDC; the other 4 bound to 4 distinct objects, none bound to two names: main/0x80039308:q, ov_SC03_001/0x8018B238:ot, ov_SC03_124/0x80187EA0:ot, ov_SC03_124/0x8018893C:out; full list: tools/struct_twins.py --show 03b738d15c44 +- `Unkstruct_8017E2EC_2`: 0 obj — used by ov_SC03_114/0x8017E2EC +- `Unkstruct_8017F8A8_2`: 0 obj — used by ov_SC04_016/0x8017F8A8 +- `Unkstruct_80181658_2`: 0 obj — used by ov_SC06_006/0x80181658 +- `Unkstruct_80187B34_2`: 0 obj — used by ov_SC06_000/0x80187B34 +- `Unkstruct_80187EDC_2`: 0 obj — used by ov_SC06_032/0x80187EDC +- `Unkstruct_8018CD04_2`: 0 obj — used by ov_SC06_018/0x8018CD04 +- `Unkstruct_8018F02C_2`: 0 obj — used by ov_SC04_011/0x8018F02C +- `Unkstruct_801AF368_2`: 0 obj — used by md_SC07_004/0x801AF368 +- `VMask`: 1 obj — main/0x80039308:q +- `W_8018893C`: 1 obj — ov_SC03_124/0x8018893C:out +- `W_S40_8018B238`: 1 obj — ov_SC03_001/0x8018B238:ot +- `W_S40_8018B238_80187EA0`: 1 obj — ov_SC03_124/0x80187EA0:ot + +### 245ecac205e6:opaque +names: MainSlot, Rec12, Rec12_801888F4, Rec801944E8, S12_801AD700, S12_801AD914, S801563EC, S_80182618, Vec12_8017F370 +cause: 9 names (12 B, all members placeholders) bound to 275 distinct objects, none bound to two names: 0x801563EC(ret), 0x8017DC68, 0x8017E644, 0x8017E680, 0x8017E70C, 0x8017E93C, 0x8017EAB0, 0x8017EB04 …; same layout as PsyQ VECTOR, no name of the row bound to it; full list: tools/struct_twins.py --show 245ecac205e6:opaque +- `MainSlot`: 1 obj — main/main:p +- `Rec12`: 134 obj — 0x8017DC68, 0x8017E644, 0x8017E680, 0x8017E70C, 0x8017E93C, 0x8017EAB0, 0x8017EB04, 0x8017EBAC (+126) +- `Rec12_801888F4`: 1 obj — 0x8018F560 +- `Rec801944E8`: 1 obj — 0x801944E8 +- `S12_801AD700`: 1 obj — md_SC07_004/0x801AD700:sp10 +- `S12_801AD914`: 1 obj — md_SC07_004/0x801AD914:sp10 +- `S801563EC`: 134 obj — 0x801563EC(ret), 0x8017F364, 0x8017FD40, 0x8017FD7C, 0x8017FE08, 0x80180038, 0x801801AC, 0x80180200 (+126) +- `S_80182618`: 1 obj — ov_SC04_002/0x80182618:tmp +- `Vec12_8017F370`: 1 obj — ov_SC03_011/0x8017F370:v + +### 7db7d8817dcc +names: Blk4_80029774, Blk4_8018048C, Blk4_801A40CC, Blk4_SC03_097_8017D898, Blk4_md_SC07_004_801ACE5C, S4_800CD054, Unkstruct_801A01E8, W_8016BFD0 +cause: 8 names (4 B, all members placeholders) bound to 23 distinct objects, none bound to two names: 0x800BA2B8, 0x8019E28C, 0x801A01B4, 0x801A01E8, 0x801A0218, 0x801A021C, 0x801A0220, 0x801A94C4 …; full list: tools/struct_twins.py --show 7db7d8817dcc +- `Blk4_80029774`: 2 obj — 0x800BA2B8, main/0x80029774:dst +- `Blk4_8018048C`: 3 obj — 0x8019E28C, ov_SC06_016/0x8018048C:p, ov_SC06_016/0x8018048C:q +- `Blk4_801A40CC`: 4 obj — 0x801A01B4, 0x801AFEF8, md_SC07_004/0x801A40CC:p, md_SC07_004/0x801A40CC:q +- `Blk4_SC03_097_8017D898`: 3 obj — 0x801A94C4, 0x801A94C8, ov_SC03_097/0x80180158:b1 +- `Blk4_md_SC07_004_801ACE5C`: 6 obj — 0x801A0218, 0x801A021C, 0x801A0220, 0x801F8D1C, 0x801F8D5C, md_SC07_004/0x801ACE5C:p +- `S4_800CD054`: 1 obj — md_MAIN_043/0x800CD054:dp +- `Unkstruct_801A01E8`: 1 obj — 0x801A01E8 +- `W_8016BFD0`: 3 obj — ov_SC01_000/0x8016BFD0:a1, ov_SC01_000/0x8016BFD0:a2, ov_SC01_000/0x8016BFD0:a4 + +### 8da756678e6d +names: Bc8_80180E0C, Packed8, S80126B38, S80172C50, UnalignedPair, up +cause: 6 names (8 B, all members placeholders) bound to 13 distinct objects, none bound to two names: 0x80126B30, 0x80126B38, 0x80126C98, 0x8014CB9C(arg0), 0x80172C50(arg0), 0x801869B4, 0x801869BC, ov_SC03_030/0x80180E0C:dst …; full list: tools/struct_twins.py --show 8da756678e6d +- `Bc8_80180E0C`: 3 obj — 0x801869B4, 0x801869BC, ov_SC03_030/0x80180E0C:dst +- `Packed8`: 2 obj — 0x80126C98, 0x8014CB9C(arg0) +- `S80126B38`: 3 obj — 0x80126B38, shared/ov/0x801733FC:a1, shared/ov/0x80173460:a1 +- `S80172C50`: 2 obj — 0x80126B30, 0x80172C50(arg0) +- `UnalignedPair`: 1 obj — shared/ov/0x8014C8F0:arg0 +- `up`: 2 obj — shared/ov/0x8014C8C8:dst, shared/ov/0x8014C8C8:src + +### 92bd6306b11d +names: Blk12_80180BE0, Blk12_801854C4, Blk12_80185E68, Blk12_820F8, Elm12, Rsc12 +cause: 6 names (12 B, all members placeholders) bound to 11 distinct objects, none bound to two names: 0x80064D49, 0x80064D4A, 0x801B8770, 0x801CDD30, 0x801D55AC, 0x801DA910, ov_SC01_005/0x801820F8:pd12, ov_SC01_005/0x801820F8:t0 …; full list: tools/struct_twins.py --show 92bd6306b11d +- `Blk12_80180BE0`: 2 obj — ov_SC05_018/0x80180BE0:out, ov_SC05_018/0x80180BE0:v +- `Blk12_801854C4`: 2 obj — 0x801B8770, ov_SC04_018/0x801854C4:a0 +- `Blk12_80185E68`: 2 obj — 0x801D55AC, 0x801DA910 +- `Blk12_820F8`: 3 obj — 0x801CDD30, ov_SC01_005/0x801820F8:pd12, ov_SC01_005/0x801820F8:t0 +- `Elm12`: 1 obj — 0x80064D49 +- `Rsc12`: 1 obj — 0x80064D4A + +### 6ef8724a7464 +names: F20T, Obj20_80178D40, S801593E4, Sub_80155800_80155800, Sub_8015CD20 +cause: 5 names (20 B, all members placeholders); 3 bound to no object (UNBOUND), used only by: type Actor_80178D40 (0x80126B58, ov_MAIN_012/0x80178D40:Cmd_80178D40, ov_MAIN_012/0x80178D40:arg0 …), type Ent_80155800_80155800 (shared/ov/0x80155800:arg0), type P10 (0x80126B58, shared/ov/0x80144B9C:p10); the other 2 bound to 3 distinct objects, none bound to two names: ov_MAIN_012/0x8015CD20:sp, ov_SC07_010/0x80181204:v1, shared/ov/0x801593E4:v1; full list: tools/struct_twins.py --show 6ef8724a7464 +- `F20T`: 0 obj — used by type P10 (0x80126B58, shared/ov/0x80144B9C:p10) +- `Obj20_80178D40`: 0 obj — used by type Actor_80178D40 (0x80126B58, ov_MAIN_012/0x80178D40:Cmd_80178D40, ov_MAIN_012/0x80178D40:arg0 …) +- `S801593E4`: 2 obj — ov_SC07_010/0x80181204:v1, shared/ov/0x801593E4:v1 +- `Sub_80155800_80155800`: 0 obj — used by type Ent_80155800_80155800 (shared/ov/0x80155800:arg0) +- `Sub_8015CD20`: 1 obj — ov_MAIN_012/0x8015CD20:sp + +### 313fe9a920e0 +names: A098Rec, Struct800D2E20, Struct800D2E6C, Struct800D3104 +cause: 4 names (26 B, all members placeholders); 1 bound to no object (UNBOUND), used only by: type A098Ctx (0x8003A098(arg0)); the other 3 bound to 3 distinct objects, none bound to two names: 0x800D2E20(arg0), 0x800D2E6C(arg0), 0x800D3104(arg0); full list: tools/struct_twins.py --show 313fe9a920e0 +- `A098Rec`: 0 obj — used by type A098Ctx (0x8003A098(arg0)) +- `Struct800D2E20`: 1 obj — 0x800D2E20(arg0) +- `Struct800D2E6C`: 1 obj — 0x800D2E6C(arg0) +- `Struct800D3104`: 1 obj — 0x800D3104(arg0) + +### 9865e09a793d +names: Blk3_8017D730, Blk3_801E40A8, Blk3_801E95E8, Blk3_801EF448 +cause: 4 names (3 B, all members placeholders) bound to 8 distinct objects, none bound to two names: 0x80183F30, 0x801E26C0, 0x801E7C00, 0x801EDA60, md_SC03_135/0x801E40A8:arr, md_SC04_027/0x801E95E8:arr, md_SC05_026/0x801EF448:arr, ov_MAIN_012/0x8017D730:arr; full list: tools/struct_twins.py --show 9865e09a793d +- `Blk3_8017D730`: 2 obj — 0x80183F30, ov_MAIN_012/0x8017D730:arr +- `Blk3_801E40A8`: 2 obj — 0x801E26C0, md_SC03_135/0x801E40A8:arr +- `Blk3_801E95E8`: 2 obj — 0x801E7C00, md_SC04_027/0x801E95E8:arr +- `Blk3_801EF448`: 2 obj — 0x801EDA60, md_SC05_026/0x801EF448:arr + +### a0f7100333b8:opaque +names: Prim4_8017E978, Prim4_8017E978_8018B478, Rec4_801891F4, UV_80185214 +cause: 4 names (4 B, all members placeholders); 1 bound to no object (UNBOUND), used only by: type Prim_80185214 (ov_SC06_029/0x80185214:prim); the other 3 bound to 5 distinct objects, none bound to two names: 0x801891F4, 0x801891F6, ov_SC01_005/0x8017E978:p, ov_SC03_001/0x8018B478:p, ov_SC06_025/0x80180F70:base; same layout as PsyQ DVECTOR, no name of the row bound to it; full list: tools/struct_twins.py --show a0f7100333b8:opaque +- `Prim4_8017E978`: 1 obj — ov_SC01_005/0x8017E978:p +- `Prim4_8017E978_8018B478`: 1 obj — ov_SC03_001/0x8018B478:p +- `Rec4_801891F4`: 3 obj — 0x801891F4, 0x801891F6, ov_SC06_025/0x80180F70:base +- `UV_80185214`: 0 obj — used by type Prim_80185214 (ov_SC06_029/0x80185214:prim) + +### afc6a8e495a5:opaque +names: Box_80133784, Ent_8018A224, Rec_8017ECD4, Rec_EDC0 +cause: 4 names (8 B, all members placeholders) bound to 273 distinct objects, none bound to two names: 0x8017D890, 0x8017D894, 0x8017E26C, 0x8017E270, 0x8017E2A8, 0x8017E2AC, 0x8017E334, 0x8017E338 …; full list: tools/struct_twins.py --show afc6a8e495a5:opaque +- `Box_80133784`: 267 obj — 0x8017D890, 0x8017D894, 0x8017E26C, 0x8017E270, 0x8017E2A8, 0x8017E2AC, 0x8017E334, 0x8017E338 (+259) +- `Ent_8018A224`: 1 obj — 0x8018A224(arg0) +- `Rec_8017ECD4`: 1 obj — 0x801853A8 +- `Rec_EDC0`: 4 obj — 0x80185094, 0x80185098, 0x801AAD6C, ov_SC07_001/0x8017EDC0:rec + +### ceca4ea3ade1:opaque +names: Cam8012E138, SV3_SC07_002_801829F0, Src_8013B598_8013B598, Src_8013B6A0_8013B6A0 +cause: 4 names (6 B, all members placeholders) bound to 4 distinct objects, none bound to two names: ov_SC01_000/0x8013B598:a1, ov_SC01_000/0x8013B6A0:src, ov_SC07_002/0x801829F0:sv, shared/ov/0x8012E138:cam; full list: tools/struct_twins.py --show ceca4ea3ade1:opaque +- `Cam8012E138`: 1 obj — shared/ov/0x8012E138:cam +- `SV3_SC07_002_801829F0`: 1 obj — ov_SC07_002/0x801829F0:sv +- `Src_8013B598_8013B598`: 1 obj — ov_SC01_000/0x8013B598:a1 +- `Src_8013B6A0_8013B6A0`: 1 obj — ov_SC01_000/0x8013B6A0:src + ### f1dcb3a42fc8 names: Rec_801825D8, Rec_80184FF8, S8012C658, S8017FF9C_sp cause: 4 names (20 B, all members placeholders) bound to 5 distinct objects, none bound to two names: ov_SC02_011/0x801890C8:sp, ov_SC04_003/0x8017FF9C:sp, ov_SC06_029/0x801825D8:rec, ov_SC06_029/0x80184FF8:rec, shared/ov/0x8012C658:sp; full list: tools/struct_twins.py --show f1dcb3a42fc8 @@ -20,26 +538,13 @@ cause: 4 names (20 B, all members placeholders) bound to 5 distinct objects, non - `S8012C658`: 2 obj — ov_SC02_011/0x801890C8:sp, shared/ov/0x8012C658:sp - `S8017FF9C_sp`: 1 obj — ov_SC04_003/0x8017FF9C:sp -### b519bad67107:opaque -names: Local_8017EE34, Local_80181C84, Local_801870E8 -cause: 3 names (20 B, all members placeholders) bound to 4 distinct objects, none bound to two names: ov_SC03_105/0x8017EE34:local, ov_SC03_105/0x80181C84:local, ov_SC03_105/0x80183D38:local, ov_SC03_105/0x801870E8:local; full list: tools/struct_twins.py --show b519bad67107:opaque -- `Local_8017EE34`: 2 obj — ov_SC03_105/0x8017EE34:local, ov_SC03_105/0x80183D38:local -- `Local_80181C84`: 1 obj — ov_SC03_105/0x80181C84:local -- `Local_801870E8`: 1 obj — ov_SC03_105/0x801870E8:local - -### c80fac242f04 -names: Mat801A8E34, Mat_80183C9C, Mtx_A8CE0 -cause: 3 names (32 B, all members placeholders) bound to 4 distinct objects, none bound to two names: md_SC07_004/0x801A8CE0:mtx, md_SC07_004/0x801A8E34:buf, ov_SC06_000/0x80183C9C:mat; full list: tools/struct_twins.py --show c80fac242f04 -- `Mat801A8E34`: 1 obj — md_SC07_004/0x801A8E34:buf -- `Mat_80183C9C`: 1 obj — ov_SC06_000/0x80183C9C:mat -- `Mtx_A8CE0`: 2 obj — md_SC07_004/0x801A8CE0:mtx, __attribute__(ret) - -### 9ba0ae408dd4 -names: Drv_8017E330, Drv_8017E550, Drv_8017E878 -cause: 3 names (56 B, all members placeholders) bound to 6 distinct objects, none bound to two names: 0x801F80E4, ov_SC06_006/0x8017E330:p, ov_SC06_006/0x8017E550:a0, ov_SC06_006/0x8017E550:p, ov_SC06_006/0x8017E878:a0, ov_SC06_006/0x8017E878:p; full list: tools/struct_twins.py --show 9ba0ae408dd4 -- `Drv_8017E330`: 2 obj — 0x801F80E4, ov_SC06_006/0x8017E330:p -- `Drv_8017E550`: 2 obj — ov_SC06_006/0x8017E550:a0, ov_SC06_006/0x8017E550:p -- `Drv_8017E878`: 2 obj — ov_SC06_006/0x8017E878:a0, ov_SC06_006/0x8017E878:p +### ff66866c62b0 +names: Ent_80183280, Unkstruct_801824D4, Unkstruct_80182560, Unkstruct_801E5894 +cause: 4 names (4 B, all members placeholders) bound to 4 distinct objects, none bound to two names: 0x80183280(arg0), md_SC02_009/0x801E5894:a0, ov_SC06_000/0x801824D4:a0, ov_SC06_000/0x80182560:arg0; full list: tools/struct_twins.py --show ff66866c62b0 +- `Ent_80183280`: 1 obj — 0x80183280(arg0) +- `Unkstruct_801824D4`: 1 obj — ov_SC06_000/0x801824D4:a0 +- `Unkstruct_80182560`: 1 obj — ov_SC06_000/0x80182560:arg0 +- `Unkstruct_801E5894`: 1 obj — md_SC02_009/0x801E5894:a0 ### 8944ddcbe454:opaque names: Blk36_800296F8, Blob36, SW20 @@ -48,6 +553,34 @@ cause: 3 names (36 B, all members placeholders) bound to 6 distinct objects, non - `Blob36`: 2 obj — 0x80078E50, src/resident/0x800D185C:arg0 - `SW20`: 1 obj — 0x800D4B70 +### 9568f57fb00f:opaque +names: OtBlk_80180894, OtBlk_80182890_8018FB5C, OtBlk_8018FE0C +cause: 3 names (20 B, all members placeholders) bound to 3 distinct objects, none bound to two names: 0x800A651C; full list: tools/struct_twins.py --show 9568f57fb00f:opaque +- `OtBlk_80180894`: 1 obj — 0x800A651C +- `OtBlk_80182890_8018FB5C`: 1 obj — D_800A651C_v +- `OtBlk_8018FE0C`: 1 obj — aD800A651C + +### 9ba0ae408dd4 +names: Drv_8017E330, Drv_8017E550, Drv_8017E878 +cause: 3 names (56 B, all members placeholders) bound to 6 distinct objects, none bound to two names: 0x801F80E4, ov_SC06_006/0x8017E330:p, ov_SC06_006/0x8017E550:a0, ov_SC06_006/0x8017E550:p, ov_SC06_006/0x8017E878:a0, ov_SC06_006/0x8017E878:p; full list: tools/struct_twins.py --show 9ba0ae408dd4 +- `Drv_8017E330`: 2 obj — 0x801F80E4, ov_SC06_006/0x8017E330:p +- `Drv_8017E550`: 2 obj — ov_SC06_006/0x8017E550:a0, ov_SC06_006/0x8017E550:p +- `Drv_8017E878`: 2 obj — ov_SC06_006/0x8017E878:a0, ov_SC06_006/0x8017E878:p + +### a5b3b6c549ea +names: Blk32u, Entry_8016E95C, Quad_td +cause: 3 names (32 B, all members placeholders) bound to 6 distinct objects, none bound to two names: 0x80063AEC, 0x80075840, 0x80115218, ov_SC01_000/0x8016E95C:p, ov_SC05_010/0x80180108:arg0, ov_SC07_010/0x8017FA94:quad; full list: tools/struct_twins.py --show a5b3b6c549ea +- `Blk32u`: 2 obj — 0x80063AEC, 0x80075840 +- `Entry_8016E95C`: 3 obj — 0x80115218, ov_SC01_000/0x8016E95C:p, ov_SC05_010/0x80180108:arg0 +- `Quad_td`: 1 obj — ov_SC07_010/0x8017FA94:quad + +### b519bad67107:opaque +names: Local_8017EE34, Local_80181C84, Local_801870E8 +cause: 3 names (20 B, all members placeholders) bound to 4 distinct objects, none bound to two names: ov_SC03_105/0x8017EE34:local, ov_SC03_105/0x80181C84:local, ov_SC03_105/0x80183D38:local, ov_SC03_105/0x801870E8:local; full list: tools/struct_twins.py --show b519bad67107:opaque +- `Local_8017EE34`: 2 obj — ov_SC03_105/0x8017EE34:local, ov_SC03_105/0x80183D38:local +- `Local_80181C84`: 1 obj — ov_SC03_105/0x80181C84:local +- `Local_801870E8`: 1 obj — ov_SC03_105/0x801870E8:local + ### c2ba48790859 names: W8, W8_, func_8002EE64_b cause: 3 names (1 B, all members placeholders) bound to 4 distinct objects, none bound to two names: 0x80076242, 0x80076243, main/0x8002EE64:b; full list: tools/struct_twins.py --show c2ba48790859 @@ -55,35 +588,18 @@ cause: 3 names (1 B, all members placeholders) bound to 4 distinct objects, none - `W8_`: 1 obj — D_80076242_ - `func_8002EE64_b`: 1 obj — main/0x8002EE64:b -### ac91ae2d8aa0:opaque -names: S800D22E4, vec -cause: 2 names (28 B, all members placeholders) bound to 77 distinct objects, none bound to two names: 0x800D22E4(arg0), 0x8012931C(arg0), 0x8012AD80(arg0), 0x80185238(arg0), 0x801879E8(arg0), md_SC07_004/0x801A72DC:a0, md_SC07_004/0x801ABC8C:a0, md_SC07_004/0x801AC234:a0 …; full list: tools/struct_twins.py --show ac91ae2d8aa0:opaque -- `S800D22E4`: 1 obj — 0x800D22E4(arg0) -- `vec`: 76 obj — 0x8012931C(arg0), 0x8012AD80(arg0), 0x80185238(arg0), 0x801879E8(arg0), md_SC07_004/0x801A72DC:a0, md_SC07_004/0x801ABC8C:a0, md_SC07_004/0x801AC234:a0, md_SC07_004/0x801AC940:a1 (+68) +### f39ecda931df:opaque +names: Rec_md_MAIN_047_800CCBC0, UAlign12_80181F40, UAlign12_8018833C +cause: 3 names (12 B, all members placeholders) bound to 6 distinct objects, none bound to two names: md_MAIN_047/0x800CCBC0:e, md_MAIN_047/0x800CCBC0:q, ov_SC06_020/0x80181F40:a2, ov_SC06_020/0x80181F40:param_1, ov_SC06_024/0x8018833C:a2, ov_SC06_024/0x8018833C:param_1; full list: tools/struct_twins.py --show f39ecda931df:opaque +- `Rec_md_MAIN_047_800CCBC0`: 2 obj — md_MAIN_047/0x800CCBC0:e, md_MAIN_047/0x800CCBC0:q +- `UAlign12_80181F40`: 2 obj — ov_SC06_020/0x80181F40:a2, ov_SC06_020/0x80181F40:param_1 +- `UAlign12_8018833C`: 2 obj — ov_SC06_024/0x8018833C:a2, ov_SC06_024/0x8018833C:param_1 -### 82c6e3650290:opaque -names: Gte8_8017F2FC, Rec_80180808 -cause: 2 names (8 B, all members placeholders) bound to 3 distinct objects, none bound to two names: 0x801B1B50, ov_SC02_021/0x8017F2FC:sp10, ov_SC06_025/0x80180808:rec; full list: tools/struct_twins.py --show 82c6e3650290:opaque -- `Gte8_8017F2FC`: 1 obj — ov_SC02_021/0x8017F2FC:sp10 -- `Rec_80180808`: 2 obj — 0x801B1B50, ov_SC06_025/0x80180808:rec - -### aa66418d079c:opaque -names: Blk16_80126940, Pos16_8018743C -cause: 2 names (16 B, all members placeholders) bound to 3 distinct objects, none bound to two names: ov_SC06_000/0x80181AB4:sp10, ov_SC06_029/0x8018743C:from, ov_SC06_029/0x8018743C:to; full list: tools/struct_twins.py --show aa66418d079c:opaque -- `Blk16_80126940`: 1 obj — ov_SC06_000/0x80181AB4:sp10 -- `Pos16_8018743C`: 2 obj — ov_SC06_029/0x8018743C:from, ov_SC06_029/0x8018743C:to - -### 1dd90dc86138 -names: Ent80183F28, Ent_80184058 -cause: 2 names (236 B, all members placeholders) bound to 2 distinct objects, none bound to two names: 0x80183F28(arg0), 0x80184058(arg0); full list: tools/struct_twins.py --show 1dd90dc86138 -- `Ent80183F28`: 1 obj — 0x80183F28(arg0) -- `Ent_80184058`: 1 obj — 0x80184058(arg0) - -### d60a32e09c91 -names: P8, S72 -cause: 2 names (8 B, all members placeholders) bound to 5 distinct objects, none bound to two names: 0x80185D28, 0x80185D2A, 0x80185D2C, 0x80185D2E, 0x80185D72; full list: tools/struct_twins.py --show d60a32e09c91 -- `P8`: 4 obj — 0x80185D28, 0x80185D2A, 0x80185D2C, 0x80185D2E -- `S72`: 1 obj — 0x80185D72 +### 00bfd8673c28 +names: Panel_8017E978_8017E1AC, Panel_801E46A0 +cause: 2 names (32 B, all members placeholders) bound to 3 distinct objects, none bound to two names: 0x80115134, 0x8017E1AC(arg1), ov_SC01_009/0x8017E1AC:w; full list: tools/struct_twins.py --show 00bfd8673c28 +- `Panel_8017E978_8017E1AC`: 2 obj — 0x8017E1AC(arg1), ov_SC01_009/0x8017E1AC:w +- `Panel_801E46A0`: 1 obj — 0x80115134 ### 08944be666a1 names: Sub8017EBC4, Sub_80181BA0 @@ -91,35 +607,23 @@ cause: 2 names (20 B, all members placeholders) bound to 3 distinct objects, non - `Sub8017EBC4`: 2 obj — ov_SC06_029/0x8017EBC4:func_8012C1B8, ov_SC06_029/0x8017EBC4:sp - `Sub_80181BA0`: 1 obj — ov_SC04_011/0x80181BA0:p -### 474e1fa40ab6 -names: Actor_8017E550, Actor_8017E878 -cause: 2 names (156 B, all members placeholders) bound to 2 distinct objects, none bound to two names: 0x8017E550(arg0), 0x8017E878(arg0); full list: tools/struct_twins.py --show 474e1fa40ab6 -- `Actor_8017E550`: 1 obj — 0x8017E550(arg0) -- `Actor_8017E878`: 1 obj — 0x8017E878(arg0) - ### 12fe36cd7e07 names: Struct801E79D8, Struct801EF318 cause: 2 names (16 B, all members placeholders) bound to 3 distinct objects, none bound to two names: 0x801E2498, 0x801E79D8, 0x801EF318; full list: tools/struct_twins.py --show 12fe36cd7e07 - `Struct801E79D8`: 1 obj — 0x801E79D8 - `Struct801EF318`: 2 obj — 0x801E2498, 0x801EF318 -### c6e867e46e6f -names: V16x4, Vec4s16_8018423C -cause: 2 names (8 B, all members placeholders) bound to 7 distinct objects, none bound to two names: 0x80188984, ov_SC03_105/0x8018423C:out, ov_SC03_105/0x8018423C:pos, ov_SC03_105/0x8018423C:tmp, ov_SC03_105/0x8018423C:vec, ov_SC06_025/0x8017F664:a, ov_SC06_025/0x8017F664:b; full list: tools/struct_twins.py --show c6e867e46e6f -- `V16x4`: 3 obj — 0x80188984, ov_SC06_025/0x8017F664:a, ov_SC06_025/0x8017F664:b -- `Vec4s16_8018423C`: 4 obj — ov_SC03_105/0x8018423C:out, ov_SC03_105/0x8018423C:pos, ov_SC03_105/0x8018423C:tmp, ov_SC03_105/0x8018423C:vec +### 1dd90dc86138 +names: Ent80183F28, Ent_80184058 +cause: 2 names (236 B, all members placeholders) bound to 2 distinct objects, none bound to two names: 0x80183F28(arg0), 0x80184058(arg0); full list: tools/struct_twins.py --show 1dd90dc86138 +- `Ent80183F28`: 1 obj — 0x80183F28(arg0) +- `Ent_80184058`: 1 obj — 0x80184058(arg0) -### 64db0612c4d4 -names: Work_801832E0, Work_80183634 -cause: 2 names (236 B, all members placeholders) bound to 2 distinct objects, none bound to two names: 0x801832E0(arg0), 0x80183634(arg0); full list: tools/struct_twins.py --show 64db0612c4d4 -- `Work_801832E0`: 1 obj — 0x801832E0(arg0) -- `Work_80183634`: 1 obj — 0x80183634(arg0) - -### cc89b444f3c5 -names: EntA, Ent_SC07_010_8017AE2C -cause: 2 names (256 B, all members placeholders) bound to 4 distinct objects, none bound to two names: ov_SC07_010/0x8017E5B8:func_8012C588, ov_SC07_010/0x8017E5B8:p, ov_SC07_010/0x8017E70C:func_8012C588, ov_SC07_010/0x8017E70C:p; full list: tools/struct_twins.py --show cc89b444f3c5 -- `EntA`: 2 obj — ov_SC07_010/0x8017E5B8:func_8012C588, ov_SC07_010/0x8017E5B8:p -- `Ent_SC07_010_8017AE2C`: 2 obj — ov_SC07_010/0x8017E70C:func_8012C588, ov_SC07_010/0x8017E70C:p +### 1f2e73d77112 +names: Rec801806C8_s, Rec80182744_s +cause: 2 names (12 B, all members placeholders); 2 bound to no object (UNBOUND), used only by: type Rec801806C8 (0x8018E344, ov_SC02_017/0x801806C8:a0), type Rec80182744 (0x8018BCD8, ov_SC03_029/0x80182744:a0); full list: tools/struct_twins.py --show 1f2e73d77112 +- `Rec801806C8_s`: 0 obj — used by type Rec801806C8 (0x8018E344, ov_SC02_017/0x801806C8:a0) +- `Rec80182744_s`: 0 obj — used by type Rec80182744 (0x8018BCD8, ov_SC03_029/0x80182744:a0) ### 2816963b1259 names: Obj800D302C, Struct800D2FEC @@ -133,8 +637,97 @@ cause: 2 names (72 B, all members placeholders) bound to 4 distinct objects, non - `Voice336A8`: 2 obj — 0x800A4988, main/0x800336A8:vo - `VoiceF80`: 2 obj — main/0x80030F80:e, main/0x80030F80:i +### 474e1fa40ab6 +names: Actor_8017E550, Actor_8017E878 +cause: 2 names (156 B, all members placeholders) bound to 2 distinct objects, none bound to two names: 0x8017E550(arg0), 0x8017E878(arg0); full list: tools/struct_twins.py --show 474e1fa40ab6 +- `Actor_8017E550`: 1 obj — 0x8017E550(arg0) +- `Actor_8017E878`: 1 obj — 0x8017E878(arg0) + +### 5f9112725d5b +names: Src80172E20, StructB58_8017FAFC +cause: 2 names (16 B, all members placeholders) bound to 4 distinct objects, none bound to two names: 0x80126B58, 0x80127508, ov_SC06_020/0x8017FAFC:b58, shared/ov/0x80172E20:p; full list: tools/struct_twins.py --show 5f9112725d5b +- `Src80172E20`: 2 obj — 0x80127508, shared/ov/0x80172E20:p +- `StructB58_8017FAFC`: 2 obj — 0x80126B58, ov_SC06_020/0x8017FAFC:b58 + +### 64db0612c4d4 +names: Work_801832E0, Work_80183634 +cause: 2 names (236 B, all members placeholders) bound to 2 distinct objects, none bound to two names: 0x801832E0(arg0), 0x80183634(arg0); full list: tools/struct_twins.py --show 64db0612c4d4 +- `Work_801832E0`: 1 obj — 0x801832E0(arg0) +- `Work_80183634`: 1 obj — 0x80183634(arg0) + +### 82c6e3650290:opaque +names: Gte8_8017F2FC, Rec_80180808 +cause: 2 names (8 B, all members placeholders) bound to 3 distinct objects, none bound to two names: 0x801B1B50, ov_SC02_021/0x8017F2FC:sp10, ov_SC06_025/0x80180808:rec; full list: tools/struct_twins.py --show 82c6e3650290:opaque +- `Gte8_8017F2FC`: 1 obj — ov_SC02_021/0x8017F2FC:sp10 +- `Rec_80180808`: 2 obj — 0x801B1B50, ov_SC06_025/0x80180808:rec + +### 927525df50d4 +names: E_13BD74, E_13C08C_8013C08C +cause: 2 names (16 B, all members placeholders) bound to 2 distinct objects, none bound to two names: ov_MAIN_012/0x8013BD74:a0, shared/ov/0x8013C08C:a0; full list: tools/struct_twins.py --show 927525df50d4 +- `E_13BD74`: 1 obj — ov_MAIN_012/0x8013BD74:a0 +- `E_13C08C_8013C08C`: 1 obj — shared/ov/0x8013C08C:a0 + +### 9c8d61900c8d +names: PRIM_8018FE20, Prim_8017DAC4 +cause: 2 names (56 B, all members placeholders) bound to 4 distinct objects, none bound to two names: ov_SC04_011/0x8018FE20:pp, ov_SC04_011/0x8018FE20:prim, shared/ov/0x8017DAC4:prim, shared/ov/0x8017DAC4:q; full list: tools/struct_twins.py --show 9c8d61900c8d +- `PRIM_8018FE20`: 2 obj — ov_SC04_011/0x8018FE20:pp, ov_SC04_011/0x8018FE20:prim +- `Prim_8017DAC4`: 2 obj — shared/ov/0x8017DAC4:prim, shared/ov/0x8017DAC4:q + +### 9dec8574d64e +names: Actor4C, actor4c +cause: 2 names (428 B, all members placeholders); 1 bound to no object (UNBOUND), used only by: type Actor4C (0x80126748, 0x80126848, shared/ov/0x8015444C:arg0 …); the other 1 bound to 5 distinct objects, none bound to two names: 0x80126748, 0x80126848, shared/ov/0x8015444C:arg0, shared/ov/0x8015444C:op, shared/ov/0x8015444C:p; full list: tools/struct_twins.py --show 9dec8574d64e +- `Actor4C`: 5 obj — 0x80126748, 0x80126848, shared/ov/0x8015444C:arg0, shared/ov/0x8015444C:op, shared/ov/0x8015444C:p +- `actor4c`: 0 obj — used by type Actor4C (0x80126748, 0x80126848, shared/ov/0x8015444C:arg0 …) + +### a3d1be6495e4 +names: Rec027, Rec_8017C738 +cause: 2 names (12 B, all members placeholders); 1 bound to no object (UNBOUND), used only by: type Blk027 (0x801D3148, 0x801D9F40, ov_SC02_027/0x8017BFEC:dst …); the other 1 bound to 4 distinct objects, none bound to two names: 0x801D3148, ov_SC02_027/0x8017C738:a0, ov_SC02_027/0x8017C738:p, ov_SC02_027/0x8017C738:q; full list: tools/struct_twins.py --show a3d1be6495e4 +- `Rec027`: 0 obj — used by type Blk027 (0x801D3148, 0x801D9F40, ov_SC02_027/0x8017BFEC:dst …) +- `Rec_8017C738`: 4 obj — 0x801D3148, ov_SC02_027/0x8017C738:a0, ov_SC02_027/0x8017C738:p, ov_SC02_027/0x8017C738:q + +### aa66418d079c:opaque +names: Blk16_80126940, Pos16_8018743C +cause: 2 names (16 B, all members placeholders) bound to 3 distinct objects, none bound to two names: ov_SC06_000/0x80181AB4:sp10, ov_SC06_029/0x8018743C:from, ov_SC06_029/0x8018743C:to; full list: tools/struct_twins.py --show aa66418d079c:opaque +- `Blk16_80126940`: 1 obj — ov_SC06_000/0x80181AB4:sp10 +- `Pos16_8018743C`: 2 obj — ov_SC06_029/0x8018743C:from, ov_SC06_029/0x8018743C:to + +### ac91ae2d8aa0:opaque +names: S800D22E4, vec +cause: 2 names (28 B, all members placeholders) bound to 77 distinct objects, none bound to two names: 0x800D22E4(arg0), 0x8012931C(arg0), 0x8012AD80(arg0), 0x80185238(arg0), 0x801879E8(arg0), md_SC07_004/0x801A72DC:a0, md_SC07_004/0x801ABC8C:a0, md_SC07_004/0x801AC234:a0 …; full list: tools/struct_twins.py --show ac91ae2d8aa0:opaque +- `S800D22E4`: 1 obj — 0x800D22E4(arg0) +- `vec`: 76 obj — 0x8012931C(arg0), 0x8012AD80(arg0), 0x80185238(arg0), 0x801879E8(arg0), md_SC07_004/0x801A72DC:a0, md_SC07_004/0x801ABC8C:a0, md_SC07_004/0x801AC234:a0, md_SC07_004/0x801AC940:a1 (+68) + +### c6e867e46e6f +names: V16x4, Vec4s16_8018423C +cause: 2 names (8 B, all members placeholders) bound to 7 distinct objects, none bound to two names: 0x80188984, ov_SC03_105/0x8018423C:out, ov_SC03_105/0x8018423C:pos, ov_SC03_105/0x8018423C:tmp, ov_SC03_105/0x8018423C:vec, ov_SC06_025/0x8017F664:a, ov_SC06_025/0x8017F664:b; full list: tools/struct_twins.py --show c6e867e46e6f +- `V16x4`: 3 obj — 0x80188984, ov_SC06_025/0x8017F664:a, ov_SC06_025/0x8017F664:b +- `Vec4s16_8018423C`: 4 obj — ov_SC03_105/0x8018423C:out, ov_SC03_105/0x8018423C:pos, ov_SC03_105/0x8018423C:tmp, ov_SC03_105/0x8018423C:vec + +### c80fac242f04 +names: Mat801A8E34, Mat_80183C9C +cause: 2 names (32 B, all members placeholders) bound to 2 distinct objects, none bound to two names: md_SC07_004/0x801A8E34:buf, ov_SC06_000/0x80183C9C:mat; full list: tools/struct_twins.py --show c80fac242f04 +- `Mat801A8E34`: 1 obj — md_SC07_004/0x801A8E34:buf +- `Mat_80183C9C`: 1 obj — ov_SC06_000/0x80183C9C:mat + +### cc89b444f3c5 +names: EntA, Ent_SC07_010_8017AE2C +cause: 2 names (256 B, all members placeholders) bound to 4 distinct objects, none bound to two names: ov_SC07_010/0x8017E5B8:func_8012C588, ov_SC07_010/0x8017E5B8:p, ov_SC07_010/0x8017E70C:func_8012C588, ov_SC07_010/0x8017E70C:p; full list: tools/struct_twins.py --show cc89b444f3c5 +- `EntA`: 2 obj — ov_SC07_010/0x8017E5B8:func_8012C588, ov_SC07_010/0x8017E5B8:p +- `Ent_SC07_010_8017AE2C`: 2 obj — ov_SC07_010/0x8017E70C:func_8012C588, ov_SC07_010/0x8017E70C:p + +### d60a32e09c91 +names: P8, S72 +cause: 2 names (8 B, all members placeholders) bound to 5 distinct objects, none bound to two names: 0x80185D28, 0x80185D2A, 0x80185D2C, 0x80185D2E, 0x80185D72; full list: tools/struct_twins.py --show d60a32e09c91 +- `P8`: 4 obj — 0x80185D28, 0x80185D2A, 0x80185D2C, 0x80185D2E +- `S72`: 1 obj — 0x80185D72 + +### f94245c68571 +names: S_8013BC7C_8013BC7C, T68_8017FC44 +cause: 2 names (108 B, all members placeholders) bound to 2 distinct objects, none bound to two names: ov_SC01_000/0x8013BC7C:arg0, ov_SC03_092/0x8017FC44:a0; full list: tools/struct_twins.py --show f94245c68571 +- `S_8013BC7C_8013BC7C`: 1 obj — ov_SC01_000/0x8013BC7C:arg0 +- `T68_8017FC44`: 1 obj — ov_SC03_092/0x8017FC44:a0 + ## Dead kept - Unkstruct_80126B58 — defined in the generated `head_types` block of include/struct_types.h; `--fold-dead` never edits generated text (T5.1.c3b) - LineF2_8018F694 — used only inside a multi-line macro body in ov_SC06_018/032/033 (census cannot see it); deleting it broke cc1 (`undeclared`), T5.1.c3b - actor4c — tag of Actor4C, named only by its own self-pointer member `unk20`; the self-reference needs the tag -- actor4c_8015444C — tag of Actor4C_8015444C_t9f81a8d5, same self-pointer `unk20` reason diff --git a/tools/struct_twins.py b/tools/struct_twins.py index e9da45f514..09c397d7e8 100644 --- a/tools/struct_twins.py +++ b/tools/struct_twins.py @@ -7,9 +7,12 @@ This tool joins each name to the objects it is bound to in the source, and class SEPARATE every name is bound to >= 1 object and no object is bound to two names of the class -> a `### ` section SHARED two or more names bound to the same object -> not listed; printed as a fold candidate with the shared object - SDK the base layout hash equals a Sony PsyQ struct's (PSYQ names defined in the canonical type files / include/, hashed - by the census's own parser and Resolver) -> not listed (folded onto the SDK name elsewhere) - UNBOUND some name has no bound object (dead / definition-only / macro-only) -> not listed, no per-name evidence exists + UNBOUND some name has no bound object (definition-only / member-only / macro-only) -> a `### ` section whose cause + cites the use sites of the unbound names (U: the functions using them, the types naming them as a member or alias); + a class none of whose cites carries an address is not written and is reported (T5.1.c7) + SDK is not a class but a note (T5.1.c7): the base layout hash equals a Sony PsyQ struct's (PSYQ names defined in the canonical + type files / include/, hashed by the census's own parser and Resolver); the SDK-named defs themselves were folded in T5.1.c6, + the placeholders left in the row are classified by their bindings like any other and the cause names the SDK layout Rows: dup_gating.tsv's tier-2 rows plus the ones the current `## Twins` list takes out of it (type_census.json), so --write is idempotent. @@ -23,6 +26,8 @@ Objects (the binding a use of the name establishes; scanned from src/**/*.{c,h} A same routine address + same local / slot, across binaries (the copies edited apart by levers and pins) AG a global used by the routine at one address, counted only across binaries (per-overlay instances of one table) F a member of an aggregate (no address) + U a use site, no object (evidence for UNBOUND only): the using function (/0x) or, outside a function, the + name the enclosing file-scope declaration defines (a struct naming it as a member, an alias typedef) Each G/L object is joined to its struct_map cluster through /body_base_type.json when present (`--sites` run). Usage: @@ -129,6 +134,12 @@ def addr_of(fn): def scan_file(rel, text, wanted, sink): """append (name, key, cite, where) for every binding of a wanted name in one file""" text = COMMENT.sub(lambda m: re.sub(r"[^\n]", " ", m.group(0)), text) + # a macro whose body names a wanted type: each use of the macro inside a function is a use (U) of that type + macros = {} + for m in re.finditer(r"(?m)^[ \t]*#[ \t]*define[ \t]+(\w+)((?:.*\\\n)*.*)$", text): + hit = set(re.findall(r"[A-Za-z_]\w*", m.group(2))) & wanted + if hit: + macros[m.group(1)] = hit text = re.sub(r"(?m)^[ \t]*#.*$", "", text) toks, lines, ln, last = [], [], 1, 0 for m in TOK.finditer(text): @@ -143,6 +154,7 @@ def scan_file(rel, text, wanted, sink): knr = None # (fn, [param idents]) between a K&R definition's `)` and its `{` hdrpend, fnpend, body0 = [], [], 0 # sink indexes of a header's P bindings / a body's L+P bindings; body start token used_by, s0 = collections.defaultdict(set), len(sink) # D_ symbol -> addresses of this file's functions using it + upend = [] # (name, where) of wanted names used outside a function: owner = the declaration's defined name stmt = 0 n = len(toks) for i, t in enumerate(toks): @@ -171,6 +183,7 @@ def scan_file(rel, text, wanted, sink): fn, fn_depth = knr[0], 1 if depth == 0 and fn: fnpend, hdrpend, body0 = hdrpend, [], i + upend = [] # a definition's header: its params are P bindings, not declaration uses knr = None depth += 1 stmt = i + 1 @@ -209,10 +222,23 @@ def scan_file(rel, text, wanted, sink): if t == ";": if depth == 0 and not parens and not knr: hdrpend = [] + if depth == 0 and not parens: + owner = toks[i - 1] if i and not knr and re.match(r"[A-Za-z_]\w*$", toks[i - 1]) else None + for nm, wh in upend: + if owner and owner != nm: + sink.append((nm, ("U", owner), owner, wh)) + upend = [] stmt = i + 1 continue + if t in macros and fn: + for nm in macros[t]: + sink.append((nm, ("U", f"{binary}/{addr_of(fn)}"), f"{binary}/{addr_of(fn)}", f"{rel}:{lines[i]}")) if t not in wanted: continue + if fn: + sink.append((t, ("U", f"{binary}/{addr_of(fn)}"), f"{binary}/{addr_of(fn)}", f"{rel}:{lines[i]}")) + else: + upend.append((t, f"{rel}:{lines[i]}")) if stmt < n and toks[stmt] == "typedef": continue j = i + 1 @@ -288,9 +314,8 @@ def struct_map_join(census): return g, loc, True -def collect(census): - rows = load_rows(census) - wanted = {nm for r in rows for nm in r["names"]} +def scan_all(wanted): + """name -> key -> [cite, [where]] over src/ and include/""" sink = [] files = sorted(p for d in ("src", "include") for p in (REPO / d).rglob("*") if p.suffix in (".c", ".h") and p.is_file()) for p in files: @@ -301,10 +326,22 @@ def collect(census): if not set(re.findall(r"[A-Za-z_]\w*", text)) & wanted: continue scan_file(rel, text, wanted, sink) - bind = collections.defaultdict(dict) # name -> key -> (cite, [where]) + bind = collections.defaultdict(dict) for name, key, cite, where in sink: e = bind[name].setdefault(key, [cite, []]) e[1].append(where) + return bind + + +def collect(census): + rows = load_rows(census) + wanted = {nm for r in rows for nm in r["names"]} + bind = scan_all(wanted) # name -> key -> (cite, [where]) + # a type naming an unbound name as a member / alias (U owner): its own bound objects locate the use (one level) + unb = {nm for nm in wanted if not any(k[0] not in ("F", "AG", "U") for k in bind.get(nm, {}))} + owners = {k[1] for nm in unb for k in bind.get(nm, {}) if k[0] == "U" and "/" not in k[1]} + obind = scan_all(owners) if owners else {} + owner_objs = {o: cites(obind.get(o, {}), cap=3) for o in owners} psyq = psyq_layouts() out = [] for r in rows: @@ -315,32 +352,63 @@ def collect(census): for key in bind.get(nm, {}): if key[0] == "AG": owners[key[:2]].add((nm, key[2])) - elif key[0] != "F": + elif key[0] not in ("F", "U"): owners[key].add((nm, None)) shared = {k: {nm for nm, _ in v} for k, v in owners.items() if len({nm for nm, _ in v}) > 1 and (k[0] != "AG" or len({b for _, b in v}) > 1)} - unbound = [nm for nm in r["names"] if not any(k[0] not in ("F", "AG") for k in bind.get(nm, {}))] - klass = "SDK" if sdk else "SHARED" if shared else "UNBOUND" if unbound else "SEPARATE" - out.append(dict(r, klass=klass, sdk=sdk, shared=shared, unbound=unbound, + unbound = [nm for nm in r["names"] if not any(k[0] not in ("F", "AG", "U") for k in bind.get(nm, {}))] + klass = "SHARED" if shared else "UNBOUND" if unbound else "SEPARATE" + out.append(dict(r, klass=klass, sdk=sdk, shared=shared, unbound=unbound, owner_objs=owner_objs, bind={nm: bind.get(nm, {}) for nm in r["names"]})) return out -def cites(objs, cap=MAX_CITES): - cs = sorted({c for k, (c, _) in objs.items() if k[0] != "F"}, key=lambda c: ("0x" not in c, c)) +def has_addr(ci): + return "0x" in ci or re.search(r"80[0-9A-Fa-f]{6}", ci) is not None + + +def cites(objs, cap=MAX_CITES, kinds=None): + cs = sorted({c for k, (c, _) in objs.items() if (k[0] in kinds if kinds else k[0] not in ("F", "U"))}, + key=lambda c: (not has_addr(c), c)) return cs[:cap], len(cs) +def uses(c, nm): + """an unbound name's use-site cites: the using functions, the types naming it (member / alias) with their own objects""" + def one(ci): + if "/" in ci: + return ci + cs, total = c["owner_objs"].get(ci, ([], 0)) + return f"type {ci}" + (f" ({', '.join(cs)}{' …' if total > len(cs) else ''})" if cs else "") + return sorted({one(ci) for k, (ci, _) in c["bind"][nm].items() if k[0] == "U"}, key=lambda x: (not has_addr(x), x)) + + def section(c): + """the `### ` text, or None when its cause would carry no address (UNBOUND without addressed use sites)""" names = sorted(c["names"]) - allc = sorted({ci for nm in names for k, (ci, _) in c["bind"][nm].items() if k[0] != "F"}) + unb = set(c["unbound"]) if c["klass"] == "UNBOUND" else set() + allc = sorted({ci for nm in names if nm not in unb for k, (ci, _) in c["bind"][nm].items() if k[0] not in ("F", "U")}) addr = [x for x in allc if "0x" in x] - nobj = len(allc) - lines = [f"### {c['lhash']}", "names: " + ", ".join(names), - f"cause: {len(names)} names ({c['size']} B, all members placeholders) bound to {nobj} distinct objects, none bound to two " - f"names: {', '.join(addr[:MAX_CITES])}{' …' if len(addr) > MAX_CITES else ''}; " - f"full list: tools/struct_twins.py --show {c['lhash']}"] + head = f"cause: {len(names)} names ({c['size']} B, all members placeholders)" + bound = (f"bound to {len(allc)} distinct objects, none bound to two names: {', '.join(addr[:MAX_CITES])}" + f"{' …' if len(addr) > MAX_CITES else ''}") + if unb: + ua = sorted({u for nm in unb for u in uses(c, nm) if has_addr(u)}) + if not ua and not addr: + return None + cause = (f"{head}; {len(unb)} bound to no object (UNBOUND), used only by: {', '.join(ua[:MAX_CITES]) or 'no addressed site'}" + f"{' …' if len(ua) > MAX_CITES else ''}" + (f"; the other {len(names) - len(unb)} {bound}" if len(unb) < len(names) else "")) + else: + cause = f"{head} {bound}" + if c["sdk"]: + cause += f"; same layout as PsyQ {', '.join(c['sdk'])}, no name of the row bound to it" + lines = [f"### {c['lhash']}", "names: " + ", ".join(names), cause + f"; full list: tools/struct_twins.py --show {c['lhash']}"] for nm in names: + if nm in unb: + us = uses(c, nm) + lines.append(f"- `{nm}`: 0 obj — used by {', '.join(us[:MAX_CITES]) if us else 'nothing outside its definition'}" + f"{f' (+{len(us) - MAX_CITES})' if len(us) > MAX_CITES else ''}") + continue cs, total = cites(c["bind"][nm]) more = f" (+{total - len(cs)})" if total > len(cs) else "" lines.append(f"- `{nm}`: {total} obj — {', '.join(cs)}{more}") @@ -354,9 +422,13 @@ def write(classes): sys.exit("struct_twins: no `## Twins` heading in docs/struct-twins.md") rest = re.search(r"(?m)^## ", text[m.end():]) end = m.end() + rest.start() if rest else len(text) - body = "\n\n".join(section(c) for c in classes if c["klass"] == "SEPARATE") + # fixed order (rows move between dup_gating.tsv and the listed set as the doc changes): most names first, then lhash + secs = [(c, section(c)) for c in sorted(classes, key=lambda c: (-len(c["names"]), c["lhash"])) + if c["klass"] in ("SEPARATE", "UNBOUND")] + body = "\n\n".join(s for _c, s in secs if s) body = ("\n\n" + body + "\n\n") if body else "\n" TWINS_DOC.write_text(text[:m.end()] + "\n" + body + text[end:]) + return [s for s in secs if s[1]], [c for c, s in secs if not s] def main(): @@ -382,8 +454,8 @@ def main(): f"{' struct_map ' + ','.join(sm[:4]) if sm else ''}") return cnt = collections.Counter(c["klass"] for c in classes) - print(f"struct_twins: {len(classes)} tier-2 rows · SEPARATE {cnt['SEPARATE']} · SHARED {cnt['SHARED']} · SDK {cnt['SDK']} · " - f"UNBOUND {cnt['UNBOUND']}") + print(f"struct_twins: {len(classes)} tier-2 rows · SEPARATE {cnt['SEPARATE']} · SHARED {cnt['SHARED']} · " + f"UNBOUND {cnt['UNBOUND']} · (SDK layout {sum(1 for c in classes if c['sdk'])})") for c in classes: if c["klass"] == "SHARED": def cite_of(k, nm): @@ -392,13 +464,17 @@ def main(): ci = cite_of(k, min(v)) + (f" (routine {k[1]})" if k[0] in ("A", "AG") else "") print(f" SHARED {c['lhash']} ({len(c['names'])} names, {len(c['shared'])} shared objects): e.g. {ci} <- {', '.join(sorted(v)[:6])}" f"{' …' if len(v) > 6 else ''}") - elif c["klass"] == "SDK": - print(f" SDK {c['lhash']} ({len(c['names'])} names) layout of {', '.join(c['sdk'])}") elif c["klass"] == "UNBOUND": - print(f" UNBOUND {c['lhash']} ({len(c['names'])} names): {', '.join(c['unbound'][:6])}{' …' if len(c['unbound']) > 6 else ''}") + noaddr = [nm for nm in c["unbound"] if not any(has_addr(u) for u in uses(c, nm))] + print(f" UNBOUND {c['lhash']} ({len(c['names'])} names): {', '.join(c['unbound'][:6])}{' …' if len(c['unbound']) > 6 else ''}" + + (f"; no addressed use: {', '.join(noaddr)}" if noaddr else "")) + if c["sdk"] and c["klass"] != "SEPARATE": + print(f" {c['lhash']}: same layout as PsyQ {', '.join(c['sdk'])}") if a.write: - write(classes) - print(f"struct_twins: wrote {cnt['SEPARATE']} `### ` sections to docs/struct-twins.md ## Twins") + done, left = write(classes) + print(f"struct_twins: wrote {len(done)} `### ` sections to docs/struct-twins.md ## Twins") + for c in left: + print(f" NOT WRITTEN {c['lhash']}: no address in any bound object or use site of {', '.join(c['unbound'])}") if __name__ == "__main__":