Files
BFM-decomp/docs/struct-twins.md
T

141 lines
9.7 KiB
Markdown

# Struct twins
`tools/type_census.py --check-structs` reads this file (`TWINS_DOC`). G62: layout twins without evidence stay apart.
- `## Twins`: one `### <lhash>` section per tier-2 duplicate row (plain or `<lhash>:opaque`) kept as separate types, with a
`names:` line (the row's names, as a set) and a `cause:` line naming at least one address (8 hex digits or `0x…`). A listed
row does not count in `dup_classes`. An absent lhash, a name-set mismatch or an addressless cause counts in `twins_stale`.
- `## Dead kept`: `- Name — cause` bullets; a listed canon name does not count in `dead`. A name that is not dead or no longer
defined in the canonical headers counts in `twins_stale`.
## Twins
<!-- generated by tools/struct_twins.py --write; regenerate, do not hand-edit -->
### 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
- `Rec_801825D8`: 1 obj — ov_SC06_029/0x801825D8:rec
- `Rec_80184FF8`: 1 obj — ov_SC06_029/0x80184FF8:rec
- `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
### 8944ddcbe454:opaque
names: Blk36_800296F8, Blob36, SW20
cause: 3 names (36 B, all members placeholders) bound to 6 distinct objects, none bound to two names: 0x800298BC(arg0), 0x80078E50, 0x80079204, 0x800D4B70, main/0x800296F8:arg0, src/resident/0x800D185C:arg0; full list: tools/struct_twins.py --show 8944ddcbe454:opaque
- `Blk36_800296F8`: 3 obj — 0x800298BC(arg0), 0x80079204, main/0x800296F8:arg0
- `Blob36`: 2 obj — 0x80078E50, src/resident/0x800D185C:arg0
- `SW20`: 1 obj — 0x800D4B70
### 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
- `W8`: 2 obj — 0x80076242, 0x80076243
- `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)
### 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
### 08944be666a1
names: Sub8017EBC4, Sub_80181BA0
cause: 2 names (20 B, all members placeholders) bound to 3 distinct objects, none bound to two names: ov_SC04_011/0x80181BA0:p, ov_SC06_029/0x8017EBC4:func_8012C1B8, ov_SC06_029/0x8017EBC4:sp; full list: tools/struct_twins.py --show 08944be666a1
- `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
### 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
### 2816963b1259
names: Obj800D302C, Struct800D2FEC
cause: 2 names (44 B, all members placeholders) bound to 2 distinct objects, none bound to two names: 0x800D2FEC(arg0), 0x800D302C(arg0); full list: tools/struct_twins.py --show 2816963b1259
- `Obj800D302C`: 1 obj — 0x800D302C(arg0)
- `Struct800D2FEC`: 1 obj — 0x800D2FEC(arg0)
### 2e57efa3d051
names: Voice336A8, VoiceF80
cause: 2 names (72 B, all members placeholders) bound to 4 distinct objects, none bound to two names: 0x800A4988, main/0x80030F80:e, main/0x80030F80:i, main/0x800336A8:vo; full list: tools/struct_twins.py --show 2e57efa3d051
- `Voice336A8`: 2 obj — 0x800A4988, main/0x800336A8:vo
- `VoiceF80`: 2 obj — main/0x80030F80:e, main/0x80030F80:i
## 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