From da26c05d674085afaa5727006efe6354acfc59ff Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Fri, 11 Sep 2026 23:54:15 -0600 Subject: [PATCH] =?UTF-8?q?phase-37:=20T1=20=E2=98=91=20=E2=80=94=20tools/?= =?UTF-8?q?type=5Fcensus.py=20+=20the=20struct=20map:=207,261=20struct=20d?= =?UTF-8?q?efinitions=20(525=20layouts,=20206=20duplicate=20classes=20/=20?= =?UTF-8?q?2,789=20names,=2039=20VARIANT),=20503,016=20raw=20pointer-cast?= =?UTF-8?q?=20dereferences=20in=20four=20forms=20(coverage=20OK;=20+=2018,?= =?UTF-8?q?912=20address-of,=2036,681=20typed=20cast-member),=2098,648=20l?= =?UTF-8?q?ying=20declarations=20/=201,609=20callees,=2018,760=20evidence-?= =?UTF-8?q?clustered=20types=20explaining=2099.2=20%=20of=20sites,=2024=20?= =?UTF-8?q?parked=20P36=20classes=20in=20parked.tsv,=20controls=204/4;=20l?= =?UTF-8?q?ever=5Fcensus=20controls=20re-keyed=20and=20--strict=20made=20l?= =?UTF-8?q?iteral=20(6,717=20direct=20GTE=20statements=20in=20bodies);=20p?= =?UTF-8?q?rogress.py=20types=20block=20+=20README=20sentence=20+=202=20co?= =?UTF-8?q?rrections;=20the=20readability=20series=20read=20by=20column=20?= =?UTF-8?q?name=20with=2016=20census=20columns;=20docs/struct-map.md;=20SE?= =?UTF-8?q?TUP=20=C2=A7P37=20S106;=20dictionary=20row;=20kit=20corpus=20|?= =?UTF-8?q?=20=F0=9F=9B=91=20T2=20NEXT=20(the=20probe,=20Max)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .run/P36/census/lever_census.json | 20 +- .run/P36/census/lever_census.txt | 10 +- .run/P37/census/parked.tsv | 30 + .run/P37/census/struct_map_top.json | 1 + .run/P37/census/type_census.json | 7432 +++++++++++++++++ .run/P37/census/type_census.txt | 33 + README.md | 2 + config/tool_dictionary.tsv | 1 + decomp-architect/corpus/tools/INDEX.md | 5 +- .../corpus/tools/P10/lever_census.py | 30 +- .../corpus/tools/P10/readability_progress.py | 79 +- .../corpus/tools/P10/type_census.py | 1885 +++++ decomp-architect/corpus/tools/P9/progress.py | 37 +- decomp-architect/tools/MANIFEST.md | 5 +- docs/SETUP.md | 40 + docs/lever-progress.tsv | 1 + docs/levers.md | 1 + docs/progress.json | 48 + docs/readability-progress.tsv | 3 +- docs/readability.md | 12 +- docs/struct-map.md | 210 + docs/tool-index.md | 15 +- docs/wiki/Reference-index.md | 1 + phase-ends/CURRENT_PHASE.md | 107 +- tools/lever_census.py | 30 +- tools/progress.py | 37 +- tools/readability_progress.py | 79 +- tools/type_census.py | 1885 +++++ 29 files changed, 11919 insertions(+), 121 deletions(-) create mode 100644 .run/P37/census/parked.tsv create mode 100644 .run/P37/census/struct_map_top.json create mode 100644 .run/P37/census/type_census.json create mode 100644 .run/P37/census/type_census.txt create mode 100644 decomp-architect/corpus/tools/P10/type_census.py create mode 100644 docs/struct-map.md create mode 100644 tools/type_census.py diff --git a/.gitignore b/.gitignore index c6480489a..496c7c4ec 100644 --- a/.gitignore +++ b/.gitignore @@ -542,6 +542,7 @@ unsloth_compiled_cache/ !/.run/P37/census/ /.run/P37/census/* !/.run/P37/census/*.json +/.run/P37/census/struct_map.json !/.run/P37/census/*.txt !/.run/P37/census/*.md !/.run/P37/census/*.tsv diff --git a/.run/P36/census/lever_census.json b/.run/P36/census/lever_census.json index fc734deed..47337a7d3 100644 --- a/.run/P36/census/lever_census.json +++ b/.run/P36/census/lever_census.json @@ -219,25 +219,25 @@ }, "controls": [ { - "expected": 45, + "expected": 14, "got": 14, "name": "src/800.c func_800226C0 pins", "ok": true, - "status": "N-A" + "status": "OK" }, { - "expected": 26, + "expected": 8, "got": 8, "name": "src/shared/ov/func_80178004.h pins", "ok": true, - "status": "N-A" + "status": "OK" }, { - "expected": 3, - "got": 0, - "name": "ov_SC03_006 func_80184034 bare-name pins", + "expected": 2, + "got": 2, + "name": "ov_SC03_006 func_801896EC bare-name pins", "ok": true, - "status": "N-A" + "status": "OK" }, { "expected": 0, @@ -280,7 +280,7 @@ } }, "coverage_ok": true, - "elapsed_s": 22.5, + "elapsed_s": 21.8, "generated": "2026-09-11", "gte_levers": { "direct": 356, @@ -291,7 +291,7 @@ "via_macro": 94, "what": "GTE ops whose clobbers exceed the canonical macro's (a scheduling steer): class-B levers INSIDE the headline number since T5 (2026-09-09), marked, 0 at the close" }, - "head": "60c4bb1cc", + "head": "23fc5d215", "headers": 3181, "levers_AB": { "asm": 1869, diff --git a/.run/P36/census/lever_census.txt b/.run/P36/census/lever_census.txt index 1fc581bea..07ce42054 100644 --- a/.run/P36/census/lever_census.txt +++ b/.run/P36/census/lever_census.txt @@ -12,7 +12,7 @@ lever_census: 218 binaries · 4,121 TUs + 3,181 headers · coverage OK · unclas E asm-label 7802 1370 6432 1100 161 2090 0 7802 {'asm-label': 7802} F builtin 445 445 0 428 27 302 0 445 {'builtin': 445} G attribute 76 1 75 1 1 40 0 76 {'attribute': 76} - UNION A–D: 5,746 bodies · 1,007 distinct (addresses normalized) · 110 multi-copy classes holding 4,849 bodies · by kind {'ov': 5352, 'shared': 159, 'main': 124, 'md': 105, 'resident': 6} + UNION A–D: 5,746 bodies · 1,007 distinct (addresses normalized) · 110 multi-copy classes holding 4,849 bodies · by kind {'ov': 5352, 'main': 124, 'md': 105, 'shared': 159, 'resident': 6} THE PHASE'S NUMBER (pins + asm statements, GTE excluded): 4,010 sites in 1,980 bodies (674 distinct) · marked !FAKE 4,010 · UNMARKED 0 orphan !FAKE markers (no pin/asm site on the line nor below): 0 marked ordinary-C fakes kept by Drew's S104 ruling (a) (`do { } while (0)`, dead initialisers; NOT levers): 53 @@ -25,8 +25,8 @@ lever_census: 218 binaries · 4,121 TUs + 3,181 headers · coverage OK · unclas gte mnemonics: {'gte_ldv0': 768, 'gte_stlvnl': 593, 'gte_stsxy': 457, 'gte_rtps': 448, 'gte_stflg': 433, 'gte_rtpt': 361, 'gte_SetRotMatrix': 253, 'gte_stsxy3': 245, 'gte_SetTransMatrix': 231, 'gte_rtv0tr': 229, 'gte_ldv3': 186, 'gte_ldv3c': 184, 'gte_stsv': 161, 'lwc2': 158, 'gte_stsz4': 149, 'gte_stsz3': 147, 'gte_stszotz': 134, 'gte_dpcl': 134, 'gte_stclmv': 114, 'gte_stsxy3_f3': 111, 'gte_nclip': 108, 'gte_stopz': 108, 'gte_stsxy3c': 108, 'gte_rtir': 81, 'gte_stsxy3_ft3': 79, 'gte_ldclmv': 78, 'gte_avsz4': 65, 'gte_stotz': 61, 'gte_ldrgb': 30, 'gte_nccs': 25} asm-bearing macro definitions: 314 (20 names, 3 with >1 text) kinds {'gte': 150, 'launder': 154, 'instruction': 9, 'barrier': 1} controls (R39): - src/800.c func_800226C0 pins got 14 expected 45 N-A - src/shared/ov/func_80178004.h pins got 8 expected 26 N-A - ov_SC03_006 func_80184034 bare-name pins got 0 expected 3 N-A + src/800.c func_800226C0 pins got 14 expected 14 OK + src/shared/ov/func_80178004.h pins got 8 expected 8 OK + ov_SC03_006 func_801896EC bare-name pins got 2 expected 2 OK engine_prelude.h asm sites (a macro definition only) got 0 expected 0 OK - elapsed 22.5 s + elapsed 21.8 s diff --git a/.run/P37/census/parked.tsv b/.run/P37/census/parked.tsv new file mode 100644 index 000000000..d5f845d4f --- /dev/null +++ b/.run/P37/census/parked.tsv @@ -0,0 +1,30 @@ +# .run/P37/census/parked.tsv — the Phase-36 parked classes, in one file with their reasons (type_census.write_parked; generated). +# A RESIDUE class of the P36 ledger whose exemplar is in .run/P36/s105/pick.py's PARK set; `needs` is read from the pack's mechanism.md headline +# (signature | carve | gte | struct | irreducible | ?); `patches` lists the ready patch files. The second block lists PARK names whose latest +# ledger verdict is LEVER-FREE (a minimum-lever bank — its surviving marked sites are counted by lever_census, not here). +fn alias tu copies sites needed_per_copy kinds regs needs pack patches headline +func_80157D20 ov_SC04_011 src/ov_SC04_011/ov_SC04_011_jr_80154C24.c 132 264 2 pin $4 $5 signature .run/P36/agents/ov_SC04_011__func_80157D20 **Final score: 0 (BYTE-IDENTICAL, 21/21 words + relocs) — but NOT body-only.** +func_8013CF68 ov_SC04_011 src/ov_SC04_011/ov_SC04_011_jr_8013C98C.c 134 134 1 instruction signature .run/P36/agents/ov_SC04_011__func_8013CF68 **Result: NOT closed.** The best score is still **10** (ORDER, 63/63). `PACK/body.c` is c9's `h2.c`, unchanged, +func_80178970 ov_SC04_011 src/ov_SC04_011/ov_SC04_011_jr_801734BC.c 127 127 1 pin $2 struct .run/P36/agents/ov_SC04_011__func_80178970 **Final score: 2, NOT closed.** `PACK/body.c` is the S102 agent's early-return body. I re-scored it (score 2, 14 vs 15 +func_80180324 ov_SC04_007 src/ov_SC04_007/ov_SC04_007_jr_8017BEBC.c 7 56 8 cast,keepalive,pin $0 ? .run/P36/agents/ov_SC04_007__func_80180324 **Result: `--try` score 0 (328/328), on this function AND all ten other members of its family (table: +func_80181D1C ov_SC04_004 src/ov_SC04_004/ov_SC04_004_jr_8017AE2C.c 4 20 5 barrier,keepalive,pin $2 $3 ? +func_8017FC5C ov_SC03_115 src/ov_SC03_115/ov_SC03_115_jr_8017BEBC.c 9 18 2 keepalive,pin $2 signature .run/P36/agents/ov_SC03_115__func_8017FC5C .run/P36/agents/ov_SC03_115__func_8017FC5C/scratch/tu_d5.diff;.run/P36/agents/ov_SC03_115__func_8017FC5C/scratch/tu_p1.diff **Result: score 0, lever-free, whole object byte-identical** — but it is NOT a `--body`-only change: the function has to +func_80168828 ov_SC01_077 src/ov_SC01_077/ov_SC01_077_jr_8015C32C.c 8 16 2 pin $3 $4 ? .run/P36/agents/ov_SC01_077__func_80168828 +func_80183CC4 ov_SC03_094 src/ov_SC03_094/ov_SC03_094_jr_8017BEBC.c 3 12 4 keepalive,pin $16 $2 $3 signature .run/P36/agents/ov_SC03_094__func_80183CC4 **Result: score 0, ZERO levers, plain C. SIGNATURE CHANGE: `void` → `s32`** (parked for the structs phase per Drew S104 (d), +func_80185578 ov_SC06_022 src/ov_SC06_022/ov_SC06_022_jr_80184A28.c 6 12 2 instruction,keepalive signature .run/P36/agents/ov_SC06_022__func_80185578 **Result: score 0, and the whole object is byte-identical (`objdump -drz -s` diff empty), BUT THE CLOSE NEEDS A CHANGE +func_80178970 ov_MAIN_012 src/ov_MAIN_012/ov_MAIN_012_jr_80171B4C.c 7 7 1 pin $2 ? .run/P36/agents/ov_MAIN_012__func_80178970 +func_80015608 main src/800.c 1 4 4 pin $20 $22 $3 signature .run/P36/agents/main__func_80015608 Best body: `body.c` (= scratch/b0/v1.c tidied). Residual: ONE register — `y0`'s `subu` and its `sll s8,…,16` use +func_8001BBBC main src/800.c 1 4 4 launder,pin $2 $3 $8 struct .run/P36/agents/main__func_8001BBBC Best body: `body.c` (= scratch/f6.c): plain field stores in the target's order, then the addPrim tail spelled with +func_801834A4 ov_SC03_105 src/ov_SC03_105/ov_SC03_105_jr_80181C84.c 1 3 3 launder,pin $2 struct .run/P36/agents/ov_SC03_105__func_801834A4 `body.c` (= `body_minlever.c` = `scratch/n1.c` + marks): `--try` score 0 (106/106). +func_80188DF4 ov_SC03_091 src/ov_SC03_091/ov_SC03_091_jr_8018326C.c 3 3 1 keepalive signature .run/P36/agents/ov_SC03_091__func_80188DF4 **Result: score 0, ZERO levers, plain C.** Six TUs checked (the brief said 3 copies share the text; the other three have the +func_80157D20 ov_SC01_077 src/ov_SC01_077/ov_SC01_077_jr_80154C24.c 1 2 2 pin $4 $5 signature .run/P36/agents/ov_SC04_011__func_80157D20 **Final score: 0 (BYTE-IDENTICAL, 21/21 words + relocs) — but NOT body-only.** +func_80035210 main src/800_b_2.c 1 1 1 pin $3 signature .run/P36/agents/main__func_80035210 Score 4, REG-caller, 24 vs 24: the post-`SpuWrite` read-modify-write of `D_80076218` (`lw; addu ..,s1; sw`) lives in `$v0` +func_80037144 main src/800_c.c 1 1 1 barrier struct .run/P36/agents/main__func_80037144 **Result.** No levers: `body.c` is byte-identical ONCE LINKED; `--try` scores it **2**, and both points are relocation +func_800384A8 main src/800_c.c 1 1 1 pin $4 signature .run/P36/agents/main__func_800384A8 Two instructions: the target indexes `D_800B9CD8` with the raw `$a0` (`sll v0,a0,7; subu v0,v0,a0`), the lever-free body +func_801805EC ov_SC02_027 src/ov_SC02_027/ov_SC02_027_jr_8017D898.c 1 1 1 barrier struct .run/P36/agents/ov_SC02_027__func_801805EC (a) Residual: score 7 (COUNT, 67 vs 68) — after the u16 store `obj->0x14 += a0->0x2A - cam->0x12` the target RELOADS +func_80185D44 ov_SC06_029 src/ov_SC06_029/ov_SC06_029_jr_8017C954.c 1 1 1 launder struct .run/P36/agents/ov_SC06_029__func_80185D44 **Result: score 0 with ONE marked lever (the tree's launder, re-marked in the step-9 format). Levers 1 -> 1. +func_80188A30 ov_SC04_011 src/ov_SC04_011/ov_SC04_011_jr_8017D494.c 1 1 1 barrier signature .run/P36/agents/ov_SC04_011__func_80188A30 **Result: score 0 in plain C with a SIGNATURE change — PARKED.** The return type is `s32` instead of `void`, the body is the +func_801A1E94 md_SC07_004 src/md_SC07_004/md_SC07_004.c 1 1 1 pin $4 signature .run/P36/agents/md_SC07_004__func_801A1E94 .run/P36/agents/md_SC07_004__func_801A1E94/signature.diff (a) Residual: body_free.c is 41 ins vs 42 — the target's `move s0,a0` in the prologue is missing and `$s0/$s1` are swapped. +func_801A5094 md_SC07_004 src/md_SC07_004/md_SC07_004.c 1 1 1 barrier struct .run/P36/agents/md_SC07_004__func_801A5094 (a) Residual: same 64 instructions; the word load `lui v1; lw v1,D_801F8744` is scheduled ABOVE `li v0,1; sb v0,D_801F8747` +func_801A5C44 md_SC07_004 src/md_SC07_004/md_SC07_004.c 1 1 1 pin $4 signature .run/P36/agents/md_SC07_004__func_801A5C44 .run/P36/agents/md_SC07_004__func_801A5C44/signature.diff (a) Residual: body_free.c is 40 ins vs 41 — the target's `sw s0,16(sp); move s0,a0` parameter copy is missing and the +# minimum-lever banks in PARK (LEVER-FREE in the ledger): func_80015D4C func_80029D3C func_8002FF0C func_800301C8 func_800385C0 func_8012E364 func_80136824 func_8013D9B0 func_8013F350 func_80140958 func_80177B5C func_8017DFB8 func_8017EF50 func_8017F0EC func_80180200 func_80180A54 func_80180FA4 func_80181F4C func_80182614 func_80186CE0 func_8018C14C func_801ADF5C diff --git a/.run/P37/census/struct_map_top.json b/.run/P37/census/struct_map_top.json new file mode 100644 index 000000000..8361a3c0a --- /dev/null +++ b/.run/P37/census/struct_map_top.json @@ -0,0 +1 @@ +{"head": "23fc5d215", "when": "2026-09-12T05:44:31Z", "n_types": 18760, "types": [{"id": "AT:D_800B5CB8", "name": "Unkstruct_800B5CB8", "sites": 107598, "bodies": 11186, "nodes": 28893, "globals_at": ["D_800B5CB8", "D_800D3888", "D_80181448", "D_80181538", "D_801818AC", "D_8018192C", "D_80181D34", "D_80181D70", "D_80181D9C", "D_8018270C", "D_80182E80", "D_801831DC", "D_801832A8", "D_801834D4", "D_80183D08", "D_80184070", "D_801845C4", "D_801845D8", "D_80184664", "D_801846B4"], "globals_ptr": ["D_8006386C", "D_80074778", "D_80074780", "D_80074784", "D_80074790", "D_800747C0", "D_800747D4", "D_800747D8", "D_800747E8", "D_80075838", "D_80075A40", "D_80076040", "D_800760C8", "D_80078E50", "D_80078E80", "D_80078E84", "D_80078E88", "D_80078EAF", "D_80078EE4", "D_80078EE8"], "params": 4732, "size_hint": 268, "fields": 134, "layout": [[0, 2, "u", 367], [1, 1, "u", 11], [2, 2, "s", 3260], [3, 1, "u", 9], [4, 4, "s", 1376], [5, 4, "s", 2], [6, 2, "u", 1597], [8, 2, "u", 480], [10, 2, "u", 3444], [12, 2, "u", 470], [13, 1, "u", 12], [14, 2, "u", 1641], [16, 4, "s", 2139], [18, 2, "u", 4483], [20, 4, "s", 1156], [22, 2, "s", 280], [24, 4, "s", 2122], [26, 2, "u", 1431], [28, 4, "s", 7913], [30, 2, "s", 133], [31, 1, "s", 1], [32, 4, "s", 13174], [33, 1, "u", 8], [34, 1, "u", 12], [35, 1, "u", 5], [36, 4, "s", 111], [37, 1, "u", 9], [38, 1, "u", 11], [39, 1, "u", 403], [40, 4, "s", 31], [42, 2, "u", 24], [44, 2, "u", 728], [46, 2, "u", 31], [48, 4, "s", 31], [50, 2, "s", 11], [52, 2, "u", 2951], [54, 2, "u", 62], [56, 4, "s", 175], [58, 2, "u", 353], [60, 4, "s", 125], [62, 2, "u", 352], [64, 4, "s", 176], [66, 2, "u", 352], [68, 4, "s", 46], [72, 4, "s", 418], [74, 2, "u", 13], [76, 4, "s", 163], [80, 4, "s", 126], [82, 2, "s", 48], [84, 2, "u", 13], [88, 4, "s", 398], [92, 2, "u", 947], [94, 1, "u", 295], [96, 2, "s", 802], [98, 2, "u", 184], [100, 4, "s", 2014], [104, 4, "s", 123], [108, 4, "s", 152], [112, 2, "s", 1813], [114, 2, "u", 321], [116, 1, "u", 41], [117, 1, "u", 275], [118, 2, "s", 910], [120, 4, "s", 615]], "conflicts": [[0, {"2u": 367, "2s": 38, "4s": 25, "1u": 24, "4p": 10}], [1, {"1u": 11, "2u": 6}], [2, {"2u": 2271, "2s": 3260, "1u": 7}], [4, {"4s": 1376, "4u": 538, "2u": 26, "2s": 61, "1s": 2}], [6, {"2u": 1597, "2s": 696, "4s": 2}], [8, {"2s": 36, "4s": 466, "2u": 480, "4u": 9}], [12, {"2s": 22, "4s": 399, "2u": 470, "4u": 6, "1u": 16}], [16, {"2s": 935, "2u": 1925, "4s": 2139, "4u": 8, "4p": 3}], [18, {"2s": 2791, "2u": 4483, "4s": 2}], [20, {"2s": 416, "2u": 310, "4s": 1156, "4u": 13}], [24, {"2s": 778, "2u": 1062, "4s": 2122, "4u": 13}], [28, {"2s": 306, "2u": 160, "4s": 7913, "4u": 58, "1u": 5}]], "evidence": {"PV": 4732, "L": 9206, "PTR": 9753, "AT": 266, "P": 4732, "R": 85, "FLD": 119}, "sign_mixed": 55, "merges": {"arg&": 249, "param": 9464, "arg": 6960, "assign": 7396, "return": 712, "ret-of": 1476, "assign&": 18, "field": 2617}, "suspect": true}, {"id": "AT:D_80126B58", "name": "Unkstruct_80126B58", "sites": 65397, "bodies": 17047, "nodes": 3385, "globals_at": ["D_80126B58"], "globals_ptr": ["D_80126B58"], "params": 1050, "size_hint": 588, "fields": 175, "layout": [[0, 2, "u", 9057], [2, 2, "u", 10770], [4, 4, "s", 12], [5, 4, "s", 1], [6, 2, "s", 237], [8, 4, "s", 15], [10, 2, "s", 520], [12, 4, "s", 13], [14, 2, "s", 239], [16, 4, "s", 464], [18, 2, "u", 22], [20, 4, "s", 440], [22, 2, "u", 6], [24, 4, "s", 438], [26, 2, "u", 8], [28, 4, "s", 105], [30, 4, "u", 1], [32, 4, "s", 2252], [34, 4, "u", 1], [36, 4, "s", 142], [38, 2, "s", 133], [40, 4, "s", 12], [44, 4, "s", 4448], [46, 2, "s", 135], [48, 4, "s", 171], [52, 4, "s", 979], [56, 4, "s", 7], [60, 2, "u", 8], [62, 2, "s", 4], [64, 2, "s", 4], [66, 2, "s", 6], [68, 4, "u", 1744], [70, 2, "s", 1], [76, 4, "s", 49], [77, 1, "u", 13], [78, 1, "u", 2], [79, 1, "u", 133], [80, 4, "s", 2181], [84, 4, "s", 2151], [88, 4, "s", 2145], [89, 1, "u", 3], [90, 2, "s", 7], [91, 1, "u", 1], [92, 4, "s", 404], [93, 1, "u", 3], [94, 1, "u", 3], [95, 1, "u", 1], [96, 2, "u", 72], [98, 2, "u", 26], [100, 2, "u", 14], [102, 2, "u", 10], [103, 1, "u", 2], [104, 2, "s", 1], [106, 2, "s", 1], [108, 2, "s", 1], [112, 2, "s", 2], [114, 2, "s", 1], [116, 2, "s", 1], [121, 2, "s", 1], [126, 2, "u", 1], [136, 2, "u", 7], [138, 2, "u", 7], [140, 2, "u", 7], [168, 1, "u", 32]], "conflicts": [[4, {"4s": 12, "2u": 5}], [6, {"2s": 237, "2u": 178, "4s": 1}], [8, {"4s": 15, "2u": 5}], [12, {"4s": 13, "2u": 5}], [16, {"4p": 2, "4s": 464, "2u": 283, "2s": 10}], [20, {"2u": 6, "4s": 440, "4u": 2}], [24, {"2u": 8, "4s": 438, "4u": 2}], [36, {"4s": 142, "2s": 20, "2u": 2}], [40, {"4s": 12, "1u": 2, "2s": 11, "2u": 1}], [44, {"4s": 4448, "4u": 8, "2s": 3}], [48, {"4s": 171, "1u": 2, "4u": 4}], [68, {"4u": 1744, "2s": 1, "4s": 331}]], "evidence": {"PV": 1050, "L": 1269, "AT": 1, "P": 1050, "PTR": 1, "FLD": 14}, "sign_mixed": 60, "merges": {"assign&": 106, "param": 2100, "arg": 1086, "assign": 41, "field": 51}, "suspect": true}, {"id": "AT:D_8018E71C", "name": "Unkstruct_8018E71C", "sites": 6745, "bodies": 396, "nodes": 36, "globals_at": ["D_8018E71C"], "globals_ptr": [], "params": 9, "size_hint": 16, "fields": 7, "layout": [[0, 4, "s", 2], [4, 2, "s", 1191], [6, 2, "s", 1191], [8, 2, "s", 1056], [10, 2, "s", 1056], [12, 2, "s", 1191], [14, 2, "s", 1058]], "conflicts": [], "evidence": {"PV": 9, "L": 17, "P": 9, "AT": 1}, "sign_mixed": 0, "merges": {"assign&": 2, "arg": 15, "param": 18}, "suspect": false}, {"id": "L:F:a2c00e890871a3d894f8977fdd58daffe546a666:arg0", "name": "Unkstruct_dac960ce", "sites": 4464, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 588, "fields": 13, "layout": [[0, 2, "u", 248], [6, 2, "s", 248], [10, 2, "u", 496], [14, 2, "s", 248], [68, 4, "u", 124], [184, 2, "u", 496], [186, 2, "u", 124], [446, 1, "u", 248], [580, 1, "u", 372], [581, 1, "u", 620], [582, 2, "u", 248], [584, 2, "u", 248], [586, 2, "u", 248]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 2, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:fdea804fac944d7874892061563887debbf5f021:a1", "name": "Unkstruct_0caecd54", "sites": 4340, "bodies": 124, "nodes": 5, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 254, "fields": 23, "layout": [[0, 2, "u", 248], [2, 2, "u", 124], [4, 2, "u", 124], [6, 2, "u", 248], [8, 2, "u", 124], [10, 2, "u", 248], [12, 2, "u", 124], [14, 2, "u", 248], [32, 4, "s", 496], [54, 2, "u", 124], [80, 2, "u", 124], [82, 2, "u", 124], [84, 2, "u", 124], [100, 4, "s", 372], [104, 4, "s", 248], [112, 2, "u", 124], [114, 2, "u", 124], [120, 4, "s", 124], [136, 2, "u", 124], [138, 2, "u", 124], [140, 2, "u", 124], [220, 4, "s", 124], [252, 2, "u", 124]], "conflicts": [], "evidence": {"L": 2, "PV": 1, "P": 1, "R": 1}, "sign_mixed": 1, "merges": {"param": 2, "assign": 1, "return": 1}, "suspect": false}, {"id": "L:F:037c9974beb20a2b4fedb50684f58aba7da3df41:a0", "name": "Unkstruct_f8ed2b9f", "sites": 4061, "bodies": 4061, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 535, "fields": 1, "layout": [[534, 1, "u", 4061]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:81aa50d5890521702ec3e35b8059e18556f6cf45:cach", "name": "Unkstruct_a32b99a1", "sites": 3936, "bodies": 123, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 75, "fields": 8, "layout": [[20, 4, "s", 984], [26, 2, "s", 246], [52, 2, "u", 492], [58, 2, "u", 123], [62, 2, "u", 369], [64, 2, "u", 984], [66, 1, "u", 246], [74, 1, "u", 369]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 1, "merges": {}, "suspect": false}, {"id": "L:F:52e92ffa088470b82cc06482daa51b2f80995c31:cach", "name": "Unkstruct_8e3dbe51", "sites": 3930, "bodies": 131, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 76, "fields": 5, "layout": [[30, 2, "s", 393], [46, 2, "s", 262], [71, 1, "u", 1441], [72, 1, "u", 786], [75, 1, "u", 917]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 1, "merges": {}, "suspect": false}, {"id": "FLD:AT:D_80126B58:0x178", "name": "Unkstruct_8014A1B0", "sites": 3778, "bodies": 542, "nodes": 35, "globals_at": [], "globals_ptr": [], "params": 5, "size_hint": 254, "fields": 13, "layout": [[0, 2, "u", 401], [6, 2, "s", 539], [10, 2, "s", 539], [14, 2, "s", 539], [32, 4, "s", 133], [92, 2, "u", 2], [94, 2, "u", 1], [96, 2, "u", 1], [98, 2, "u", 1], [120, 4, "s", 1617], [200, 1, "u", 1], [201, 1, "u", 1], [252, 2, "s", 1]], "conflicts": [], "evidence": {"L": 21, "PV": 5, "P": 5, "R": 1, "FLD": 3}, "sign_mixed": 1, "merges": {"field": 13, "arg": 10, "param": 10, "return": 1}, "suspect": false}, {"id": "FLD:L:F:0142ec5f23f03ef302b2868332ae4bf0df389535:param_1:0x20", "name": "Unkstruct_80128EA8", "sites": 3311, "bodies": 632, "nodes": 53, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 56, "fields": 18, "layout": [[4, 4, "u", 666], [8, 2, "u", 1], [10, 2, "u", 1], [12, 2, "u", 1], [16, 2, "s", 59], [18, 2, "s", 29], [20, 2, "s", 8], [24, 2, "u", 414], [26, 2, "u", 414], [32, 4, "s", 2], [36, 1, "s", 134], [37, 1, "s", 134], [38, 1, "s", 134], [39, 1, "u", 142], [40, 2, "s", 94], [42, 2, "s", 79], [44, 2, "u", 4], [52, 4, "s", 135]], "conflicts": [], "evidence": {"L": 43, "PV": 1, "P": 1, "R": 2, "FLD": 6}, "sign_mixed": 13, "merges": {"field": 7, "arg": 23, "ret-of": 19, "assign": 1, "param": 2}, "suspect": false}, {"id": "L:F:019330d37e000b4de251f5caef4483ad02b4a572:a0", "name": "Unkstruct_ade2e8a0", "sites": 3271, "bodies": 196, "nodes": 402, "globals_at": [], "globals_ptr": [], "params": 134, "size_hint": 164, "fields": 26, "layout": [[5, 1, "u", 228], [8, 4, "s", 74], [12, 2, "s", 74], [16, 4, "s", 151], [20, 4, "s", 123], [24, 2, "s", 154], [26, 2, "s", 153], [28, 2, "s", 148], [32, 2, "s", 96], [34, 2, "s", 92], [36, 2, "s", 78], [40, 2, "s", 312], [42, 2, "s", 298], [44, 2, "s", 298], [46, 2, "s", 117], [48, 2, "s", 83], [50, 2, "s", 80], [60, 4, "s", 74], [64, 4, "s", 74], [68, 4, "s", 74], [72, 4, "s", 74], [76, 4, "s", 74], [80, 4, "s", 74], [156, 4, "s", 13], [160, 2, "u", 4], [162, 2, "u", 3]], "conflicts": [[8, {"4s": 74, "2s": 74}], [16, {"4s": 151, "2s": 76}], [20, {"4s": 123, "2s": 74}]], "evidence": {"PV": 134, "P": 134, "L": 134}, "sign_mixed": 9, "merges": {"param": 268, "arg": 133}, "suspect": false}, {"id": "L:F:52e92ffa088470b82cc06482daa51b2f80995c31:flag", "name": "Unkstruct_1fa9e810", "sites": 3144, "bodies": 131, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 73, "fields": 3, "layout": [[46, 2, "s", 393], [71, 1, "u", 524], [72, 1, "u", 2227]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:f290967a9bfb3ed845a5d2a766082ed2705729c6:buf", "name": "Unkstruct_30b21035", "sites": 3100, "bodies": 124, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 84, "fields": 13, "layout": [[32, 2, "s", 248], [34, 2, "s", 248], [36, 2, "s", 248], [40, 2, "s", 248], [42, 2, "s", 248], [44, 2, "s", 248], [48, 2, "s", 248], [50, 2, "s", 248], [52, 2, "s", 248], [56, 2, "s", 248], [58, 2, "s", 248], [60, 2, "s", 248], [80, 4, "s", 124]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "AT:D_80126948", "name": "Unkstruct_80126948", "sites": 2986, "bodies": 832, "nodes": 125, "globals_at": ["D_80126948", "D_80126E60"], "globals_ptr": ["D_80114EE8", "D_801151D4", "D_80126948", "D_80126E60", "D_80126F04", "D_80126FA8"], "params": 3, "size_hint": 164, "fields": 34, "layout": [[0, 4, "s", 7], [4, 1, "u", 43], [8, 4, "s", 4], [12, 4, "s", 4], [16, 4, "s", 26], [20, 4, "s", 24], [24, 2, "s", 2], [26, 2, "u", 13], [32, 2, "s", 2], [34, 2, "u", 12], [36, 2, "s", 1], [40, 2, "s", 1], [42, 2, "s", 4], [44, 2, "s", 1], [46, 2, "s", 2], [48, 2, "s", 4], [50, 2, "s", 2], [52, 4, "s", 4], [56, 2, "u", 16], [60, 4, "s", 539], [64, 4, "s", 139], [68, 4, "s", 539], [72, 4, "s", 539], [76, 4, "s", 140], [80, 4, "s", 673], [92, 4, "s", 57], [96, 4, "s", 53], [100, 4, "s", 57], [104, 4, "s", 13], [108, 4, "s", 9], [112, 4, "s", 13], [156, 4, "s", 1], [160, 2, "s", 1], [162, 2, "s", 1]], "conflicts": [], "evidence": {"PV": 3, "PTR": 6, "L": 111, "P": 3, "AT": 2}, "sign_mixed": 10, "merges": {"arg&": 1, "assign": 99, "param": 6, "arg": 14, "assign&": 4}, "suspect": false}, {"id": "L:F:1fd5c5850652e651e5db7bf9ff6d4ae99aab9d03:arg0", "name": "Unkstruct_adc0bee4", "sites": 2646, "bodies": 126, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 52, "fields": 8, "layout": [[2, 2, "u", 252], [6, 2, "s", 378], [10, 2, "s", 378], [14, 2, "s", 378], [18, 2, "u", 126], [22, 2, "u", 126], [32, 4, "s", 126], [48, 4, "s", 126]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 3, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:1eeddc4a726cce7edb2fd84a3cad6477021bcf85:param_1", "name": "Unkstruct_198fc7cc", "sites": 2580, "bodies": 129, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 56, "fields": 16, "layout": [[2, 2, "u", 258], [6, 2, "u", 129], [10, 2, "u", 129], [14, 2, "u", 129], [16, 4, "s", 129], [18, 2, "u", 129], [20, 4, "s", 129], [22, 2, "s", 129], [24, 4, "s", 129], [26, 2, "u", 129], [28, 4, "s", 258], [32, 4, "s", 258], [40, 2, "u", 129], [44, 4, "s", 129], [48, 4, "s", 129], [52, 4, "s", 129]], "conflicts": [[18, "overlap"], [22, "overlap"], [26, "overlap"]], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 1, "merges": {"param": 2}, "suspect": false}, {"id": "FLD:AT:D_800B5CB8:0x64", "name": "Unkstruct_801439FC", "sites": 2489, "bodies": 981, "nodes": 103, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 268, "fields": 57, "layout": [[0, 2, "u", 151], [2, 2, "u", 15], [4, 4, "s", 66], [6, 2, "u", 37], [8, 4, "s", 67], [10, 2, "u", 34], [12, 4, "s", 67], [14, 2, "u", 32], [16, 4, "s", 2], [18, 2, "s", 3], [20, 4, "s", 2], [24, 4, "s", 2], [28, 4, "s", 6], [32, 4, "s", 457], [52, 2, "s", 2], [54, 2, "s", 263], [56, 4, "s", 1], [60, 4, "s", 1], [64, 4, "s", 1], [88, 4, "s", 134], [92, 2, "u", 21], [94, 2, "u", 16], [96, 2, "s", 15], [98, 2, "u", 15], [100, 4, "s", 1], [104, 4, "s", 1], [108, 4, "s", 4], [112, 2, "s", 76], [118, 2, "s", 17], [124, 2, "u", 15], [126, 2, "u", 15], [128, 2, "u", 15], [144, 4, "s", 16], [148, 4, "s", 13], [152, 2, "s", 1], [193, 1, "u", 150], [204, 4, "s", 38], [206, 2, "u", 11], [208, 4, "s", 16], [212, 2, "u", 11], [214, 2, "u", 11], [216, 2, "u", 11], [220, 4, "s", 8], [224, 4, "s", 36], [226, 2, "u", 1], [228, 4, "s", 2], [232, 4, "u", 3], [240, 4, "s", 2], [248, 4, "s", 21], [250, 2, "s", 2], [252, 2, "s", 19], [254, 2, "s", 38], [256, 2, "u", 25], [258, 2, "u", 3], [260, 2, "s", 1], [262, 2, "s", 2], [266, 2, "u", 2]], "conflicts": [[204, {"4s": 38, "2u": 11}], [208, {"4s": 16, "2u": 11}], [6, "overlap"], [10, "overlap"], [14, "overlap"], [18, "overlap"], [206, "overlap"], [226, "overlap"], [250, "overlap"]], "evidence": {"L": 102, "FLD": 1}, "sign_mixed": 22, "merges": {"field": 102}, "suspect": false}, {"id": "FLD:L:F:ed1c24ca47a915759f6ba3f907f5b5d82aa3c397:base:0x24", "name": "Unkstruct_80130D48", "sites": 2382, "bodies": 587, "nodes": 119, "globals_at": [], "globals_ptr": ["D_80072C84", "D_80078E78"], "params": 0, "size_hint": 100, "fields": 25, "layout": [[0, 1, "u", 266], [4, 4, "s", 6], [20, 4, "s", 3], [24, 4, "s", 1], [26, 2, "u", 26], [34, 2, "s", 1], [36, 4, "s", 3], [38, 2, "s", 533], [40, 4, "s", 6], [42, 2, "s", 1], [44, 4, "s", 2], [46, 2, "s", 534], [48, 4, "s", 4], [50, 2, "s", 1], [52, 2, "u", 2], [55, 1, "u", 1], [58, 2, "u", 135], [60, 2, "u", 139], [62, 2, "u", 266], [64, 2, "u", 400], [67, 1, "s", 1], [73, 1, "u", 1], [80, 4, "s", 1], [96, 4, "s", 6], [98, 2, "s", 4]], "conflicts": [[26, "overlap"], [38, "overlap"], [42, "overlap"], [46, "overlap"], [50, "overlap"], [98, "overlap"]], "evidence": {"L": 116, "PTR": 2, "FLD": 1}, "sign_mixed": 3, "merges": {"field": 1, "assign": 117}, "suspect": false}, {"id": "L:F:d8ec93cf2ab8692a851707f792bb542559b8b477:buf", "name": "Unkstruct_ed8f1335", "sites": 2356, "bodies": 124, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 36, "fields": 18, "layout": [[0, 4, "s", 124], [4, 2, "s", 248], [6, 2, "s", 124], [8, 2, "s", 124], [10, 2, "s", 124], [12, 2, "s", 124], [14, 1, "u", 124], [15, 1, "u", 124], [16, 2, "s", 124], [18, 2, "s", 124], [20, 1, "u", 124], [21, 1, "u", 124], [22, 1, "u", 124], [24, 2, "s", 124], [26, 2, "s", 124], [28, 2, "s", 124], [30, 2, "s", 124], [32, 4, "s", 124]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:11f86a358e6d71766aa362f8cfb3a9eb58ca58bc:param_1", "name": "Unkstruct_8016B4F8", "sites": 2140, "bodies": 535, "nodes": 39, "globals_at": [], "globals_ptr": [], "params": 13, "size_hint": 48, "fields": 5, "layout": [[16, 4, "s", 269], [20, 4, "s", 269], [24, 4, "s", 402], [28, 4, "s", 666], [44, 4, "s", 534]], "conflicts": [], "evidence": {"PV": 13, "P": 13, "L": 13}, "sign_mixed": 0, "merges": {"param": 26, "arg": 12}, "suspect": false}, {"id": "L:F:07b460bb9e8b53760af60379de40d6d476777b34:param_1", "name": "Unkstruct_80139C7C", "sites": 2111, "bodies": 265, "nodes": 18, "globals_at": [], "globals_ptr": [], "params": 6, "size_hint": 68, "fields": 14, "layout": [[8, 4, "s", 262], [24, 2, "s", 131], [28, 2, "s", 131], [32, 1, "u", 132], [34, 1, "u", 525], [36, 2, "u", 1], [38, 2, "u", 1], [44, 2, "s", 262], [46, 2, "s", 262], [48, 2, "s", 1], [50, 2, "s", 1], [52, 2, "s", 133], [54, 2, "s", 131], [64, 4, "s", 2]], "conflicts": [], "evidence": {"PV": 6, "P": 6, "L": 6}, "sign_mixed": 3, "merges": {"param": 12, "arg": 5}, "suspect": false}, {"id": "L:F:989ea29447ebea9f665718fe835d44c289cd476c:L", "name": "Unkstruct_b047cdf2", "sites": 2108, "bodies": 124, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 32, "fields": 6, "layout": [[0, 2, "s", 1116], [2, 2, "s", 248], [8, 4, "s", 124], [12, 4, "s", 372], [24, 4, "s", 124], [28, 4, "s", 124]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:81aa50d5890521702ec3e35b8059e18556f6cf45:flag", "name": "Unkstruct_2729e670", "sites": 2091, "bodies": 123, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 75, "fields": 6, "layout": [[20, 4, "s", 369], [26, 2, "s", 369], [52, 2, "u", 369], [60, 2, "u", 123], [64, 2, "u", 492], [74, 1, "u", 369]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:60753a66ad7b997b354356bdcc1b2cfb92a8800f:s", "name": "Unkstruct_dd542e54", "sites": 2016, "bodies": 126, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 24, "fields": 7, "layout": [[7, 1, "u", 126], [12, 2, "u", 126], [14, 2, "u", 126], [16, 2, "u", 252], [18, 2, "u", 252], [20, 2, "u", 126], [22, 2, "u", 126]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:e88bc6d8af09ec78a633a1ad0286db378f599db5:param_1", "name": "Unkstruct_f49880fd", "sites": 2000, "bodies": 125, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 84, "fields": 6, "layout": [[24, 2, "s", 250], [26, 2, "s", 250], [28, 2, "s", 125], [72, 4, "s", 375], [76, 4, "s", 500], [80, 4, "s", 375]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 1, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:5cb8944340208a6dacc6cd8ff089a3c5b21bf4b3:a0", "name": "Unkstruct_a8d34bce", "sites": 1948, "bodies": 1948, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 533, "fields": 1, "layout": [[532, 1, "u", 1948]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:4c09002e2679c98f83f9f9cfd76c32f960133d5d:param_1", "name": "Unkstruct_568f7bda", "sites": 1875, "bodies": 125, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 56, "fields": 9, "layout": [[2, 2, "s", 125], [6, 2, "s", 125], [10, 2, "s", 125], [14, 2, "s", 125], [18, 2, "s", 250], [28, 4, "s", 500], [40, 2, "s", 125], [48, 4, "s", 250], [52, 4, "p", 125]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:1e5bdb3d889cf99856e8e0f53e443c0d445ca75e:param_1", "name": "Unkstruct_8016DF5C", "sites": 1791, "bodies": 131, "nodes": 18, "globals_at": [], "globals_ptr": [], "params": 6, "size_hint": 56, "fields": 9, "layout": [[2, 2, "s", 255], [6, 2, "s", 128], [10, 2, "s", 128], [14, 2, "s", 128], [28, 4, "s", 258], [32, 4, "s", 128], [44, 4, "u", 127], [48, 4, "s", 127], [52, 4, "s", 128]], "conflicts": [], "evidence": {"PV": 6, "P": 6, "L": 6}, "sign_mixed": 3, "merges": {"param": 12, "arg": 5}, "suspect": false}, {"id": "L:F:5a1e46d09a18bce1851bbfe4bbd37ae5f338cb7d:param", "name": "Unkstruct_f1f49381", "sites": 1764, "bodies": 126, "nodes": 5, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 56, "fields": 10, "layout": [[2, 2, "u", 252], [6, 2, "u", 126], [10, 2, "u", 126], [14, 2, "u", 126], [16, 2, "s", 126], [18, 2, "u", 252], [22, 2, "u", 252], [26, 2, "u", 252], [32, 4, "s", 126], [52, 4, "s", 126]], "conflicts": [], "evidence": {"L": 3, "PV": 1, "P": 1}, "sign_mixed": 0, "merges": {"param": 2, "assign": 2}, "suspect": false}, {"id": "AT:D_8011F7A8", "name": "Unkstruct_8011F7A8", "sites": 1746, "bodies": 271, "nodes": 20, "globals_at": ["D_8011F7A8"], "globals_ptr": [], "params": 0, "size_hint": 286, "fields": 7, "layout": [[7, 1, "u", 399], [8, 1, "u", 266], [18, 2, "u", 266], [20, 2, "u", 133], [22, 2, "u", 266], [130, 2, "u", 133], [284, 2, "u", 266]], "conflicts": [], "evidence": {"L": 19, "AT": 1}, "sign_mixed": 0, "merges": {"assign&": 19}, "suspect": false}, {"id": "L:F:81aa50d5890521702ec3e35b8059e18556f6cf45:cur", "name": "Unkstruct_84612d18", "sites": 1722, "bodies": 123, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 75, "fields": 8, "layout": [[20, 4, "s", 246], [26, 2, "s", 246], [52, 2, "u", 246], [58, 2, "u", 123], [62, 2, "u", 246], [64, 2, "u", 246], [66, 1, "u", 123], [74, 1, "u", 246]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:304d1a1cd67647ffff0d682a49fc7bd3bb4ca331:puVar10", "name": "Unkstruct_57db4d07", "sites": 1664, "bodies": 128, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 0, "fields": 13, "layout": [[-21, 1, "u", 128], [-20, 4, "u", 128], [-16, 1, "u", 128], [-15, 1, "u", 128], [-14, 1, "u", 128], [-13, 1, "u", 128], [-12, 2, "u", 128], [-10, 2, "u", 128], [-8, 1, "u", 128], [-7, 1, "u", 128], [-6, 2, "u", 128], [-4, 2, "u", 128], [-2, 2, "u", 128]], "conflicts": [[-21, "overlap"], [-20, "overlap"], [-16, "overlap"], [-15, "overlap"], [-14, "overlap"], [-13, "overlap"], [-12, "overlap"], [-10, "overlap"], [-8, "overlap"], [-7, "overlap"], [-6, "overlap"], [-4, "overlap"]], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "FLD:L:F:0ef566a105e459b80720f079223698904a0de611:param_1:0x20", "name": "Unkstruct_4692fc17", "sites": 1612, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 30, "fields": 4, "layout": [[18, 2, "s", 248], [24, 2, "s", 248], [26, 2, "u", 248], [28, 2, "u", 248]], "conflicts": [], "evidence": {"L": 2, "FLD": 1}, "sign_mixed": 3, "merges": {"field": 2}, "suspect": false}, {"id": "L:F:12c4b7be41f646d9e1ef4c88c1d179890b4a56fb:param_1", "name": "Unkstruct_eda88e53", "sites": 1596, "bodies": 133, "nodes": 24, "globals_at": [], "globals_ptr": [], "params": 8, "size_hint": 84, "fields": 6, "layout": [[60, 4, "s", 133], [64, 4, "s", 133], [68, 4, "s", 133], [72, 4, "s", 133], [76, 4, "s", 133], [80, 4, "s", 133]], "conflicts": [[60, {"4s": 133, "2s": 133}], [64, {"4s": 133, "2s": 133}], [68, {"4s": 133, "2s": 133}], [72, {"4s": 133, "2s": 133}], [76, {"4s": 133, "2s": 133}], [80, {"4s": 133, "2s": 133}]], "evidence": {"PV": 8, "P": 8, "L": 8}, "sign_mixed": 0, "merges": {"param": 16, "arg": 7}, "suspect": false}, {"id": "L:F:016bfe21cadcda9221c71177a8a4d810e798d34f:pkt", "name": "Unkstruct_8012D3B4", "sites": 1588, "bodies": 183, "nodes": 162, "globals_at": [], "globals_ptr": ["D_80074808", "D_800A5E60"], "params": 8, "size_hint": 36, "fields": 23, "layout": [[0, 4, "u", 25], [3, 1, "u", 17], [4, 4, "u", 28], [5, 1, "u", 1], [6, 1, "u", 1], [7, 1, "u", 12], [8, 2, "s", 145], [10, 2, "s", 145], [12, 2, "s", 4], [13, 1, "u", 1], [14, 2, "s", 138], [16, 2, "s", 141], [18, 2, "s", 141], [20, 4, "u", 4], [21, 1, "u", 1], [22, 2, "s", 134], [24, 2, "s", 137], [26, 2, "s", 137], [28, 4, "u", 4], [29, 1, "u", 1], [30, 1, "u", 1], [32, 2, "s", 137], [34, 2, "s", 137]], "conflicts": [[4, {"4u": 28, "4s": 12, "1u": 1}], [12, {"2u": 2, "4s": 1, "2s": 4, "4u": 4, "1u": 1}], [14, {"2s": 138, "2u": 10, "1u": 1}], [16, {"2s": 141, "2u": 6, "4u": 1}], [20, {"4u": 4, "1u": 1}], [22, {"2s": 134, "2u": 10, "1u": 1}], [28, {"4u": 4, "1u": 1}], [3, "overlap"], [5, "overlap"], [6, "overlap"], [7, "overlap"], [13, "overlap"]], "evidence": {"L": 139, "PV": 8, "P": 8, "PTR": 2, "R": 5}, "sign_mixed": 9, "merges": {"assign": 75, "return": 5, "param": 16, "arg": 10, "ret-of": 55}, "suspect": false}, {"id": "L:F:a3efbb1f6dada4f05ad25b37afb41ac912d4e9ed:param_1", "name": "Unkstruct_4e09b6d9", "sites": 1572, "bodies": 131, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 50, "fields": 9, "layout": [[6, 2, "u", 131], [10, 2, "u", 131], [14, 2, "u", 131], [36, 1, "u", 131], [38, 2, "u", 262], [40, 2, "s", 262], [42, 2, "u", 131], [44, 4, "s", 131], [48, 2, "u", 131]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 1, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:606b9cd56050502da9c870c663e07d5753cfef65:arg1", "name": "Unkstruct_23e45db5", "sites": 1512, "bodies": 126, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 22, "fields": 11, "layout": [[0, 2, "u", 252], [2, 2, "s", 126], [4, 2, "s", 126], [6, 2, "s", 126], [8, 2, "s", 126], [10, 2, "s", 126], [12, 2, "s", 126], [14, 2, "s", 126], [16, 2, "s", 126], [18, 2, "s", 126], [20, 2, "s", 126]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:a62137677b6eec4b6b27aa122999967c9240c0fc:puVar1", "name": "Unkstruct_47470ce3", "sites": 1488, "bodies": 124, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 30, "fields": 6, "layout": [[18, 2, "s", 124], [20, 2, "s", 124], [22, 2, "s", 372], [24, 2, "s", 372], [26, 2, "s", 372], [28, 2, "s", 124]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:a8f4060c5f3c8d9ae6472f3ae009c575b5e99ead:arg0", "name": "Unkstruct_b5c0372a", "sites": 1441, "bodies": 131, "nodes": 4, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 88, "fields": 9, "layout": [[6, 2, "s", 131], [10, 2, "s", 131], [14, 2, "s", 131], [18, 1, "u", 262], [48, 4, "s", 262], [52, 4, "s", 131], [76, 4, "s", 131], [80, 4, "s", 131], [84, 4, "s", 131]], "conflicts": [], "evidence": {"L": 2, "PV": 1, "P": 1}, "sign_mixed": 0, "merges": {"param": 2, "assign": 1}, "suspect": false}, {"id": "L:F:52e92ffa088470b82cc06482daa51b2f80995c31:cur", "name": "Unkstruct_0980b9f0", "sites": 1441, "bodies": 131, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 73, "fields": 4, "layout": [[30, 2, "s", 131], [46, 2, "s", 262], [71, 1, "u", 393], [72, 1, "u", 655]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:a5b4fc886a867d7e491da7f2769704ece0eee579:a0", "name": "Unkstruct_ba6e2e9f", "sites": 1439, "bodies": 1439, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 4, "fields": 1, "layout": [[2, 2, "u", 1439]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:fdea804fac944d7874892061563887debbf5f021:a0", "name": "Unkstruct_a68f6d03", "sites": 1364, "bodies": 124, "nodes": 4, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 20, "fields": 9, "layout": [[0, 2, "u", 124], [2, 2, "u", 124], [4, 2, "u", 124], [6, 2, "u", 124], [8, 2, "u", 124], [10, 2, "u", 372], [12, 2, "s", 124], [14, 2, "u", 124], [16, 4, "s", 124]], "conflicts": [], "evidence": {"L": 2, "PV": 1, "P": 1}, "sign_mixed": 0, "merges": {"param": 2, "assign": 1}, "suspect": false}, {"id": "L:F:77b6ecefb14cc475d995f1680b9348665ff66743:p", "name": "Unkstruct_8fdd92d1", "sites": 1300, "bodies": 130, "nodes": 4, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 36, "fields": 4, "layout": [[10, 2, "s", 260], [12, 4, "u", 130], [14, 2, "u", 650], [32, 4, "u", 130]], "conflicts": [[12, {"4u": 130, "1u": 130}], [14, "overlap"]], "evidence": {"PV": 1, "L": 2, "P": 1}, "sign_mixed": 0, "merges": {"param": 2, "assign": 1}, "suspect": false}, {"id": "L:F:38e54b73b4e193a02893e5f0406ab99b3b88f59a:param_1", "name": "Unkstruct_110cf29e", "sites": 1250, "bodies": 125, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 44, "fields": 7, "layout": [[6, 2, "u", 250], [10, 2, "u", 250], [14, 2, "u", 250], [16, 4, "s", 125], [20, 4, "s", 125], [24, 4, "s", 125], [42, 2, "s", 125]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:d8ec93cf2ab8692a851707f792bb542559b8b477:arg0", "name": "Unkstruct_4db8cec8", "sites": 1240, "bodies": 124, "nodes": 4, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 54, "fields": 8, "layout": [[26, 2, "u", 124], [32, 1, "u", 124], [34, 1, "u", 124], [40, 2, "u", 248], [42, 2, "u", 124], [48, 2, "u", 248], [50, 2, "u", 124], [52, 2, "u", 124]], "conflicts": [], "evidence": {"L": 2, "PV": 1, "P": 1}, "sign_mixed": 0, "merges": {"param": 2, "assign": 1}, "suspect": false}, {"id": "L:F:2a34f6ae0fbc42dba731f3cb61b452b132151f49:param_1", "name": "Unkstruct_f0bc3b7a", "sites": 1240, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 256, "fields": 7, "layout": [[32, 4, "s", 124], [100, 4, "s", 372], [112, 2, "s", 248], [144, 4, "s", 124], [152, 2, "s", 124], [252, 2, "s", 124], [254, 2, "s", 124]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:0289b3cb56bcf08db160c872a5dd2fb73fb84820:arg0", "name": "Unkstruct_297e7547", "sites": 1240, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 88, "fields": 10, "layout": [[4, 1, "u", 124], [12, 4, "s", 124], [20, 4, "s", 124], [32, 2, "s", 124], [34, 2, "s", 124], [36, 2, "s", 124], [46, 2, "s", 124], [48, 2, "s", 124], [50, 2, "s", 124], [84, 4, "s", 124]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:d28b333ee76050463046f0e1e298531aec6f5954:param_1", "name": "Unkstruct_dd59c999", "sites": 1240, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 56, "fields": 6, "layout": [[2, 2, "u", 248], [6, 2, "s", 124], [10, 2, "u", 248], [14, 2, "s", 124], [32, 4, "s", 124], [52, 4, "s", 124]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 2, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:9cc20d766b9997aab372938831fb29f5096150bf:arg0", "name": "Unkstruct_919ca3ea", "sites": 1230, "bodies": 123, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 16, "fields": 6, "layout": [[4, 2, "s", 246], [6, 2, "s", 246], [8, 2, "s", 123], [10, 2, "s", 123], [12, 2, "s", 246], [14, 2, "s", 246]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:f3920c81bd648c06944654709f5f2737b73b2aa6:param_1", "name": "Unkstruct_a459e3e5", "sites": 1220, "bodies": 122, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 52, "fields": 6, "layout": [[2, 2, "s", 244], [28, 4, "s", 122], [40, 2, "s", 122], [42, 2, "s", 122], [44, 4, "s", 488], [48, 4, "s", 122]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "FLD:FLD:AT:D_80126B58:0x178:0x78", "name": "Unkstruct_8014CA00", "sites": 1219, "bodies": 407, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 46, "fields": 4, "layout": [[12, 2, "s", 273], [14, 2, "s", 273], [16, 2, "s", 273], [44, 2, "s", 1]], "conflicts": [], "evidence": {"L": 1, "FLD": 1}, "sign_mixed": 3, "merges": {"field": 1}, "suspect": false}, {"id": "L:F:05e15c2a22084e23bfef1c49d10e45ddb56bc792:np", "name": "Unkstruct_74787850", "sites": 1206, "bodies": 1073, "nodes": 2, "globals_at": [], "globals_ptr": ["D_801152A8"], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "s", 804]], "conflicts": [], "evidence": {"PTR": 1, "L": 1}, "sign_mixed": 1, "merges": {"assign": 1}, "suspect": false}, {"id": "L:F:741e694989de8029f7fb58b84f991c3adff430b3:param_1", "name": "Unkstruct_f9a7989e", "sites": 1179, "bodies": 131, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 54, "fields": 3, "layout": [[2, 2, "u", 262], [32, 4, "s", 524], [52, 2, "u", 262]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 1, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:94945b92a3ffae0d24f74ce4cd9cffd105741cbe:param_1", "name": "Unkstruct_0b30043d", "sites": 1128, "bodies": 376, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 94, "fields": 3, "layout": [[32, 4, "s", 376], [88, 4, "s", 376], [92, 2, "s", 376]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:fe40e9ccdaa2d5f0ba2f4c3e37a6970152d41247:param_1", "name": "Unkstruct_301381d4", "sites": 1116, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 54, "fields": 3, "layout": [[2, 2, "u", 248], [32, 4, "s", 496], [52, 2, "u", 248]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 1, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:2f386ebb9a66fcb2ac404d69911dc62e11ced48e:param_1", "name": "Unkstruct_0ced46e2", "sites": 1116, "bodies": 124, "nodes": 4, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 254, "fields": 5, "layout": [[2, 2, "s", 248], [100, 4, "s", 496], [112, 2, "s", 124], [204, 4, "s", 124], [252, 2, "u", 124]], "conflicts": [], "evidence": {"L": 2, "PV": 1, "P": 1}, "sign_mixed": 0, "merges": {"param": 2, "assign": 1}, "suspect": false}, {"id": "L:F:ca991c955692b224654363038eab11d77a124e7c:a4", "name": "Unkstruct_f153f338", "sites": 1107, "bodies": 123, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 52, "fields": 5, "layout": [[4, 2, "s", 123], [12, 2, "s", 123], [20, 2, "s", 123], [28, 2, "s", 123], [48, 4, "u", 123]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:77b6d94dff9bef0b15b418f0bd59eaa0256ec56d:param_1", "name": "Unkstruct_50a3f6b4", "sites": 1040, "bodies": 130, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 54, "fields": 3, "layout": [[2, 4, "s", 260], [6, 4, "s", 260], [50, 4, "s", 520]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "AT:D_800B9A02", "name": "Unkstruct_800B9A02", "sites": 992, "bodies": 434, "nodes": 70, "globals_at": ["D_800B9A02"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "u", 992]], "conflicts": [], "evidence": {"AT": 1, "L": 69}, "sign_mixed": 0, "merges": {"assign&": 69}, "suspect": false}, {"id": "L:F:0fdb1818230a528aa8124f3e3ca3abbc37c4da35:param_1", "name": "Unkstruct_f74e3af7", "sites": 992, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 254, "fields": 5, "layout": [[2, 2, "u", 124], [100, 4, "s", 496], [112, 2, "s", 124], [204, 4, "s", 124], [252, 2, "u", 124]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:5a75eb79d3353c515ae37f52d702bda943144381:base", "name": "Unkstruct_6b138cb0", "sites": 931, "bodies": 133, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 32, "fields": 7, "layout": [[-12, 4, "s", 133], [4, 4, "s", 133], [8, 4, "s", 133], [12, 4, "s", 133], [20, 4, "s", 133], [24, 4, "s", 133], [28, 4, "s", 133]], "conflicts": [[-12, "overlap"]], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "FLD:L:F:52e92ffa088470b82cc06482daa51b2f80995c31:ix:0x28", "name": "Unkstruct_b774eeeb", "sites": 917, "bodies": 131, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 65, "fields": 4, "layout": [[4, 1, "u", 262], [13, 1, "u", 262], [32, 2, "u", 262], [64, 1, "u", 131]], "conflicts": [], "evidence": {"L": 1, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 1}, "suspect": false}, {"id": "L:F:9dedcda9dded508b80dc8149159c528d143a0d96:param_1", "name": "Unkstruct_6d856e9d", "sites": 917, "bodies": 131, "nodes": 4, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 30, "fields": 5, "layout": [[14, 4, "s", 131], [16, 4, "s", 131], [22, 4, "u", 131], [24, 4, "s", 262], [26, 4, "s", 131]], "conflicts": [[16, "overlap"], [24, "overlap"], [26, "overlap"]], "evidence": {"L": 2, "PV": 1, "P": 1}, "sign_mixed": 1, "merges": {"assign": 1, "param": 2}, "suspect": false}, {"id": "FLD:L:F:9dedcda9dded508b80dc8149159c528d143a0d96:param_1:0x18", "name": "Unkstruct_d0c6cce6", "sites": 917, "bodies": 131, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 56, "fields": 4, "layout": [[6, 2, "u", 262], [10, 2, "u", 262], [14, 2, "u", 262], [54, 2, "u", 131]], "conflicts": [], "evidence": {"L": 1, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 1}, "suspect": false}, {"id": "L:F:0cbff40c35cd7f98519c33fa669d174d54170c93:a0", "name": "Unkstruct_859b4fab", "sites": 910, "bodies": 130, "nodes": 4, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 176, "fields": 4, "layout": [[32, 4, "s", 130], [169, 1, "u", 130], [170, 2, "u", 130], [174, 2, "u", 520]], "conflicts": [], "evidence": {"L": 2, "PV": 1, "P": 1}, "sign_mixed": 0, "merges": {"param": 2, "assign": 1}, "suspect": false}, {"id": "L:F:03fe969bf84574f92bb856d0cb59dedb7299d891:p", "name": "Unkstruct_801463A0", "sites": 907, "bodies": 210, "nodes": 10, "globals_at": [], "globals_ptr": ["D_80126B78"], "params": 0, "size_hint": 84, "fields": 13, "layout": [[0, 4, "s", 1], [4, 2, "u", 2], [8, 2, "s", 2], [10, 2, "s", 2], [12, 2, "s", 2], [16, 2, "s", 2], [18, 2, "s", 40], [20, 2, "s", 1], [32, 4, "s", 2], [44, 2, "u", 2], [72, 4, "s", 2], [76, 4, "s", 2], [80, 4, "s", 2]], "conflicts": [], "evidence": {"PTR": 1, "L": 9}, "sign_mixed": 1, "merges": {"assign": 9}, "suspect": false}, {"id": "L:F:bf6d1e48a836c45fb0c51ee0d2312b14e4fc27be:p", "name": "Unkstruct_6d3f3f5d", "sites": 889, "bodies": 127, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 56, "fields": 6, "layout": [[4, 2, "s", 127], [32, 4, "u", 127], [36, 4, "u", 127], [40, 4, "u", 127], [44, 4, "u", 127], [52, 4, "u", 127]], "conflicts": [], "evidence": {"L": 2}, "sign_mixed": 0, "merges": {"assign": 1}, "suspect": false}, {"id": "L:F:84255a903577529ee712cdbc97647e719440dfd3:p2", "name": "Unkstruct_1e86c313", "sites": 882, "bodies": 126, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 8, "fields": 4, "layout": [[0, 2, "u", 252], [2, 2, "u", 252], [4, 2, "u", 252], [6, 2, "u", 126]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:9df4b60ade927cf864b1a0a1438721c480ca9784:param", "name": "Unkstruct_a41ec127", "sites": 882, "bodies": 126, "nodes": 4, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 56, "fields": 6, "layout": [[16, 2, "s", 252], [18, 2, "u", 126], [22, 2, "u", 126], [26, 2, "u", 126], [32, 4, "s", 126], [52, 4, "s", 126]], "conflicts": [], "evidence": {"L": 2, "PV": 1, "P": 1}, "sign_mixed": 0, "merges": {"param": 2, "assign": 1}, "suspect": false}, {"id": "L:F:7a236870edfc6bd00bd593972631b414341516eb:param_1", "name": "Unkstruct_3f697924", "sites": 875, "bodies": 125, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 56, "fields": 5, "layout": [[6, 2, "u", 125], [10, 2, "u", 125], [14, 2, "u", 125], [48, 4, "s", 375], [52, 4, "s", 125]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:858edb9b0da77e1274071626f287939881c33e7b:p2", "name": "Unkstruct_e505dcd3", "sites": 868, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 8, "fields": 4, "layout": [[0, 2, "u", 248], [2, 2, "u", 248], [4, 2, "u", 248], [6, 2, "u", 124]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "FLD:L:F:d28b333ee76050463046f0e1e298531aec6f5954:param_1:0x34", "name": "Unkstruct_fe02110c", "sites": 868, "bodies": 124, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 16, "fields": 3, "layout": [[6, 2, "s", 248], [10, 2, "s", 124], [14, 2, "s", 248]], "conflicts": [], "evidence": {"L": 1, "FLD": 1}, "sign_mixed": 2, "merges": {"field": 1}, "suspect": false}, {"id": "L:F:1d09228dd5c2462bead8cd0b014ea599fe154e57:param_1", "name": "Unkstruct_92677d11", "sites": 861, "bodies": 123, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 576, "fields": 5, "layout": [[0, 2, "u", 246], [32, 4, "s", 246], [564, 4, "s", 123], [568, 4, "s", 123], [572, 4, "s", 123]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:659637a8357e1c0b8fa595c33bfce17ffab95582:a0v", "name": "Unkstruct_86465c2c", "sites": 861, "bodies": 123, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 32, "fields": 7, "layout": [[6, 2, "u", 123], [10, 2, "u", 123], [14, 2, "u", 123], [18, 2, "u", 123], [22, 2, "u", 123], [26, 2, "u", 123], [28, 4, "s", 123]], "conflicts": [], "evidence": {"L": 2}, "sign_mixed": 0, "merges": {"assign": 1}, "suspect": false}, {"id": "L:F:8dd1002c19f72a778eeb3a7a4fb715299d59ae25:param_1", "name": "Unkstruct_ffd2397c", "sites": 854, "bodies": 122, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 52, "fields": 5, "layout": [[2, 2, "s", 244], [28, 4, "s", 122], [42, 2, "s", 122], [44, 4, "s", 244], [48, 4, "s", 122]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:0f5e993b3c8ed7a59daf16fb6d43086aa8b7fae8:a0", "name": "Unkstruct_17738e2c", "sites": 821, "bodies": 30, "nodes": 71, "globals_at": [], "globals_ptr": [], "params": 23, "size_hint": 164, "fields": 32, "layout": [[5, 1, "u", 15], [8, 2, "s", 20], [12, 2, "s", 19], [16, 4, "s", 40], [20, 2, "s", 19], [24, 2, "s", 38], [26, 2, "s", 44], [28, 2, "s", 38], [32, 2, "s", 19], [34, 2, "s", 25], [36, 2, "s", 19], [40, 2, "s", 76], [42, 2, "s", 76], [44, 2, "s", 76], [46, 2, "s", 24], [48, 2, "s", 19], [50, 2, "s", 20], [56, 2, "s", 1], [58, 2, "s", 1], [60, 4, "s", 19], [62, 2, "s", 1], [64, 4, "s", 19], [66, 2, "s", 1], [68, 4, "s", 19], [70, 2, "s", 1], [72, 4, "s", 19], [76, 4, "s", 19], [80, 4, "s", 19], [156, 2, "s", 12], [158, 2, "s", 2], [160, 2, "s", 4], [162, 2, "s", 24]], "conflicts": [[8, {"4s": 19, "2s": 20}], [12, {"4s": 4, "2s": 19}], [16, {"4s": 40, "2s": 20}], [20, {"2s": 19, "4s": 5}], [32, {"2s": 19, "4s": 1}], [60, {"4s": 19, "2s": 1}], [64, {"4s": 19, "2s": 1}], [68, {"4s": 19, "2s": 1}], [72, {"4s": 19, "2s": 1}], [62, "overlap"], [66, "overlap"], [70, "overlap"]], "evidence": {"PV": 23, "P": 23, "L": 25}, "sign_mixed": 5, "merges": {"param": 46, "assign": 1, "arg": 23}, "suspect": false}, {"id": "AT:D_801270C0", "name": "Unkstruct_801270C0", "sites": 821, "bodies": 820, "nodes": 2, "globals_at": ["D_801270C0"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "s", 821]], "conflicts": [], "evidence": {"AT": 1, "L": 1}, "sign_mixed": 0, "merges": {"assign&": 1}, "suspect": false}, {"id": "L:F:c6d6ef34db3f99b145fbf127bb9f07d719ca5391:arg", "name": "Unkstruct_2932a0a7", "sites": 798, "bodies": 133, "nodes": 4, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 18, "fields": 6, "layout": [[4, 4, "s", 133], [6, 4, "s", 133], [8, 4, "s", 133], [10, 4, "s", 133], [12, 4, "s", 133], [14, 4, "s", 133]], "conflicts": [[6, "overlap"], [8, "overlap"], [10, "overlap"], [12, "overlap"], [14, "overlap"]], "evidence": {"L": 2, "PV": 1, "P": 1}, "sign_mixed": 0, "merges": {"param": 2, "assign": 1}, "suspect": false}, {"id": "L:F:00b75d213b2a41107232b1f6692e0f9cc00b7ee7:a0", "name": "Unkstruct_0a8f505b", "sites": 790, "bodies": 83, "nodes": 81, "globals_at": [], "globals_ptr": [], "params": 27, "size_hint": 268, "fields": 14, "layout": [[2, 2, "u", 54], [10, 2, "u", 25], [28, 4, "s", 87], [32, 4, "s", 75], [94, 2, "u", 50], [204, 4, "s", 50], [208, 4, "s", 25], [216, 4, "p", 25], [220, 4, "p", 29], [252, 2, "u", 50], [254, 2, "u", 50], [262, 2, "s", 50], [264, 2, "s", 58], [266, 2, "s", 75]], "conflicts": [], "evidence": {"PV": 27, "P": 27, "L": 27}, "sign_mixed": 5, "merges": {"param": 54, "arg": 26}, "suspect": false}, {"id": "FLD:L:F:741e694989de8029f7fb58b84f991c3adff430b3:param_1:0x20", "name": "Unkstruct_12f4cee2", "sites": 786, "bodies": 131, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 40, "fields": 5, "layout": [[4, 4, "s", 262], [24, 2, "u", 131], [26, 2, "u", 131], [32, 4, "u", 131], [39, 1, "u", 131]], "conflicts": [], "evidence": {"L": 1, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 1}, "suspect": false}, {"id": "L:F:2efadbdef7c8f0b9d8e61f5f99c4ab820ab31fe4:arg0", "name": "Unkstruct_d2490774", "sites": 786, "bodies": 131, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 176, "fields": 3, "layout": [[169, 1, "u", 131], [170, 2, "u", 131], [174, 2, "u", 524]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:3f50a76a114c0196fe01adbdf3383be46e44b139:a0", "name": "Unkstruct_80135260", "sites": 780, "bodies": 130, "nodes": 38, "globals_at": [], "globals_ptr": [], "params": 12, "size_hint": 84, "fields": 3, "layout": [[72, 4, "s", 260], [76, 4, "s", 260], [80, 4, "s", 260]], "conflicts": [], "evidence": {"PV": 12, "P": 12, "L": 14}, "sign_mixed": 0, "merges": {"param": 24, "arg": 11, "assign": 2}, "suspect": false}, {"id": "L:F:d8b2cb544bf2d39e0fd9a5b84f7c2c59493b1aaf:puVar4", "name": "Unkstruct_b196f9c0", "sites": 768, "bodies": 128, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 20, "fields": 5, "layout": [[0, 2, "u", 128], [4, 4, "s", 128], [10, 1, "u", 128], [16, 1, "u", 128], [18, 2, "u", 128]], "conflicts": [[0, {"2u": 128, "4s": 128}]], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:903c7004189f0bb3a018ec60a8a59dde7bc4da31:arr", "name": "Unkstruct_36c327cf", "sites": 762, "bodies": 127, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 24, "fields": 2, "layout": [[20, 2, "u", 381], [22, 2, "u", 381]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:c9a642091d2ee140cadc8a4c4b8fb8797e9a5234:param_1", "name": "Unkstruct_6cd0e445", "sites": 756, "bodies": 126, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 16, "fields": 2, "layout": [[6, 2, "s", 378], [14, 2, "s", 378]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:e88bc6d8af09ec78a633a1ad0286db378f599db5:p", "name": "Unkstruct_c0b9c5d5", "sites": 750, "bodies": 125, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 16, "fields": 6, "layout": [[4, 2, "u", 125], [6, 2, "u", 125], [8, 2, "u", 125], [10, 2, "u", 125], [12, 2, "u", 125], [14, 2, "u", 125]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:fc3f1ffd17e7582fc5f58fe5091b90ca656cccd7:arg0", "name": "Unkstruct_64375b18", "sites": 744, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 160, "fields": 5, "layout": [[114, 2, "u", 248], [144, 4, "p", 124], [148, 4, "s", 124], [154, 2, "s", 124], [156, 4, "s", 124]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "FLD:L:F:fdea804fac944d7874892061563887debbf5f021:a1:0x20", "name": "Unkstruct_438adcd1", "sites": 744, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 20, "fields": 5, "layout": [[0, 2, "u", 248], [8, 2, "u", 124], [10, 2, "u", 124], [12, 2, "u", 124], [18, 2, "s", 124]], "conflicts": [], "evidence": {"L": 2, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 2}, "suspect": false}, {"id": "FLD:L:F:fe40e9ccdaa2d5f0ba2f4c3e37a6970152d41247:param_1:0x20", "name": "Unkstruct_97b6f459", "sites": 744, "bodies": 124, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 40, "fields": 5, "layout": [[4, 4, "s", 248], [24, 2, "u", 124], [26, 2, "u", 124], [32, 4, "u", 124], [39, 1, "u", 124]], "conflicts": [], "evidence": {"L": 1, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 1}, "suspect": false}, {"id": "L:F:0ef566a105e459b80720f079223698904a0de611:iVar1", "name": "Unkstruct_38975874", "sites": 744, "bodies": 124, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 132, "fields": 4, "layout": [[4, 4, "u", 248], [26, 2, "u", 124], [44, 2, "u", 248], [128, 4, "p", 124]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:847846f948e9fe926200a820d3a38dde0be26e63:p", "name": "Unkstruct_76b1caf3", "sites": 744, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 3, "fields": 2, "layout": [[1, 1, "u", 248], [2, 1, "u", 496]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:1477ad6a9f9211dc890db15516297afa81abfb58:param", "name": "Unkstruct_8016BBE0", "sites": 690, "bodies": 139, "nodes": 12, "globals_at": [], "globals_ptr": [], "params": 4, "size_hint": 56, "fields": 9, "layout": [[2, 2, "u", 134], [16, 2, "s", 134], [18, 2, "u", 5], [20, 2, "s", 134], [22, 2, "u", 5], [26, 2, "u", 5], [32, 4, "s", 134], [44, 4, "s", 134], [52, 4, "s", 5]], "conflicts": [], "evidence": {"PV": 4, "P": 4, "L": 4}, "sign_mixed": 0, "merges": {"param": 8, "arg": 3}, "suspect": false}, {"id": "L:F:018117d92e996b5ccd97dd6fed38b144533be2bc:r", "name": "Unkstruct_80146A6C", "sites": 680, "bodies": 137, "nodes": 8, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 44, "fields": 7, "layout": [[6, 2, "s", 135], [10, 2, "s", 135], [14, 2, "s", 135], [16, 4, "s", 2], [20, 4, "s", 2], [24, 4, "s", 2], [42, 2, "s", 134]], "conflicts": [], "evidence": {"L": 7, "R": 1}, "sign_mixed": 0, "merges": {"ret-of": 7}, "suspect": false}, {"id": "AT:D_800AF630", "name": "Unkstruct_800AF630", "sites": 671, "bodies": 537, "nodes": 9, "globals_at": ["D_800AF630"], "globals_ptr": [], "params": 0, "size_hint": 41948, "fields": 3, "layout": [[0, 1, "u", 402], [41938, 2, "u", 268], [41946, 2, "s", 1]], "conflicts": [], "evidence": {"L": 8, "AT": 1}, "sign_mixed": 0, "merges": {"assign&": 8}, "suspect": true}, {"id": "L:F:2e0d980349a3986c4e37b6e5252c9de6f1fed04f:end", "name": "Unkstruct_8012C284", "sites": 668, "bodies": 533, "nodes": 8, "globals_at": [], "globals_ptr": ["D_80126720"], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "s", 402]], "conflicts": [], "evidence": {"PTR": 1, "L": 7}, "sign_mixed": 1, "merges": {"assign": 7}, "suspect": false}, {"id": "AT:D_80115128", "name": "Unkstruct_80115128", "sites": 667, "bodies": 534, "nodes": 1, "globals_at": ["D_80115128"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "s", 667]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:ac7599b22dca07025fc0949dcdd424e700291629:arg0", "name": "Unkstruct_3271c3cc", "sites": 665, "bodies": 133, "nodes": 4, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 94, "fields": 3, "layout": [[28, 4, "s", 133], [32, 4, "s", 399], [92, 2, "s", 133]], "conflicts": [], "evidence": {"L": 2, "PV": 1, "P": 1}, "sign_mixed": 0, "merges": {"assign": 1, "param": 2}, "suspect": false}, {"id": "L:F:266b753080d094a813817359fce34335dcf6f7ac:p0C", "name": "Unkstruct_61789347", "sites": 665, "bodies": 133, "nodes": 7, "globals_at": [], "globals_ptr": [], "params": 2, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"PV": 2, "P": 2, "L": 3}, "sign_mixed": 0, "merges": {"arg": 2, "param": 4}, "suspect": false}, {"id": "L:F:8ffda1508a6726a15566fc4ef02dbc9f66e75c35:base", "name": "Unkstruct_05fa9429", "sites": 665, "bodies": 133, "nodes": 7, "globals_at": [], "globals_ptr": [], "params": 2, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"PV": 2, "P": 2, "L": 3}, "sign_mixed": 0, "merges": {"param": 4, "arg": 2}, "suspect": false}, {"id": "FLD:L:F:c6d6ef34db3f99b145fbf127bb9f07d719ca5391:arg:0x8", "name": "Unkstruct_801345F8", "sites": 665, "bodies": 133, "nodes": 16, "globals_at": [], "globals_ptr": [], "params": 4, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"PV": 4, "P": 4, "L": 6, "FLD": 2}, "sign_mixed": 0, "merges": {"field": 2, "param": 8, "arg": 5}, "suspect": false}, {"id": "FLD:L:F:c6d6ef34db3f99b145fbf127bb9f07d719ca5391:arg:0x6", "name": "Unkstruct_801345F8", "sites": 665, "bodies": 133, "nodes": 16, "globals_at": [], "globals_ptr": [], "params": 4, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"PV": 4, "P": 4, "L": 6, "FLD": 2}, "sign_mixed": 0, "merges": {"field": 2, "param": 8, "arg": 5}, "suspect": false}, {"id": "AT:D_801152A0", "name": "Unkstruct_801152A0", "sites": 665, "bodies": 399, "nodes": 1, "globals_at": ["D_801152A0"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "u", 665]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:951936f84f12c82adbf8a4a4be09c0719d52a282:iVar1", "name": "Unkstruct_89230a8b", "sites": 665, "bodies": 133, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 28, "fields": 5, "layout": [[16, 2, "s", 133], [18, 2, "s", 133], [20, 2, "s", 133], [24, 2, "s", 133], [26, 2, "s", 133]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "FLD:L:F:77b6d94dff9bef0b15b418f0bd59eaa0256ec56d:param_1:0x32", "name": "Unkstruct_fdd04bae", "sites": 650, "bodies": 130, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 56, "fields": 3, "layout": [[4, 4, "s", 260], [12, 4, "s", 260], [54, 2, "s", 130]], "conflicts": [], "evidence": {"L": 1, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 1}, "suspect": false}, {"id": "L:F:33923e514bd02d6671035bee0f8b344b58b3d972:param_1", "name": "Unkstruct_eb8b6fbf", "sites": 645, "bodies": 129, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 254, "fields": 5, "layout": [[32, 4, "s", 129], [88, 4, "s", 129], [92, 2, "s", 129], [220, 4, "s", 129], [252, 2, "s", 129]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "FLD:L:F:1eeddc4a726cce7edb2fd84a3cad6477021bcf85:param_1:0x34", "name": "Unkstruct_90d0825c", "sites": 645, "bodies": 129, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 28, "fields": 5, "layout": [[4, 4, "u", 129], [6, 2, "u", 129], [10, 2, "u", 129], [14, 2, "u", 129], [26, 2, "s", 129]], "conflicts": [[6, "overlap"]], "evidence": {"L": 1, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 1}, "suspect": false}, {"id": "L:F:1542055f1c9f4304a7a2a4a6d7952d5524bbd6f6:param_1", "name": "Unkstruct_27c177f1", "sites": 645, "bodies": 129, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 52, "fields": 4, "layout": [[2, 2, "s", 258], [22, 2, "s", 129], [32, 4, "s", 129], [48, 4, "s", 129]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:8de2505415803d505ca54f1d5ec81c291e2191a8:d", "name": "Unkstruct_4f9f60b8", "sites": 630, "bodies": 126, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 120, "fields": 4, "layout": [[4, 4, "u", 252], [24, 2, "s", 126], [26, 2, "s", 126], [118, 2, "s", 126]], "conflicts": [], "evidence": {"L": 2}, "sign_mixed": 0, "merges": {"assign": 1}, "suspect": false}, {"id": "L:F:25ab0fa8060d0fde4162393b2fe6d2e173139b54:param_1", "name": "Unkstruct_7a31a22f", "sites": 630, "bodies": 126, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 412, "fields": 2, "layout": [[32, 4, "s", 126], [408, 4, "s", 504]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:2e7a0e0cf5ddcacbaf0f3497e29d348050488cd0:param_1", "name": "Unkstruct_187abeff", "sites": 630, "bodies": 126, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 104, "fields": 5, "layout": [[44, 2, "s", 126], [46, 2, "s", 126], [96, 2, "s", 126], [98, 2, "s", 126], [102, 2, "s", 126]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:5a1e46d09a18bce1851bbfe4bbd37ae5f338cb7d:s2", "name": "Unkstruct_dafba7ce", "sites": 630, "bodies": 126, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 32, "fields": 4, "layout": [[4, 4, "s", 252], [24, 2, "s", 126], [26, 2, "s", 126], [30, 2, "s", 126]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:1e5bdb3d889cf99856e8e0f53e443c0d445ca75e:iNew", "name": "Unkstruct_20d4328b", "sites": 630, "bodies": 126, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 56, "fields": 4, "layout": [[4, 4, "u", 252], [24, 2, "s", 126], [26, 2, "s", 126], [52, 4, "s", 126]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:7a236870edfc6bd00bd593972631b414341516eb:param_3", "name": "Unkstruct_d94ab931", "sites": 625, "bodies": 125, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 6, "fields": 4, "layout": [[0, 2, "u", 125], [1, 2, "u", 125], [2, 2, "u", 125], [4, 2, "s", 125]], "conflicts": [[1, "overlap"], [2, "overlap"]], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 1, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:7a236870edfc6bd00bd593972631b414341516eb:param_2", "name": "Unkstruct_7ef9c9ef", "sites": 625, "bodies": 125, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 6, "fields": 4, "layout": [[0, 2, "u", 125], [1, 2, "u", 125], [2, 2, "u", 125], [4, 2, "s", 125]], "conflicts": [[1, "overlap"], [2, "overlap"]], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 1, "merges": {"param": 2}, "suspect": false}, {"id": "FLD:L:F:aefd1d3f1a6e502cd2bc00fd72ead9b2a943b1e0:param_1:0x20", "name": "Unkstruct_8ce68494", "sites": 625, "bodies": 125, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 26, "fields": 2, "layout": [[18, 2, "u", 250], [24, 2, "u", 375]], "conflicts": [], "evidence": {"L": 1, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 1}, "suspect": false}, {"id": "L:F:e4a8eda15597710d8e18c0c552e2c5d772f45ea3:param_1", "name": "Unkstruct_57ae03d1", "sites": 620, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 44, "fields": 2, "layout": [[21, 1, "u", 248], [40, 4, "s", 372]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:0ef566a105e459b80720f079223698904a0de611:param_1", "name": "Unkstruct_af1e9d57", "sites": 620, "bodies": 248, "nodes": 9, "globals_at": [], "globals_ptr": [], "params": 3, "size_hint": 100, "fields": 4, "layout": [[32, 4, "s", 248], [80, 4, "s", 124], [96, 2, "u", 124], [98, 2, "u", 124]], "conflicts": [], "evidence": {"PV": 3, "P": 3, "L": 3}, "sign_mixed": 0, "merges": {"param": 6, "arg": 2}, "suspect": false}, {"id": "L:F:8135fa3c427f4ca639d9562fd2c45229be7d8689:arg0", "name": "Unkstruct_172cbd29", "sites": 620, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 508, "fields": 2, "layout": [[0, 2, "u", 496], [504, 4, "s", 124]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:fd006a820b6cb56b1fca204bcbda6be36d434bbd:param_1", "name": "Unkstruct_2c2c1d2e", "sites": 620, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 36, "fields": 4, "layout": [[2, 2, "s", 248], [16, 4, "s", 124], [20, 4, "s", 124], [32, 4, "s", 124]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:5d384070f557c4e179ee23e15ca41c21eeb65e76:a0", "name": "Unkstruct_aaf4c4dd", "sites": 615, "bodies": 615, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 22, "fields": 1, "layout": [[21, 1, "u", 615]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:d3dab0de7f93234d504e64c09270db7e78cb4e16:out3", "name": "Unkstruct_293d71dc", "sites": 600, "bodies": 75, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:e1b0419f54c26cc0ccd6be1f438874310e36c635:a0", "name": "Unkstruct_78eaa73c", "sites": 553, "bodies": 7, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 266, "fields": 15, "layout": [[6, 2, "s", 21], [10, 2, "s", 28], [14, 2, "s", 21], [32, 4, "s", 266], [100, 4, "s", 70], [112, 2, "s", 14], [204, 4, "p", 7], [208, 4, "p", 21], [252, 2, "u", 7], [254, 2, "s", 7], [256, 2, "u", 7], [258, 2, "u", 7], [260, 2, "u", 7], [262, 2, "u", 7], [264, 2, "s", 14]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 7, "merges": {"param": 2}, "suspect": false}, {"id": "AT:D_8011512E", "name": "Unkstruct_8011512E", "sites": 532, "bodies": 133, "nodes": 1, "globals_at": ["D_8011512E"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "s", 532]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:27b5410bfc91fc14d52c05c082c77da058ab4fe9:a0", "name": "Unkstruct_8016BFA8", "sites": 532, "bodies": 133, "nodes": 18, "globals_at": [], "globals_ptr": [], "params": 6, "size_hint": 36, "fields": 4, "layout": [[6, 2, "u", 133], [10, 2, "u", 133], [14, 2, "u", 133], [32, 4, "s", 133]], "conflicts": [], "evidence": {"PV": 6, "P": 6, "L": 6}, "sign_mixed": 0, "merges": {"param": 12, "arg": 5}, "suspect": false}, {"id": "L:F:be9288d1f2eaecc1cb9835a4658eb37749f9bcbe:d", "name": "Unkstruct_30befa8c", "sites": 520, "bodies": 130, "nodes": 4, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 254, "fields": 3, "layout": [[32, 4, "s", 130], [112, 2, "u", 260], [252, 2, "s", 130]], "conflicts": [], "evidence": {"L": 2, "PV": 1, "P": 1}, "sign_mixed": 0, "merges": {"assign": 1, "param": 2}, "suspect": false}, {"id": "L:F:8ffda1508a6726a15566fc4ef02dbc9f66e75c35:cmd", "name": "Unkstruct_00ddc7c9", "sites": 520, "bodies": 130, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 2, "fields": 1, "layout": [[0, 2, "u", 390]], "conflicts": [[0, {"2u": 390, "1u": 130}]], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:b5f85ed5dd4d2a1750ce5c6720e8c63407a6b0e8:a0", "name": "Unkstruct_01082f7a", "sites": 520, "bodies": 520, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 4, "fields": 1, "layout": [[2, 2, "u", 520]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "FLD:L:F:1eeddc4a726cce7edb2fd84a3cad6477021bcf85:param_1:0x30", "name": "Unkstruct_db0ee441", "sites": 516, "bodies": 129, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 56, "fields": 4, "layout": [[6, 2, "u", 129], [10, 2, "u", 129], [14, 2, "u", 129], [54, 2, "u", 129]], "conflicts": [], "evidence": {"L": 1, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 1}, "suspect": false}, {"id": "L:F:fd901a9a5b08fe3e2d8866b949886e73e5e6ade9:e", "name": "Unkstruct_7476116e", "sites": 516, "bodies": 129, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 4, "fields": 1, "layout": [[0, 4, "s", 516]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:8de2505415803d505ca54f1d5ec81c291e2191a8:param_1", "name": "Unkstruct_290ce261", "sites": 504, "bodies": 126, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 254, "fields": 3, "layout": [[32, 4, "s", 126], [112, 2, "u", 126], [252, 2, "s", 252]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:b25150e61818e0e15b1d045fef5830235d52337c:iVar1", "name": "Unkstruct_d6100faa", "sites": 504, "bodies": 126, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 32, "fields": 3, "layout": [[4, 4, "u", 252], [16, 2, "s", 126], [30, 2, "s", 126]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:5af6f1274f961b3381a10db1c3ebfe2b33450ebd:param_2", "name": "Unkstruct_5ebcbddc", "sites": 504, "bodies": 126, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 14, "fields": 3, "layout": [[8, 2, "u", 126], [10, 2, "s", 126], [12, 2, "s", 126]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:5cc8290154fb662b23f83a0d99af3b530814bc30:param_1", "name": "Unkstruct_7cb40b10", "sites": 500, "bodies": 500, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 4, "fields": 1, "layout": [[2, 2, "u", 500]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:d8ec93cf2ab8692a851707f792bb542559b8b477:b164", "name": "Unkstruct_4e078af8", "sites": 496, "bodies": 124, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 4, "fields": 2, "layout": [[0, 2, "s", 124], [2, 2, "s", 124]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 2, "merges": {}, "suspect": false}, {"id": "L:F:865c6699e7072df19983825933b0da5a8df2e612:arg0", "name": "Unkstruct_494cef68", "sites": 496, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 392, "fields": 2, "layout": [[0, 2, "u", 248], [388, 4, "u", 248]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "FLD:L:F:0fdb1818230a528aa8124f3e3ca3abbc37c4da35:param_1:0x64", "name": "Unkstruct_93df0322", "sites": 496, "bodies": 124, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 56, "fields": 4, "layout": [[6, 2, "u", 124], [10, 2, "u", 124], [14, 2, "u", 124], [54, 2, "u", 124]], "conflicts": [], "evidence": {"FLD": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "FLD:L:F:2f386ebb9a66fcb2ac404d69911dc62e11ced48e:param_1:0x64", "name": "Unkstruct_3b2b6e45", "sites": 496, "bodies": 124, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 56, "fields": 4, "layout": [[6, 2, "u", 124], [10, 2, "u", 124], [14, 2, "u", 124], [54, 2, "u", 124]], "conflicts": [], "evidence": {"FLD": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:d81b9a67258787a6f2cc35936700d1862008fc9e:param_2", "name": "Unkstruct_31283f15", "sites": 492, "bodies": 123, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 6, "fields": 3, "layout": [[0, 2, "s", 123], [2, 2, "s", 123], [4, 2, "s", 123]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:81aa50d5890521702ec3e35b8059e18556f6cf45:s0b", "name": "Unkstruct_a05973fa", "sites": 492, "bodies": 123, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 44, "fields": 3, "layout": [[24, 4, "s", 246], [32, 4, "p", 123], [40, 4, "s", 123]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:6f527022fa9e2edbff88b3415d6e85040f80b293:a0", "name": "Unkstruct_48c11385", "sites": 441, "bodies": 21, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 104, "fields": 5, "layout": [[4, 4, "s", 21], [8, 4, "s", 21], [12, 4, "s", 21], [32, 4, "s", 210], [100, 4, "s", 168]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:a3818d1fe32af81de33548695a2bad677be3a52a:a0", "name": "Unkstruct_a55a221e", "sites": 428, "bodies": 428, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 533, "fields": 1, "layout": [[532, 1, "u", 428]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "PTR:D_80115158", "name": "Unkstruct_02864986", "sites": 420, "bodies": 420, "nodes": 1, "globals_at": [], "globals_ptr": ["D_80115158"], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "u", 137]], "conflicts": [], "evidence": {"PTR": 1}, "sign_mixed": 1, "merges": {}, "suspect": false}, {"id": "FLD:AT:D_800B5CB8:0x78", "name": "Unkstruct_80131B14", "sites": 404, "bodies": 383, "nodes": 23, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 50, "fields": 5, "layout": [[0, 2, "u", 34], [2, 2, "u", 60], [8, 4, "s", 2], [46, 2, "s", 1], [48, 2, "s", 307]], "conflicts": [], "evidence": {"L": 22, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 22}, "suspect": false}, {"id": "AT:D_8011511A", "name": "Unkstruct_8011511A", "sites": 404, "bodies": 146, "nodes": 15, "globals_at": ["D_8011511A"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "u", 390]], "conflicts": [], "evidence": {"AT": 1, "L": 14}, "sign_mixed": 1, "merges": {"assign&": 14}, "suspect": false}, {"id": "FLD:L:F:11f86a358e6d71766aa362f8cfb3a9eb58ca58bc:param_1:0x18", "name": "Unkstruct_8016B5C0", "sites": 399, "bodies": 133, "nodes": 4, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 28, "fields": 2, "layout": [[24, 2, "s", 133], [26, 2, "s", 266]], "conflicts": [], "evidence": {"L": 3, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 3}, "suspect": false}, {"id": "L:F:27b5410bfc91fc14d52c05c082c77da058ab4fe9:a3", "name": "Unkstruct_8016BFA8", "sites": 399, "bodies": 133, "nodes": 18, "globals_at": [], "globals_ptr": [], "params": 6, "size_hint": 6, "fields": 3, "layout": [[0, 2, "u", 133], [2, 2, "u", 133], [4, 2, "u", 133]], "conflicts": [], "evidence": {"PV": 6, "P": 6, "L": 6}, "sign_mixed": 0, "merges": {"param": 12, "arg": 5}, "suspect": false}, {"id": "AT:D_8011F7F0", "name": "Unkstruct_8011F7F0", "sites": 399, "bodies": 133, "nodes": 10, "globals_at": ["D_8011F7F0"], "globals_ptr": [], "params": 0, "size_hint": 66, "fields": 3, "layout": [[30, 2, "s", 133], [46, 2, "u", 133], [64, 2, "u", 133]], "conflicts": [], "evidence": {"L": 9, "AT": 1}, "sign_mixed": 0, "merges": {"assign&": 9}, "suspect": false}, {"id": "FLD:L:F:9dedcda9dded508b80dc8149159c528d143a0d96:param_1:0x1a", "name": "Unkstruct_2552224c", "sites": 393, "bodies": 131, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 16, "fields": 3, "layout": [[6, 2, "u", 131], [10, 2, "u", 131], [14, 2, "u", 131]], "conflicts": [], "evidence": {"L": 1, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 1}, "suspect": false}, {"id": "L:F:f88573dff145c554981bca20355a96b6dfaea27d:param_1", "name": "Unkstruct_1649b9a7", "sites": 392, "bodies": 28, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 56, "fields": 8, "layout": [[2, 2, "s", 56], [6, 2, "s", 56], [10, 2, "u", 56], [14, 2, "s", 56], [20, 2, "s", 28], [22, 2, "s", 28], [32, 4, "s", 28], [52, 4, "s", 28]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 2, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:02f3d948e09a3e6d0e1d58f9893278085dee5950:param_1", "name": "Unkstruct_ea5ed765", "sites": 390, "bodies": 130, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 219, "fields": 1, "layout": [[218, 1, "u", 390]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:3f50a76a114c0196fe01adbdf3383be46e44b139:a3", "name": "Unkstruct_80135260", "sites": 390, "bodies": 130, "nodes": 35, "globals_at": [], "globals_ptr": [], "params": 11, "size_hint": 6, "fields": 3, "layout": [[0, 2, "s", 130], [2, 2, "s", 130], [4, 2, "s", 130]], "conflicts": [], "evidence": {"PV": 11, "P": 11, "L": 13}, "sign_mixed": 0, "merges": {"param": 22, "arg": 10, "assign": 2}, "suspect": false}, {"id": "L:F:1eeddc4a726cce7edb2fd84a3cad6477021bcf85:iVar2", "name": "Unkstruct_a472a6ba", "sites": 387, "bodies": 129, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 28, "fields": 3, "layout": [[4, 4, "u", 129], [24, 2, "s", 129], [26, 2, "s", 129]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:16a750960362018cc369e0f92a6ed206750386f3:a0", "name": "Unkstruct_630777a3", "sites": 387, "bodies": 258, "nodes": 15, "globals_at": [], "globals_ptr": [], "params": 5, "size_hint": 5, "fields": 2, "layout": [[0, 1, "u", 129], [4, 1, "u", 258]], "conflicts": [], "evidence": {"PV": 5, "P": 5, "L": 5}, "sign_mixed": 0, "merges": {"param": 10, "arg": 4}, "suspect": false}, {"id": "L:F:304d1a1cd67647ffff0d682a49fc7bd3bb4ca331:OTE", "name": "Unkstruct_f2440762", "sites": 384, "bodies": 128, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 4, "fields": 1, "layout": [[0, 4, "u", 384]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:b25150e61818e0e15b1d045fef5830235d52337c:param_1", "name": "Unkstruct_80164BDC", "sites": 384, "bodies": 128, "nodes": 9, "globals_at": [], "globals_ptr": [], "params": 3, "size_hint": 100, "fields": 5, "layout": [[10, 2, "s", 1], [32, 4, "s", 127], [76, 4, "s", 1], [96, 2, "s", 127], [98, 2, "s", 127]], "conflicts": [], "evidence": {"PV": 3, "P": 3, "L": 3}, "sign_mixed": 1, "merges": {"param": 6, "arg": 2}, "suspect": false}, {"id": "L:F:c43d345b308a05793ac9a8edca20a5c739ae9813:a0", "name": "Unkstruct_8c2ab96e", "sites": 384, "bodies": 128, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 8, "fields": 3, "layout": [[3, 1, "u", 128], [4, 2, "u", 128], [6, 2, "u", 128]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:d6e3de8a766ebb0b4ab359aabc01dcd5e9d53a36:out3", "name": "Unkstruct_d448adea", "sites": 384, "bodies": 48, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:60753a66ad7b997b354356bdcc1b2cfb92a8800f:q1", "name": "Unkstruct_e79a0730", "sites": 378, "bodies": 126, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 36, "fields": 2, "layout": [[32, 2, "u", 252], [34, 2, "u", 126]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:60753a66ad7b997b354356bdcc1b2cfb92a8800f:src", "name": "Unkstruct_1a8e907f", "sites": 378, "bodies": 126, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 4, "fields": 1, "layout": [[0, 4, "u", 378]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:84255a903577529ee712cdbc97647e719440dfd3:p1", "name": "Unkstruct_e1c73ac0", "sites": 378, "bodies": 126, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 6, "fields": 3, "layout": [[0, 2, "u", 126], [2, 2, "u", 126], [4, 2, "u", 126]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:1fd5c5850652e651e5db7bf9ff6d4ae99aab9d03:p1", "name": "Unkstruct_8ba4da0a", "sites": 378, "bodies": 126, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 28, "fields": 3, "layout": [[18, 2, "u", 126], [22, 2, "u", 126], [26, 2, "u", 126]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "FLD:L:F:9df4b60ade927cf864b1a0a1438721c480ca9784:param:0x20", "name": "Unkstruct_93e44aed", "sites": 378, "bodies": 126, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 28, "fields": 2, "layout": [[24, 2, "s", 126], [26, 2, "s", 252]], "conflicts": [], "evidence": {"L": 1, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 1}, "suspect": false}, {"id": "L:F:dd85b89075eefb8623b7d9ebafc421f35bcd96bd:param_2", "name": "Unkstruct_24687968", "sites": 378, "bodies": 126, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 14, "fields": 3, "layout": [[8, 2, "u", 126], [10, 2, "s", 126], [12, 2, "s", 126]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:e88bc6d8af09ec78a633a1ad0286db378f599db5:param_4", "name": "Unkstruct_89684c99", "sites": 375, "bodies": 125, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 6, "fields": 3, "layout": [[0, 2, "u", 125], [2, 2, "u", 125], [4, 2, "u", 125]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:aefd1d3f1a6e502cd2bc00fd72ead9b2a943b1e0:param_1", "name": "Unkstruct_831a2d3a", "sites": 375, "bodies": 125, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 36, "fields": 2, "layout": [[2, 2, "s", 250], [32, 4, "s", 125]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:695bc29300546c372ed373f9f26b961fa5dea2c1:a0", "name": "Unkstruct_89f82b52", "sites": 372, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 458, "fields": 3, "layout": [[68, 4, "u", 124], [172, 2, "u", 124], [456, 2, "s", 124]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:858edb9b0da77e1274071626f287939881c33e7b:p1", "name": "Unkstruct_924d03d6", "sites": 372, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 6, "fields": 3, "layout": [[0, 2, "u", 124], [2, 2, "u", 124], [4, 2, "u", 124]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "FLD:L:F:66a9253f13334598aac89a2be8e072eb5a5a6621:param_1:0x18c", "name": "Unkstruct_7fd6458b", "sites": 372, "bodies": 124, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 64, "fields": 1, "layout": [[60, 4, "s", 372]], "conflicts": [], "evidence": {"L": 1, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 1}, "suspect": false}, {"id": "L:F:a8b2812a7f92a80f310198d49b4dbdb58a0160dd:param_1", "name": "Unkstruct_92a372de", "sites": 372, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 36, "fields": 2, "layout": [[2, 2, "s", 248], [32, 4, "s", 124]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:d28b333ee76050463046f0e1e298531aec6f5954:iVar3", "name": "Unkstruct_4a31f01c", "sites": 372, "bodies": 124, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 28, "fields": 3, "layout": [[18, 2, "u", 124], [22, 2, "u", 124], [26, 2, "u", 124]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "FLD:FLD:L:F:66a9253f13334598aac89a2be8e072eb5a5a6621:param_1:0x18c:0x3c", "name": "Unkstruct_39de3511", "sites": 372, "bodies": 124, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 18, "fields": 3, "layout": [[12, 2, "u", 124], [14, 2, "s", 124], [16, 2, "u", 124]], "conflicts": [], "evidence": {"FLD": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:a06a0968fc994e3570786e8595151cfd5a7bd33c:param_1", "name": "Unkstruct_1b4331f0", "sites": 369, "bodies": 123, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 94, "fields": 3, "layout": [[32, 4, "s", 123], [88, 4, "s", 123], [92, 2, "s", 123]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:27e50fe90649c2a36422062babe9f76e89ad16e5:param_1", "name": "Unkstruct_75e9a6af", "sites": 369, "bodies": 123, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 16, "fields": 3, "layout": [[6, 2, "s", 123], [10, 2, "s", 123], [14, 2, "s", 123]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:10595a7f37bbf3255368bf29c858a97e24fdd472:arg0", "name": "Unkstruct_b39064df", "sites": 366, "bodies": 14, "nodes": 21, "globals_at": [], "globals_ptr": [], "params": 7, "size_hint": 162, "fields": 24, "layout": [[5, 1, "u", 12], [8, 4, "s", 8], [12, 2, "s", 8], [16, 4, "s", 16], [20, 2, "s", 8], [24, 2, "s", 16], [26, 2, "s", 16], [28, 2, "s", 16], [32, 2, "s", 10], [34, 2, "s", 11], [36, 2, "s", 10], [40, 2, "s", 32], [42, 2, "s", 32], [44, 2, "s", 32], [46, 2, "s", 10], [48, 2, "s", 10], [50, 2, "s", 10], [60, 4, "s", 8], [64, 4, "s", 8], [68, 4, "s", 8], [72, 4, "s", 8], [76, 4, "s", 8], [80, 4, "s", 8], [160, 2, "s", 15]], "conflicts": [[8, {"4s": 8, "2s": 8}], [16, {"4s": 16, "2s": 8}], [20, {"4s": 6, "2s": 8}]], "evidence": {"PV": 7, "P": 7, "L": 7}, "sign_mixed": 3, "merges": {"param": 14, "arg": 6}, "suspect": false}, {"id": "L:F:2fcbb507072c0155e0be8559c319e0badc676579:buf", "name": "Unkstruct_5c635b4b", "sites": 364, "bodies": 14, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 52, "fields": 13, "layout": [[0, 2, "s", 28], [2, 2, "s", 28], [4, 2, "s", 28], [8, 2, "s", 28], [10, 2, "s", 28], [12, 2, "s", 28], [16, 2, "s", 28], [18, 2, "s", 28], [20, 2, "s", 28], [24, 2, "s", 28], [26, 2, "s", 28], [28, 2, "s", 28], [48, 4, "s", 28]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "AT:D_800AE620", "name": "Unkstruct_800AE620", "sites": 325, "bodies": 322, "nodes": 3, "globals_at": ["D_800AE620"], "globals_ptr": [], "params": 0, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"AT": 1, "L": 2}, "sign_mixed": 0, "merges": {"assign&": 2}, "suspect": false}, {"id": "L:F:d3dab0de7f93234d504e64c09270db7e78cb4e16:out2", "name": "Unkstruct_814e4d87", "sites": 300, "bodies": 75, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:d3dab0de7f93234d504e64c09270db7e78cb4e16:flag", "name": "Unkstruct_09b02bee", "sites": 300, "bodies": 75, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 4, "fields": 2, "layout": [[0, 2, "s", 150], [2, 2, "s", 150]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:ea7424d9729cc61d5cc082e384615f9e83e8d527:a0", "name": "Unkstruct_1ef3b11b", "sites": 280, "bodies": 10, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 268, "fields": 7, "layout": [[28, 4, "s", 20], [112, 2, "s", 60], [212, 4, "p", 10], [216, 4, "p", 10], [252, 2, "s", 10], [264, 2, "s", 90], [266, 2, "s", 70]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 1, "merges": {"param": 2}, "suspect": false}, {"id": "AT:D_80115188", "name": "Unkstruct_80115188", "sites": 274, "bodies": 270, "nodes": 1, "globals_at": ["D_80115188"], "globals_ptr": [], "params": 0, "size_hint": 4, "fields": 1, "layout": [[0, 4, "s", 8]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:012607e097ecfa1e9fa4694b79953ad3694e61b6:v0", "name": "Unkstruct_80129CF8", "sites": 273, "bodies": 90, "nodes": 118, "globals_at": [], "globals_ptr": ["D_800AF630"], "params": 0, "size_hint": 42037, "fields": 33, "layout": [[392, 2, "u", 5], [394, 2, "u", 5], [408, 4, "s", 2], [412, 2, "u", 4], [414, 2, "u", 5], [41896, 2, "u", 2], [41898, 2, "u", 28], [41900, 2, "u", 1], [41902, 2, "u", 3], [41904, 2, "u", 2], [41908, 2, "u", 9], [41910, 2, "u", 16], [41912, 2, "u", 11], [41914, 2, "u", 6], [41916, 2, "u", 6], [41918, 2, "u", 4], [41920, 2, "u", 4], [41922, 2, "u", 4], [41926, 2, "u", 6], [41928, 2, "u", 5], [41930, 2, "u", 3], [41932, 2, "u", 7], [41934, 2, "u", 7], [41936, 2, "u", 4], [41938, 2, "u", 73], [41940, 2, "u", 2], [41944, 2, "s", 16], [41946, 2, "s", 4], [41948, 2, "s", 4], [41950, 2, "s", 1], [41955, 1, "u", 1], [41960, 4, "s", 11], [42036, 1, "u", 1]], "conflicts": [], "evidence": {"L": 117, "PTR": 1}, "sign_mixed": 5, "merges": {"assign": 117}, "suspect": true}, {"id": "L:F:aa1b9ff2f846d7698f54c6a1e7b5b72bb7e2bcda:a0", "name": "Unkstruct_a2d6c72b", "sites": 273, "bodies": 21, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 256, "fields": 4, "layout": [[28, 4, "s", 63], [32, 4, "s", 84], [112, 2, "s", 42], [254, 2, "s", 84]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "AT:D_80078EB4", "name": "Unkstruct_80078EB4", "sites": 270, "bodies": 137, "nodes": 1, "globals_at": ["D_80078EB4"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "u", 270]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "AT:D_80115118", "name": "Unkstruct_80115118", "sites": 268, "bodies": 265, "nodes": 15, "globals_at": ["D_80115118"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "s", 134]], "conflicts": [], "evidence": {"AT": 1, "L": 14}, "sign_mixed": 1, "merges": {"assign&": 14}, "suspect": false}, {"id": "AT:D_801152B0", "name": "Unkstruct_801152B0", "sites": 268, "bodies": 268, "nodes": 1, "globals_at": ["D_801152B0"], "globals_ptr": [], "params": 0, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "AT:D_801269F4", "name": "Unkstruct_801269F4", "sites": 267, "bodies": 134, "nodes": 1, "globals_at": ["D_801269F4"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "s", 266]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:2a34f6ae0fbc42dba731f3cb61b452b132151f49:iVar1", "name": "Unkstruct_8012C1DC", "sites": 267, "bodies": 134, "nodes": 5, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 28, "fields": 3, "layout": [[0, 2, "u", 1], [24, 2, "s", 133], [26, 2, "s", 133]], "conflicts": [], "evidence": {"L": 4, "R": 1}, "sign_mixed": 0, "merges": {"ret-of": 3, "return": 1}, "suspect": false}, {"id": "AT:D_8011515C", "name": "Unkstruct_8011515C", "sites": 267, "bodies": 267, "nodes": 1, "globals_at": ["D_8011515C"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "u", 137]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 1, "merges": {}, "suspect": false}, {"id": "L:F:ac7599b22dca07025fc0949dcdd424e700291629:e1", "name": "Unkstruct_640f8122", "sites": 266, "bodies": 133, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 46, "fields": 1, "layout": [[44, 2, "u", 266]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:ac7599b22dca07025fc0949dcdd424e700291629:e2", "name": "Unkstruct_02495693", "sites": 266, "bodies": 133, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 30, "fields": 2, "layout": [[24, 2, "s", 133], [28, 2, "s", 133]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:e52fe6d660617468c6358f043f05169a46f838f2:s0", "name": "Unkstruct_3f149285", "sites": 266, "bodies": 133, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "u", 266]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:6966b8be15e9832708a2dbf4b5b13ee7d3060710:sp", "name": "Unkstruct_a310cf42", "sites": 266, "bodies": 133, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 4, "fields": 1, "layout": [[0, 4, "s", 266]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "AT:D_80115124", "name": "Unkstruct_80115124", "sites": 266, "bodies": 266, "nodes": 1, "globals_at": ["D_80115124"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "s", 266]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "AT:D_800D4BE0", "name": "Unkstruct_800D4BE0", "sites": 266, "bodies": 133, "nodes": 1, "globals_at": ["D_800D4BE0"], "globals_ptr": [], "params": 0, "size_hint": 4, "fields": 1, "layout": [[0, 4, "s", 266]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "AT:D_800D4F8C", "name": "Unkstruct_800D4F8C", "sites": 266, "bodies": 133, "nodes": 1, "globals_at": ["D_800D4F8C"], "globals_ptr": [], "params": 0, "size_hint": 4, "fields": 1, "layout": [[0, 4, "s", 266]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:27b5410bfc91fc14d52c05c082c77da058ab4fe9:a1", "name": "Unkstruct_8016BFA8", "sites": 266, "bodies": 133, "nodes": 18, "globals_at": [], "globals_ptr": [], "params": 6, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"PV": 6, "P": 6, "L": 6}, "sign_mixed": 0, "merges": {"param": 12, "arg": 5}, "suspect": false}, {"id": "L:F:27b5410bfc91fc14d52c05c082c77da058ab4fe9:a2", "name": "Unkstruct_8016BFA8", "sites": 266, "bodies": 133, "nodes": 18, "globals_at": [], "globals_ptr": [], "params": 6, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"PV": 6, "P": 6, "L": 6}, "sign_mixed": 0, "merges": {"param": 12, "arg": 5}, "suspect": false}, {"id": "L:F:52e92ffa088470b82cc06482daa51b2f80995c31:b", "name": "Unkstruct_80176734", "sites": 266, "bodies": 133, "nodes": 3, "globals_at": [], "globals_ptr": ["D_8011F7B0"], "params": 0, "size_hint": 44, "fields": 1, "layout": [[40, 4, "s", 266]], "conflicts": [], "evidence": {"L": 2, "PTR": 1}, "sign_mixed": 0, "merges": {"assign": 2}, "suspect": false}, {"id": "AT:D_80126B62", "name": "Unkstruct_80126B62", "sites": 265, "bodies": 252, "nodes": 4, "globals_at": ["D_80126B62"], "globals_ptr": [], "params": 0, "size_hint": 14, "fields": 2, "layout": [[0, 2, "s", 262], [10, 4, "s", 1]], "conflicts": [], "evidence": {"AT": 1, "L": 3}, "sign_mixed": 1, "merges": {"assign&": 3}, "suspect": false}, {"id": "L:F:52e92ffa088470b82cc06482daa51b2f80995c31:pp", "name": "Unkstruct_76f4299b", "sites": 262, "bodies": 131, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 74, "fields": 1, "layout": [[73, 1, "u", 262]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:be9288d1f2eaecc1cb9835a4658eb37749f9bcbe:obj", "name": "Unkstruct_3816caab", "sites": 260, "bodies": 130, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 28, "fields": 2, "layout": [[24, 2, "s", 130], [26, 2, "s", 130]], "conflicts": [], "evidence": {"L": 2}, "sign_mixed": 0, "merges": {"assign": 1}, "suspect": false}, {"id": "L:F:a57747ff39fc5e679a5d66ad52a5fecdb16e3749:param_1", "name": "Unkstruct_ac2c8f05", "sites": 260, "bodies": 130, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 366, "fields": 1, "layout": [[364, 2, "u", 260]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:d8b2cb544bf2d39e0fd9a5b84f7c2c59493b1aaf:param_1", "name": "Unkstruct_985493b9", "sites": 256, "bodies": 128, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 449, "fields": 2, "layout": [[424, 1, "u", 128], [448, 1, "u", 128]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:19e58ae08e2232f72d7b0ff8bdb0d57e16ea558b:a0", "name": "Unkstruct_c21b1a66", "sites": 255, "bodies": 255, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 5, "fields": 1, "layout": [[4, 1, "u", 255]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:324c3534fcf5e33e05b7a4d4b899c209594cbefe:arg0", "name": "Unkstruct_ae2d1f2a", "sites": 252, "bodies": 7, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 588, "fields": 13, "layout": [[0, 2, "u", 14], [6, 2, "s", 14], [10, 2, "u", 28], [14, 2, "s", 14], [68, 4, "u", 7], [184, 2, "u", 28], [186, 2, "u", 7], [446, 1, "u", 14], [580, 1, "u", 21], [581, 1, "u", 35], [582, 2, "u", 14], [584, 2, "u", 14], [586, 2, "u", 14]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 2, "merges": {"param": 2}, "suspect": false}, {"id": "FLD:L:F:25ab0fa8060d0fde4162393b2fe6d2e173139b54:param_1:0x20", "name": "Unkstruct_746c35d0", "sites": 252, "bodies": 126, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 20, "fields": 1, "layout": [[18, 2, "u", 252]], "conflicts": [], "evidence": {"L": 1, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 1}, "suspect": false}, {"id": "L:F:988adeae4dfa58056e1909876ae4cae41e37f3cf:puVar3", "name": "Unkstruct_faf094bf", "sites": 252, "bodies": 126, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:6143fc1990bdc9fd66a1eb5d4299f4720c7611e1:a0", "name": "Unkstruct_5d117345", "sites": 252, "bodies": 21, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 256, "fields": 4, "layout": [[28, 4, "s", 63], [32, 4, "s", 84], [112, 2, "s", 21], [254, 2, "s", 84]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "AT:D_80126B66", "name": "Unkstruct_80126B66", "sites": 250, "bodies": 222, "nodes": 6, "globals_at": ["D_80126B66"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "s", 249]], "conflicts": [], "evidence": {"AT": 1, "L": 5}, "sign_mixed": 1, "merges": {"assign&": 5}, "suspect": false}, {"id": "L:F:a2c6e6c9e0cd31da19954438810a7e982cbc79fb:param_1", "name": "Unkstruct_6ffc1ed8", "sites": 250, "bodies": 125, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:27b86fd006a486cabfa5d7c35b6660563f963c88:src", "name": "Unkstruct_60564c8e", "sites": 250, "bodies": 125, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:36e9c14059bc5f38e92d9a3a353f237483186eff:src", "name": "Unkstruct_cd65b25c", "sites": 250, "bodies": 125, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:82fdb45641d53ed5ab4e96614f3a5f78238ee2ed:a0", "name": "Unkstruct_acf38518", "sites": 250, "bodies": 250, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 5, "fields": 1, "layout": [[4, 1, "u", 250]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:7296f9939a14b5a5bb00c3dc1014045f1fc85aa3:src", "name": "Unkstruct_0f0a788d", "sites": 250, "bodies": 125, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:9161d35cd5c742eb5541db928a88c44fe7fe4cfa:arg0", "name": "Unkstruct_830ea620", "sites": 248, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 194, "fields": 2, "layout": [[180, 4, "u", 124], [193, 1, "u", 124]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:d8ec93cf2ab8692a851707f792bb542559b8b477:b1A8", "name": "Unkstruct_afee652d", "sites": 248, "bodies": 124, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 4, "fields": 2, "layout": [[0, 2, "u", 124], [2, 2, "u", 124]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:989ea29447ebea9f665718fe835d44c289cd476c:a2", "name": "Unkstruct_a0bdbb1e", "sites": 248, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 4, "fields": 2, "layout": [[0, 2, "s", 124], [2, 2, "s", 124]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:55712afcacfe2fece6a848abbf398be1eed54533:param_1", "name": "Unkstruct_ca3ab5df", "sites": 248, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 254, "fields": 2, "layout": [[32, 4, "s", 124], [252, 2, "s", 124]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:55712afcacfe2fece6a848abbf398be1eed54533:v0", "name": "Unkstruct_a34caab1", "sites": 248, "bodies": 124, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 28, "fields": 2, "layout": [[24, 2, "s", 124], [26, 2, "s", 124]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:5cd77565ad78e08752784cbdc19c1aeaac402ef9:param_1", "name": "Unkstruct_539a2ae1", "sites": 248, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 254, "fields": 2, "layout": [[32, 4, "s", 124], [252, 2, "s", 124]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:5cd77565ad78e08752784cbdc19c1aeaac402ef9:iVar2", "name": "Unkstruct_9fb4bfac", "sites": 248, "bodies": 124, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 28, "fields": 2, "layout": [[24, 2, "s", 124], [26, 2, "s", 124]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:15509feb6a0627930999eaf787acc09eced3904a:iVar2", "name": "Unkstruct_c5bf162e", "sites": 248, "bodies": 124, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 28, "fields": 2, "layout": [[24, 2, "s", 124], [26, 2, "s", 124]], "conflicts": [], "evidence": {"L": 2}, "sign_mixed": 0, "merges": {"assign": 1}, "suspect": false}, {"id": "L:F:2214b0acb044a41f5be69cb14320801af12a2347:a0", "name": "Unkstruct_f6997d4b", "sites": 248, "bodies": 124, "nodes": 4, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 36, "fields": 1, "layout": [[32, 4, "s", 248]], "conflicts": [], "evidence": {"L": 2, "PV": 1, "P": 1}, "sign_mixed": 0, "merges": {"param": 2, "assign": 1}, "suspect": false}, {"id": "L:F:81e0d439bcac2207a0601a6c74bda54b7effc8f5:param_1", "name": "Unkstruct_d294081d", "sites": 248, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 36, "fields": 2, "layout": [[2, 2, "u", 124], [32, 4, "s", 124]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:8ea4834b2afe21e6bcb5d70f202657b4e7e9b533:a0", "name": "Unkstruct_28d9f75d", "sites": 248, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 408, "fields": 2, "layout": [[68, 4, "u", 124], [407, 1, "u", 124]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:f50e604c8b58f45013548ab979545380c3dc817f:param_1", "name": "Unkstruct_3ec1f7d3", "sites": 248, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 6, "fields": 1, "layout": [[4, 2, "u", 248]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:df660660ac576b486dd5d8dbd078596ded642459:arg0", "name": "Unkstruct_65a4104e", "sites": 248, "bodies": 124, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 186, "fields": 1, "layout": [[184, 2, "u", 248]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:196f409c6989286dbec87c9a1eb5d33757255f10:param_1", "name": "Unkstruct_576bfafb", "sites": 248, "bodies": 248, "nodes": 9, "globals_at": [], "globals_ptr": [], "params": 3, "size_hint": 72, "fields": 2, "layout": [[2, 2, "u", 124], [68, 4, "u", 124]], "conflicts": [], "evidence": {"PV": 3, "P": 3, "L": 3}, "sign_mixed": 0, "merges": {"param": 6, "arg": 2}, "suspect": false}, {"id": "FLD:L:F:2214b0acb044a41f5be69cb14320801af12a2347:a0:0x20", "name": "Unkstruct_8e3ffd0a", "sites": 248, "bodies": 124, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 20, "fields": 2, "layout": [[16, 2, "s", 124], [18, 2, "s", 124]], "conflicts": [], "evidence": {"FLD": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:d80795e12fc7517775bb6ace09c7ca13caef919c:param", "name": "Unkstruct_82fd4ac2", "sites": 247, "bodies": 247, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 2, "fields": 1, "layout": [[1, 1, "u", 247]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:ddabefe960b7573ac0070b5cd1f0186950118b95:param_1", "name": "Unkstruct_9f3ec286", "sites": 246, "bodies": 123, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 254, "fields": 2, "layout": [[2, 2, "u", 123], [252, 2, "s", 123]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:705fc77f3b91063220f409e903893068922aed81:p", "name": "Unkstruct_b10794ea", "sites": 246, "bodies": 123, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 8, "fields": 2, "layout": [[4, 2, "s", 123], [6, 2, "u", 123]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "FLD:L:F:81aa50d5890521702ec3e35b8059e18556f6cf45:s0b:0x28", "name": "Unkstruct_228f3189", "sites": 246, "bodies": 123, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 94, "fields": 1, "layout": [[93, 1, "u", 246]], "conflicts": [], "evidence": {"L": 1, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 1}, "suspect": false}, {"id": "FLD:L:F:81aa50d5890521702ec3e35b8059e18556f6cf45:cach:0x34", "name": "Unkstruct_8115be3c", "sites": 246, "bodies": 123, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 812, "fields": 1, "layout": [[810, 2, "s", 246]], "conflicts": [], "evidence": {"L": 1, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 1}, "suspect": false}, {"id": "L:F:b8045aa890d7bb3cb0bd77e5281959989b84029c:a1", "name": "Unkstruct_66a9ef17", "sites": 245, "bodies": 7, "nodes": 5, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 254, "fields": 23, "layout": [[0, 2, "u", 14], [2, 2, "u", 7], [4, 2, "u", 7], [6, 2, "u", 14], [8, 2, "u", 7], [10, 2, "u", 14], [12, 2, "u", 7], [14, 2, "u", 14], [32, 4, "s", 28], [54, 2, "u", 7], [80, 2, "u", 7], [82, 2, "u", 7], [84, 2, "u", 7], [100, 4, "s", 21], [104, 4, "s", 14], [112, 2, "u", 7], [114, 2, "u", 7], [120, 4, "s", 7], [136, 2, "u", 7], [138, 2, "u", 7], [140, 2, "u", 7], [220, 4, "s", 7], [252, 2, "u", 7]], "conflicts": [], "evidence": {"L": 2, "PV": 1, "P": 1, "R": 1}, "sign_mixed": 1, "merges": {"param": 2, "assign": 1, "return": 1}, "suspect": false}, {"id": "L:F:d1fbb74dab666fc0645c433a6f63e3c37fc60b8b:g", "name": "Unkstruct_83ca5e9f", "sites": 242, "bodies": 121, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:d1fbb74dab666fc0645c433a6f63e3c37fc60b8b:arg1", "name": "Unkstruct_10dc73aa", "sites": 242, "bodies": 121, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "AT:D_80126B5E", "name": "Unkstruct_80126B5E", "sites": 229, "bodies": 219, "nodes": 6, "globals_at": ["D_80126B5E"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "s", 229]], "conflicts": [], "evidence": {"AT": 1, "L": 5}, "sign_mixed": 0, "merges": {"assign&": 5}, "suspect": false}, {"id": "L:F:4abe78c4e7fd61e6a6f87917a6cacd7622b1fc9a:a0", "name": "Unkstruct_520ce05f", "sites": 228, "bodies": 228, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 535, "fields": 1, "layout": [[534, 1, "u", 228]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "FLD:L:F:6efeba9571c70c28595c309b64f18d17de08a52a:a0:0xdc", "name": "Unkstruct_a82a43aa", "sites": 224, "bodies": 28, "nodes": 2, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 14, "fields": 4, "layout": [[0, 4, "s", 56], [4, 4, "s", 28], [8, 2, "u", 56], [12, 2, "u", 84]], "conflicts": [], "evidence": {"L": 1, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 1}, "suspect": false}, {"id": "L:F:a15898c74d2e6cefc637fc5922442370e2a9cfad:s0", "name": "Unkstruct_0681badd", "sites": 215, "bodies": 5, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 254, "fields": 13, "layout": [[2, 2, "s", 10], [6, 2, "s", 10], [10, 2, "u", 50], [14, 2, "s", 10], [16, 4, "s", 5], [18, 2, "u", 30], [20, 4, "s", 5], [22, 2, "s", 5], [24, 4, "s", 5], [26, 2, "u", 20], [28, 4, "s", 5], [52, 2, "s", 10], [252, 2, "s", 10]], "conflicts": [[18, "overlap"], [22, "overlap"], [26, "overlap"]], "evidence": {"L": 1}, "sign_mixed": 5, "merges": {}, "suspect": false}, {"id": "L:F:917f19148162f411912b88a30eeb253747fe04ab:iv", "name": "Unkstruct_b59353da", "sites": 215, "bodies": 5, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 54, "fields": 14, "layout": [[2, 2, "s", 10], [4, 4, "s", 10], [6, 2, "u", 20], [10, 2, "u", 50], [12, 4, "s", 10], [14, 2, "u", 20], [16, 4, "s", 5], [18, 2, "u", 30], [20, 4, "s", 5], [22, 2, "s", 5], [24, 4, "s", 5], [26, 2, "u", 20], [28, 4, "s", 5], [52, 2, "u", 10]], "conflicts": [[6, "overlap"], [14, "overlap"], [18, "overlap"], [22, "overlap"], [26, "overlap"]], "evidence": {"L": 1}, "sign_mixed": 2, "merges": {}, "suspect": false}, {"id": "L:F:da221188fc4dbf9b0b8d71355bcdf4552e191595:s0", "name": "Unkstruct_fc9b0607", "sites": 215, "bodies": 5, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 54, "fields": 14, "layout": [[2, 2, "s", 10], [4, 4, "s", 10], [6, 2, "s", 10], [10, 2, "s", 25], [12, 4, "s", 10], [14, 2, "s", 10], [16, 4, "s", 5], [18, 2, "s", 20], [20, 4, "s", 5], [22, 2, "s", 5], [24, 4, "s", 5], [26, 2, "s", 15], [28, 4, "s", 5], [52, 2, "s", 10]], "conflicts": [[6, "overlap"], [14, "overlap"], [18, "overlap"], [22, "overlap"], [26, "overlap"]], "evidence": {"L": 1}, "sign_mixed": 5, "merges": {}, "suspect": false}, {"id": "L:F:da6f5834a2462dbdc8003e3b2cdf2ffb5b6f9d9d:a0", "name": "Unkstruct_6aa0aebb", "sites": 210, "bodies": 7, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 264, "fields": 14, "layout": [[6, 2, "s", 7], [10, 2, "s", 7], [14, 2, "s", 7], [32, 4, "s", 70], [100, 4, "s", 35], [112, 2, "s", 7], [204, 4, "p", 7], [208, 4, "p", 7], [252, 2, "u", 7], [254, 2, "s", 7], [256, 2, "u", 7], [258, 2, "u", 7], [260, 2, "u", 7], [262, 2, "u", 7]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 3, "merges": {"param": 2}, "suspect": false}, {"id": "FLD:L:F:6f527022fa9e2edbff88b3415d6e85040f80b293:a0:0x20", "name": "Unkstruct_4a619ff2", "sites": 210, "bodies": 21, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 30, "fields": 5, "layout": [[4, 4, "s", 84], [18, 2, "u", 63], [24, 2, "s", 21], [26, 2, "s", 21], [28, 2, "s", 21]], "conflicts": [], "evidence": {"FLD": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "FLD:L:F:e1b0419f54c26cc0ccd6be1f438874310e36c635:a0:0x20", "name": "Unkstruct_61c8e5ed", "sites": 203, "bodies": 7, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 26, "fields": 5, "layout": [[4, 4, "u", 14], [16, 2, "u", 63], [18, 2, "u", 70], [20, 2, "s", 7], [24, 2, "s", 21]], "conflicts": [], "evidence": {"FLD": 1}, "sign_mixed": 3, "merges": {}, "suspect": false}, {"id": "L:F:74f4e0356746fd0484181399ca77414114dca6ad:a0", "name": "Unkstruct_51b35d2d", "sites": 202, "bodies": 101, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 44, "fields": 2, "layout": [[21, 1, "u", 101], [40, 4, "s", 101]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:25baf5859d5cb2059562a09a70da55c50f116116:a0", "name": "Unkstruct_eadcd5d5", "sites": 198, "bodies": 18, "nodes": 4, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 254, "fields": 6, "layout": [[2, 2, "s", 18], [18, 2, "s", 18], [22, 2, "s", 18], [26, 2, "s", 18], [28, 4, "s", 54], [252, 2, "s", 18]], "conflicts": [], "evidence": {"L": 2, "PV": 1, "P": 1}, "sign_mixed": 3, "merges": {"param": 2, "assign": 1}, "suspect": false}, {"id": "L:F:d6e3de8a766ebb0b4ab359aabc01dcd5e9d53a36:out2", "name": "Unkstruct_35caedb8", "sites": 192, "bodies": 48, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:d6e3de8a766ebb0b4ab359aabc01dcd5e9d53a36:flag", "name": "Unkstruct_f8edcaba", "sites": 192, "bodies": 48, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 4, "fields": 2, "layout": [[0, 2, "s", 96], [2, 2, "s", 96]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:fec0915289791771ea837debee3504f78133eede:a0", "name": "Unkstruct_a00e0c6e", "sites": 190, "bodies": 95, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 44, "fields": 2, "layout": [[21, 1, "u", 95], [40, 4, "s", 95]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:611c49169f75d8fbc9b94885ea872ae504473b59:a0", "name": "Unkstruct_bd4a4f6c", "sites": 183, "bodies": 61, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 44, "fields": 2, "layout": [[21, 1, "u", 61], [40, 4, "s", 122]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:a48bac4e1e4fed5c8966504b99c29a43727bf059:buf", "name": "Unkstruct_8e763649", "sites": 175, "bodies": 7, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 84, "fields": 13, "layout": [[32, 2, "s", 14], [34, 2, "s", 14], [36, 2, "s", 14], [40, 2, "s", 14], [42, 2, "s", 14], [44, 2, "s", 14], [48, 2, "s", 14], [50, 2, "s", 14], [52, 2, "s", 14], [56, 2, "s", 14], [58, 2, "s", 14], [60, 2, "s", 14], [80, 4, "s", 7]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:1994557e7e1644407dd26734f4aa1b1265b4ee29:a0", "name": "Unkstruct_3b68bc3b", "sites": 175, "bodies": 7, "nodes": 4, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 256, "fields": 9, "layout": [[0, 2, "u", 7], [6, 2, "u", 14], [10, 2, "u", 14], [14, 2, "u", 14], [32, 4, "s", 98], [204, 4, "s", 7], [208, 4, "s", 7], [252, 2, "u", 7], [254, 2, "u", 7]], "conflicts": [], "evidence": {"L": 2, "PV": 1, "P": 1}, "sign_mixed": 0, "merges": {"assign": 1, "param": 2}, "suspect": false}, {"id": "L:F:d44d0a2a4382cb511d295db6f24dd0138d0c6bb3:p", "name": "Unkstruct_e48c7347", "sites": 172, "bodies": 2, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 36, "fields": 9, "layout": [[6, 2, "u", 20], [10, 2, "u", 18], [14, 2, "u", 20], [16, 4, "s", 6], [18, 2, "s", 8], [20, 4, "s", 8], [24, 4, "s", 6], [26, 2, "s", 8], [32, 4, "s", 78]], "conflicts": [[18, "overlap"], [26, "overlap"]], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:fef113b2129d4d1938686dcf906d7db5c6a3f7d5:param_1", "name": "Unkstruct_801EF964", "sites": 168, "bodies": 4, "nodes": 6, "globals_at": [], "globals_ptr": [], "params": 2, "size_hint": 84, "fields": 23, "layout": [[5, 1, "u", 12], [8, 4, "s", 4], [12, 4, "s", 4], [16, 4, "s", 8], [20, 2, "s", 4], [24, 2, "s", 8], [26, 2, "s", 8], [28, 2, "s", 8], [32, 2, "s", 4], [34, 2, "s", 4], [36, 2, "s", 4], [40, 2, "s", 16], [42, 2, "s", 16], [44, 2, "s", 16], [46, 2, "s", 8], [48, 2, "s", 4], [50, 2, "s", 4], [60, 4, "s", 4], [64, 4, "s", 4], [68, 4, "s", 4], [72, 4, "s", 4], [76, 4, "s", 4], [80, 4, "s", 4]], "conflicts": [[8, {"4s": 4, "2s": 4}], [12, {"4s": 4, "2s": 4}], [16, {"4s": 8, "2s": 4}]], "evidence": {"PV": 2, "P": 2, "L": 2}, "sign_mixed": 0, "merges": {"param": 4, "arg": 1}, "suspect": false}, {"id": "L:F:5e678d33ff74ee62ca80b9526bca2a95c9e5b187:param_1", "name": "Unkstruct_801E2AF4", "sites": 168, "bodies": 4, "nodes": 6, "globals_at": [], "globals_ptr": [], "params": 2, "size_hint": 84, "fields": 23, "layout": [[5, 1, "u", 12], [8, 4, "s", 4], [12, 4, "s", 4], [16, 4, "s", 8], [20, 2, "s", 4], [24, 2, "s", 8], [26, 2, "s", 8], [28, 2, "s", 8], [32, 2, "s", 4], [34, 2, "s", 4], [36, 2, "s", 4], [40, 2, "s", 16], [42, 2, "s", 16], [44, 2, "s", 16], [46, 2, "s", 8], [48, 2, "s", 4], [50, 2, "s", 4], [60, 4, "s", 4], [64, 4, "s", 4], [68, 4, "s", 4], [72, 4, "s", 4], [76, 4, "s", 4], [80, 4, "s", 4]], "conflicts": [[8, {"4s": 4, "2s": 4}], [12, {"4s": 4, "2s": 4}], [16, {"4s": 8, "2s": 4}]], "evidence": {"PV": 2, "P": 2, "L": 2}, "sign_mixed": 0, "merges": {"param": 4, "arg": 1}, "suspect": false}, {"id": "L:F:d120af8ec8f981c4f86e7962400d1779f1666f4c:param_1", "name": "Unkstruct_801E8034", "sites": 168, "bodies": 4, "nodes": 6, "globals_at": [], "globals_ptr": [], "params": 2, "size_hint": 84, "fields": 23, "layout": [[5, 1, "u", 12], [8, 4, "s", 4], [12, 4, "s", 4], [16, 4, "s", 8], [20, 2, "s", 4], [24, 2, "s", 8], [26, 2, "s", 8], [28, 2, "s", 8], [32, 2, "s", 4], [34, 2, "s", 4], [36, 2, "s", 4], [40, 2, "s", 16], [42, 2, "s", 16], [44, 2, "s", 16], [46, 2, "s", 8], [48, 2, "s", 4], [50, 2, "s", 4], [60, 4, "s", 4], [64, 4, "s", 4], [68, 4, "s", 4], [72, 4, "s", 4], [76, 4, "s", 4], [80, 4, "s", 4]], "conflicts": [[8, {"4s": 4, "2s": 4}], [12, {"4s": 4, "2s": 4}], [16, {"4s": 8, "2s": 4}]], "evidence": {"PV": 2, "P": 2, "L": 2}, "sign_mixed": 0, "merges": {"param": 4, "arg": 1}, "suspect": false}, {"id": "L:F:d29224b95ded543f31e398c2a999f4fb4cd4cbfa:param_1", "name": "Unkstruct_948c6fe5", "sites": 168, "bodies": 4, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 84, "fields": 23, "layout": [[5, 1, "u", 12], [8, 4, "s", 4], [12, 4, "s", 4], [16, 4, "s", 8], [20, 2, "s", 4], [24, 2, "s", 8], [26, 2, "s", 8], [28, 2, "s", 8], [32, 2, "s", 4], [34, 2, "s", 4], [36, 2, "s", 4], [40, 2, "s", 16], [42, 2, "s", 16], [44, 2, "s", 16], [46, 2, "s", 8], [48, 2, "s", 4], [50, 2, "s", 4], [60, 4, "s", 4], [64, 4, "s", 4], [68, 4, "s", 4], [72, 4, "s", 4], [76, 4, "s", 4], [80, 4, "s", 4]], "conflicts": [[8, {"4s": 4, "2s": 4}], [12, {"4s": 4, "2s": 4}], [16, {"4s": 8, "2s": 4}]], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "FLD:L:F:6f527022fa9e2edbff88b3415d6e85040f80b293:a0:0x64", "name": "Unkstruct_7079957f", "sites": 168, "bodies": 21, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 36, "fields": 4, "layout": [[4, 4, "s", 21], [8, 4, "s", 21], [12, 4, "s", 21], [32, 4, "s", 105]], "conflicts": [], "evidence": {"FLD": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:557ac0c4133010cca4a62bb6987d9bf328795607:a0", "name": "Unkstruct_b0e004f3", "sites": 156, "bodies": 4, "nodes": 12, "globals_at": [], "globals_ptr": [], "params": 4, "size_hint": 264, "fields": 13, "layout": [[2, 2, "s", 5], [28, 4, "s", 12], [52, 2, "u", 66], [204, 4, "s", 9], [208, 4, "s", 9], [212, 4, "s", 9], [216, 4, "s", 9], [224, 4, "s", 8], [236, 4, "s", 3], [254, 2, "s", 9], [258, 2, "u", 5], [260, 2, "s", 5], [262, 2, "s", 1]], "conflicts": [], "evidence": {"PV": 4, "P": 4, "L": 4}, "sign_mixed": 2, "merges": {"param": 8, "arg": 3}, "suspect": false}, {"id": "L:F:1994557e7e1644407dd26734f4aa1b1265b4ee29:iVar2", "name": "Unkstruct_cb6870d9", "sites": 154, "bodies": 7, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 30, "fields": 10, "layout": [[4, 4, "u", 28], [8, 2, "u", 14], [10, 2, "u", 14], [12, 2, "u", 14], [16, 2, "u", 14], [18, 2, "u", 14], [20, 2, "u", 14], [24, 2, "u", 14], [26, 2, "u", 14], [28, 2, "u", 14]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:2f72bbc69e126792f9ef0f8f00a8649286ca9f83:matrix_stack", "name": "Unkstruct_78facbf0", "sites": 153, "bodies": 17, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 18, "fields": 9, "layout": [[0, 2, "s", 17], [2, 2, "s", 17], [4, 2, "s", 17], [6, 2, "s", 17], [8, 2, "s", 17], [10, 2, "s", 17], [12, 2, "s", 17], [14, 2, "s", 17], [16, 2, "s", 17]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:1caab05d387f2817ccbd6c780b66fe0c0dc38e9f:a0", "name": "Unkstruct_ea987c97", "sites": 153, "bodies": 3, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 266, "fields": 22, "layout": [[2, 2, "s", 3], [28, 4, "s", 3], [100, 4, "s", 18], [112, 2, "u", 3], [220, 2, "s", 3], [222, 2, "s", 3], [224, 2, "s", 3], [228, 2, "s", 3], [230, 2, "s", 3], [232, 2, "s", 3], [236, 2, "s", 15], [238, 2, "s", 15], [240, 2, "s", 15], [244, 2, "s", 9], [246, 2, "s", 9], [248, 2, "s", 9], [252, 2, "s", 6], [254, 2, "s", 6], [256, 2, "s", 6], [260, 2, "s", 6], [262, 2, "s", 6], [264, 2, "s", 6]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "AT:D_80078EB0", "name": "Unkstruct_80078EB0", "sites": 152, "bodies": 143, "nodes": 1, "globals_at": ["D_80078EB0"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "s", 152]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:8651da9db154eabc542b940cdeb8222397edab15:param_1", "name": "Unkstruct_745af9ee", "sites": 150, "bodies": 6, "nodes": 9, "globals_at": [], "globals_ptr": [], "params": 3, "size_hint": 160, "fields": 23, "layout": [[8, 4, "s", 4], [12, 2, "s", 4], [16, 4, "s", 8], [20, 2, "s", 4], [24, 2, "s", 8], [26, 2, "s", 8], [28, 2, "s", 8], [32, 2, "s", 4], [34, 2, "s", 4], [36, 2, "s", 4], [40, 2, "s", 16], [42, 2, "s", 16], [44, 2, "s", 16], [46, 2, "s", 4], [48, 2, "s", 4], [50, 2, "s", 4], [60, 4, "s", 4], [64, 4, "s", 4], [68, 4, "s", 4], [72, 4, "s", 4], [76, 4, "s", 4], [80, 4, "s", 4], [156, 4, "s", 2]], "conflicts": [[8, {"4s": 4, "2s": 4}], [16, {"4s": 8, "2s": 4}]], "evidence": {"PV": 3, "P": 3, "L": 3}, "sign_mixed": 0, "merges": {"param": 6, "arg": 2}, "suspect": false}, {"id": "FLD:FLD:AT:D_800B5CB8:0x64:0x20", "name": "Unkstruct_801439FC", "sites": 148, "bodies": 89, "nodes": 14, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 116, "fields": 10, "layout": [[4, 4, "s", 16], [16, 2, "u", 2], [18, 2, "u", 54], [20, 2, "u", 1], [26, 2, "s", 2], [32, 4, "s", 8], [44, 2, "u", 14], [104, 4, "u", 1], [108, 4, "u", 1], [112, 4, "u", 1]], "conflicts": [], "evidence": {"L": 13, "FLD": 1}, "sign_mixed": 4, "merges": {"field": 13}, "suspect": false}, {"id": "PTR:D_801151C8", "name": "Unkstruct_24c0d4db", "sites": 145, "bodies": 145, "nodes": 1, "globals_at": [], "globals_ptr": ["D_801151C8"], "params": 0, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"PTR": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "PTR:D_80115140", "name": "Unkstruct_de5b293a", "sites": 141, "bodies": 141, "nodes": 1, "globals_at": [], "globals_ptr": ["D_80115140"], "params": 0, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"PTR": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:78aecb3cd7f9abc3d9ca6eeaabc59c5ea154cdc8:a0", "name": "Unkstruct_d1fbf19a", "sites": 140, "bodies": 10, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 224, "fields": 6, "layout": [[2, 2, "s", 10], [6, 2, "u", 30], [10, 2, "u", 40], [112, 2, "s", 20], [208, 4, "s", 20], [220, 4, "p", 10]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 1, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:051a54651df7fde6a2a4cb6d30518e38f0035e66:arg0", "name": "Unkstruct_d2a26ab7", "sites": 140, "bodies": 25, "nodes": 36, "globals_at": [], "globals_ptr": [], "params": 12, "size_hint": 256, "fields": 10, "layout": [[6, 2, "u", 10], [10, 2, "u", 10], [14, 2, "u", 10], [28, 4, "s", 24], [32, 4, "s", 20], [94, 2, "u", 5], [170, 2, "s", 5], [220, 4, "s", 20], [228, 4, "s", 31], [254, 2, "s", 5]], "conflicts": [], "evidence": {"PV": 12, "P": 12, "L": 12}, "sign_mixed": 0, "merges": {"param": 24, "arg": 11}, "suspect": false}, {"id": "FLD:AT:D_800B5CB8:0x68", "name": "Unkstruct_8012C098", "sites": 139, "bodies": 131, "nodes": 63, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 14, "fields": 2, "layout": [[10, 2, "u", 9], [12, 2, "s", 117]], "conflicts": [], "evidence": {"L": 62, "FLD": 1}, "sign_mixed": 1, "merges": {"field": 62}, "suspect": false}, {"id": "L:X:ov::pbase", "name": "Unkstruct_8615cbe6", "sites": 136, "bodies": 136, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 41940, "fields": 1, "layout": [[41938, 2, "u", 136]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": true}, {"id": "L:F:1d683b223192258d1998a9c3c3ad54eb4be301eb:a0", "name": "Unkstruct_6313652c", "sites": 136, "bodies": 12, "nodes": 33, "globals_at": [], "globals_ptr": [], "params": 11, "size_hint": 262, "fields": 22, "layout": [[2, 2, "s", 4], [4, 4, "s", 2], [8, 4, "s", 2], [10, 2, "u", 8], [12, 4, "s", 2], [14, 2, "s", 8], [16, 4, "s", 2], [24, 4, "s", 2], [28, 4, "s", 16], [32, 4, "s", 12], [52, 2, "s", 8], [82, 2, "s", 2], [88, 4, "s", 2], [112, 2, "s", 2], [136, 2, "u", 2], [140, 2, "u", 2], [228, 2, "s", 2], [230, 2, "u", 2], [252, 2, "s", 4], [256, 2, "u", 10], [258, 2, "s", 14], [260, 2, "u", 2]], "conflicts": [[10, "overlap"], [14, "overlap"]], "evidence": {"PV": 11, "P": 11, "L": 11}, "sign_mixed": 6, "merges": {"param": 22, "arg": 10}, "suspect": false}, {"id": "L:F:20db3f0238f6af52ce526a74c3a0171d83b65265:p", "name": "Unkstruct_8018512C", "sites": 135, "bodies": 9, "nodes": 28, "globals_at": [], "globals_ptr": [], "params": 9, "size_hint": 252, "fields": 24, "layout": [[2, 2, "u", 8], [4, 4, "s", 1], [6, 2, "u", 5], [8, 4, "s", 1], [10, 2, "u", 4], [12, 4, "s", 1], [14, 2, "u", 7], [16, 4, "s", 4], [20, 4, "s", 11], [24, 4, "s", 10], [28, 4, "s", 3], [32, 4, "s", 10], [58, 2, "u", 1], [62, 2, "u", 1], [66, 2, "u", 1], [68, 4, "s", 9], [72, 4, "s", 10], [76, 4, "s", 9], [220, 2, "s", 2], [222, 2, "s", 8], [224, 2, "s", 3], [226, 2, "u", 1], [248, 2, "s", 2], [250, 2, "s", 2]], "conflicts": [[6, "overlap"], [10, "overlap"], [14, "overlap"]], "evidence": {"PV": 9, "P": 9, "L": 10}, "sign_mixed": 7, "merges": {"param": 18, "arg": 8, "assign": 1}, "suspect": false}, {"id": "L:F:04d955c17670582806c72770c075681379828e85:a0", "name": "Unkstruct_7ee1ed9a", "sites": 135, "bodies": 15, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 56, "fields": 8, "layout": [[2, 2, "u", 30], [16, 4, "s", 15], [20, 4, "s", 15], [24, 4, "s", 15], [28, 4, "s", 15], [32, 4, "s", 15], [44, 4, "s", 15], [52, 4, "s", 15]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "AT:D_80126CE0", "name": "Unkstruct_80126CE0", "sites": 134, "bodies": 134, "nodes": 1, "globals_at": ["D_80126CE0"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "u", 133]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 1, "merges": {}, "suspect": false}, {"id": "AT:D_800B9A78", "name": "Unkstruct_800B9A78", "sites": 134, "bodies": 134, "nodes": 5, "globals_at": ["D_800B9A78"], "globals_ptr": [], "params": 0, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"L": 4, "AT": 1}, "sign_mixed": 0, "merges": {"assign&": 4}, "suspect": false}, {"id": "AT:D_80110C3C", "name": "Unkstruct_80110C3C", "sites": 134, "bodies": 134, "nodes": 1, "globals_at": ["D_80110C3C"], "globals_ptr": [], "params": 0, "size_hint": 1, "fields": 1, "layout": [[0, 1, "u", 134]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "AT:D_800B9AAC", "name": "Unkstruct_800B9AAC", "sites": 134, "bodies": 134, "nodes": 1, "globals_at": ["D_800B9AAC"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "s", 134]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "AT:D_8011F7BC", "name": "Unkstruct_8011F7BC", "sites": 134, "bodies": 134, "nodes": 1, "globals_at": ["D_8011F7BC"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "u", 134]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "AT:D_8011F7BE", "name": "Unkstruct_8011F7BE", "sites": 134, "bodies": 134, "nodes": 1, "globals_at": ["D_8011F7BE"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "u", 134]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "AT:D_8011514C", "name": "Unkstruct_8011514C", "sites": 134, "bodies": 134, "nodes": 1, "globals_at": ["D_8011514C"], "globals_ptr": [], "params": 0, "size_hint": 1, "fields": 1, "layout": [[0, 1, "u", 130]], "conflicts": [[0, {"1u": 130, "2u": 4}]], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "AT:D_801270C4", "name": "Unkstruct_801270C4", "sites": 133, "bodies": 133, "nodes": 1, "globals_at": ["D_801270C4"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "u", 133]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:266b753080d094a813817359fce34335dcf6f7ac:s0", "name": "Unkstruct_0cebe116", "sites": 133, "bodies": 133, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "u", 133]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "AT:D_80127548", "name": "Unkstruct_80127548", "sites": 133, "bodies": 133, "nodes": 1, "globals_at": ["D_80127548"], "globals_ptr": [], "params": 0, "size_hint": 4, "fields": 1, "layout": [[0, 4, "s", 133]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:4b05e7f4ddb57db0ff1835c0c7fb5d2ffc851f37:buf", "name": "Unkstruct_cd605c73", "sites": 133, "bodies": 7, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 36, "fields": 18, "layout": [[0, 4, "s", 7], [4, 2, "s", 14], [6, 2, "s", 7], [8, 2, "s", 7], [10, 2, "s", 7], [12, 2, "s", 7], [14, 1, "u", 7], [15, 1, "u", 7], [16, 2, "s", 7], [18, 2, "s", 7], [20, 1, "u", 7], [21, 1, "u", 7], [22, 1, "u", 7], [24, 2, "s", 7], [26, 2, "s", 7], [28, 2, "s", 7], [30, 2, "s", 7], [32, 4, "s", 7]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "AT:D_80115148", "name": "Unkstruct_80115148", "sites": 133, "bodies": 133, "nodes": 1, "globals_at": ["D_80115148"], "globals_ptr": [], "params": 0, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "AT:D_80115112", "name": "Unkstruct_80115112", "sites": 133, "bodies": 133, "nodes": 27, "globals_at": ["D_80115112"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "u", 133]], "conflicts": [], "evidence": {"AT": 1, "L": 26}, "sign_mixed": 0, "merges": {"assign&": 26}, "suspect": false}, {"id": "AT:D_80115110", "name": "Unkstruct_80115110", "sites": 133, "bodies": 133, "nodes": 8, "globals_at": ["D_80115110"], "globals_ptr": [], "params": 0, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"AT": 1, "L": 7}, "sign_mixed": 0, "merges": {"assign&": 7}, "suspect": false}, {"id": "AT:D_80115152", "name": "Unkstruct_80115152", "sites": 133, "bodies": 133, "nodes": 1, "globals_at": ["D_80115152"], "globals_ptr": [], "params": 0, "size_hint": 2, "fields": 1, "layout": [[0, 2, "s", 133]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "AT:D_80062BD0", "name": "Unkstruct_80062BD0", "sites": 133, "bodies": 133, "nodes": 1, "globals_at": ["D_80062BD0"], "globals_ptr": [], "params": 0, "size_hint": 4, "fields": 1, "layout": [[0, 4, "s", 133]], "conflicts": [], "evidence": {"AT": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "FLD:L:F:27b5410bfc91fc14d52c05c082c77da058ab4fe9:a0:0x20", "name": "Unkstruct_8016BFD0", "sites": 133, "bodies": 133, "nodes": 4, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 20, "fields": 1, "layout": [[18, 2, "s", 133]], "conflicts": [], "evidence": {"L": 3, "FLD": 1}, "sign_mixed": 0, "merges": {"field": 3}, "suspect": false}, {"id": "AT:D_80115218", "name": "Unkstruct_80115218", "sites": 133, "bodies": 133, "nodes": 5, "globals_at": ["D_80115218"], "globals_ptr": [], "params": 0, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"AT": 1, "L": 4}, "sign_mixed": 0, "merges": {"assign&": 4}, "suspect": false}, {"id": "L:F:179bdd4fec1a0fd39cb489fa706f592b16565424:n", "name": "Unkstruct_3259bc8e", "sites": 133, "bodies": 133, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 0, "fields": 0, "layout": [], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "FLD:FLD:AT:D_80126B58:0x178:0x20", "name": "Unkstruct_c1b0cef5", "sites": 133, "bodies": 133, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 20, "fields": 1, "layout": [[18, 2, "s", 133]], "conflicts": [], "evidence": {"FLD": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "FLD:L:F:52e92ffa088470b82cc06482daa51b2f80995c31:b:0x28", "name": "Unkstruct_14e19f34", "sites": 133, "bodies": 133, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 52, "fields": 1, "layout": [[50, 2, "u", 133]], "conflicts": [], "evidence": {"FLD": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}, {"id": "L:F:07e2662659f664a00246f642fa2e12964ea767d6:a0", "name": "Unkstruct_1c3d008e", "sites": 132, "bodies": 132, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 4, "fields": 1, "layout": [[2, 2, "u", 132]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:dbe85381697bb2e8ed6a145c0cebf0d7533229e6:arg0", "name": "Unkstruct_99e1dbd1", "sites": 132, "bodies": 33, "nodes": 3, "globals_at": [], "globals_ptr": [], "params": 1, "size_hint": 104, "fields": 3, "layout": [[8, 4, "s", 66], [12, 4, "p", 33], [100, 4, "s", 33]], "conflicts": [], "evidence": {"PV": 1, "P": 1, "L": 1}, "sign_mixed": 0, "merges": {"param": 2}, "suspect": false}, {"id": "L:F:dbe85381697bb2e8ed6a145c0cebf0d7533229e6:pkt", "name": "Unkstruct_b600749f", "sites": 132, "bodies": 33, "nodes": 1, "globals_at": [], "globals_ptr": [], "params": 0, "size_hint": 4, "fields": 1, "layout": [[0, 4, "u", 132]], "conflicts": [], "evidence": {"L": 1}, "sign_mixed": 0, "merges": {}, "suspect": false}]} \ No newline at end of file diff --git a/.run/P37/census/type_census.json b/.run/P37/census/type_census.json new file mode 100644 index 000000000..d56dc7f69 --- /dev/null +++ b/.run/P37/census/type_census.json @@ -0,0 +1,7432 @@ +{ + "summary": { + "head": "23fc5d215", + "src_stamp": "ab7aba1c21c89889", + "tool_stamp": "da30900472", + "when": "2026-09-12T05:44:31Z", + "files": 7305, + "tus": 4121, + "headers": 3181, + "functions": 99130, + "definitions": { + "total": 7261, + "enums": 0, + "canon": 1179, + "in_c_file_scope": 4091, + "in_c_block_scope": 1904, + "in_shared_fn_headers": 63, + "in_include": 0, + "other_headers": 24, + "distinct_names": 3109, + "distinct_layouts": 525, + "unknown_layout": 2, + "dup_layout_classes": 206, + "dup_layout_names": 2789, + "dup_tier1": 122, + "dup_tier2": 84, + "layout_twin_classes": 46, + "layout_twin_names": 1844, + "exact_classes": 588, + "exact_copies": 4469, + "variant_names": 39, + "dead_canon_names": 141, + "shadowed_canon_names": 75, + "typedef_aliases": 1781, + "forward_decls": 157 + }, + "casts": { + "by_form": { + "P": 409007, + "I": 60666, + "X": 13800, + "A": 18912, + "C": 36681, + "M": 19543 + }, + "raw_counts": { + "P": 409007, + "I": 60666, + "X": 13800, + "A": 18912, + "C": 36681, + "M": 19543 + }, + "coverage_ok": true, + "refused": 0, + "deref_total": 503016, + "addr_form": 18912, + "typed_cast_member": 36681, + "bodies": 69497, + "by_bclass": { + "local": 149915, + "param": 276860, + "global": 8860, + "gaddr": 40122, + "nested": 24076, + "ident": 156, + "other": 1678, + "addr-of": 1349 + }, + "by_width": { + "s4": 145167, + "u2": 142775, + "s2": 131818, + "u1": 43174, + "agg": 13472, + "p4": 12016, + "u4": 11165, + "s1": 3429 + }, + "readability_raw_regex": 411850, + "abs_casts": 0, + "top_bases": [ + [ + "param", + "a0", + 92255 + ], + [ + "param", + "param_1", + 81595 + ], + [ + "param", + "arg0", + 67704 + ], + [ + "local", + "p", + 18043 + ], + [ + "param", + "p", + 11784 + ], + [ + "local", + "s0", + 10368 + ], + [ + "local", + "cach", + 8246 + ], + [ + "local", + "s1", + 7137 + ], + [ + "local", + "buf", + 7067 + ], + [ + "local", + "flag", + 5453 + ], + [ + "nested", + "*(s32 *)(a0 + 0x20)", + 5215 + ], + [ + "local", + "iVar2", + 5160 + ], + [ + "local", + "dst", + 4874 + ], + [ + "local", + "iVar1", + 4836 + ], + [ + "local", + "iVar3", + 4693 + ], + [ + "local", + "e", + 3918 + ], + [ + "local", + "obj", + 3678 + ], + [ + "local", + "cur", + 3375 + ], + [ + "local", + "param_1", + 2832 + ], + [ + "param", + "a1", + 2667 + ], + [ + "local", + "base", + 2632 + ], + [ + "local", + "src", + 2599 + ], + [ + "local", + "L", + 2261 + ], + [ + "local", + "ent", + 2253 + ], + [ + "param", + "param_2", + 2248 + ], + [ + "local", + "s2", + 2188 + ], + [ + "local", + "s", + 2167 + ], + [ + "param", + "arg1", + 2030 + ], + [ + "nested", + "*(s32 *)(param_1 + 0x20)", + 1967 + ], + [ + "local", + "iVar5", + 1906 + ], + [ + "global", + "D_801151D4", + 1896 + ], + [ + "param", + "p2", + 1876 + ], + [ + "local", + "pv", + 1847 + ], + [ + "local", + "self", + 1818 + ], + [ + "local", + "r", + 1787 + ], + [ + "local", + "puVar10", + 1742 + ], + [ + "local", + "puVar1", + 1730 + ], + [ + "local", + "st", + 1729 + ], + [ + "local", + "v1", + 1564 + ], + [ + "local", + "q", + 1393 + ] + ] + }, + "decls": { + "fn_definitions": 99130, + "kr_definitions": 1889, + "extern_fn_decls": 4279365, + "extern_data_decls": 1078837, + "declared_fn_names": 12139, + "multi_spelled_callees": 3870, + "multi_body_names": 6415, + "data_symbols_declared": 55569, + "multi_typed_data_symbols": 18442, + "asm_label_aliases": 5749, + "asm_label_alias_names": 225, + "builtins": { + "memcpy": 301, + "abs": 144 + }, + "attributes": { + "packed": 64, + "aligned": 12 + }, + "lying": 98648, + "lying_callees": 1609, + "lying_kinds": { + "K&R-empty": 91357, + "narrow": 7291 + } + }, + "struct_map": { + "types": 18760, + "explained_sites": 498896, + "deref_sites": 503016, + "explained_pct": 99.2, + "unassigned_sites": 4120, + "conflicts": 729, + "suspect": 11, + "evidence": { + "param": 36550, + "assign": 14717, + "ret-of": 3410, + "arg": 10176, + "return": 1523, + "assign&": 1051, + "arg&": 270, + "field": 9623 + }, + "vetoed": { + "arg-conduit": 115291, + "ret-of-multisource": 6651, + "assign-multisource": 34545, + "arg&-conduit": 14516, + "field-multisource": 7008, + "ret-of": 683, + "assign&-multisource": 12499, + "arg&-no-overlap": 3455, + "assign": 347, + "arg-no-overlap": 43018, + "assign&": 69, + "arg": 182, + "return": 12, + "field": 3220 + }, + "singletons": 14706, + "multi_body": 4054, + "sites_in_multi_body": 441056, + "top": [ + { + "name": "Unkstruct_800B5CB8", + "sites": 107598, + "bodies": 11186, + "size_hint": 268, + "fields": 134, + "conflicts": 50, + "sign_mixed": 55, + "merges": { + "arg&": 249, + "param": 9464, + "arg": 6960, + "assign": 7396, + "return": 712, + "ret-of": 1476, + "assign&": 18, + "field": 2617 + }, + "globals_at": [ + "D_800B5CB8", + "D_800D3888", + "D_80181448" + ], + "globals_ptr": [ + "D_8006386C", + "D_80074778", + "D_80074780" + ] + }, + { + "name": "Unkstruct_80126B58", + "sites": 65397, + "bodies": 17047, + "size_hint": 588, + "fields": 175, + "conflicts": 50, + "sign_mixed": 60, + "merges": { + "assign&": 106, + "param": 2100, + "arg": 1086, + "assign": 41, + "field": 51 + }, + "globals_at": [ + "D_80126B58" + ], + "globals_ptr": [ + "D_80126B58" + ] + }, + { + "name": "Unkstruct_8018E71C", + "sites": 6745, + "bodies": 396, + "size_hint": 16, + "fields": 7, + "conflicts": 0, + "sign_mixed": 0, + "merges": { + "assign&": 2, + "arg": 15, + "param": 18 + }, + "globals_at": [ + "D_8018E71C" + ], + "globals_ptr": [] + }, + { + "name": "Unkstruct_dac960ce", + "sites": 4464, + "bodies": 124, + "size_hint": 588, + "fields": 13, + "conflicts": 0, + "sign_mixed": 2, + "merges": { + "param": 2 + }, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_0caecd54", + "sites": 4340, + "bodies": 124, + "size_hint": 254, + "fields": 23, + "conflicts": 0, + "sign_mixed": 1, + "merges": { + "param": 2, + "assign": 1, + "return": 1 + }, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_f8ed2b9f", + "sites": 4061, + "bodies": 4061, + "size_hint": 535, + "fields": 1, + "conflicts": 0, + "sign_mixed": 0, + "merges": { + "param": 2 + }, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_a32b99a1", + "sites": 3936, + "bodies": 123, + "size_hint": 75, + "fields": 8, + "conflicts": 0, + "sign_mixed": 1, + "merges": {}, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_8e3dbe51", + "sites": 3930, + "bodies": 131, + "size_hint": 76, + "fields": 5, + "conflicts": 0, + "sign_mixed": 1, + "merges": {}, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_8014A1B0", + "sites": 3778, + "bodies": 542, + "size_hint": 254, + "fields": 13, + "conflicts": 0, + "sign_mixed": 1, + "merges": { + "field": 13, + "arg": 10, + "param": 10, + "return": 1 + }, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_80128EA8", + "sites": 3311, + "bodies": 632, + "size_hint": 56, + "fields": 18, + "conflicts": 0, + "sign_mixed": 13, + "merges": { + "field": 7, + "arg": 23, + "ret-of": 19, + "assign": 1, + "param": 2 + }, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_ade2e8a0", + "sites": 3271, + "bodies": 196, + "size_hint": 164, + "fields": 26, + "conflicts": 3, + "sign_mixed": 9, + "merges": { + "param": 268, + "arg": 133 + }, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_1fa9e810", + "sites": 3144, + "bodies": 131, + "size_hint": 73, + "fields": 3, + "conflicts": 0, + "sign_mixed": 0, + "merges": {}, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_30b21035", + "sites": 3100, + "bodies": 124, + "size_hint": 84, + "fields": 13, + "conflicts": 0, + "sign_mixed": 0, + "merges": {}, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_80126948", + "sites": 2986, + "bodies": 832, + "size_hint": 164, + "fields": 34, + "conflicts": 0, + "sign_mixed": 10, + "merges": { + "arg&": 1, + "assign": 99, + "param": 6, + "arg": 14, + "assign&": 4 + }, + "globals_at": [ + "D_80126948", + "D_80126E60" + ], + "globals_ptr": [ + "D_80114EE8", + "D_801151D4", + "D_80126948" + ] + }, + { + "name": "Unkstruct_adc0bee4", + "sites": 2646, + "bodies": 126, + "size_hint": 52, + "fields": 8, + "conflicts": 0, + "sign_mixed": 3, + "merges": { + "param": 2 + }, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_198fc7cc", + "sites": 2580, + "bodies": 129, + "size_hint": 56, + "fields": 16, + "conflicts": 3, + "sign_mixed": 1, + "merges": { + "param": 2 + }, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_801439FC", + "sites": 2489, + "bodies": 981, + "size_hint": 268, + "fields": 57, + "conflicts": 9, + "sign_mixed": 22, + "merges": { + "field": 102 + }, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_80130D48", + "sites": 2382, + "bodies": 587, + "size_hint": 100, + "fields": 25, + "conflicts": 6, + "sign_mixed": 3, + "merges": { + "field": 1, + "assign": 117 + }, + "globals_at": [], + "globals_ptr": [ + "D_80072C84", + "D_80078E78" + ] + }, + { + "name": "Unkstruct_ed8f1335", + "sites": 2356, + "bodies": 124, + "size_hint": 36, + "fields": 18, + "conflicts": 0, + "sign_mixed": 0, + "merges": {}, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_8016B4F8", + "sites": 2140, + "bodies": 535, + "size_hint": 48, + "fields": 5, + "conflicts": 0, + "sign_mixed": 0, + "merges": { + "param": 26, + "arg": 12 + }, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_80139C7C", + "sites": 2111, + "bodies": 265, + "size_hint": 68, + "fields": 14, + "conflicts": 0, + "sign_mixed": 3, + "merges": { + "param": 12, + "arg": 5 + }, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_b047cdf2", + "sites": 2108, + "bodies": 124, + "size_hint": 32, + "fields": 6, + "conflicts": 0, + "sign_mixed": 0, + "merges": {}, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_2729e670", + "sites": 2091, + "bodies": 123, + "size_hint": 75, + "fields": 6, + "conflicts": 0, + "sign_mixed": 0, + "merges": {}, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_dd542e54", + "sites": 2016, + "bodies": 126, + "size_hint": 24, + "fields": 7, + "conflicts": 0, + "sign_mixed": 0, + "merges": {}, + "globals_at": [], + "globals_ptr": [] + }, + { + "name": "Unkstruct_f49880fd", + "sites": 2000, + "bodies": 125, + "size_hint": 84, + "fields": 6, + "conflicts": 0, + "sign_mixed": 1, + "merges": { + "param": 2 + }, + "globals_at": [], + "globals_ptr": [] + } + ] + }, + "controls": { + "player_block_widths": { + "ok": true, + "detail": "D_80078E8C:4/4 D_80078EB2:2/2 D_80078EB4:2/2 D_80078EB6:2/2 D_80078EB8:2/2 [doc-disputed D_80078F08: code 4 vs actor-struct.md 2] [doc-disputed D_80078F0C: code 4 vs actor-struct.md 2]" + }, + "matrix_layouts": { + "ok": true, + "detail": "MATRIX=32 MATRIX_L48=48" + }, + "prim_layout_class": { + "ok": true, + "detail": "defs in 1192 files, 2 spellings, 1192/1192 in one layout (64 B)" + }, + "tu_conflict_D_800A651C": { + "ok": true, + "detail": "s32:1202 | OtBlk[]:9 | OtBlk_80016450[]:8 | u8[]:8 | s32[][5]:6" + }, + "ok": 4, + "n": 4 + }, + "global_blocks": { + "n": 2123, + "members": 14251, + "top": [ + { + "base": "0x800cf10c", + "size": 52, + "members": 29, + "first": "D_800CF10C", + "last": "D_800CF13C", + "widths": { + "3": 2, + "1": 14, + "4": 3, + "2": 10 + } + }, + { + "base": "0x800a6580", + "size": 58, + "members": 27, + "first": "D_800A6580", + "last": "D_800A65B8", + "widths": { + "4": 2, + "2": 25 + } + }, + { + "base": "0x801998a4", + "size": 87, + "members": 24, + "first": "D_801998A4", + "last": "D_801998FA", + "widths": { + "4": 21, + "1": 3 + } + }, + { + "base": "0x80199840", + "size": 86, + "members": 23, + "first": "D_80199840", + "last": "D_80199895", + "widths": { + "4": 21, + "1": 2 + } + }, + { + "base": "0x801a9608", + "size": 80, + "members": 22, + "first": "D_801A9608", + "last": "D_801A9654", + "widths": { + "4": 18, + "2": 4 + } + }, + { + "base": "0x801ab708", + "size": 84, + "members": 21, + "first": "D_801AB708", + "last": "D_801AB758", + "widths": { + "4": 21 + } + }, + { + "base": "0x801b0df0", + "size": 75, + "members": 21, + "first": "D_801B0DF0", + "last": "D_801B0E3A", + "widths": { + "4": 18, + "1": 3 + } + }, + { + "base": "0x801b83a0", + "size": 78, + "members": 21, + "first": "D_801B83A0", + "last": "D_801B83ED", + "widths": { + "4": 19, + "1": 2 + } + }, + { + "base": "0x801b8710", + "size": 84, + "members": 21, + "first": "D_801B8710", + "last": "D_801B8760", + "widths": { + "4": 21 + } + }, + { + "base": "0x801c1e60", + "size": 84, + "members": 21, + "first": "D_801C1E60", + "last": "D_801C1EB0", + "widths": { + "4": 21 + } + }, + { + "base": "0x801c4278", + "size": 84, + "members": 21, + "first": "D_801C4278", + "last": "D_801C42C8", + "widths": { + "4": 21 + } + }, + { + "base": "0x801cb090", + "size": 84, + "members": 21, + "first": "D_801CB090", + "last": "D_801CB0E0", + "widths": { + "4": 21 + } + }, + { + "base": "0x801cf298", + "size": 82, + "members": 21, + "first": "D_801CF298", + "last": "D_801CF2E8", + "widths": { + "4": 20, + "2": 1 + } + }, + { + "base": "0x801e05a8", + "size": 81, + "members": 21, + "first": "D_801E05A8", + "last": "D_801E05F8", + "widths": { + "4": 20, + "1": 1 + } + }, + { + "base": "0x80190a20", + "size": 80, + "members": 20, + "first": "D_80190A20", + "last": "D_80190A6C", + "widths": { + "4": 20 + } + } + ] + }, + "parked": { + "classes": 24, + "bodies": 453, + "sites": 691, + "needs": { + "signature": 13, + "struct": 7, + "?": 4 + }, + "minimum_lever_banks": 22, + "path": ".run/P37/census/parked.tsv" + }, + "timing": { + "walk_s": 59.9, + "decls_s": 189.8, + "total_s": 198.8 + } + }, + "dup_layout_classes": [ + { + "lhash": "64533110def7:d75a25", + "size": 8, + "n_names": 293, + "n_defs": 488, + "canon": 0, + "in_c": 0, + "names": [ + "GTESVec", + "GVec8", + "SIn_8017E95C", + "SV", + "SV180090", + "SV221A8", + "SV3_8012CC88", + "SV3_80178D40", + "SV3_8017E830", + "SV3_80180D48", + "SV3_801A4570", + "SV4_801749C8", + "SV83", + "SVEC", + "SVEC2", + "SVEC2_C59C", + "SVEC2_C59C_8017D9CC", + "SVEC2_C59C_8017DBEC", + "SVEC2_C59C_801865EC", + "SVEC2_C6F4", + "SVEC2_C974", + "SVEC2_C974_8017BA3C", + "SVEC2_C974_8017BA3C_80189F00", + "SVEC2_CF90", + "SVEC2_D538", + "SVEC2_DF98", + "SVEC8", + "SVEC80180FE4", + "SVEC8_80025818", + "SVEC8_80025EB8", + "SVEC8_80026128", + "SVEC8_800262D8", + "SVEC8_800CB1F8", + "SVEC8_800CB3C0", + "SVEC8_800CB5D0", + "SVEC8_800CB7BC", + "SVEC8_800CBA18", + "SVEC8_800CBE28", + "SVECTOR", + "SVECTOR2" + ], + "tier": 1 + }, + { + "lhash": "64533110def7:opaque", + "size": 8, + "n_names": 202, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "Blk8L", + "Blk8S16", + "Blk8U", + "Blk8_80126940", + "Blk8_80126940_8017D044", + "Blk8_80126940_8017D04C", + "Blk8_80126940_8017D07C", + "Blk8_80126940_8017D09C", + "Blk8_80126940_8017D130", + "Blk8_80126940_8017D168", + "Blk8_80126940_8017D1AC", + "Blk8_80126940_8017D1D8", + "Blk8_80126940_8017D1F0", + "Blk8_80126940_8017D208", + "Blk8_80126940_8017D20C", + "Blk8_80126940_8017D210", + "Blk8_80126940_8017D25C", + "Blk8_80126940_8017D268", + "Blk8_80126940_8017D2FC", + "Blk8_80126940_8017D308", + "Blk8_80126940_8017D344", + "Blk8_80126940_8017D348", + "Blk8_80126940_8017D388", + "Blk8_80126940_8017D3B0", + "Blk8_80126940_8017D3B8", + "Blk8_80126940_8017D3C0", + "Blk8_80126940_8017D458", + "Blk8_80126940_8017D474", + "Blk8_80126940_8017D4A0", + "Blk8_80126940_8017D4DC", + "Blk8_80126940_8017D508", + "Blk8_80126940_8017D524", + "Blk8_80126940_8017D590", + "Blk8_80126940_8017D5D0", + "Blk8_80126940_8017D5D8", + "Blk8_80126940_8017D630", + "Blk8_80126940_8017D634", + "Blk8_80126940_8017D654", + "Blk8_80126940_8017D670", + "Blk8_80126940_8017D6D0" + ], + "tier": 2 + }, + { + "lhash": "1146b31f105c", + "size": 32, + "n_names": 170, + "n_defs": 278, + "canon": 18, + "in_c": 259, + "names": [ + "M32_8017F154", + "M32_80188094", + "MATRIX", + "MATRIX2", + "MATRIX2_8017CDF0", + "MATRIX_8001EFE0", + "MATRIX_8017D5C8", + "MATRIX_8017D5C8_8017D5C8", + "MATRIX_8017D5C8_8017EE98", + "MATRIX_8017D5C8_801814E4", + "MATRIX_8017DBC4", + "MATRIX_8017F98C", + "MATRIX_80181228", + "MATRIX_80182800", + "MATRIX_80187A30", + "MATRIX_80188114", + "MATRIX_8018985C", + "MATRIX_8018DA64", + "MATRIX_801EDED4", + "MATRIX_801EDED4_801E2B14", + "MATRIX_801EDED4_801E2B1C", + "MATRIX_801EDED4_801E5124", + "MATRIX_801EDED4_801E8054", + "MATRIX_801EDED4_801E805C", + "MATRIX_801EDED4_801EA664", + "MATRIX_801EDED4_801EDED4", + "MATRIX_801EDED4_801EF98C", + "MATRIX_801EDED4_801EF99C", + "MATRIX_801EDED4_801F04DC", + "MATRIX_801EDED4_801F1F94", + "MTX", + "MTX80180FE4", + "MTX_1A30", + "MTX_1A30_80184BFC", + "MTX_1A30_80185434", + "MTX_1A30_8018F734", + "MTX_8001FC08", + "MTX_80020248", + "MTX_800CB4E4", + "MTX_800CB910" + ], + "tier": 2 + }, + { + "lhash": "8d605044e3bf:f5e18b", + "size": 8, + "n_names": 152, + "n_defs": 341, + "canon": 0, + "in_c": 0, + "names": [ + "Blk8_801807DC", + "Blk8_8018453C", + "COL_8001EFE0", + "MoveT", + "Pt_8017D87C", + "Pt_80187940", + "Pt_80187940_80180D24", + "SV_80181740", + "Tbl8_8017D898", + "V4", + "V4_80146AFC", + "V4_8014A738", + "V4_8014D820", + "V4_8015094C", + "V4_8017D73C", + "V4_8017E734", + "V4_8017FAC0", + "V4_8017FAC0_8017D420", + "V4_8017FAC0_8017D708", + "V4_8017FAC0_8017D914", + "V4_8017FAC0_8017E01C", + "V4_8017FAC0_8017E518", + "V4_8017FAC0_8017E974", + "V4_8017FAC0_8017EC9C", + "V4_8017FAC0_8017F134", + "V4_8017FAC0_8017F4A4", + "V4_8017FAC0_8017FA54", + "V4_8017FAC0_80181274", + "V4_8017FAC0_80181704", + "V4_8017FAC0_80181FA4", + "V4_8017FAC0_801822C8", + "V4_8017FAC0_8018277C", + "V4_8017FAC0_80182E4C", + "V4_8017FAC0_80183418", + "V4_8017FAC0_80183DD4", + "V4_8017FAC0_801847B8", + "V4_8017FAC0_80186118", + "V4_8017FD58", + "V4_8017FD58_8017D6B8", + "V4_8017FD58_8017D9A0" + ], + "tier": 1 + }, + { + "lhash": "b85caab442ac:opaque", + "size": 32, + "n_names": 129, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "B20", + "Blk20", + "Blk20_800CB68C", + "Blk20_8016DF5C", + "Blk20_8017E3F8", + "Blk20_80180B38", + "Blk20_80180B78", + "Blk20_80181260", + "Blk20_80181EE8", + "Blk20_80182D70", + "Blk20_8018454C", + "Blk20_80184694", + "Blk20_80187108", + "Blk20_80187714", + "Blk20_80188AF4", + "Blk20_8018A4C4", + "Blk20_8018AF88", + "Blk20_8018AF88_80186160", + "Blk32", + "Blk32L", + "Blk32L_80133298", + "Blk32_80017E8C", + "Blk32_8017ECD4", + "Blk32_8017F76C", + "Blk32_8017F76C_80186D9C", + "Blk32_8017F76C_80187780", + "Blk32_80180770", + "Blk32_80180908", + "Blk32_80180E8C", + "Blk32_80181708", + "Blk32_8018287C", + "Blk32_80183F10", + "Blk32_8018AA98", + "Blk32_8018AA98_80181BA8", + "Blk32_8018AA98_80181CF4", + "Blk32_8018AA98_80182254", + "Blk32_8018AA98_80183D30", + "Blk32_8018AA98_80183D30_80180450", + "Blk32_8018AA98_80183D30_801809B0", + "Blk32_8018AA98_80183D30_80183DEC" + ], + "tier": 2 + }, + { + "lhash": "4cc70dd1aeae:opaque", + "size": 4, + "n_names": 102, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "B4", + "B4_8017F154", + "B4_80181970", + "B4_80181ABC", + "B4_8018201C", + "B4_80183AF8", + "B4_80183F3C", + "B4_80184774", + "B4_80185458", + "B4_8018570C", + "B4_80185C00", + "B4_80186938", + "B4_80188094", + "B4_8018A860", + "B4_8018A8E8", + "B4_8018E1F0", + "B4_CB578", + "BYTES_800CFAD0", + "Blk4", + "Blk4_8017CE90", + "Blk4_8017CE90_8017CE90", + "Blk4_8017CE90_8017F32C", + "Blk4_8017CE90_8017F32C_80184FF0", + "Blk4_8017CE90_8017F32C_80184FF0_80187A9C", + "Blk4_8017CE90_8017F32C_80184FF0_80188134", + "Blk4_8017CE90_8017F32C_801869CC", + "Blk4_8017D5DC", + "Blk4_8017D7A0", + "Blk4_8017DF40", + "Blk4_8017DF40_801E48B8", + "Blk4_8017DF40_801E9DF8", + "Blk4_8017DF40_801EFC58", + "Blk4_8017DF40_801F1738", + "Blk4_8017E808", + "Blk4_8017EBCC", + "Blk4_8017FE90", + "Blk4_801800E0", + "Blk4_80180518", + "Blk4_801815D4", + "Blk4_80181EDC" + ], + "tier": 2 + }, + { + "lhash": "d46137d9e11f", + "size": 64, + "n_names": 91, + "n_defs": 1428, + "canon": 1, + "in_c": 1427, + "names": [ + "Prim_8016E7C8", + "Prim_8016E7C8_8016B6BC", + "Prim_8016E7C8_8016B9F8", + "Prim_8016E7C8_8016C2C4", + "Prim_8016E7C8_8016CBC0", + "Prim_8016E7C8_8016E7C8", + "Prim_8016E7C8_8016EB3C", + "Prim_8016E7C8_8016EC0C", + "Prim_8016E7C8_8016F1C4", + "Prim_8016E7C8_80175DA8", + "Prim_8016E7C8_80176218", + "Prim_8016E7C8_80176734", + "Prim_8016E7C8_80177B5C", + "Prim_8016E7C8_80177DA8", + "Prim_8016E7C8_80178970", + "Prim_8016E7C8_8017BEF8", + "Prim_8016E7C8_8017CE7C", + "Prim_8016E7C8_8017D030", + "Prim_8016E7C8_8017D1E0", + "Prim_8016E7C8_8017D4B4", + "Prim_8016E7C8_8017D728", + "Prim_8016E7C8_8017D9CC", + "Prim_8016E7C8_8017DA64", + "Prim_8016E7C8_8017DBEC", + "Prim_8016E7C8_8017DEA0", + "Prim_8016E7C8_8017DFB0", + "Prim_8016E7C8_8017E470", + "Prim_8016E7C8_8017E560", + "Prim_8016E7C8_8017E590", + "Prim_8016E7C8_8017E5B8", + "Prim_8016E7C8_8017E6F0", + "Prim_8016E7C8_8017EAB4", + "Prim_8016E7C8_8017EC6C", + "Prim_8016E7C8_8017F640", + "Prim_8016E7C8_8017F67C", + "Prim_8016E7C8_8017F6D8", + "Prim_8016E7C8_8017F6E8", + "Prim_8016E7C8_8017F8A0", + "Prim_8016E7C8_8017F9CC", + "Prim_8016E7C8_8017FBEC" + ], + "tier": 2 + }, + { + "lhash": "b53d46e36006:opaque", + "size": 8, + "n_names": 72, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "B8", + "B8_17F474", + "B8_801AEB04", + "B8_CB578", + "Blk8", + "Blk8L", + "Blk8_8017B238", + "Blk8_8017B238_8017B238", + "Blk8_8017B614", + "Blk8_8017CF48", + "Blk8_8017DAB8", + "Blk8_8017DAFC", + "Blk8_8017E224", + "Blk8_8017E6A4", + "Blk8_8017E72C", + "Blk8_8017EBCC", + "Blk8_80180040", + "Blk8_80180450", + "Blk8_80180970", + "Blk8_801809B0", + "Blk8_80180BFC", + "Blk8_801812AC", + "Blk8_80181324", + "Blk8_801813B0", + "Blk8_80181774", + "Blk8_80181824", + "Blk8_80181940", + "Blk8_801827C4", + "Blk8_80182844", + "Blk8_80182B08", + "Blk8_80182BDC", + "Blk8_80183084", + "Blk8_801838C8", + "Blk8_801838EC", + "Blk8_80183DEC", + "Blk8_8018495C", + "Blk8_801859DC", + "Blk8_80185E28", + "Blk8_80186594", + "Blk8_80186594_8017E72C" + ], + "tier": 2 + }, + { + "lhash": "8d605044e3bf:d75a25", + "size": 8, + "n_names": 63, + "n_defs": 211, + "canon": 0, + "in_c": 0, + "names": [ + "Ang_8017E95C", + "DVEC_80183534", + "SOut_8017E95C", + "SVEC", + "SVECTOR_8017C290", + "SVECTOR_8017E6D8", + "SVECTOR_8017E72C", + "SVEC_8017DF68", + "SVEC_8018AD9C", + "SVEC_8018EDB0", + "SVEC_8018F060", + "SV_80021284", + "SV_8017F154", + "SV_80188094", + "SV_801A1B28", + "SV_801A8990", + "SV_EA14", + "SVec_80183DA4", + "SVec_80184138", + "SXY_80181574", + "SXY_80184F18", + "Svec_80132F40", + "Sxy_8017DC24", + "Sxy_8017F6A8", + "Sxy_8018012C", + "Sxy_80185C0C", + "UV8", + "UVEC_8017F234", + "UVEC_8017F55C", + "UVEC_80182BD8", + "UVEC_8018F694", + "UV_80181394", + "UV_85810", + "UVec8", + "UVec_8017EA1C", + "UVec_8017EA1C_8017DA78", + "UVec_8017EA1C_8017DB34", + "UVec_8017EA1C_8017DD4C", + "UVec_8017EA1C_8017E064", + "UVec_8017EA1C_8017E2A8" + ], + "tier": 1 + }, + { + "lhash": "65c3c6fd5cf3:e886d6", + "size": 4, + "n_names": 60, + "n_defs": 68, + "canon": 0, + "in_c": 0, + "names": [ + "PTAG_85910", + "PTag", + "PTag293C", + "PTag_1412A8", + "PTag_8001BC6C", + "PTag_8001D3FC", + "PTag_80021284", + "PTag_80023570", + "PTag_80023BF0", + "PTag_800CF3E8", + "PTag_800D2650", + "PTag_800D27DC", + "PTag_800D29F8", + "PTag_80140D68", + "PTag_8017DD28", + "PTag_8017FD50", + "PTag_80180B3C", + "PTag_80181E04", + "PTag_801833F0", + "PTag_801843D8", + "PTag_801843D8_80183438", + "PTag_801843D8_80186DCC", + "PTag_801843D8_801879FC", + "PTag_8018478C", + "PTag_8018893C", + "PTag_80188C04", + "PTag_8018B028", + "PTag_8018B23C", + "PTag_8018B23C_8018234C", + "PTag_8018B23C_80182498", + "PTag_8018B23C_801829F8", + "PTag_8018B23C_801844D4", + "PTag_8018B23C_80184918", + "PTag_8018B23C_80185150", + "PTag_8018B23C_80185E34", + "PTag_8018B23C_801860E8", + "PTag_8018B23C_801865DC", + "PTag_8018B23C_80187314", + "PTag_8018B23C_8018B23C", + "PTag_8018B23C_8018B2C4" + ], + "tier": 1 + }, + { + "lhash": "6c480babe175:opaque", + "size": 8, + "n_names": 58, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "CdFileLoc", + "Cmd_801805C8", + "M8_8016B6BC", + "Packed8", + "Pair8_8017DDC4", + "Pair8_8017DDC4_8018034C", + "Pair8_8017DDC4_80180F08", + "Pair8_8017DDC4_80182244", + "Pair8_8017DDC4_80182244_8017DAB8", + "Pair8_8017DDC4_80182244_8017E72C", + "Pair8_8017DDC4_80182244_80180040", + "Pair8_8017DDC4_80182244_80180040_8017FEA0", + "Pair8_8017DDC4_80182244_80180040_80180400", + "Pair8_8017DDC4_80182244_80180040_80180450", + "Pair8_8017DDC4_80182244_80180040_801809B0", + "Pair8_8017DDC4_80182244_80180040_8018383C", + "Pair8_8017DDC4_80182244_80180040_80183DEC", + "Pair8_8017DDC4_80182244_80180970", + "Pair8_8017DDC4_80182244_80180BFC", + "Pair8_8017DDC4_80182244_80181824", + "Pair8_8017DDC4_80182244_80186740", + "Pair8_8017DDC4_80182244_80187DE4", + "Pair8_8017DDC4_80186D9C", + "Pair8_8017DDC4_80187780", + "Pair_801B5E30", + "Pair_801B5E30_8017E9CC", + "Pair_801B5E30_8017EADC", + "Pair_801B5E30_8017F08C", + "Pair_801B5E30_80180AE4", + "Rec8", + "Rec_80189AEC", + "S80126B38", + "S80172C50", + "S_D2394B", + "Struct", + "Struct_8017E784", + "Struct_8017EA6C", + "Struct_8017EC78", + "Struct_8017F380", + "Struct_8017F87C" + ], + "tier": 2 + }, + { + "lhash": "d4b0395bb0af:opaque", + "size": 16, + "n_names": 54, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "B16", + "B16_8017CDE4", + "B16_80183ED8", + "B16_801841C8", + "B16_80185634", + "B16_801856E4", + "B16_80185794", + "B16_8018584C", + "B16_8018A758", + "B16_8018FC38", + "B16_local", + "Blk16", + "Blk16X", + "Blk16_8017ECD4", + "Blk16_80184328", + "Blk16_8018A1D8", + "Blk16_8018A4C4", + "Blk16_8018A8B8", + "Blk16_8018B13C", + "Blk16_8018B29C", + "Blk16_801E2F08", + "Blk16_956C", + "Blk16_E898", + "Blk_800CBAD0", + "CB4A4_V4", + "DStruct", + "LBlk16", + "M16", + "Q16", + "Quad", + "Quad_8018797C", + "Quad_8018797C_8017F26C", + "Quad_8018797C_8017FCD0", + "Quad_8018797C_80181A30", + "Quad_8018797C_80182B44", + "Rec16_8017DDC4", + "Rec16_8017DDC4_8018023C", + "Rec16_8017DDC4_8018034C", + "Rec16_8017DDC4_80180F08", + "Rec16_8017DDC4_801815C4" + ], + "tier": 2 + }, + { + "lhash": "846e0acadd6a", + "size": 8, + "n_names": 53, + "n_defs": 363, + "canon": 15, + "in_c": 346, + "names": [ + "B8014", + "Blk8", + "Blk8_8012C890", + "Blk8_8012C890_8017C348", + "Blk8_8012C890_8017C348_801E3540", + "Blk8_8012C890_8017C348_801E8A80", + "Blk8_8012C890_8017C348_801EE8E0", + "Blk8_8012C890_8017C348_801F03C0", + "Blk8_8012C890_801E2BC4", + "Blk8_8012C890_801E2CC0", + "Blk8_8012C890_801E8104", + "Blk8_8012C890_801E8200", + "Blk8_8012C890_801EDF64", + "Blk8_8012C890_801EE060", + "Blk8_8012C890_801EFA44", + "Blk8_8012C890_801EFB40", + "Blk8_8012E364", + "Blk8_8012EFB8", + "Blk8_8012FCC4", + "Blk8_80131170", + "Blk8_80131340", + "Blk8_80131B14", + "Blk8_80131CA8", + "Blk8_80131CF4", + "Blk8_80132F40", + "Blk8_80133CD4", + "Blk8_80134C20", + "Blk8_80135004", + "Blk8_80135260", + "Blk8_801463A0", + "Blk8_8017DC54", + "Blk8_8017DCF4", + "Blk8_8017FF80", + "Blk8_8018048C", + "Blk8_801828E4", + "Blob8_80187664", + "Blob8_801876B0", + "Blob8_80189B30", + "Blob8_8018A47C", + "Blob8_8018A47C_8017D2B0" + ], + "tier": 2 + }, + { + "lhash": "8d605044e3bf:opaque", + "size": 8, + "n_names": 52, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "Args_80182194", + "Blk8", + "Blk8017FD54", + "Blk8_801A6AD0", + "Blk8_801AD914", + "Blk8_801E0764", + "Blk8_801E076C", + "Blk_80178D40", + "D_801D0630_s", + "Data_t", + "Data_t_80181CE0", + "Data_t_80182704", + "Data_t_801829CC", + "Data_t_801829F0", + "Data_t_80183DE4", + "Data_t_80184294", + "Data_t_80184A40", + "Data_t_80186848", + "Data_t_8018767C", + "Data_t_80189320", + "Data_t_80189454", + "Data_t_80189AA0", + "Data_t_80189D04", + "Data_t_8018A948", + "Ent8_80188", + "Entry8_801A5D68", + "Rec8_801863EC", + "Rec8_801A57E8", + "SC05_F3E4_Tbl8", + "SV4U", + "SVec", + "SVec_801347A0", + "Stride8_u16_80182868", + "Stride8_u16_80182868_80180970", + "Tbl8_801AFF3C", + "Tbl_80181574", + "Tbl_80184F18", + "U16x4", + "UAlign8", + "UAlign8_80181F40" + ], + "tier": 2 + }, + { + "lhash": "c1767d5293b8:opaque", + "size": 6, + "n_names": 51, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "D80190448_t", + "Pt6_8017D65C", + "ResMapCol", + "S6", + "S8012D664_8012D664", + "S845EC_out", + "SV3", + "SV3_801802D0", + "SV3_80181D44", + "SV3_80181D44_8017CEF4", + "SV3_80181D44_8017CEF4_8017DC20", + "SV3_80181D44_8017CEF4_8017E108", + "SV3_80181D44_8017CEF4_8017F634", + "SV3_80181D44_8017CEF4_8017F81C", + "SV3_80181D44_8017CEF4_8017FB1C", + "SV3_80181D44_8017CEF4_801814F4", + "SV3_80181D44_801821DC", + "SV3_80181D44_8018317C", + "SV3_80181D44_80185B70", + "SV3_8018287C", + "SV3_80182938", + "SV3_8018495C", + "SV3_80184C98", + "SV3_80184D50", + "SV3_80184E00", + "SV3_80184F48", + "SV3_80187654", + "SV3_801891E8", + "SV3_846B4", + "SV3x", + "SV3x_80180ACC", + "SV3x_80183E2C", + "SV3x_80184B30", + "SV3x_80184B30_80181D58", + "SV3x_80184B30_801822A0", + "SV3x_80184B30_8018241C", + "SV3x_80184B30_801829C4", + "SV3x_80184B30_801841E8", + "SV3x_80184B30_80184730", + "SV3x_80184B30_801848AC" + ], + "tier": 2 + }, + { + "lhash": "64533110def7:f5e18b", + "size": 8, + "n_names": 47, + "n_defs": 55, + "canon": 0, + "in_c": 0, + "names": [ + "Buf8_8017D4F0", + "PosT", + "Rec8T", + "Rot_8017E330", + "Rot_8017E550", + "Rot_8017E878", + "SVEC_80167AE0", + "SVEC_8016A290", + "SVEC_8016CBC0", + "SVec8017D67C", + "SVec801A5674", + "SVec_800CB3BC", + "SVec_801670E4", + "SVec_8017C910", + "SVec_8017C910_8017C910", + "SVec_8017C910_8017D728", + "SVec_8017C910_8017D7F0", + "SVec_8017C910_8017D9EC", + "SVec_8017C910_8017DB00", + "SVec_8017C910_8017E608", + "SVec_8017C910_8017E924", + "SVec_8017C910_8017EAE8", + "SVec_8017C910_801808E0", + "SVec_8017C910_80180E74", + "SVec_8017C910_80182A40", + "SVec_801809C4", + "SXY_801A8B64", + "Svec_801A6184", + "Svec_801A8494", + "Svec_801AEC38", + "Svec_A8CE0", + "V3_F428", + "V4_80185480", + "V8_8017D898", + "V8_8017DEBC", + "V8_80182E54", + "V8_80182E54_80183FF8", + "V8_8018487C", + "V8_8018487C_80185344", + "V8_80184F90" + ], + "tier": 1 + }, + { + "lhash": "9568f57fb00f:opaque", + "size": 20, + "n_names": 45, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "OtBlk", + "OtBlk_80016450", + "OtBlk_80016450_80015F04", + "OtBlk_8017D3A0", + "OtBlk_8017D3F8", + "OtBlk_80180894", + "OtBlk_801809C4", + "OtBlk_80181A60", + "OtBlk_80182890_8018FB5C", + "OtBlk_80183DA4", + "OtBlk_80184138", + "OtBlk_80185B4C", + "OtBlk_8018A974", + "OtBlk_8018A974_8018AAF4", + "OtBlk_8018A974_8018BB48", + "OtBlk_8018A974_8018EB08", + "OtBlk_8018A974_8018EB08_8018A28C", + "OtBlk_8018A974_8018EB08_8018A28C_80183ED4", + "OtBlk_8018A974_8018EB08_8018A28C_80187DF8", + "OtBlk_8018A974_8018EB08_8018A28C_801887EC", + "OtBlk_8018A974_8018EB08_8018A28C_8018A2D0", + "OtBlk_8018A974_8018EB08_8018B1D8", + "OtBlk_8018A974_8018EB08_8018BCC4", + "OtBlk_8018A974_801AADA8", + "OtBlk_8018FE0C", + "Ot_80182A78", + "Ot_80182A78_8017EE80", + "Ot_80182A78_80180894", + "Ot_80182A78_801812FC", + "Ot_80182A78_801819E0", + "Ot_8018B23C", + "Ot_8018B23C_8018234C", + "Ot_8018B23C_80182498", + "Ot_8018B23C_801829F8", + "Ot_8018B23C_801844D4", + "Ot_8018B23C_80184918", + "Ot_8018B23C_80185150", + "Ot_8018B23C_80185E34", + "Ot_8018B23C_801860E8", + "Ot_8018B23C_801863B8" + ], + "tier": 2 + }, + { + "lhash": "5f4b599a9ffa:opaque", + "size": 20, + "n_names": 44, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "Blk20_8017D110", + "Buf8017BF34", + "Buf8017BF34_8017BF14", + "Buf8017BF34_8017BF34", + "Buf8017BF34_8017CAF8", + "Buf8017BF34_80182C28", + "Buf8017BF50", + "Buf8017BF50_8017BF50", + "Buf8017BF50_8017BF70", + "Buf8017BF50_8017C234", + "Loc_80180E10", + "LocalStruct", + "LocalStruct_8018A968", + "Local_80180ABC", + "Pkt_801861D8", + "Pkt_8018626C", + "Prim", + "Prim293C", + "Prim80180A38", + "PrimBE4", + "PrimF790", + "PrimSpec80182A6C", + "Prim_80180BDC", + "Rec", + "Rec8017F39C", + "S80143BDC", + "S80190C84", + "S80190C84L", + "S80190C84_8018483C", + "S80190C84_846B4", + "S845EC_in", + "Spawn801A143C", + "Sprite8_801861D8", + "St_8017D118", + "St_8017EDC4", + "St_80182784", + "St_80182784_801817E4", + "St_80182784_80185178", + "St_80182784_80185DA8", + "St_80182784_80185DA8_8018023C" + ], + "tier": 2 + }, + { + "lhash": "f3431cdc6e53", + "size": 32, + "n_names": 39, + "n_defs": 48, + "canon": 20, + "in_c": 28, + "names": [ + "MATRIX_8016E7C8", + "MATRIX_8017C290", + "MATRIX_8017E6D8", + "MATRIX_8017E72C", + "MATRIX_c2", + "MB_8018562C", + "MB_80185764", + "MB_80185B04", + "MTX", + "MTX_139C8", + "MTX_801749C8", + "MTX_8017BB34", + "MTX_8017DE40", + "MTX_8017E4D8", + "MTX_8017EA48", + "MTX_8017FE38", + "MTX_8017FE38_80183FE0", + "MTX_8018256C", + "MTX_80182CB8", + "MTX_801836B8", + "MTX_L", + "MTX_L_8017BEBC", + "MTX_L_8017C180", + "MTX_L_8017C294", + "MTX_L_8017C558", + "MTX_L_8017CA80", + "MTX_L_8017CD9C", + "MTX_L_8017D0B8", + "MTX_L_8017D27C", + "MTX_L_8017D960", + "MTX_L_801811D4", + "MTX_L_80184B80", + "MtxDA34", + "MtxLocal", + "Mtx_800CD27C", + "Mtx_8018A180", + "Mtx_8018E8A0", + "Mtx_8018E8A0_80184FF0", + "Mtx_8018E8A0_801869CC" + ], + "tier": 1 + }, + { + "lhash": "4cc70dd1aeae:658da6", + "size": 4, + "n_names": 39, + "n_defs": 42, + "canon": 0, + "in_c": 0, + "names": [ + "CLR_8016CBC0", + "CVEC", + "CV_80180228", + "CV_801837B0", + "CV_80187EE8", + "CVec4_8017C218", + "CVec4_8017C218_8017C218", + "CVec4_8017C218_8017D030", + "CVec4_8017C218_8017D0F8", + "CVec4_8017C218_8017D2F4", + "CVec4_8017C218_8017D408", + "CVec4_8017C218_8017DF10", + "CVec4_8017C218_8017E22C", + "CVec4_8017C218_8017E3F0", + "CVec4_8017C218_801801E8", + "CVec4_8017C218_8018077C", + "CVec4_8017C218_80182348", + "CVecDA34", + "CVecX", + "CVec_80186E9C", + "CVec_80186E9C_8018BCC4", + "Clr_8017C910", + "Clr_8017C910_8017C910", + "Clr_8017C910_8017D728", + "Clr_8017C910_8017D7F0", + "Clr_8017C910_8017D9EC", + "Clr_8017C910_8017DB00", + "Clr_8017C910_8017E608", + "Clr_8017C910_8017E924", + "Clr_8017C910_8017EAE8", + "Clr_8017C910_801808E0", + "Clr_8017C910_80180E74", + "Clr_8017C910_80182A40", + "Col4_8017D878", + "Col4_8017F2FC", + "Col4_8017F8BC", + "Col4_80181574", + "Cv_8017F074", + "Cv_8017FA2C" + ], + "tier": 1 + }, + { + "lhash": "d4b0395bb0af:d75a25", + "size": 16, + "n_names": 37, + "n_defs": 53, + "canon": 0, + "in_c": 0, + "names": [ + "LV_801851A8", + "LV_801851A8_80182D18", + "LV_801851A8_80184E84", + "LV_801851A8_80185D2C", + "LVec1CDC", + "V32", + "V32_800CB910", + "V32_8017D7C0", + "V32_8017D7C0_8017F19C", + "V32_8017D7C0_8017F340", + "V32_8017D7C0_8017F65C", + "V32_80182D80", + "V32_80182D80_80181DE0", + "V32_80182D80_80185774", + "V32_80182D80_801863A4", + "VC221A8", + "VC_EA14", + "VEC_8001EFE0", + "VEC_80021284", + "VEC_801A1B28", + "Vec16_8018E8A0", + "Vec16_8018E8A0_80184FF0", + "Vec16_8018E8A0_801869CC", + "Vec32", + "Vec32_80188AF4", + "Vec32_8018AF58", + "Vec32_8018B058", + "Vec32_801A2400", + "Vec32_801A3180", + "Vec32_801A4FDC", + "Vec32_801A5094", + "Vec801A143C", + "Vec_8017DB0C", + "Vec_8017E024", + "Vec_8017E37C", + "Vec_8017EBE4", + "Vec_80190538" + ], + "tier": 1 + }, + { + "lhash": "e3853bc52fd6", + "size": 20, + "n_names": 28, + "n_defs": 35, + "canon": 10, + "in_c": 25, + "names": [ + "Env_1412A8", + "Env_800D2650", + "Env_800D27DC", + "Env_800D29F8", + "Env_80140958", + "Env_8017CA18", + "Env_8017DD28", + "Env_8017E804_80188F14", + "Env_8017EFA8", + "Env_8017EFA8_8017E7DC", + "Env_8017EFA8_8017E804", + "Env_8017EFA8_8017E93C", + "Env_8017EFA8_8017EFA8", + "Env_8017FD50", + "Env_8018893C", + "Env_8018BCD4", + "Env_8018C960", + "Env_8018C960_801895C8", + "Env_8018C960_80189BA0", + "Env_8018C960_80189EA0", + "Env_801E46A0", + "Env_801E9BE0", + "Env_801EFA40", + "Env_801F1520", + "Env_S40_8018B238", + "Env_S40_8018B238_80187EA0", + "Env_S40_8018B238_80188478", + "Env_S40_8018B238_80188778" + ], + "tier": 1 + }, + { + "lhash": "a3d1be6495e4", + "size": 12, + "n_names": 22, + "n_defs": 22, + "canon": 22, + "in_c": 0, + "names": [ + "Rec027", + "Rec027_8017BFEC", + "Rec027_8017C2B0", + "Rec027_8017C3C4", + "Rec027_8017C688", + "Rec027_8017CBB0", + "Rec027_8017CECC", + "Rec027_8017D1E8", + "Rec027_8017D3AC", + "Rec027_8017DA90", + "Rec027_80181304", + "Rec_8017C738", + "Rec_8017C738_8017C738", + "Rec_8017C738_8017C9FC", + "Rec_8017C738_8017CB10", + "Rec_8017C738_8017CDD4", + "Rec_8017C738_8017D2FC", + "Rec_8017C738_8017D618", + "Rec_8017C738_8017D934", + "Rec_8017C738_8017DAF8", + "Rec_8017C738_8017E1DC", + "Rec_8017C738_80181A50" + ], + "tier": 2 + }, + { + "lhash": "a0f7100333b8:a0f163", + "size": 4, + "n_names": 20, + "n_defs": 62, + "canon": 0, + "in_c": 0, + "names": [ + "DVEC2_C59C", + "DVEC2_C59C_8017D9CC", + "DVEC2_C59C_8017DBEC", + "DVEC2_C59C_801865EC", + "DVEC2_C6F4", + "DVEC2_C974", + "DVEC2_C974_8017BA3C", + "DVEC2_C974_8017BA3C_80189F00", + "DVEC2_CF90", + "DVEC2_D538", + "DVEC2_DF98", + "DVEC80180FE4", + "DVECTOR2", + "DVECTOR2_8017CDF0", + "DV_8017EF94", + "DV_80180B3C", + "DVec35C", + "DVec_59F4", + "DVec_80180894", + "XDV2" + ], + "tier": 1 + }, + { + "lhash": "2c6b87996aed", + "size": 268, + "n_names": 20, + "n_defs": 20, + "canon": 20, + "in_c": 0, + "names": [ + "Ent_8017FD58", + "Ent_8017FD58_8017D6B8", + "Ent_8017FD58_8017D9A0", + "Ent_8017FD58_8017DBAC", + "Ent_8017FD58_8017E2B4", + "Ent_8017FD58_8017E7B0", + "Ent_8017FD58_8017EC0C", + "Ent_8017FD58_8017EF34", + "Ent_8017FD58_8017F3CC", + "Ent_8017FD58_8017F73C", + "Ent_8017FD58_8017FCEC", + "Ent_8017FD58_8018150C", + "Ent_8017FD58_8018199C", + "Ent_8017FD58_8018223C", + "Ent_8017FD58_80182560", + "Ent_8017FD58_80182A14", + "Ent_8017FD58_801830E4", + "Ent_8017FD58_8018406C", + "Ent_8017FD58_80184A50", + "Ent_8017FD58_801863B0" + ], + "tier": 1 + }, + { + "lhash": "31ae27c7fcb4", + "size": 2, + "n_names": 19, + "n_defs": 34, + "canon": 15, + "in_c": 14, + "names": [ + "Bidx_8018B23C", + "Bidx_8018B23C_8018234C", + "Bidx_8018B23C_80182498", + "Bidx_8018B23C_801829F8", + "Bidx_8018B23C_801844D4", + "Bidx_8018B23C_80184918", + "Bidx_8018B23C_80185150", + "Bidx_8018B23C_80185E34", + "Bidx_8018B23C_801860E8", + "Bidx_8018B23C_801865DC", + "Bidx_8018B23C_80187314", + "Bidx_8018B23C_8018B23C", + "Bidx_8018B23C_8018B2C4", + "Bidx_8018B23C_8018EBCC", + "Ctr34", + "H16", + "H2", + "S16_800CF3E8", + "S34_80184A8C" + ], + "tier": 1 + }, + { + "lhash": "afc6a8e495a5:f5e18b", + "size": 8, + "n_names": 19, + "n_defs": 19, + "canon": 0, + "in_c": 0, + "names": [ + "Rec8_8017DDC4", + "Rec8_8017DDC4_8018023C", + "Rec8_8017DDC4_8018034C", + "Rec8_8017DDC4_8018034C_80180450", + "Rec8_8017DDC4_8018034C_801809B0", + "Rec8_8017DDC4_8018034C_80183DEC", + "Rec8_8017DDC4_80180F08", + "Rec8_8017DDC4_801815C4", + "Rec8_8017DDC4_801815C4_80185344", + "Rec8_8017DDC4_80181DCC", + "Rec8_8017DDC4_80182244", + "Rec8_8017DDC4_80186944", + "Rec8_8017DDC4_801877EC", + "Rec8_8018A390", + "Rec8_8018A390_8018523C", + "Rec8_8018A390_80185730", + "Rec8_8018A390_80186468", + "Rec8_8018A390_8018A390", + "Rec8_8018A390_8018FE94" + ], + "tier": 1 + }, + { + "lhash": "00bfd8673c28", + "size": 32, + "n_names": 18, + "n_defs": 20, + "canon": 9, + "in_c": 11, + "names": [ + "Panel_8017DD28", + "Panel_8017E978", + "Panel_8017E978_8017E1AC", + "Panel_8017E978_8017E1D4", + "Panel_8017E978_8017E30C", + "Panel_8017E978_8017E978", + "Panel_8017E978_801880E0", + "Panel_8017E978_801886B8", + "Panel_8017E978_801889B8", + "Panel_8017E978_8018B478", + "Panel_801E46A0", + "Panel_801E9BE0", + "Panel_801EFA40", + "Panel_801F1520", + "Panel_S40_8018B238", + "Panel_S40_8018B238_80187EA0", + "Panel_S40_8018B238_80188478", + "Panel_S40_8018B238_80188778" + ], + "tier": 2 + }, + { + "lhash": "ce8acea75f2c", + "size": 12, + "n_names": 17, + "n_defs": 97, + "canon": 8, + "in_c": 79, + "names": [ + "Blk12", + "Prim", + "Prim126", + "Prim59C", + "PrimC59C", + "PrimC974", + "PrimCF90", + "PrimD538", + "PrimDF98", + "Prim_8017CD9C", + "Prim_8017CDF0", + "Prim_8017D174", + "Prim_8017DF84", + "Prim_8017FA5C", + "Prim_8017FB38", + "Prim_80180A64", + "XPrim" + ], + "tier": 2 + }, + { + "lhash": "142564f85464:opaque", + "size": 4, + "n_names": 16, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "D_801D0660_s", + "Ent_80186AE4", + "P4", + "Pair4_801B02DC", + "Prim4_8017DD28", + "Prim4_801E46A0", + "Prim4_801E9BE0", + "Prim4_801EFA40", + "Prim4_801F1520", + "Rec4", + "S9E", + "U16x2", + "U16x2L", + "U16x2N", + "UV_80181574", + "UV_80184F18" + ], + "tier": 2 + }, + { + "lhash": "245ecac205e6:e989c0", + "size": 12, + "n_names": 15, + "n_defs": 20, + "canon": 0, + "in_c": 0, + "names": [ + "V32_801875E4", + "V32_801875E4_8018848C", + "V32_80187C64", + "V32_80188B0C", + "V3_800CB634", + "VEC32_801ADC40", + "VEC3L", + "VECTOR", + "Vec32_801AA004", + "Vec3_1818F8", + "Vec3_1887F8", + "Vec3_189324", + "Vec3_874E8", + "VecL_80184694", + "Vec_80187A04" + ], + "tier": 1 + }, + { + "lhash": "92bd6306b11d", + "size": 12, + "n_names": 15, + "n_defs": 15, + "canon": 10, + "in_c": 3, + "names": [ + "Blk12_80180BE0", + "Blk12_801854C4", + "Blk12_801854C4_80181830", + "Blk12_801854C4_80181CA0", + "Blk12_801854C4_801822F4", + "Blk12_801854C4_80183A70", + "Blk12_801854C4_80184BEC", + "Blk12_801854C4_80184EA8", + "Blk12_801854C4_801851C4", + "Blk12_801854C4_801854C4", + "Blk12_801854C4_80187F84", + "Blk12_80185E68", + "Blk12_820F8", + "Elm12", + "Rsc12" + ], + "tier": 2 + }, + { + "lhash": "5b156b6f1fb8", + "size": 16, + "n_names": 14, + "n_defs": 14, + "canon": 14, + "in_c": 0, + "names": [ + "P", + "P_801820E0", + "P_8018222C", + "P_8018278C", + "P_80184268", + "P_801846AC", + "P_80184EE4", + "P_80185BC8", + "P_80185E7C", + "P_80186370", + "P_801870A8", + "P_8018AFD0", + "P_8018B058", + "P_8018E960" + ], + "tier": 2 + }, + { + "lhash": "9dd6d5ec3b52", + "size": 16, + "n_names": 14, + "n_defs": 14, + "canon": 14, + "in_c": 0, + "names": [ + "Rec_8018B23C", + "Rec_8018B23C_8018234C", + "Rec_8018B23C_80182498", + "Rec_8018B23C_801829F8", + "Rec_8018B23C_801844D4", + "Rec_8018B23C_80184918", + "Rec_8018B23C_80185150", + "Rec_8018B23C_80185E34", + "Rec_8018B23C_801860E8", + "Rec_8018B23C_801865DC", + "Rec_8018B23C_80187314", + "Rec_8018B23C_8018B23C", + "Rec_8018B23C_8018B2C4", + "Rec_8018B23C_8018EBCC" + ], + "tier": 2 + }, + { + "lhash": "699932e6421d:2982ab", + "size": 52, + "n_names": 12, + "n_defs": 12, + "canon": 0, + "in_c": 0, + "names": [ + "Prim_8017C218", + "Prim_8017C218_8017C218", + "Prim_8017C218_8017D030", + "Prim_8017C218_8017D0F8", + "Prim_8017C218_8017D2F4", + "Prim_8017C218_8017D408", + "Prim_8017C218_8017DF10", + "Prim_8017C218_8017E22C", + "Prim_8017C218_8017E3F0", + "Prim_8017C218_801801E8", + "Prim_8017C218_8018077C", + "Prim_8017C218_80182348" + ], + "tier": 1 + }, + { + "lhash": "c3cfca554285", + "size": 52, + "n_names": 12, + "n_defs": 12, + "canon": 12, + "in_c": 0, + "names": [ + "Ent_8017BFE0", + "Ent_8017BFE0_8017BFE0", + "Ent_8017BFE0_8017CDF8", + "Ent_8017BFE0_8017CEC0", + "Ent_8017BFE0_8017D0BC", + "Ent_8017BFE0_8017D1D0", + "Ent_8017BFE0_8017DCD8", + "Ent_8017BFE0_8017DFF4", + "Ent_8017BFE0_8017E1B8", + "Ent_8017BFE0_8017FFB0", + "Ent_8017BFE0_80180544", + "Ent_8017BFE0_80182110" + ], + "tier": 2 + }, + { + "lhash": "2102c0155eb4", + "size": 36, + "n_names": 12, + "n_defs": 12, + "canon": 12, + "in_c": 0, + "names": [ + "Ent_8017D6EC", + "Ent_8017D6EC_8017D6EC", + "Ent_8017D6EC_8017DEE8", + "Ent_8017D6EC_8017F5F8", + "Ent_8017D6EC_80180064", + "Ent_8017D6EC_80180618", + "Ent_8017D6EC_801807C0", + "Ent_8017D6EC_80181884", + "Ent_8017D6EC_8018326C", + "Ent_8017D6EC_80183918", + "Ent_8017F688", + "Ent_80181914" + ], + "tier": 2 + }, + { + "lhash": "69ca975386b8", + "size": 32, + "n_names": 12, + "n_defs": 12, + "canon": 12, + "in_c": 0, + "names": [ + "Prim_8017C910", + "Prim_8017C910_8017C910", + "Prim_8017C910_8017D728", + "Prim_8017C910_8017D7F0", + "Prim_8017C910_8017D9EC", + "Prim_8017C910_8017DB00", + "Prim_8017C910_8017E608", + "Prim_8017C910_8017E924", + "Prim_8017C910_8017EAE8", + "Prim_8017C910_801808E0", + "Prim_8017C910_80180E74", + "Prim_8017C910_80182A40" + ], + "tier": 1 + }, + { + "lhash": "142564f85464:a0f163", + "size": 4, + "n_names": 11, + "n_defs": 11, + "canon": 0, + "in_c": 0, + "names": [ + "DV_EA14", + "DVec_80021D38", + "DVec_80183DA4", + "DVec_80184138", + "Pt2_80180F98", + "Pt2_80182FD4", + "Pt2_80184370", + "Pt2_801887E8", + "Pt2_8018AC0C", + "Pt2_8018BAB4", + "XY_8001EFE0" + ], + "tier": 1 + }, + { + "lhash": "7db7d8817dcc", + "size": 4, + "n_names": 11, + "n_defs": 17, + "canon": 2, + "in_c": 15, + "names": [ + "Blk4", + "Blk4_80029774", + "Blk4_8018048C", + "Blk4_801A40CC", + "Blk4_801A7358", + "Blk4_801AB8C0", + "Blk4_801AD31C", + "Blk4_fc", + "S4_800CD054", + "W", + "W_8016BFD0" + ], + "tier": 2 + }, + { + "lhash": "ee4bbc1a9659", + "size": 2, + "n_names": 11, + "n_defs": 19, + "canon": 4, + "in_c": 14, + "names": [ + "Flag_S40_8018B238", + "Flag_S40_8018B238_80187EA0", + "Flag_S40_8018B238_80188478", + "Flag_S40_8018B238_80188778", + "Hd4a4", + "Hd4a4_8017D47C", + "Hd4a4_8017D5DC", + "Hd4a4_8017DC48", + "S0E_80184828", + "Sub_8018A3FC", + "W16" + ], + "tier": 1 + }, + { + "lhash": "245ecac205e6:opaque", + "size": 12, + "n_names": 11, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "MainSlot", + "Rec12", + "Rec12_801888F4", + "Rec801806C8_s", + "Rec80182744_s", + "Rec801944E8", + "S12_801AD700", + "S12_801AD914", + "S801563EC", + "S_80182618", + "Vec12_8017F370" + ], + "tier": 2 + }, + { + "lhash": "a0f7100333b8:opaque", + "size": 4, + "n_names": 11, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "Prim4_8017E978", + "Prim4_8017E978_8017E1AC", + "Prim4_8017E978_8017E1D4", + "Prim4_8017E978_8017E30C", + "Prim4_8017E978_8017E978", + "Prim4_8017E978_801880E0", + "Prim4_8017E978_801886B8", + "Prim4_8017E978_801889B8", + "Prim4_8017E978_8018B478", + "Rec4_801891F4", + "UV_80185214" + ], + "tier": 2 + }, + { + "lhash": "533d080f0739", + "size": 32, + "n_names": 11, + "n_defs": 32, + "canon": 4, + "in_c": 28, + "names": [ + "Ft3_35C", + "PFT3_C59C", + "PFT3_C6F4", + "PFT3_C974", + "PFT3_CF90", + "PFT3_D538", + "PFT3_DF98", + "PolyFT3", + "PolyFT3_8017CDF0", + "PolyFT3_80180FE4", + "XFT3" + ], + "tier": 1 + }, + { + "lhash": "c66921efb8a6", + "size": 40, + "n_names": 11, + "n_defs": 32, + "canon": 4, + "in_c": 28, + "names": [ + "Ft4_35C", + "PFT4_C59C", + "PFT4_C6F4", + "PFT4_C974", + "PFT4_CF90", + "PFT4_D538", + "PFT4_DF98", + "PolyFT4", + "PolyFT4_8017CDF0", + "PolyFT4_80180FE4", + "XFT4" + ], + "tier": 1 + }, + { + "lhash": "69accad910ac", + "size": 8, + "n_names": 11, + "n_defs": 15, + "canon": 4, + "in_c": 11, + "names": [ + "SV_80187A30", + "SVec", + "SVec_8017D1E0", + "SVec_8017DF84", + "SVec_8017F67C", + "SVec_8017F67C_80184FF0", + "SVec_8017F67C_80184FF0_80188134", + "SVec_8017F67C_801869CC", + "SVec_8017FA5C", + "SVec_8017FB38", + "SVec_80180A64" + ], + "tier": 1 + }, + { + "lhash": "9c8d61900c8d", + "size": 56, + "n_names": 11, + "n_defs": 11, + "canon": 10, + "in_c": 1, + "names": [ + "PRIM_8018FE20", + "Prim_8017DAC4", + "Prim_8017DAC4_8017DAC4", + "Prim_8017DAC4_8017E2C0", + "Prim_8017DAC4_8017F9D0", + "Prim_8017DAC4_8018043C", + "Prim_8017DAC4_801809F0", + "Prim_8017DAC4_80180B98", + "Prim_8017DAC4_80181C5C", + "Prim_8017DAC4_80183644", + "Prim_8017DAC4_80183CF0" + ], + "tier": 2 + }, + { + "lhash": "68c91496d82c", + "size": 108, + "n_names": 11, + "n_defs": 11, + "canon": 11, + "in_c": 0, + "names": [ + "Blk027", + "Blk027_8017BFEC", + "Blk027_8017C2B0", + "Blk027_8017C3C4", + "Blk027_8017C688", + "Blk027_8017CBB0", + "Blk027_8017CECC", + "Blk027_8017D1E8", + "Blk027_8017D3AC", + "Blk027_8017DA90", + "Blk027_80181304" + ], + "tier": 2 + }, + { + "lhash": "a2e73cdb49a3", + "size": 4, + "n_names": 10, + "n_defs": 174, + "canon": 5, + "in_c": 163, + "names": [ + "Cnt", + "Cnt_80187DE4", + "E4", + "PW8017C290", + "PW8017E6D8", + "PW8017E72C", + "S70", + "W32", + "packed_word", + "vecr" + ], + "tier": 1 + }, + { + "lhash": "666ed5ae32a1", + "size": 268, + "n_names": 10, + "n_defs": 17, + "canon": 0, + "in_c": 17, + "names": [ + "Ent_80188E10", + "Ent_80188E10_80182F80", + "Ent_80188E10_80183BB4", + "Ent_80188E10_80183ED4", + "Ent_80188E10_80186EA4", + "Ent_80188E10_80187898", + "Ent_80188E10_80187DF8", + "Ent_80188E10_801887EC", + "Ent_80188E10_8018937C", + "Ent_80188E10_8018A2D0" + ], + "tier": 2 + }, + { + "lhash": "c1767d5293b8:a1c8d6", + "size": 6, + "n_names": 8, + "n_defs": 20, + "canon": 0, + "in_c": 0, + "names": [ + "SV3_8017FAA8", + "Shake_80180FE8", + "Struct801AD7EC_Local", + "V3", + "V3_8017F4E4", + "V3_801812AC", + "Vec3_8016BFD0", + "Vec3s" + ], + "tier": 1 + }, + { + "lhash": "03b738d15c44", + "size": 4, + "n_names": 8, + "n_defs": 9, + "canon": 3, + "in_c": 6, + "names": [ + "VMask", + "W4", + "W_8018893C", + "W_8018BCD4", + "W_S40_8018B238", + "W_S40_8018B238_80187EA0", + "W_S40_8018B238_80188478", + "W_S40_8018B238_80188778" + ], + "tier": 2 + }, + { + "lhash": "c9d3ff70a851", + "size": 16, + "n_names": 8, + "n_defs": 12, + "canon": 0, + "in_c": 12, + "names": [ + "Node_801E5AAC", + "Node_801F0E9C", + "Node_801F28E0", + "Tbl16_8018BDE4", + "Tbl16_8018BDE4_8017CEF4", + "Tbl16_8018BDE4_8017CEF4_80183FF8", + "Tbl16_8018BDE4_8018023C", + "Tbl16_8018BDE4_8018359C" + ], + "tier": 1 + }, + { + "lhash": "afc6a8e495a5:opaque", + "size": 8, + "n_names": 8, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "Blk801539F8", + "Box", + "Box_80133784", + "Ent_8018A224", + "Foo_80134510", + "Foo_80134510_80134510", + "Rec_8017ECD4", + "Rec_EDC0" + ], + "tier": 2 + }, + { + "lhash": "6b2796e0dce1", + "size": 8, + "n_names": 7, + "n_defs": 7, + "canon": 0, + "in_c": 7, + "names": [ + "GTEOutV", + "SV_80016A7C", + "SVec3_800173DC", + "SVec_80017168", + "V0_80017294", + "V16D78", + "V16F18" + ], + "tier": 1 + }, + { + "lhash": "f39ecda931df:opaque", + "size": 12, + "n_names": 7, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "Rec", + "UAlign12", + "UAlign12_80181F40", + "UAlign12_80182B74", + "UAlign12_80185E64", + "UAlign12_80186858", + "UAlign12_8018833C" + ], + "tier": 2 + }, + { + "lhash": "ddfe48605de8", + "size": 28, + "n_names": 7, + "n_defs": 26, + "canon": 0, + "in_c": 26, + "names": [ + "Cell126", + "Cell59C", + "CellC59C", + "CellC974", + "CellCF90", + "CellD538", + "CellDF98" + ], + "tier": 1 + }, + { + "lhash": "702e111905f2", + "size": 20, + "n_names": 7, + "n_defs": 27, + "canon": 1, + "in_c": 26, + "names": [ + "PF3_C59C", + "PF3_C6F4", + "PF3_C974", + "PF3_CF90", + "PF3_D538", + "PF3_DF98", + "PolyF3" + ], + "tier": 1 + }, + { + "lhash": "d5fa08a17c88", + "size": 24, + "n_names": 7, + "n_defs": 27, + "canon": 1, + "in_c": 26, + "names": [ + "PF4_C59C", + "PF4_C6F4", + "PF4_C974", + "PF4_CF90", + "PF4_D538", + "PF4_DF98", + "PolyF4" + ], + "tier": 1 + }, + { + "lhash": "db33e2cfb9f1:3987cf", + "size": 8, + "n_names": 7, + "n_defs": 7, + "canon": 0, + "in_c": 0, + "names": [ + "V8_80187968", + "V8_80187968_801804D8", + "V8_80187968_801807AC", + "V8_80187968_80181F18", + "V8_80187968_8018321C", + "V8_80187968_80183280", + "V8_80187968_80184194" + ], + "tier": 1 + }, + { + "lhash": "5f9112725d5b", + "size": 16, + "n_names": 7, + "n_defs": 7, + "canon": 7, + "in_c": 0, + "names": [ + "Src80172E20", + "StructB58", + "StructB58_8017FAFC", + "StructB58_80180730", + "StructB58_80183A20", + "StructB58_80184414", + "StructB58_80185EF8" + ], + "tier": 2 + }, + { + "lhash": "b219fb31f5e8", + "size": 36, + "n_names": 6, + "n_defs": 6, + "canon": 0, + "in_c": 6, + "names": [ + "G4_80017778", + "PG4_8017FD50", + "PG4_8018C960", + "PG4_8018C960_801895C8", + "PG4_8018C960_80189BA0", + "PG4_8018C960_80189EA0" + ], + "tier": 1 + }, + { + "lhash": "0029a68fa4fc:e70b14", + "size": 64, + "n_names": 6, + "n_defs": 6, + "canon": 0, + "in_c": 0, + "names": [ + "Src_80180F98", + "Src_80182FD4", + "Src_80184370", + "Src_801887E8", + "Src_8018AC0C", + "Src_8018BAB4" + ], + "tier": 1 + }, + { + "lhash": "f9ef43fbf4f3", + "size": 152, + "n_names": 6, + "n_defs": 13, + "canon": 1, + "in_c": 12, + "names": [ + "Blk152", + "Blk152_8017DF40", + "Blk152_8017DF40_801E48B8", + "Blk152_8017DF40_801E9DF8", + "Blk152_8017DF40_801EFC58", + "Blk152_8017DF40_801F1738" + ], + "tier": 2 + }, + { + "lhash": "245ecac205e6:cfa514", + "size": 12, + "n_names": 6, + "n_defs": 6, + "canon": 0, + "in_c": 0, + "names": [ + "S_AF634", + "S_AF634_80175820", + "S_AF634_80175820_80175820", + "S_AF634_801758FC", + "S_AF634_801759D8", + "S_AF634_80176144" + ], + "tier": 1 + }, + { + "lhash": "5f4b599a9ffa:f015dc", + "size": 20, + "n_names": 6, + "n_defs": 7, + "canon": 0, + "in_c": 0, + "names": [ + "Blk8018057C", + "Blk801819B0", + "Blk80181A1C", + "Blk80182030", + "Blk801821E8", + "Blk80182634" + ], + "tier": 1 + }, + { + "lhash": "ceca4ea3ade1:a1c8d6", + "size": 6, + "n_names": 6, + "n_defs": 8, + "canon": 0, + "in_c": 0, + "names": [ + "Pos800D20C0", + "Pos_8017DC24", + "Pos_8017F6A8", + "Pos_8018012C", + "Pos_80185C0C", + "Vec4h_8017FB08" + ], + "tier": 1 + }, + { + "lhash": "ceca4ea3ade1:opaque", + "size": 6, + "n_names": 6, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "Cam8012E138", + "SV3", + "Src_8013B598", + "Src_8013B598_8013B598", + "Src_8013B6A0", + "Src_8013B6A0_8013B6A0" + ], + "tier": 2 + }, + { + "lhash": "6f0428152b9e:c5b43c", + "size": 64, + "n_names": 6, + "n_defs": 6, + "canon": 0, + "in_c": 0, + "names": [ + "Prim_8017F40C", + "Prim_8017F40C_8017DB28", + "Prim_8017F40C_8017DF74", + "Prim_8017F40C_8017E368", + "Prim_8017F40C_8017E6EC", + "Prim_8017F40C_8017E97C" + ], + "tier": 1 + }, + { + "lhash": "eaec0835ca48", + "size": 12, + "n_names": 6, + "n_defs": 8, + "canon": 3, + "in_c": 5, + "names": [ + "Elem_8018F086", + "Entry8018F07C", + "Key12_8017DD64", + "TrailEntry", + "Vec", + "VecA" + ], + "tier": 1 + }, + { + "lhash": "306fe4e56612", + "size": 40, + "n_names": 6, + "n_defs": 6, + "canon": 5, + "in_c": 1, + "names": [ + "Ft4_80180B3C", + "Ft4_801833F0", + "Ft4_8018478C", + "Ft4_80188C04", + "Ft4_8018B028", + "Ft4_8018BED0" + ], + "tier": 1 + }, + { + "lhash": "496827f3c5a0", + "size": 28, + "n_names": 6, + "n_defs": 21, + "canon": 0, + "in_c": 21, + "names": [ + "SubRec_801EB5C8", + "SubRec_801EB5C8_8017D7EC", + "SubRec_801EB5C8_8017DC38", + "SubRec_801EB5C8_8017E02C", + "SubRec_801EB5C8_8017E3B0", + "SubRec_801EB5C8_8017E640" + ], + "tier": 2 + }, + { + "lhash": "1064dd3564d8", + "size": 464, + "n_names": 6, + "n_defs": 21, + "canon": 0, + "in_c": 21, + "names": [ + "GroupRec_801EB5C8", + "GroupRec_801EB5C8_8017D7EC", + "GroupRec_801EB5C8_8017DC38", + "GroupRec_801EB5C8_8017E02C", + "GroupRec_801EB5C8_8017E3B0", + "GroupRec_801EB5C8_8017E640" + ], + "tier": 1 + }, + { + "lhash": "51be9f07fb92", + "size": 20, + "n_names": 6, + "n_defs": 6, + "canon": 5, + "in_c": 1, + "names": [ + "Ctl801800B8", + "S_AE7BC", + "S_AE7BC_80175820", + "S_AE7BC_80175820_80175820", + "S_AE7BC_801758FC", + "S_AE7BC_801759D8" + ], + "tier": 1 + }, + { + "lhash": "453eb672a0e3", + "size": 16, + "n_names": 5, + "n_defs": 5, + "canon": 0, + "in_c": 5, + "names": [ + "Entry_D_801949C8", + "Stride16_801BA59C", + "Stride16_801BA59C_8017DF5C", + "Stride16_801BA59C_8017EE0C", + "T16" + ], + "tier": 1 + }, + { + "lhash": "64533110def7:42eab4", + "size": 8, + "n_names": 5, + "n_defs": 6, + "canon": 0, + "in_c": 0, + "names": [ + "Vtx_8016B6BC", + "Vtx_8017DC24", + "Vtx_8017F6A8", + "Vtx_8018012C", + "Vtx_80185C0C" + ], + "tier": 1 + }, + { + "lhash": "fef6227898bc", + "size": 16, + "n_names": 5, + "n_defs": 11, + "canon": 2, + "in_c": 9, + "names": [ + "B16", + "B16x", + "Blk16", + "Prim_1412A8", + "St801D9204" + ], + "tier": 1 + }, + { + "lhash": "59d779d0e67a:793c1d", + "size": 8, + "n_names": 5, + "n_defs": 5, + "canon": 0, + "in_c": 0, + "names": [ + "Drm_801833F0", + "Drm_8018478C", + "Drm_80188C04", + "Drm_8018B028", + "Drm_8018BED0" + ], + "tier": 1 + }, + { + "lhash": "0aaa0c2b3635", + "size": 8, + "n_names": 5, + "n_defs": 18, + "canon": 1, + "in_c": 17, + "names": [ + "DRM", + "DR_MODE", + "E8_8018E450", + "Pair8", + "S8" + ], + "tier": 1 + }, + { + "lhash": "313fe9a920e0", + "size": 26, + "n_names": 5, + "n_defs": 5, + "canon": 0, + "in_c": 5, + "names": [ + "A098Rec", + "Struct800D2E20", + "Struct800D2E6C", + "Struct800D3104", + "Struct800D3120" + ], + "tier": 2 + }, + { + "lhash": "9865e09a793d", + "size": 3, + "n_names": 5, + "n_defs": 5, + "canon": 0, + "in_c": 5, + "names": [ + "Blk3_8017D730", + "Blk3_801E40A8", + "Blk3_801E95E8", + "Blk3_801EF448", + "Blk3_801F0F28" + ], + "tier": 2 + }, + { + "lhash": "81a57ef0eb8d", + "size": 32, + "n_names": 5, + "n_defs": 5, + "canon": 1, + "in_c": 4, + "names": [ + "Mat32", + "Mat32_8017F4E4", + "Mat32_8018741C", + "Mat32_80188B78", + "Mat32_801A4EBC" + ], + "tier": 1 + }, + { + "lhash": "9fb45259b19a", + "size": 20, + "n_names": 5, + "n_defs": 6, + "canon": 4, + "in_c": 2, + "names": [ + "Part", + "Part35C", + "Part80180FE4", + "Part_8017CDF0", + "XPart" + ], + "tier": 1 + }, + { + "lhash": "ab244e47ddd7:2982ab", + "size": 52, + "n_names": 5, + "n_defs": 5, + "canon": 0, + "in_c": 0, + "names": [ + "Prim_8017FA2C", + "Prim_80183FE0", + "Prim_80183FE0_80183040", + "Prim_80183FE0_801869D4", + "Prim_80183FE0_80187604" + ], + "tier": 1 + }, + { + "lhash": "6ef8724a7464", + "size": 20, + "n_names": 5, + "n_defs": 5, + "canon": 4, + "in_c": 0, + "names": [ + "F20T", + "Obj20_80178D40", + "S801593E4", + "Sub_80155800_80155800", + "Sub_8015CD20" + ], + "tier": 2 + }, + { + "lhash": "8ae81f2c5478", + "size": 20, + "n_names": 5, + "n_defs": 5, + "canon": 5, + "in_c": 0, + "names": [ + "Rec20", + "Rec20_8017DF18", + "Rec20_8017DF18_8017DEF0", + "Rec20_8017DF18_8017E050", + "Rec20_8017DF18_8017E6BC" + ], + "tier": 2 + }, + { + "lhash": "65c3c6fd5cf3:02ce31", + "size": 4, + "n_names": 4, + "n_defs": 4, + "canon": 0, + "in_c": 0, + "names": [ + "Ang2_8012B77C", + "Ang2_8012B77C_8012B77C", + "Ang2_8012B77C_80187180", + "Ang2_8012B77C_8018BFA8" + ], + "tier": 1 + }, + { + "lhash": "8d605044e3bf:94f981", + "size": 8, + "n_names": 4, + "n_defs": 5, + "canon": 0, + "in_c": 0, + "names": [ + "D24D0_Rect", + "SpadRect_800184F0", + "XRECT", + "imgrect" + ], + "tier": 1 + }, + { + "lhash": "a5b3b6c549ea", + "size": 32, + "n_names": 4, + "n_defs": 6, + "canon": 2, + "in_c": 4, + "names": [ + "Blk32u", + "Entry", + "Entry_8016E95C", + "Quad" + ], + "tier": 2 + }, + { + "lhash": "a0f7100333b8:fd5a6b", + "size": 4, + "n_names": 4, + "n_defs": 5, + "canon": 0, + "in_c": 0, + "names": [ + "DVec_8016B6BC", + "Hw4", + "Pair", + "Pair_8013AD38" + ], + "tier": 1 + }, + { + "lhash": "5f4b599a9ffa:7b82c5", + "size": 20, + "n_names": 4, + "n_defs": 4, + "canon": 0, + "in_c": 0, + "names": [ + "Msg_8018248C", + "Msg_8018248C_80180450", + "Msg_8018248C_801809B0", + "Msg_8018248C_80183DEC" + ], + "tier": 1 + }, + { + "lhash": "8b02616e5c40", + "size": 52, + "n_names": 4, + "n_defs": 4, + "canon": 0, + "in_c": 4, + "names": [ + "Prim34_80190174", + "Prim_801812AC", + "Prim_80188114", + "Prim_801A52DC" + ], + "tier": 1 + }, + { + "lhash": "8955a8be0835", + "size": 8, + "n_names": 4, + "n_defs": 7, + "canon": 3, + "in_c": 4, + "names": [ + "PTag_801AEC38", + "P_TAG", + "P_TAG_80137DD4", + "P_TAG_8013DD68" + ], + "tier": 1 + }, + { + "lhash": "ce6951817871", + "size": 268, + "n_names": 4, + "n_defs": 136, + "canon": 0, + "in_c": 134, + "names": [ + "Ent", + "EntD820", + "EntD820_8014D820", + "Ent_8014D820" + ], + "tier": 1 + }, + { + "lhash": "fd623ac865b9", + "size": 28, + "n_names": 4, + "n_defs": 12, + "canon": 4, + "in_c": 8, + "names": [ + "Ent_8013B6A0", + "Ent_8013B6A0_8013B6A0", + "Spr_8013B598", + "Spr_8013B598_8013B598" + ], + "tier": 2 + }, + { + "lhash": "f5c2ab89f5a9", + "size": 16, + "n_names": 4, + "n_defs": 5, + "canon": 0, + "in_c": 5, + "names": [ + "Blk16A1", + "Entry16", + "Row_80186060", + "S16" + ], + "tier": 1 + }, + { + "lhash": "3336997be720", + "size": 164, + "n_names": 4, + "n_defs": 6, + "canon": 2, + "in_c": 4, + "names": [ + "BigCopy", + "Blk164", + "Blk_0xA4", + "copy00" + ], + "tier": 1 + }, + { + "lhash": "c6ea13d69cd3", + "size": 40, + "n_names": 4, + "n_defs": 4, + "canon": 0, + "in_c": 4, + "names": [ + "Prim_8017DC24", + "Prim_8017F6A8", + "Prim_8018012C", + "Prim_80185C0C" + ], + "tier": 1 + }, + { + "lhash": "766bee63ace7", + "size": 72, + "n_names": 4, + "n_defs": 4, + "canon": 0, + "in_c": 4, + "names": [ + "Prim_80182080", + "Quad_8017DABC", + "Quad_8017DB20", + "Quad_8017E0E4" + ], + "tier": 1 + }, + { + "lhash": "f1dcb3a42fc8", + "size": 20, + "n_names": 4, + "n_defs": 4, + "canon": 1, + "in_c": 3, + "names": [ + "Rec_801825D8", + "Rec_80184FF8", + "S8012C658", + "S8017FF9C_sp" + ], + "tier": 2 + }, + { + "lhash": "193af660478c", + "size": 12, + "n_names": 4, + "n_defs": 4, + "canon": 0, + "in_c": 4, + "names": [ + "Pose_8017E330", + "Pose_8017E550", + "Pose_8017E878", + "St80180ACC" + ], + "tier": 1 + }, + { + "lhash": "6f8e2de2ffda", + "size": 20, + "n_names": 4, + "n_defs": 6, + "canon": 0, + "in_c": 6, + "names": [ + "buf_801840C0", + "buf_801873B0", + "buf_80187DA4", + "buf_80189888" + ], + "tier": 2 + }, + { + "lhash": "3e4f4166f2b3", + "size": 36, + "n_names": 4, + "n_defs": 4, + "canon": 2, + "in_c": 2, + "names": [ + "A801593E4", + "Ent_80186E9C", + "Ent_80186E9C_8018BCC4", + "S126B58" + ], + "tier": 1 + }, + { + "lhash": "8944ddcbe454:opaque", + "size": 36, + "n_names": 3, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "Blk36_800296F8", + "Blob36", + "SW20" + ], + "tier": 2 + }, + { + "lhash": "0fb1d3def821:403b4a", + "size": 20, + "n_names": 3, + "n_defs": 3, + "canon": 0, + "in_c": 0, + "names": [ + "Face14_800CB5D0", + "Face2", + "FaceF4_800CB3C0" + ], + "tier": 1 + }, + { + "lhash": "142564f85464:fd5a6b", + "size": 4, + "n_names": 3, + "n_defs": 3, + "canon": 0, + "in_c": 0, + "names": [ + "Poly12Pt", + "Pt_80015F04", + "XY221A8" + ], + "tier": 1 + }, + { + "lhash": "8d605044e3bf:4c7ee6", + "size": 8, + "n_names": 3, + "n_defs": 3, + "canon": 0, + "in_c": 0, + "names": [ + "Blk8_8018A314", + "QB_80185B04", + "Q_8018562C" + ], + "tier": 1 + }, + { + "lhash": "c1767d5293b8:e989c0", + "size": 6, + "n_names": 3, + "n_defs": 7, + "canon": 0, + "in_c": 0, + "names": [ + "SV_801AA210", + "Svec3", + "UVec_8017DB64" + ], + "tier": 1 + }, + { + "lhash": "c2ba48790859", + "size": 1, + "n_names": 3, + "n_defs": 3, + "canon": 0, + "in_c": 2, + "names": [ + "W8", + "W8_", + "func_8002EE64_b" + ], + "tier": 2 + }, + { + "lhash": "7b3adf8bd9e4", + "size": 84, + "n_names": 3, + "n_defs": 3, + "canon": 0, + "in_c": 3, + "names": [ + "F150Rec", + "F1ccRec", + "S54" + ], + "tier": 1 + }, + { + "lhash": "245ecac205e6:a1c8d6", + "size": 12, + "n_names": 3, + "n_defs": 3, + "canon": 0, + "in_c": 0, + "names": [ + "SV4", + "VEC_8017DF28", + "Vec3_8017DF8C" + ], + "tier": 1 + }, + { + "lhash": "f39ecda931df:e998cb", + "size": 12, + "n_names": 3, + "n_defs": 3, + "canon": 0, + "in_c": 0, + "names": [ + "Rec_80166690", + "Rec_80166690_80166690", + "Rec_8016CBC0" + ], + "tier": 1 + }, + { + "lhash": "ff66866c62b0", + "size": 4, + "n_names": 3, + "n_defs": 6, + "canon": 2, + "in_c": 4, + "names": [ + "Ent_80183280", + "Ent_80183CF0", + "Ent_80183CF0_80183CF0" + ], + "tier": 2 + }, + { + "lhash": "b519bad67107:opaque", + "size": 20, + "n_names": 3, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "Local_8017EE34", + "Local_80181C84", + "Local_801870E8" + ], + "tier": 2 + }, + { + "lhash": "6f0428152b9e:d366eb", + "size": 64, + "n_names": 3, + "n_defs": 5, + "canon": 0, + "in_c": 0, + "names": [ + "Prim_80183F84", + "Prim_801A4680", + "Prim_801A4680_8017F668" + ], + "tier": 1 + }, + { + "lhash": "927525df50d4", + "size": 16, + "n_names": 3, + "n_defs": 8, + "canon": 3, + "in_c": 5, + "names": [ + "E_13BD74", + "E_13C08C", + "E_13C08C_8013C08C" + ], + "tier": 2 + }, + { + "lhash": "c108edffc948", + "size": 52, + "n_names": 3, + "n_defs": 4, + "canon": 1, + "in_c": 3, + "names": [ + "D_80195D74_Entry", + "Elem52_801B5094", + "S_8018AEB8" + ], + "tier": 1 + }, + { + "lhash": "f94245c68571", + "size": 108, + "n_names": 3, + "n_defs": 5, + "canon": 2, + "in_c": 3, + "names": [ + "S_8013BC7C", + "S_8013BC7C_8013BC7C", + "T68_8017FC44" + ], + "tier": 2 + }, + { + "lhash": "33717af3314b", + "size": 40, + "n_names": 3, + "n_defs": 5, + "canon": 0, + "in_c": 5, + "names": [ + "FT4_801857A4", + "Ft4_80183DA4", + "Ft4_80184138" + ], + "tier": 1 + }, + { + "lhash": "8f99301f271e", + "size": 268, + "n_names": 3, + "n_defs": 4, + "canon": 0, + "in_c": 4, + "names": [ + "Cnt_8018E8A0", + "Cnt_8018E8A0_80184FF0", + "Cnt_8018E8A0_801869CC" + ], + "tier": 2 + }, + { + "lhash": "c76809a9d652", + "size": 56, + "n_names": 3, + "n_defs": 4, + "canon": 0, + "in_c": 4, + "names": [ + "Prim_8018E8A0", + "Prim_8018E8A0_80184FF0", + "Prim_8018E8A0_801869CC" + ], + "tier": 1 + }, + { + "lhash": "631872411606", + "size": 56, + "n_names": 3, + "n_defs": 3, + "canon": 1, + "in_c": 2, + "names": [ + "PKT_80180228", + "PKT_801837B0", + "PKT_80187EE8" + ], + "tier": 1 + }, + { + "lhash": "1dd90dc86138", + "size": 236, + "n_names": 3, + "n_defs": 3, + "canon": 2, + "in_c": 1, + "names": [ + "Ent80183F28", + "Ent80183F28_80183F28", + "Ent_80184058" + ], + "tier": 2 + }, + { + "lhash": "aa66418d079c:f5e18b", + "size": 16, + "n_names": 3, + "n_defs": 3, + "canon": 0, + "in_c": 0, + "names": [ + "Work_8017E330", + "Work_8017E550", + "Work_8017E878" + ], + "tier": 1 + }, + { + "lhash": "43669d0a183b", + "size": 36, + "n_names": 3, + "n_defs": 3, + "canon": 0, + "in_c": 3, + "names": [ + "Coord_8017E330", + "Coord_8017E550", + "Coord_8017E878" + ], + "tier": 1 + }, + { + "lhash": "9ba0ae408dd4", + "size": 56, + "n_names": 3, + "n_defs": 3, + "canon": 0, + "in_c": 3, + "names": [ + "Drv_8017E330", + "Drv_8017E550", + "Drv_8017E878" + ], + "tier": 2 + }, + { + "lhash": "defdeb9d32fc", + "size": 56, + "n_names": 3, + "n_defs": 3, + "canon": 2, + "in_c": 1, + "names": [ + "Blk80078E78", + "Gs_80078E78", + "Gs_80078E78_80183D50" + ], + "tier": 2 + }, + { + "lhash": "9dec8574d64e", + "size": 428, + "n_names": 3, + "n_defs": 2, + "canon": 1, + "in_c": 0, + "names": [ + "Actor4C", + "actor4c", + "actor4c_8015444C" + ], + "tier": 2 + }, + { + "lhash": "11315955abf5", + "size": 32, + "n_names": 3, + "n_defs": 3, + "canon": 3, + "in_c": 0, + "names": [ + "Obj_8018A550", + "Obj_8018A550_801878A8", + "Obj_8018A550_8018A550" + ], + "tier": 2 + }, + { + "lhash": "d919e4fe13ba", + "size": 52, + "n_names": 3, + "n_defs": 3, + "canon": 3, + "in_c": 0, + "names": [ + "Ctl_8018A550", + "Ctl_8018A550_801878A8", + "Ctl_8018A550_8018A550" + ], + "tier": 1 + }, + { + "lhash": "5c92835319e5", + "size": 16, + "n_names": 3, + "n_defs": 3, + "canon": 3, + "in_c": 0, + "names": [ + "Rec_8018A550", + "Rec_8018A550_801878A8", + "Rec_8018A550_8018A550" + ], + "tier": 2 + }, + { + "lhash": "26fea65ca12c", + "size": 16, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "DispSlot_800184F0", + "DispSlot_800184F0_80014588" + ], + "tier": 1 + }, + { + "lhash": "eefa450f0381", + "size": 24, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "Face3", + "FaceGT4_800CB7BC" + ], + "tier": 1 + }, + { + "lhash": "f138a69b30cd:f292be", + "size": 16, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 0, + "names": [ + "LineF2_80015F04", + "LineF2_80181A60" + ], + "tier": 1 + }, + { + "lhash": "9c6e4b1a9e07", + "size": 24, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "F4_80016450", + "F4_801AB21C" + ], + "tier": 1 + }, + { + "lhash": "c261a2c483d3:b85ac4", + "size": 40, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 0, + "names": [ + "LineG4", + "LineG4_80016C28" + ], + "tier": 1 + }, + { + "lhash": "c261a2c483d3:c91c09", + "size": 40, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 0, + "names": [ + "Ft4", + "Ft4_800CBA18" + ], + "tier": 1 + }, + { + "lhash": "f57d25747f4b", + "size": 4, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "UV16D78", + "UV16F18" + ], + "tier": 1 + }, + { + "lhash": "b85caab442ac:1203f4", + "size": 32, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 0, + "names": [ + "MTX8_80185648", + "Oct_801852BC" + ], + "tier": 1 + }, + { + "lhash": "8d605044e3bf:cfadf9", + "size": 8, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 0, + "names": [ + "SV4R_801AAA6C", + "SV4_801AAB28" + ], + "tier": 1 + }, + { + "lhash": "8d605044e3bf:ef9222", + "size": 8, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 0, + "names": [ + "Row8_8018367C", + "Row8_8018367C_801811A4" + ], + "tier": 1 + }, + { + "lhash": "4cc70dd1aeae:bf98b1", + "size": 4, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 0, + "names": [ + "C_8017DCC0", + "RGBC" + ], + "tier": 1 + }, + { + "lhash": "400c14f38ee9:a3510d", + "size": 32, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 0, + "names": [ + "Face20_800CBA18", + "Prim20" + ], + "tier": 1 + }, + { + "lhash": "cd10d44bbfcc", + "size": 36, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "FaceGT4", + "FaceGT4_800CBE28" + ], + "tier": 1 + }, + { + "lhash": "e78015bce7b7", + "size": 52, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "PktGT4", + "PktGT4_800CBE28" + ], + "tier": 1 + }, + { + "lhash": "b1a4ba961858", + "size": 84, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "F150Slot", + "F1ccSlot" + ], + "tier": 1 + }, + { + "lhash": "06c78d2eedc6", + "size": 32, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 1, + "names": [ + "Blk28", + "C24" + ], + "tier": 2 + }, + { + "lhash": "2e57efa3d051", + "size": 72, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "Voice336A8", + "VoiceF80" + ], + "tier": 2 + }, + { + "lhash": "4d3f0ba5faf2", + "size": 8, + "n_names": 2, + "n_defs": 2, + "canon": 1, + "in_c": 1, + "names": [ + "Buf80153978", + "Ramp388C" + ], + "tier": 1 + }, + { + "lhash": "344506cf1022", + "size": 48, + "n_names": 2, + "n_defs": 136, + "canon": 1, + "in_c": 134, + "names": [ + "CdReq", + "MATRIX_L48" + ], + "tier": 1 + }, + { + "lhash": "4a70ab65aff5", + "size": 4, + "n_names": 2, + "n_defs": 3, + "canon": 0, + "in_c": 3, + "names": [ + "FnEntry", + "RowC_80180CD0" + ], + "tier": 1 + }, + { + "lhash": "b8ea8cce0a40", + "size": 20, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "MZ", + "Stk" + ], + "tier": 1 + }, + { + "lhash": "5b8ad54bc29f", + "size": 24, + "n_names": 2, + "n_defs": 3, + "canon": 0, + "in_c": 2, + "names": [ + "Locs", + "Mat_CB6A0" + ], + "tier": 1 + }, + { + "lhash": "542b1eda7358", + "size": 64, + "n_names": 2, + "n_defs": 3, + "canon": 2, + "in_c": 1, + "names": [ + "Mtx", + "Mtx_8016BFD0" + ], + "tier": 1 + }, + { + "lhash": "7ffb740ef67d", + "size": 40, + "n_names": 2, + "n_defs": 2, + "canon": 1, + "in_c": 1, + "names": [ + "B", + "Mtx40" + ], + "tier": 1 + }, + { + "lhash": "0d582a24ea16", + "size": 152, + "n_names": 2, + "n_defs": 2, + "canon": 1, + "in_c": 1, + "names": [ + "Fr_800CB3BC", + "Fr_801670E4" + ], + "tier": 1 + }, + { + "lhash": "5b95bca7ba8c", + "size": 84, + "n_names": 2, + "n_defs": 2, + "canon": 1, + "in_c": 1, + "names": [ + "Src_800CB658", + "Src_80167540" + ], + "tier": 1 + }, + { + "lhash": "8353c1de6a85", + "size": 40, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "MtxBuf_800CD27C", + "MtxBuf_8018A180" + ], + "tier": 1 + }, + { + "lhash": "699932e6421d:6183cf", + "size": 52, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 0, + "names": [ + "Frame_80166690", + "Frame_80166690_80166690" + ], + "tier": 1 + }, + { + "lhash": "99b59e3160d5", + "size": 10, + "n_names": 2, + "n_defs": 3, + "canon": 2, + "in_c": 1, + "names": [ + "S10", + "S10_80136C90" + ], + "tier": 2 + }, + { + "lhash": "a0f7100333b8:cdf8ac", + "size": 4, + "n_names": 2, + "n_defs": 3, + "canon": 0, + "in_c": 0, + "names": [ + "Range_80189A70", + "Range_80189B1C" + ], + "tier": 1 + }, + { + "lhash": "425f1d9c3446", + "size": 32, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "Prim8017D67C", + "Prim801A5674" + ], + "tier": 1 + }, + { + "lhash": "61568a95a4a8", + "size": 54, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "Ent34", + "S34_801A1470" + ], + "tier": 1 + }, + { + "lhash": "c80fac242f04", + "size": 32, + "n_names": 2, + "n_defs": 3, + "canon": 0, + "in_c": 3, + "names": [ + "Mat801A8E34", + "Mat_80183C9C" + ], + "tier": 2 + }, + { + "lhash": "ac91ae2d8aa0:opaque", + "size": 28, + "n_names": 2, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "S800D22E4", + "vec" + ], + "tier": 2 + }, + { + "lhash": "416a00ee0fb0", + "size": 28, + "n_names": 2, + "n_defs": 3, + "canon": 2, + "in_c": 1, + "names": [ + "E_3B7AC", + "E_3B7AC_8013B7AC" + ], + "tier": 2 + }, + { + "lhash": "069136f94521", + "size": 4, + "n_names": 2, + "n_defs": 2, + "canon": 1, + "in_c": 1, + "names": [ + "Prim4", + "SpotDef_8018A278" + ], + "tier": 1 + }, + { + "lhash": "58a962a3345f", + "size": 20, + "n_names": 2, + "n_defs": 2, + "canon": 1, + "in_c": 1, + "names": [ + "D_87298", + "Rec801466F0" + ], + "tier": 1 + }, + { + "lhash": "82c6e3650290:6fe693", + "size": 8, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 0, + "names": [ + "Elem_8012ACE0", + "Elem_8012ACE0_8012ACE0" + ], + "tier": 1 + }, + { + "lhash": "82c6e3650290:opaque", + "size": 8, + "n_names": 2, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "Gte8_8017F2FC", + "Rec_80180808" + ], + "tier": 2 + }, + { + "lhash": "429d56779f18", + "size": 24, + "n_names": 2, + "n_defs": 13, + "canon": 1, + "in_c": 12, + "names": [ + "Loc", + "Loc_8014A048" + ], + "tier": 2 + }, + { + "lhash": "612981d95d84:4447d6", + "size": 12, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 0, + "names": [ + "Out_8017E910", + "Out_8017E910_8017E508" + ], + "tier": 1 + }, + { + "lhash": "12fe36cd7e07", + "size": 16, + "n_names": 2, + "n_defs": 3, + "canon": 0, + "in_c": 3, + "names": [ + "Struct801E79D8", + "Struct801EF318" + ], + "tier": 2 + }, + { + "lhash": "042b3b868d1c", + "size": 12, + "n_names": 2, + "n_defs": 3, + "canon": 1, + "in_c": 2, + "names": [ + "MatEntry", + "MatEntry_80187B04" + ], + "tier": 2 + }, + { + "lhash": "a1efd3767cc1", + "size": 20, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "Msg_80187050", + "Tmp80181CD0" + ], + "tier": 1 + }, + { + "lhash": "9bf9dbcce1cc", + "size": 6, + "n_names": 2, + "n_defs": 2, + "canon": 1, + "in_c": 1, + "names": [ + "Vec3h", + "Vec3x16" + ], + "tier": 1 + }, + { + "lhash": "c6e867e46e6f", + "size": 8, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "V16x4", + "Vec4s16_8018423C" + ], + "tier": 2 + }, + { + "lhash": "db33e2cfb9f1:d75a25", + "size": 8, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 0, + "names": [ + "SV3_8012CC88", + "SV3_801808E8" + ], + "tier": 1 + }, + { + "lhash": "1ee831be5408", + "size": 72, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "Desc_80181574", + "Desc_80184F18" + ], + "tier": 1 + }, + { + "lhash": "64db0612c4d4", + "size": 236, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "Work_801832E0", + "Work_80183634" + ], + "tier": 2 + }, + { + "lhash": "0ac6330ef243", + "size": 64, + "n_names": 2, + "n_defs": 3, + "canon": 0, + "in_c": 3, + "names": [ + "Prim_80182800", + "Prim_8018DA64" + ], + "tier": 1 + }, + { + "lhash": "08944be666a1", + "size": 20, + "n_names": 2, + "n_defs": 4, + "canon": 0, + "in_c": 4, + "names": [ + "Sub8017EBC4", + "Sub_80181BA0" + ], + "tier": 2 + }, + { + "lhash": "aa66418d079c:d9804b", + "size": 16, + "n_names": 2, + "n_defs": 6, + "canon": 0, + "in_c": 0, + "names": [ + "Box_80182BC8", + "Box_80184564" + ], + "tier": 1 + }, + { + "lhash": "aa66418d079c:fd5a6b", + "size": 16, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 0, + "names": [ + "Pair16", + "Pair16_8017B368" + ], + "tier": 1 + }, + { + "lhash": "aa66418d079c:opaque", + "size": 16, + "n_names": 2, + "n_defs": 0, + "canon": 0, + "in_c": 0, + "names": [ + "Blk16_80126940", + "Pos16_8018743C" + ], + "tier": 2 + }, + { + "lhash": "474e1fa40ab6", + "size": 156, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "Actor_8017E550", + "Actor_8017E878" + ], + "tier": 2 + }, + { + "lhash": "ffa7660db10a", + "size": 40, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "Quad_80186E9C", + "Quad_80186E9C_8018BCC4" + ], + "tier": 1 + }, + { + "lhash": "808a1afecf18", + "size": 80, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "Fr_80187368", + "Fr_8018C190" + ], + "tier": 1 + }, + { + "lhash": "f22518ca2429", + "size": 268, + "n_names": 2, + "n_defs": 3, + "canon": 0, + "in_c": 3, + "names": [ + "Ent_8018D3A4", + "Ent_8018D654" + ], + "tier": 2 + }, + { + "lhash": "e816c568395a", + "size": 260, + "n_names": 2, + "n_defs": 3, + "canon": 0, + "in_c": 3, + "names": [ + "Obj80180D84", + "St_8017E95C_r" + ], + "tier": 2 + }, + { + "lhash": "d60a32e09c91", + "size": 8, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "P8", + "S72" + ], + "tier": 2 + }, + { + "lhash": "cc89b444f3c5", + "size": 256, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "Ent", + "EntA" + ], + "tier": 2 + }, + { + "lhash": "2816963b1259", + "size": 44, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "Obj800D302C", + "Struct800D2FEC" + ], + "tier": 2 + }, + { + "lhash": "410bab0528f6", + "size": 20, + "n_names": 2, + "n_defs": 2, + "canon": 2, + "in_c": 0, + "names": [ + "S8014C010", + "S_8014AD30" + ], + "tier": 1 + }, + { + "lhash": "c15c29cf79fb", + "size": 508, + "n_names": 2, + "n_defs": 2, + "canon": 2, + "in_c": 0, + "names": [ + "SubED80", + "SubF24C" + ], + "tier": 2 + }, + { + "lhash": "d97bdca0dba1:22ff66", + "size": 196, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 0, + "names": [ + "Blk_8016CF04", + "Blk_8016CF04_8016CF04" + ], + "tier": 1 + }, + { + "lhash": "43ae4b374f39", + "size": 92, + "n_names": 2, + "n_defs": 2, + "canon": 2, + "in_c": 0, + "names": [ + "DrawEnv", + "DrawEnv_8013DD68" + ], + "tier": 2 + }, + { + "lhash": "64003f1eade0", + "size": 104, + "n_names": 2, + "n_defs": 2, + "canon": 2, + "in_c": 0, + "names": [ + "Buf_8013DD68", + "Buf_c2" + ], + "tier": 1 + }, + { + "lhash": "4bf2054e3688", + "size": 104, + "n_names": 2, + "n_defs": 2, + "canon": 2, + "in_c": 0, + "names": [ + "Ent_80164930", + "Ent_80164930_80164930" + ], + "tier": 2 + }, + { + "lhash": "3ed8f73077eb", + "size": 148, + "n_names": 2, + "n_defs": 2, + "canon": 2, + "in_c": 0, + "names": [ + "Owner_8012ACE0", + "Owner_8012ACE0_8012ACE0" + ], + "tier": 1 + }, + { + "lhash": "0c137f25ac4b", + "size": 22, + "n_names": 2, + "n_defs": 2, + "canon": 2, + "in_c": 0, + "names": [ + "S0", + "S0_801347A0" + ], + "tier": 2 + }, + { + "lhash": "375b5247305e", + "size": 40, + "n_names": 2, + "n_defs": 2, + "canon": 2, + "in_c": 0, + "names": [ + "Thing_80168828", + "Thing_80168828_80168828" + ], + "tier": 2 + }, + { + "lhash": "53254525c0c2", + "size": 84, + "n_names": 2, + "n_defs": 2, + "canon": 2, + "in_c": 0, + "names": [ + "Fr", + "Fr_80167AE0" + ], + "tier": 1 + }, + { + "lhash": "5eb78e970e7e", + "size": 236, + "n_names": 2, + "n_defs": 2, + "canon": 2, + "in_c": 0, + "names": [ + "Ent_80183D50", + "Ent_80183D50_80183D50" + ], + "tier": 2 + }, + { + "lhash": "a579a7d634d5", + "size": 230, + "n_names": 2, + "n_defs": 2, + "canon": 2, + "in_c": 0, + "names": [ + "Ent_80184264", + "Ent_80184264_80184264" + ], + "tier": 2 + }, + { + "lhash": "bf68fb32debf", + "size": 20, + "n_names": 2, + "n_defs": 2, + "canon": 2, + "in_c": 0, + "names": [ + "Unk8018F8C4", + "Unk8018F8C4_80184538" + ], + "tier": 2 + } + ], + "layout_twins": [ + { + "lhash": "64533110def7", + "size": 8, + "n_names": 551, + "n_defs": 821, + "canon": 177, + "in_c": 642, + "names": [ + "Blk8L", + "Blk8S16", + "Blk8U", + "Blk8_80126940", + "Blk8_80126940_8017D044", + "Blk8_80126940_8017D04C", + "Blk8_80126940_8017D07C", + "Blk8_80126940_8017D09C", + "Blk8_80126940_8017D130", + "Blk8_80126940_8017D168", + "Blk8_80126940_8017D1AC", + "Blk8_80126940_8017D1D8", + "Blk8_80126940_8017D1F0", + "Blk8_80126940_8017D208", + "Blk8_80126940_8017D20C", + "Blk8_80126940_8017D210", + "Blk8_80126940_8017D25C", + "Blk8_80126940_8017D268", + "Blk8_80126940_8017D2FC", + "Blk8_80126940_8017D308", + "Blk8_80126940_8017D344", + "Blk8_80126940_8017D348", + "Blk8_80126940_8017D388", + "Blk8_80126940_8017D3B0", + "Blk8_80126940_8017D3B8", + "Blk8_80126940_8017D3C0", + "Blk8_80126940_8017D458", + "Blk8_80126940_8017D474", + "Blk8_80126940_8017D4A0", + "Blk8_80126940_8017D4DC", + "Blk8_80126940_8017D508", + "Blk8_80126940_8017D524", + "Blk8_80126940_8017D590", + "Blk8_80126940_8017D5D0", + "Blk8_80126940_8017D5D8", + "Blk8_80126940_8017D630", + "Blk8_80126940_8017D634", + "Blk8_80126940_8017D654", + "Blk8_80126940_8017D670", + "Blk8_80126940_8017D6D0" + ], + "tier": 3, + "camps": [ + [ + "GTESVec", + "GVec8", + "SIn_8017E95C", + "SV", + "SV180090", + "SV221A8" + ], + [ + "Buf8_8017D4F0", + "PosT", + "Rec8T", + "Rot_8017E330", + "Rot_8017E550", + "Rot_8017E878" + ], + [ + "Rect" + ], + [ + "Pt_8017E1A8" + ], + [ + "Vtx_8016B6BC", + "Vtx_8017DC24", + "Vtx_8017F6A8", + "Vtx_8018012C", + "Vtx_80185C0C" + ], + [ + "S16x4" + ], + [ + "Q_8017DF28" + ] + ], + "opaque_names": [ + "Blk8L", + "Blk8S16", + "Blk8U", + "Blk8_80126940", + "Blk8_80126940_8017D044", + "Blk8_80126940_8017D04C", + "Blk8_80126940_8017D07C", + "Blk8_80126940_8017D09C", + "Blk8_80126940_8017D130", + "Blk8_80126940_8017D168" + ] + }, + { + "lhash": "8d605044e3bf", + "size": 8, + "n_names": 276, + "n_defs": 626, + "canon": 153, + "in_c": 470, + "names": [ + "Ang_8017E95C", + "Args_80182194", + "Blk8", + "Blk8017FD54", + "Blk8_801807DC", + "Blk8_8018453C", + "Blk8_8018A314", + "Blk8_801A6AD0", + "Blk8_801AD914", + "Blk8_801E0764", + "Blk8_801E076C", + "Blk_80178D40", + "COL_8001EFE0", + "D24D0_Rect", + "DVEC_80183534", + "D_801D0630_s", + "Data_t", + "Data_t_80181CE0", + "Data_t_80182704", + "Data_t_801829CC", + "Data_t_801829F0", + "Data_t_80183DE4", + "Data_t_80184294", + "Data_t_80184A40", + "Data_t_80186848", + "Data_t_8018767C", + "Data_t_80189320", + "Data_t_80189454", + "Data_t_80189AA0", + "Data_t_80189D04", + "Data_t_8018A948", + "Ent8_80188", + "Entry8_801A5D68", + "MoveT", + "Pt_8017D87C", + "Pt_80187940", + "Pt_80187940_80180D24", + "QB_80185B04", + "Q_8018562C", + "Rec8_801863EC" + ], + "tier": 3, + "camps": [ + [ + "D24D0_Rect", + "SpadRect_800184F0", + "XRECT", + "imgrect" + ], + [ + "Ang_8017E95C", + "DVEC_80183534", + "SOut_8017E95C", + "SVEC", + "SVECTOR_8017C290", + "SVECTOR_8017E6D8" + ], + [ + "Blk8_801807DC", + "Blk8_8018453C", + "COL_8001EFE0", + "MoveT", + "Pt_8017D87C", + "Pt_80187940" + ], + [ + "SV4R_801AAA6C", + "SV4_801AAB28" + ], + [ + "Blk8_8018A314", + "QB_80185B04", + "Q_8018562C" + ], + [ + "Row8_8018367C", + "Row8_8018367C_801811A4" + ] + ], + "opaque_names": [ + "Args_80182194", + "Blk8", + "Blk8017FD54", + "Blk8_801A6AD0", + "Blk8_801AD914", + "Blk8_801E0764", + "Blk8_801E076C", + "Blk_80178D40", + "D_801D0630_s", + "Data_t" + ] + }, + { + "lhash": "4cc70dd1aeae", + "size": 4, + "n_names": 143, + "n_defs": 194, + "canon": 75, + "in_c": 119, + "names": [ + "B4", + "B4_8017F154", + "B4_80181970", + "B4_80181ABC", + "B4_8018201C", + "B4_80183AF8", + "B4_80183F3C", + "B4_80184774", + "B4_80185458", + "B4_8018570C", + "B4_80185C00", + "B4_80186938", + "B4_80188094", + "B4_8018A860", + "B4_8018A8E8", + "B4_8018E1F0", + "B4_CB578", + "BYTES_800CFAD0", + "Blk4", + "Blk4_8017CE90", + "Blk4_8017CE90_8017CE90", + "Blk4_8017CE90_8017F32C", + "Blk4_8017CE90_8017F32C_80184FF0", + "Blk4_8017CE90_8017F32C_80184FF0_80187A9C", + "Blk4_8017CE90_8017F32C_80184FF0_80188134", + "Blk4_8017CE90_8017F32C_801869CC", + "Blk4_8017D5DC", + "Blk4_8017D7A0", + "Blk4_8017DF40", + "Blk4_8017DF40_801E48B8", + "Blk4_8017DF40_801E9DF8", + "Blk4_8017DF40_801EFC58", + "Blk4_8017DF40_801F1738", + "Blk4_8017E808", + "Blk4_8017EBCC", + "Blk4_8017FE90", + "Blk4_801800E0", + "Blk4_80180518", + "Blk4_801815D4", + "Blk4_80181EDC" + ], + "tier": 3, + "camps": [ + [ + "CLR_8016CBC0", + "CVEC", + "CV_80180228", + "CV_801837B0", + "CV_80187EE8", + "CVec4_8017C218" + ], + [ + "C_8017DCC0", + "RGBC" + ] + ], + "opaque_names": [ + "B4", + "B4_8017F154", + "B4_80181970", + "B4_80181ABC", + "B4_8018201C", + "B4_80183AF8", + "B4_80183F3C", + "B4_80184774", + "B4_80185458", + "B4_8018570C" + ] + }, + { + "lhash": "b85caab442ac", + "size": 32, + "n_names": 133, + "n_defs": 171, + "canon": 72, + "in_c": 99, + "names": [ + "ARG_80187714", + "B20", + "Blk20", + "Blk20_800CB68C", + "Blk20_8016DF5C", + "Blk20_8017E3F8", + "Blk20_80180B38", + "Blk20_80180B78", + "Blk20_80181260", + "Blk20_80181EE8", + "Blk20_80182D70", + "Blk20_8018454C", + "Blk20_80184694", + "Blk20_80187108", + "Blk20_80187714", + "Blk20_80188AF4", + "Blk20_8018A4C4", + "Blk20_8018AF88", + "Blk20_8018AF88_80186160", + "Blk32", + "Blk32L", + "Blk32L_80133298", + "Blk32_80017E8C", + "Blk32_8017ECD4", + "Blk32_8017F76C", + "Blk32_8017F76C_80186D9C", + "Blk32_8017F76C_80187780", + "Blk32_80180770", + "Blk32_80180908", + "Blk32_80180E8C", + "Blk32_80181708", + "Blk32_8018287C", + "Blk32_80183F10", + "Blk32_8018AA98", + "Blk32_8018AA98_80181BA8", + "Blk32_8018AA98_80181CF4", + "Blk32_8018AA98_80182254", + "Blk32_8018AA98_80183D30", + "Blk32_8018AA98_80183D30_80180450", + "Blk32_8018AA98_80183D30_801809B0" + ], + "tier": 3, + "camps": [ + [ + "RView" + ], + [ + "ARG_80187714" + ], + [ + "MTX8_80185648", + "Oct_801852BC" + ], + [] + ], + "opaque_names": [ + "B20", + "Blk20", + "Blk20_800CB68C", + "Blk20_8016DF5C", + "Blk20_8017E3F8", + "Blk20_80180B38", + "Blk20_80180B78", + "Blk20_80181260", + "Blk20_80181EE8", + "Blk20_80182D70" + ] + }, + { + "lhash": "d4b0395bb0af", + "size": 16, + "n_names": 94, + "n_defs": 163, + "canon": 23, + "in_c": 140, + "names": [ + "B16", + "B16_8017CDE4", + "B16_80183ED8", + "B16_801841C8", + "B16_80185634", + "B16_801856E4", + "B16_80185794", + "B16_8018584C", + "B16_8018A758", + "B16_8018FC38", + "B16_local", + "Blk16", + "Blk16X", + "Blk16_8017ECD4", + "Blk16_80184328", + "Blk16_8018A1D8", + "Blk16_8018A4C4", + "Blk16_8018A8B8", + "Blk16_8018B13C", + "Blk16_8018B29C", + "Blk16_801E2F08", + "Blk16_956C", + "Blk16_E898", + "Blk_800CBAD0", + "CB4A4_V4", + "DStruct", + "LBlk16", + "LV_801851A8", + "LV_801851A8_80182D18", + "LV_801851A8_80184E84", + "LV_801851A8_80185D2C", + "LVec1CDC", + "LineF2", + "M16", + "Q16", + "Quad", + "Quad_8018797C", + "Quad_8018797C_8017F26C", + "Quad_8018797C_8017FCD0", + "Quad_8018797C_80181A30" + ], + "tier": 3, + "camps": [ + [ + "Vec4_800128EC" + ], + [ + "LV_801851A8", + "LV_801851A8_80182D18", + "LV_801851A8_80184E84", + "LV_801851A8_80185D2C", + "LVec1CDC", + "V32" + ], + [ + "V32_800CB4E4" + ], + [], + [ + "LineF2" + ], + [] + ], + "opaque_names": [ + "B16", + "B16_8017CDE4", + "B16_80183ED8", + "B16_801841C8", + "B16_80185634", + "B16_801856E4", + "B16_80185794", + "B16_8018584C", + "B16_8018A758", + "B16_8018FC38" + ] + }, + { + "lhash": "b53d46e36006", + "size": 8, + "n_names": 74, + "n_defs": 146, + "canon": 22, + "in_c": 124, + "names": [ + "B8", + "B8_17F474", + "B8_801AEB04", + "B8_CB578", + "Blk8", + "Blk8L", + "Blk8_8017B238", + "Blk8_8017B238_8017B238", + "Blk8_8017B614", + "Blk8_8017CF48", + "Blk8_8017DAB8", + "Blk8_8017DAFC", + "Blk8_8017E224", + "Blk8_8017E6A4", + "Blk8_8017E72C", + "Blk8_8017EBCC", + "Blk8_80180040", + "Blk8_80180450", + "Blk8_80180970", + "Blk8_801809B0", + "Blk8_80180BFC", + "Blk8_801812AC", + "Blk8_80181324", + "Blk8_801813B0", + "Blk8_80181774", + "Blk8_80181824", + "Blk8_80181940", + "Blk8_801827C4", + "Blk8_80182844", + "Blk8_80182B08", + "Blk8_80182BDC", + "Blk8_80183084", + "Blk8_801838C8", + "Blk8_801838EC", + "Blk8_80183DEC", + "Blk8_8018495C", + "Blk8_801859DC", + "Blk8_80185E28", + "Blk8_80186594", + "Blk8_80186594_8017E72C" + ], + "tier": 3, + "camps": [ + [ + "S8Blob" + ], + [ + "PHdr_80189340" + ] + ], + "opaque_names": [ + "B8", + "B8_17F474", + "B8_801AEB04", + "B8_CB578", + "Blk8", + "Blk8L", + "Blk8_8017B238", + "Blk8_8017B238_8017B238", + "Blk8_8017B614", + "Blk8_8017CF48" + ] + }, + { + "lhash": "65c3c6fd5cf3", + "size": 4, + "n_names": 65, + "n_defs": 73, + "canon": 28, + "in_c": 45, + "names": [ + "Ang2_8012B77C", + "Ang2_8012B77C_8012B77C", + "Ang2_8012B77C_80187180", + "Ang2_8012B77C_8018BFA8", + "PTAG_85910", + "PTag", + "PTag293C", + "PTag_1412A8", + "PTag_8001BC6C", + "PTag_8001D3FC", + "PTag_80021284", + "PTag_80023570", + "PTag_80023BF0", + "PTag_800CF3E8", + "PTag_800D2650", + "PTag_800D27DC", + "PTag_800D29F8", + "PTag_80140D68", + "PTag_8017DD28", + "PTag_8017FD50", + "PTag_80180B3C", + "PTag_80181E04", + "PTag_801833F0", + "PTag_801843D8", + "PTag_801843D8_80183438", + "PTag_801843D8_80186DCC", + "PTag_801843D8_801879FC", + "PTag_8018478C", + "PTag_8018893C", + "PTag_80188C04", + "PTag_8018B028", + "PTag_8018B23C", + "PTag_8018B23C_8018234C", + "PTag_8018B23C_80182498", + "PTag_8018B23C_801829F8", + "PTag_8018B23C_801844D4", + "PTag_8018B23C_80184918", + "PTag_8018B23C_80185150", + "PTag_8018B23C_80185E34", + "PTag_8018B23C_801860E8" + ], + "tier": 3, + "camps": [ + [ + "PTAG_85910", + "PTag", + "PTag293C", + "PTag_1412A8", + "PTag_8001BC6C", + "PTag_8001D3FC" + ], + [ + "Ang2_8012B77C", + "Ang2_8012B77C_8012B77C", + "Ang2_8012B77C_80187180", + "Ang2_8012B77C_8018BFA8" + ] + ], + "opaque_names": [ + "Rot1CDC" + ] + }, + { + "lhash": "c1767d5293b8", + "size": 6, + "n_names": 63, + "n_defs": 99, + "canon": 8, + "in_c": 90, + "names": [ + "D80190448_t", + "Pt6_8017D65C", + "ResMapCol", + "S6", + "S8012D664_8012D664", + "S845EC_out", + "SV3", + "SV3L", + "SV3_8017FAA8", + "SV3_801802D0", + "SV3_80181D44", + "SV3_80181D44_8017CEF4", + "SV3_80181D44_8017CEF4_8017DC20", + "SV3_80181D44_8017CEF4_8017E108", + "SV3_80181D44_8017CEF4_8017F634", + "SV3_80181D44_8017CEF4_8017F81C", + "SV3_80181D44_8017CEF4_8017FB1C", + "SV3_80181D44_8017CEF4_801814F4", + "SV3_80181D44_801821DC", + "SV3_80181D44_8018317C", + "SV3_80181D44_80185B70", + "SV3_8018287C", + "SV3_80182938", + "SV3_8018495C", + "SV3_80184C98", + "SV3_80184D50", + "SV3_80184E00", + "SV3_80184F48", + "SV3_80187654", + "SV3_801891E8", + "SV3_846B4", + "SV3x", + "SV3x_80180ACC", + "SV3x_80183E2C", + "SV3x_80184B30", + "SV3x_80184B30_80181D58", + "SV3x_80184B30_801822A0", + "SV3x_80184B30_8018241C", + "SV3x_80184B30_801829C4", + "SV3x_80184B30_801841E8" + ], + "tier": 3, + "camps": [ + [ + "SV3_8017FAA8", + "Shake_80180FE8", + "Struct801AD7EC_Local", + "V3", + "V3_8017F4E4", + "V3_801812AC" + ], + [ + "SV_801AA210", + "Svec3", + "UVec_8017DB64" + ], + [ + "SV3L" + ] + ], + "opaque_names": [ + "D80190448_t", + "Pt6_8017D65C", + "ResMapCol", + "S6", + "S8012D664_8012D664", + "S845EC_out", + "SV3", + "SV3_801802D0", + "SV3_80181D44", + "SV3_80181D44_8017CEF4" + ] + }, + { + "lhash": "6c480babe175", + "size": 8, + "n_names": 58, + "n_defs": 79, + "canon": 27, + "in_c": 52, + "names": [ + "CdFileLoc", + "Cmd_801805C8", + "M8_8016B6BC", + "Packed8", + "Pair8_8017DDC4", + "Pair8_8017DDC4_8018034C", + "Pair8_8017DDC4_80180F08", + "Pair8_8017DDC4_80182244", + "Pair8_8017DDC4_80182244_8017DAB8", + "Pair8_8017DDC4_80182244_8017E72C", + "Pair8_8017DDC4_80182244_80180040", + "Pair8_8017DDC4_80182244_80180040_8017FEA0", + "Pair8_8017DDC4_80182244_80180040_80180400", + "Pair8_8017DDC4_80182244_80180040_80180450", + "Pair8_8017DDC4_80182244_80180040_801809B0", + "Pair8_8017DDC4_80182244_80180040_8018383C", + "Pair8_8017DDC4_80182244_80180040_80183DEC", + "Pair8_8017DDC4_80182244_80180970", + "Pair8_8017DDC4_80182244_80180BFC", + "Pair8_8017DDC4_80182244_80181824", + "Pair8_8017DDC4_80182244_80186740", + "Pair8_8017DDC4_80182244_80187DE4", + "Pair8_8017DDC4_80186D9C", + "Pair8_8017DDC4_80187780", + "Pair_801B5E30", + "Pair_801B5E30_8017E9CC", + "Pair_801B5E30_8017EADC", + "Pair_801B5E30_8017F08C", + "Pair_801B5E30_80180AE4", + "Rec8", + "Rec_80189AEC", + "S80126B38", + "S80172C50", + "S_D2394B", + "Struct", + "Struct_8017E784", + "Struct_8017EA6C", + "Struct_8017EC78", + "Struct_8017F380", + "Struct_8017F87C" + ], + "tier": 3, + "camps": [ + [], + [], + [] + ], + "opaque_names": [ + "CdFileLoc", + "Cmd_801805C8", + "M8_8016B6BC", + "Packed8", + "Pair8_8017DDC4", + "Pair8_8017DDC4_8018034C", + "Pair8_8017DDC4_80180F08", + "Pair8_8017DDC4_80182244", + "Pair8_8017DDC4_80182244_8017DAB8", + "Pair8_8017DDC4_80182244_8017E72C" + ] + }, + { + "lhash": "5f4b599a9ffa", + "size": 20, + "n_names": 55, + "n_defs": 85, + "canon": 13, + "in_c": 72, + "names": [ + "Blk20_8017D110", + "Blk8018057C", + "Blk801819B0", + "Blk80181A1C", + "Blk80182030", + "Blk801821E8", + "Blk80182634", + "Buf8017BF34", + "Buf8017BF34_8017BF14", + "Buf8017BF34_8017BF34", + "Buf8017BF34_8017CAF8", + "Buf8017BF34_80182C28", + "Buf8017BF50", + "Buf8017BF50_8017BF50", + "Buf8017BF50_8017BF70", + "Buf8017BF50_8017C234", + "Loc_80180E10", + "LocalStruct", + "LocalStruct_8018A968", + "Local_80180ABC", + "Msg_8018248C", + "Msg_8018248C_80180450", + "Msg_8018248C_801809B0", + "Msg_8018248C_80183DEC", + "Pkt_801861D8", + "Pkt_8018626C", + "Prim", + "Prim293C", + "Prim80180A38", + "Prim801A2014", + "PrimBE4", + "PrimF790", + "PrimSpec80182A6C", + "Prim_80180BDC", + "Rec", + "Rec8017F39C", + "S80143BDC", + "S80190C84", + "S80190C84L", + "S80190C84_8018483C" + ], + "tier": 3, + "camps": [ + [ + "Prim801A2014" + ], + [ + "Blk8018057C", + "Blk801819B0", + "Blk80181A1C", + "Blk80182030", + "Blk801821E8", + "Blk80182634" + ], + [ + "Msg_8018248C", + "Msg_8018248C_80180450", + "Msg_8018248C_801809B0", + "Msg_8018248C_80183DEC" + ] + ], + "opaque_names": [ + "Blk20_8017D110", + "Buf8017BF34", + "Buf8017BF34_8017BF14", + "Buf8017BF34_8017BF34", + "Buf8017BF34_8017CAF8", + "Buf8017BF34_80182C28", + "Buf8017BF50", + "Buf8017BF50_8017BF50", + "Buf8017BF50_8017BF70", + "Buf8017BF50_8017C234" + ] + }, + { + "lhash": "9568f57fb00f", + "size": 20, + "n_names": 45, + "n_defs": 61, + "canon": 20, + "in_c": 41, + "names": [ + "OtBlk", + "OtBlk_80016450", + "OtBlk_80016450_80015F04", + "OtBlk_8017D3A0", + "OtBlk_8017D3F8", + "OtBlk_80180894", + "OtBlk_801809C4", + "OtBlk_80181A60", + "OtBlk_80182890_8018FB5C", + "OtBlk_80183DA4", + "OtBlk_80184138", + "OtBlk_80185B4C", + "OtBlk_8018A974", + "OtBlk_8018A974_8018AAF4", + "OtBlk_8018A974_8018BB48", + "OtBlk_8018A974_8018EB08", + "OtBlk_8018A974_8018EB08_8018A28C", + "OtBlk_8018A974_8018EB08_8018A28C_80183ED4", + "OtBlk_8018A974_8018EB08_8018A28C_80187DF8", + "OtBlk_8018A974_8018EB08_8018A28C_801887EC", + "OtBlk_8018A974_8018EB08_8018A28C_8018A2D0", + "OtBlk_8018A974_8018EB08_8018B1D8", + "OtBlk_8018A974_8018EB08_8018BCC4", + "OtBlk_8018A974_801AADA8", + "OtBlk_8018FE0C", + "Ot_80182A78", + "Ot_80182A78_8017EE80", + "Ot_80182A78_80180894", + "Ot_80182A78_801812FC", + "Ot_80182A78_801819E0", + "Ot_8018B23C", + "Ot_8018B23C_8018234C", + "Ot_8018B23C_80182498", + "Ot_8018B23C_801829F8", + "Ot_8018B23C_801844D4", + "Ot_8018B23C_80184918", + "Ot_8018B23C_80185150", + "Ot_8018B23C_80185E34", + "Ot_8018B23C_801860E8", + "Ot_8018B23C_801863B8" + ], + "tier": 3, + "camps": [ + [], + [], + [] + ], + "opaque_names": [ + "OtBlk", + "OtBlk_80016450", + "OtBlk_80016450_80015F04", + "OtBlk_8017D3A0", + "OtBlk_8017D3F8", + "OtBlk_80180894", + "OtBlk_801809C4", + "OtBlk_80181A60", + "OtBlk_80182890_8018FB5C", + "OtBlk_80183DA4" + ] + }, + { + "lhash": "a0f7100333b8", + "size": 4, + "n_names": 38, + "n_defs": 85, + "canon": 18, + "in_c": 67, + "names": [ + "DVEC2_C59C", + "DVEC2_C59C_8017D9CC", + "DVEC2_C59C_8017DBEC", + "DVEC2_C59C_801865EC", + "DVEC2_C6F4", + "DVEC2_C974", + "DVEC2_C974_8017BA3C", + "DVEC2_C974_8017BA3C_80189F00", + "DVEC2_CF90", + "DVEC2_D538", + "DVEC2_DF98", + "DVEC80180FE4", + "DVECTOR2", + "DVECTOR2_8017CDF0", + "DV_8017EF94", + "DV_80180B3C", + "DVec35C", + "DVec_59F4", + "DVec_8016B6BC", + "DVec_80180894", + "Entry", + "Hw4", + "Pair", + "Pair_8013AD38", + "Prim4_8017E978", + "Prim4_8017E978_8017E1AC", + "Prim4_8017E978_8017E1D4", + "Prim4_8017E978_8017E30C", + "Prim4_8017E978_8017E978", + "Prim4_8017E978_801880E0", + "Prim4_8017E978_801886B8", + "Prim4_8017E978_801889B8", + "Prim4_8017E978_8018B478", + "Range_80189A70", + "Range_80189B1C", + "Rec4_801891F4", + "UV_80185214", + "XDV2" + ], + "tier": 3, + "camps": [ + [ + "DVEC2_C59C", + "DVEC2_C59C_8017D9CC", + "DVEC2_C59C_8017DBEC", + "DVEC2_C59C_801865EC", + "DVEC2_C6F4", + "DVEC2_C974" + ], + [ + "Range_80189A70", + "Range_80189B1C" + ], + [ + "DVec_8016B6BC", + "Hw4", + "Pair", + "Pair_8013AD38" + ], + [ + "Entry" + ] + ], + "opaque_names": [ + "Prim4_8017E978", + "Prim4_8017E978_8017E1AC", + "Prim4_8017E978_8017E1D4", + "Prim4_8017E978_8017E30C", + "Prim4_8017E978_8017E978", + "Prim4_8017E978_801880E0", + "Prim4_8017E978_801886B8", + "Prim4_8017E978_801889B8", + "Prim4_8017E978_8018B478", + "Rec4_801891F4" + ] + }, + { + "lhash": "245ecac205e6", + "size": 12, + "n_names": 35, + "n_defs": 50, + "canon": 9, + "in_c": 41, + "names": [ + "MainSlot", + "Rec12", + "Rec12_801888F4", + "Rec801806C8_s", + "Rec80182744_s", + "Rec801944E8", + "S12_801AD700", + "S12_801AD914", + "S801563EC", + "SV4", + "S_80182618", + "S_AF634", + "S_AF634_80175820", + "S_AF634_80175820_80175820", + "S_AF634_801758FC", + "S_AF634_801759D8", + "S_AF634_80176144", + "V32_801875E4", + "V32_801875E4_8018848C", + "V32_80187C64", + "V32_80188B0C", + "V3_800CB634", + "VEC32_801ADC40", + "VEC3L", + "VECTOR", + "VEC_8017DF28", + "Vec12_8017F370", + "Vec32_801AA004", + "Vec3_1818F8", + "Vec3_1887F8", + "Vec3_189324", + "Vec3_8017DF8C", + "Vec3_874E8", + "VecL_80184694", + "Vec_80187A04" + ], + "tier": 3, + "camps": [ + [ + "V32_801875E4", + "V32_801875E4_8018848C", + "V32_80187C64", + "V32_80188B0C", + "V3_800CB634", + "VEC32_801ADC40" + ], + [ + "SV4", + "VEC_8017DF28", + "Vec3_8017DF8C" + ], + [], + [ + "S_AF634", + "S_AF634_80175820", + "S_AF634_80175820_80175820", + "S_AF634_801758FC", + "S_AF634_801759D8", + "S_AF634_80176144" + ] + ], + "opaque_names": [ + "MainSlot", + "Rec12", + "Rec12_801888F4", + "Rec801806C8_s", + "Rec80182744_s", + "Rec801944E8", + "S12_801AD700", + "S12_801AD914", + "S801563EC", + "S_80182618" + ] + }, + { + "lhash": "142564f85464", + "size": 4, + "n_names": 31, + "n_defs": 35, + "canon": 7, + "in_c": 28, + "names": [ + "DV_EA14", + "DVec_80021D38", + "DVec_80183DA4", + "DVec_80184138", + "D_801D0660_s", + "Ent_80186AE4", + "P4", + "Pair4_801B02DC", + "Poly12Pt", + "Prim4_8017DD28", + "Prim4_801E46A0", + "Prim4_801E9BE0", + "Prim4_801EFA40", + "Prim4_801F1520", + "Pt2_80180F98", + "Pt2_80182FD4", + "Pt2_80184370", + "Pt2_801887E8", + "Pt2_8018AC0C", + "Pt2_8018BAB4", + "Pt_80015F04", + "Rec4", + "S80153CCC", + "S9E", + "U16x2", + "U16x2L", + "U16x2N", + "UV_80181574", + "UV_80184F18", + "XY221A8", + "XY_8001EFE0" + ], + "tier": 3, + "camps": [ + [ + "Poly12Pt", + "Pt_80015F04", + "XY221A8" + ], + [ + "DV_EA14", + "DVec_80021D38", + "DVec_80183DA4", + "DVec_80184138", + "Pt2_80180F98", + "Pt2_80182FD4" + ], + [], + [ + "S80153CCC" + ] + ], + "opaque_names": [ + "D_801D0660_s", + "Ent_80186AE4", + "P4", + "Pair4_801B02DC", + "Prim4_8017DD28", + "Prim4_801E46A0", + "Prim4_801E9BE0", + "Prim4_801EFA40", + "Prim4_801F1520", + "Rec4" + ] + }, + { + "lhash": "afc6a8e495a5", + "size": 8, + "n_names": 28, + "n_defs": 40, + "canon": 10, + "in_c": 30, + "names": [ + "Blk801539F8", + "Box", + "Box_80133784", + "Ent_8018A224", + "Foo_80134510", + "Foo_80134510_80134510", + "Rec8_8017DDC4", + "Rec8_8017DDC4_8018023C", + "Rec8_8017DDC4_8018034C", + "Rec8_8017DDC4_8018034C_80180450", + "Rec8_8017DDC4_8018034C_801809B0", + "Rec8_8017DDC4_8018034C_80183DEC", + "Rec8_8017DDC4_80180F08", + "Rec8_8017DDC4_801815C4", + "Rec8_8017DDC4_801815C4_80185344", + "Rec8_8017DDC4_80181DCC", + "Rec8_8017DDC4_80182244", + "Rec8_8017DDC4_80186944", + "Rec8_8017DDC4_801877EC", + "Rec8_8018A390", + "Rec8_8018A390_8018523C", + "Rec8_8018A390_80185730", + "Rec8_8018A390_80186468", + "Rec8_8018A390_8018A390", + "Rec8_8018A390_8018FE94", + "Rec_8017ECD4", + "Rec_EDC0", + "SVEC_FD64" + ], + "tier": 3, + "camps": [ + [ + "SVEC_FD64" + ], + [ + "Rec8_8017DDC4", + "Rec8_8017DDC4_8018023C", + "Rec8_8017DDC4_8018034C", + "Rec8_8017DDC4_8018034C_80180450", + "Rec8_8017DDC4_8018034C_801809B0", + "Rec8_8017DDC4_8018034C_80183DEC" + ] + ], + "opaque_names": [ + "Blk801539F8", + "Box", + "Box_80133784", + "Ent_8018A224", + "Foo_80134510", + "Foo_80134510_80134510", + "Rec_8017ECD4", + "Rec_EDC0" + ] + }, + { + "lhash": "699932e6421d", + "size": 52, + "n_names": 17, + "n_defs": 17, + "canon": 15, + "in_c": 2, + "names": [ + "Frame_80166690", + "Frame_80166690_80166690", + "Poly_8016CBC0", + "Prim", + "Prim_8017C218", + "Prim_8017C218_8017C218", + "Prim_8017C218_8017D030", + "Prim_8017C218_8017D0F8", + "Prim_8017C218_8017D2F4", + "Prim_8017C218_8017D408", + "Prim_8017C218_8017DF10", + "Prim_8017C218_8017E22C", + "Prim_8017C218_8017E3F0", + "Prim_8017C218_801801E8", + "Prim_8017C218_8018077C", + "Prim_8017C218_80182348", + "Str_8017DA50" + ], + "tier": 3, + "camps": [ + [ + "Prim" + ], + [ + "Str_8017DA50" + ], + [ + "Frame_80166690", + "Frame_80166690_80166690" + ], + [ + "Poly_8016CBC0" + ], + [ + "Prim_8017C218", + "Prim_8017C218_8017C218", + "Prim_8017C218_8017D030", + "Prim_8017C218_8017D0F8", + "Prim_8017C218_8017D2F4", + "Prim_8017C218_8017D408" + ] + ], + "opaque_names": [] + }, + { + "lhash": "ceca4ea3ade1", + "size": 6, + "n_names": 14, + "n_defs": 26, + "canon": 5, + "in_c": 21, + "names": [ + "Cam183098", + "Cam8012E138", + "Col6_801A2E20", + "Pos800D20C0", + "Pos_8017DC24", + "Pos_8017F6A8", + "Pos_8018012C", + "Pos_80185C0C", + "SV3", + "Src_8013B598", + "Src_8013B598_8013B598", + "Src_8013B6A0", + "Src_8013B6A0_8013B6A0", + "Vec4h_8017FB08" + ], + "tier": 3, + "camps": [ + [ + "Col6_801A2E20" + ], + [ + "Pos800D20C0", + "Pos_8017DC24", + "Pos_8017F6A8", + "Pos_8018012C", + "Pos_80185C0C", + "Vec4h_8017FB08" + ], + [ + "Cam183098" + ] + ], + "opaque_names": [ + "Cam8012E138", + "SV3", + "Src_8013B598", + "Src_8013B598_8013B598", + "Src_8013B6A0", + "Src_8013B6A0_8013B6A0" + ] + }, + { + "lhash": "f39ecda931df", + "size": 12, + "n_names": 11, + "n_defs": 12, + "canon": 9, + "in_c": 3, + "names": [ + "Rec", + "Rec12_EBB8", + "Rec_80166690", + "Rec_80166690_80166690", + "Rec_8016CBC0", + "UAlign12", + "UAlign12_80181F40", + "UAlign12_80182B74", + "UAlign12_80185E64", + "UAlign12_80186858", + "UAlign12_8018833C" + ], + "tier": 3, + "camps": [ + [ + "Rec12_EBB8" + ], + [ + "Rec_80166690", + "Rec_80166690_80166690", + "Rec_8016CBC0" + ] + ], + "opaque_names": [ + "Rec", + "UAlign12", + "UAlign12_80181F40", + "UAlign12_80182B74", + "UAlign12_80185E64", + "UAlign12_80186858", + "UAlign12_8018833C" + ] + }, + { + "lhash": "aa66418d079c", + "size": 16, + "n_names": 11, + "n_defs": 17, + "canon": 3, + "in_c": 13, + "names": [ + "Blk16_80126940", + "Box_80182BC8", + "Box_80184564", + "Buf", + "Ent_801E650C", + "Pair16", + "Pair16_8017B368", + "Pos16_8018743C", + "Work_8017E330", + "Work_8017E550", + "Work_8017E878" + ], + "tier": 3, + "camps": [ + [ + "Ent_801E650C" + ], + [ + "Work_8017E330", + "Work_8017E550", + "Work_8017E878" + ], + [ + "Box_80182BC8", + "Box_80184564" + ], + [ + "Pair16", + "Pair16_8017B368" + ], + [ + "Buf" + ] + ], + "opaque_names": [ + "Blk16_80126940", + "Pos16_8018743C" + ] + }, + { + "lhash": "6f0428152b9e", + "size": 64, + "n_names": 9, + "n_defs": 11, + "canon": 6, + "in_c": 5, + "names": [ + "Prim_8017F40C", + "Prim_8017F40C_8017DB28", + "Prim_8017F40C_8017DF74", + "Prim_8017F40C_8017E368", + "Prim_8017F40C_8017E6EC", + "Prim_8017F40C_8017E97C", + "Prim_80183F84", + "Prim_801A4680", + "Prim_801A4680_8017F668" + ], + "tier": 3, + "camps": [ + [ + "Prim_80183F84", + "Prim_801A4680", + "Prim_801A4680_8017F668" + ], + [ + "Prim_8017F40C", + "Prim_8017F40C_8017DB28", + "Prim_8017F40C_8017DF74", + "Prim_8017F40C_8017E368", + "Prim_8017F40C_8017E6EC", + "Prim_8017F40C_8017E97C" + ] + ], + "opaque_names": [] + }, + { + "lhash": "db33e2cfb9f1", + "size": 8, + "n_names": 9, + "n_defs": 9, + "canon": 0, + "in_c": 9, + "names": [ + "SV3_8012CC88", + "SV3_801808E8", + "V8_80187968", + "V8_80187968_801804D8", + "V8_80187968_801807AC", + "V8_80187968_80181F18", + "V8_80187968_8018321C", + "V8_80187968_80183280", + "V8_80187968_80184194" + ], + "tier": 3, + "camps": [ + [ + "V8_80187968", + "V8_80187968_801804D8", + "V8_80187968_801807AC", + "V8_80187968_80181F18", + "V8_80187968_8018321C", + "V8_80187968_80183280" + ], + [ + "SV3_8012CC88", + "SV3_801808E8" + ] + ], + "opaque_names": [] + }, + { + "lhash": "59d779d0e67a", + "size": 8, + "n_names": 7, + "n_defs": 7, + "canon": 5, + "in_c": 2, + "names": [ + "DrMode_80021284", + "DrTpage", + "Drm_801833F0", + "Drm_8018478C", + "Drm_80188C04", + "Drm_8018B028", + "Drm_8018BED0" + ], + "tier": 3, + "camps": [ + [ + "DrTpage" + ], + [ + "DrMode_80021284" + ], + [ + "Drm_801833F0", + "Drm_8018478C", + "Drm_80188C04", + "Drm_8018B028", + "Drm_8018BED0" + ] + ], + "opaque_names": [] + }, + { + "lhash": "0029a68fa4fc", + "size": 64, + "n_names": 7, + "n_defs": 7, + "canon": 6, + "in_c": 1, + "names": [ + "Poly12Obj", + "Src_80180F98", + "Src_80182FD4", + "Src_80184370", + "Src_801887E8", + "Src_8018AC0C", + "Src_8018BAB4" + ], + "tier": 3, + "camps": [ + [ + "Poly12Obj" + ], + [ + "Src_80180F98", + "Src_80182FD4", + "Src_80184370", + "Src_801887E8", + "Src_8018AC0C", + "Src_8018BAB4" + ] + ], + "opaque_names": [] + }, + { + "lhash": "ab244e47ddd7", + "size": 52, + "n_names": 6, + "n_defs": 6, + "canon": 0, + "in_c": 6, + "names": [ + "Prim_8017FA2C", + "Prim_80183FE0", + "Prim_80183FE0_80183040", + "Prim_80183FE0_801869D4", + "Prim_80183FE0_80187604", + "Q_8017DCC0" + ], + "tier": 3, + "camps": [ + [ + "Prim_8017FA2C", + "Prim_80183FE0", + "Prim_80183FE0_80183040", + "Prim_80183FE0_801869D4", + "Prim_80183FE0_80187604" + ], + [ + "Q_8017DCC0" + ] + ], + "opaque_names": [] + }, + { + "lhash": "c261a2c483d3", + "size": 40, + "n_names": 5, + "n_defs": 5, + "canon": 0, + "in_c": 5, + "names": [ + "Ft4", + "Ft4_800CBA18", + "LineG4", + "LineG4_80016C28", + "PktGT3" + ], + "tier": 3, + "camps": [ + [ + "LineG4", + "LineG4_80016C28" + ], + [ + "Ft4", + "Ft4_800CBA18" + ], + [ + "PktGT3" + ] + ], + "opaque_names": [] + }, + { + "lhash": "82c6e3650290", + "size": 8, + "n_names": 5, + "n_defs": 5, + "canon": 2, + "in_c": 3, + "names": [ + "Elem_8012ACE0", + "Elem_8012ACE0_8012ACE0", + "Gte8_8017F2FC", + "Gte8_80181574", + "Rec_80180808" + ], + "tier": 3, + "camps": [ + [ + "Gte8_80181574" + ], + [ + "Elem_8012ACE0", + "Elem_8012ACE0_8012ACE0" + ] + ], + "opaque_names": [ + "Gte8_8017F2FC", + "Rec_80180808" + ] + }, + { + "lhash": "8944ddcbe454", + "size": 36, + "n_names": 4, + "n_defs": 6, + "canon": 0, + "in_c": 6, + "names": [ + "Blk36_800296F8", + "Blob36", + "G4", + "SW20" + ], + "tier": 3, + "camps": [ + [ + "G4" + ], + [] + ], + "opaque_names": [ + "Blk36_800296F8", + "Blob36", + "SW20" + ] + }, + { + "lhash": "0fb1d3def821", + "size": 20, + "n_names": 4, + "n_defs": 4, + "canon": 0, + "in_c": 4, + "names": [ + "Face14_800CB5D0", + "Face2", + "FaceF4_800CB3C0", + "Prim" + ], + "tier": 3, + "camps": [ + [ + "Face14_800CB5D0", + "Face2", + "FaceF4_800CB3C0" + ], + [ + "Prim" + ] + ], + "opaque_names": [] + }, + { + "lhash": "b519bad67107", + "size": 20, + "n_names": 4, + "n_defs": 12, + "canon": 0, + "in_c": 12, + "names": [ + "Local_8017EE34", + "Local_80181C84", + "Local_801870E8", + "SV3L2" + ], + "tier": 3, + "camps": [ + [ + "SV3L2" + ], + [] + ], + "opaque_names": [ + "Local_8017EE34", + "Local_80181C84", + "Local_801870E8" + ] + }, + { + "lhash": "f138a69b30cd", + "size": 16, + "n_names": 3, + "n_defs": 3, + "canon": 1, + "in_c": 2, + "names": [ + "Blip_8018F694", + "LineF2_80015F04", + "LineF2_80181A60" + ], + "tier": 3, + "camps": [ + [ + "LineF2_80015F04", + "LineF2_80181A60" + ], + [ + "Blip_8018F694" + ] + ], + "opaque_names": [] + }, + { + "lhash": "355775b26f45", + "size": 20, + "n_names": 3, + "n_defs": 4, + "canon": 0, + "in_c": 4, + "names": [ + "F3P_800CB1F8", + "F3_80017168", + "LineG2_80016A7C" + ], + "tier": 3, + "camps": [ + [ + "LineG2_80016A7C" + ], + [ + "F3_80017168" + ], + [ + "F3P_800CB1F8" + ] + ], + "opaque_names": [] + }, + { + "lhash": "25f49f5ba77e", + "size": 32, + "n_names": 3, + "n_defs": 4, + "canon": 1, + "in_c": 3, + "names": [ + "Blk32_801898F4", + "Buf32", + "LineG3_80016B60" + ], + "tier": 3, + "camps": [ + [ + "LineG3_80016B60" + ], + [], + [ + "Buf32" + ] + ], + "opaque_names": [ + "Blk32_801898F4" + ] + }, + { + "lhash": "858542a6caf7", + "size": 28, + "n_names": 3, + "n_defs": 3, + "canon": 0, + "in_c": 3, + "names": [ + "FaceGT3", + "FaceT3", + "TPRIM_80025818" + ], + "tier": 3, + "camps": [ + [ + "TPRIM_80025818" + ], + [ + "FaceGT3" + ] + ], + "opaque_names": [ + "FaceT3" + ] + }, + { + "lhash": "400c14f38ee9", + "size": 32, + "n_names": 3, + "n_defs": 3, + "canon": 0, + "in_c": 3, + "names": [ + "Face20_800CBA18", + "Prim20", + "TPRIM_800275BC" + ], + "tier": 3, + "camps": [ + [ + "Face20_800CBA18", + "Prim20" + ], + [ + "TPRIM_800275BC" + ] + ], + "opaque_names": [] + }, + { + "lhash": "decfa4933e51", + "size": 8, + "n_names": 3, + "n_defs": 4, + "canon": 0, + "in_c": 4, + "names": [ + "Cmd801800B8", + "RES_8018209C", + "Rec8_801A026C" + ], + "tier": 3, + "camps": [ + [ + "RES_8018209C" + ], + [ + "Cmd801800B8" + ] + ], + "opaque_names": [ + "Rec8_801A026C" + ] + }, + { + "lhash": "ac91ae2d8aa0", + "size": 28, + "n_names": 3, + "n_defs": 72, + "canon": 1, + "in_c": 61, + "names": [ + "G3", + "S800D22E4", + "vec" + ], + "tier": 3, + "camps": [ + [], + [ + "G3" + ] + ], + "opaque_names": [ + "S800D22E4", + "vec" + ] + }, + { + "lhash": "d97bdca0dba1", + "size": 196, + "n_names": 3, + "n_defs": 3, + "canon": 3, + "in_c": 0, + "names": [ + "Blk_8016CF04", + "Blk_8016CF04_8016CF04", + "Trail" + ], + "tier": 3, + "camps": [ + [ + "Blk_8016CF04", + "Blk_8016CF04_8016CF04" + ], + [ + "Trail" + ] + ], + "opaque_names": [] + }, + { + "lhash": "241a3665d293", + "size": 40, + "n_names": 2, + "n_defs": 2, + "canon": 1, + "in_c": 1, + "names": [ + "Prim_8016B6BC", + "Src_80016B60" + ], + "tier": 3, + "camps": [ + [ + "Src_80016B60" + ], + [ + "Prim_8016B6BC" + ] + ], + "opaque_names": [] + }, + { + "lhash": "9ac749ecf0eb", + "size": 52, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "Src_80016C28", + "Src_80017778" + ], + "tier": 3, + "camps": [ + [ + "Src_80016C28" + ], + [ + "Src_80017778" + ] + ], + "opaque_names": [] + }, + { + "lhash": "14018f91f8d9", + "size": 24, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "F4_80017294", + "PktF4_800CB3C0" + ], + "tier": 3, + "camps": [ + [ + "F4_80017294" + ], + [ + "PktF4_800CB3C0" + ] + ], + "opaque_names": [] + }, + { + "lhash": "0bc2946999e5", + "size": 28, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "G3_800173DC", + "Prim1C_800CB5D0" + ], + "tier": 3, + "camps": [ + [ + "G3_800173DC" + ], + [ + "Prim1C_800CB5D0" + ] + ], + "opaque_names": [] + }, + { + "lhash": "923553d9bdbc", + "size": 12, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "Cell_EA14", + "RecDA34" + ], + "tier": 3, + "camps": [ + [ + "RecDA34" + ], + [ + "Cell_EA14" + ] + ], + "opaque_names": [] + }, + { + "lhash": "16c2a0529d6c", + "size": 8, + "n_names": 2, + "n_defs": 2, + "canon": 0, + "in_c": 2, + "names": [ + "MH", + "TblEntry_80189854" + ], + "tier": 3, + "camps": [ + [ + "MH" + ], + [ + "TblEntry_80189854" + ] + ], + "opaque_names": [] + }, + { + "lhash": "dc04bfb9dfa0", + "size": 196, + "n_names": 2, + "n_defs": 3, + "canon": 1, + "in_c": 2, + "names": [ + "Blk_8016CBC0", + "Trail" + ], + "tier": 3, + "camps": [ + [ + "Trail" + ], + [ + "Blk_8016CBC0" + ] + ], + "opaque_names": [] + }, + { + "lhash": "978935850105", + "size": 12, + "n_names": 2, + "n_defs": 4, + "canon": 2, + "in_c": 2, + "names": [ + "Bar", + "T3Reloc" + ], + "tier": 3, + "camps": [ + [ + "Bar" + ], + [ + "T3Reloc" + ] + ], + "opaque_names": [] + }, + { + "lhash": "612981d95d84", + "size": 12, + "n_names": 2, + "n_defs": 8, + "canon": 0, + "in_c": 8, + "names": [ + "Out_8017E910", + "Out_8017E910_8017E508" + ], + "tier": 3, + "camps": [ + [ + "Out_8017E910", + "Out_8017E910_8017E508" + ], + [], + [] + ], + "opaque_names": [] + } + ], + "variants": [ + [ + "Prim", + 5 + ], + [ + "Rec", + 4 + ], + [ + "St", + 4 + ], + [ + "S", + 4 + ], + [ + "V8", + 4 + ], + [ + "Blk8", + 3 + ], + [ + "Vec8", + 3 + ], + [ + "Obj", + 3 + ], + [ + "Ent", + 3 + ], + [ + "Blk16", + 2 + ], + [ + "CdReq", + 2 + ], + [ + "Blk4", + 2 + ], + [ + "Rec12", + 2 + ], + [ + "W8_", + 2 + ], + [ + "P_TAG", + 2 + ], + [ + "Gs_80078E78", + 2 + ], + [ + "S16", + 2 + ], + [ + "W8", + 2 + ], + [ + "Struct80078E78", + 2 + ], + [ + "MTX", + 2 + ], + [ + "Work", + 2 + ], + [ + "SVEC", + 2 + ], + [ + "Trail", + 2 + ], + [ + "SV4", + 2 + ], + [ + "V4", + 2 + ], + [ + "B16", + 2 + ], + [ + "Stk", + 2 + ], + [ + "M8", + 2 + ], + [ + "Blk8L", + 2 + ], + [ + "W4", + 2 + ], + [ + "SVec", + 2 + ], + [ + "SV3_8012CC88", + 2 + ], + [ + "Ent_801DFBF8", + 2 + ], + [ + "B", + 2 + ], + [ + "SV3", + 2 + ], + [ + "Quad", + 2 + ], + [ + "Vec", + 2 + ], + [ + "S8", + 2 + ], + [ + "Entry", + 2 + ] + ], + "dead": [ + "A", + "Ang2_8012B77C", + "B", + "B4_8018A860", + "Bidx_8018B23C_8018B23C", + "Blk12_801854C4_801854C4", + "Blk32L", + "Blk32_8018AA98_8018AA98", + "Blob8", + "Buf_c2", + "CLR_8016CBC0", + "CV_801837B0", + "CVec4_8017C218", + "CVec4_8017C218_8017C218", + "CVec4_8017C218_8017D030", + "CVec4_8017C218_8017D0F8", + "CVec4_8017C218_8017D2F4", + "CVec4_8017C218_8017D408", + "CVec4_8017C218_8017DF10", + "CVec4_8017C218_8017E22C", + "CVec4_8017C218_8017E3F0", + "CVec4_8017C218_801801E8", + "CVec4_8017C218_8018077C", + "CVec4_8017C218_80182348", + "Clr_8017C910", + "Clr_8017C910_8017C910", + "Clr_8017C910_8017D728", + "Clr_8017C910_8017D7F0", + "Clr_8017C910_8017D9EC", + "Clr_8017C910_8017DB00", + "Clr_8017C910_8017E608", + "Clr_8017C910_8017E924", + "Clr_8017C910_8017EAE8", + "Clr_8017C910_801808E0", + "Clr_8017C910_80180E74", + "Clr_8017C910_80182A40", + "Ctl_8018A550_8018A550", + "DrawEnv", + "Elem_8012ACE0", + "Elem_8012ACE0_8012ACE0", + "Ent80183F28_80183F28", + "Ent_80183CF0_80183CF0", + "Ent_80183D50_80183D50", + "Ent_80184264_80184264", + "Env_8017EFA8_8017EFA8", + "Gs_80078E78_80183D50", + "LineF2_8018F694", + "Mat32_8018A390_8018A390", + "Mat32_8018B23C_8018B23C", + "Mat_80167540", + "Mtx8_8017C910_8017C910", + "Mtx8_8017C910_8017D728", + "Mtx8_8017D0BC", + "Obj20_80178D40", + "Obj_8018A550_8018A550", + "Ot_8018B23C_8018B23C", + "P", + "PTag_801833F0", + "PTag_8018478C", + "PTag_80188C04", + "PTag_8018B028", + "PTag_8018B23C_8018B23C", + "PTag_8018BED0", + "P_8018AFD0", + "Panel_8017E978_8017E978", + "Prim4_8017E978_8017E978", + "Prim_8017C910_8017C910", + "Prim_8017C910_8017D728", + "Prim_8017DAC4_8017DAC4", + "Prim_8017DF84", + "Prim_8017FA5C", + "Pt2_80180F98", + "Pt2_80182FD4", + "Pt2_80184370", + "Pt2_801887E8", + "Pt2_8018AC0C", + "Pt2_8018BAB4", + "Rec027", + "Rec027_8017BFEC", + "Rec027_8017C2B0", + "Rec027_8017C3C4", + "Rec027_8017C688", + "Rec027_8017CBB0", + "Rec027_8017CECC", + "Rec027_8017D1E8", + "Rec027_8017D3AC", + "Rec027_8017DA90", + "Rec027_80181304", + "Rec8_8018A390_8018A390", + "Rec_8018A550_8018A550", + "Rec_8018A6A4_8018A6A4", + "Rec_8018B23C_8018B23C", + "S", + "S126B58_inner", + "SVEC_80167AE0", + "SVEC_8016A290", + "SVEC_8016CBC0", + "SV_8017DAC4", + "SV_8017DAC4_8017DAC4", + "SV_8017DAC4_8017E2C0", + "SV_8017DAC4_8017F9D0", + "SV_8017DAC4_8018043C", + "SV_8017DAC4_801809F0", + "SV_8017DAC4_80180B98", + "SV_8017DAC4_80181C5C", + "SV_8017DAC4_80183644", + "SV_8017DAC4_80183CF0", + "SVec_801670E4", + "SVec_8017C910", + "SVec_8017C910_8017C910", + "SVec_8017C910_8017D728", + "SVec_8017C910_8017D7F0", + "SVec_8017C910_8017D9EC", + "SVec_8017C910_8017DB00", + "SVec_8017C910_8017E608", + "SVec_8017C910_8017E924", + "SVec_8017C910_8017EAE8", + "SVec_8017C910_801808E0", + "SVec_8017C910_80180E74", + "SVec_8017C910_80182A40", + "SVec_8017DF84", + "SVec_8017FA5C", + "S_AE7BC_80175820", + "S_AF634_80175820", + "S_AF634_80176144", + "Src_80167540", + "Sub20_1CDC", + "Sub2_80167540", + "Sub64_1CDC", + "SubA_8016A73C", + "SubB_8016A73C", + "Sub_80155800_80155800", + "TrailEntry", + "Unk8018F8C4_80184538", + "V4U", + "V4_8018ADA8", + "Vec3h", + "Vec4s_80184C28", + "Vtx_8016B6BC", + "W", + "actor4c" + ], + "shadow": [ + "B", + "B16", + "B16_80185634", + "Bar", + "Blk152", + "Blk16", + "Blk20", + "Blk32", + "Blk32_8018AA98_80183D30", + "Blk8", + "Blk8_80126940_8017D20C", + "Blk8_80126940_8017D6D0", + "Blk8_80126940_8017E01C", + "Blk8_80126940_8017FC98", + "CdFileLoc", + "E4", + "E_13BD74", + "E_13C08C", + "E_3B7AC", + "Ent", + "Ent_8013B6A0", + "Ent_8013B83C", + "Ent_8016AB6C", + "Ent_801F7618", + "Env_800D29F8", + "Foo", + "Gs_80078E78", + "M8", + "MATRIX", + "MATRIX_80188114", + "MTX", + "Mtx", + "Mtx8_8017DE10_8017E710", + "Obj", + "Obj_8016AB6C", + "Ot_8018B23C", + "P_13BD74", + "P_TAG", + "Prim", + "Quad", + "RView", + "Rec12", + "S", + "S10_80136C90", + "S16", + "S80126B38", + "S80143BDC", + "S80190C84", + "SV3", + "SV3_8012CC88", + "SV4", + "SV4_8017B368", + "SVEC", + "SVECTOR", + "SVECTOR_8017F40C", + "SVec", + "SVec_8016AB6C", + "S_8013BC7C", + "Spr_8013B598", + "Src_8013B598", + "Src_8013B6A0", + "T3Reloc", + "Trail", + "V8", + "Vec3s", + "Vec8", + "W", + "W4", + "XDV2", + "XFT3", + "XFT4", + "XPart", + "XPrim", + "XSV2", + "sprite8" + ], + "refused": [] +} \ No newline at end of file diff --git a/.run/P37/census/type_census.txt b/.run/P37/census/type_census.txt new file mode 100644 index 000000000..bed46c763 --- /dev/null +++ b/.run/P37/census/type_census.txt @@ -0,0 +1,33 @@ +type_census — 2026-09-12T05:44:31Z at 23fc5d215 (src stamp ab7aba1c21c89889, tool da30900472); 7305 files (4121 TUs + 3181 headers), 99130 function definitions; walk 59.9 s, total 198.8 s + +DEFINITIONS 7261 struct/union bodies (+0 enums): canonical header 1179 · .c file-scope 4091 · .c block-scope 1904 · per-function shared headers 63 · other headers 24 · include/ 0 + 3109 distinct names · 525 distinct layouts (2 unresolved) · 206 duplicate classes covering 2789 names (tier 1 122 same-named, tier 2 84 opaque; 46 layout-twin classes / 1844 names kept apart) · 588 exact-text classes / 4469 copies · 39 VARIANT names (>1 layout) · 141 dead canonical names · 75 canonical names redefined in .c · 1781 scalar/alias typedefs · 157 forward decls +CAST SITES deref 503016 = P 409007 + I 60666 + X 13800 + M 19543 (+ A address-of 18912; + C typed cast-member 36681) in 69497 bodies · coverage OK (raw {'P': 409007, 'I': 60666, 'X': 13800, 'A': 18912, 'C': 36681, 'M': 19543}) · refused 0 · absolute 0 · readability regex over raw text 411850 + by base: param 276860 · local 149915 · gaddr 40122 · nested 24076 · global 8860 · other 1678 · addr-of 1349 · ident 156 + by width: s4 145167 · u2 142775 · s2 131818 · u1 43174 · agg 13472 · p4 12016 · u4 11165 · s1 3429 + top bases: a0(param) 92255 · param_1(param) 81595 · arg0(param) 67704 · p(local) 18043 · p(param) 11784 · s0(local) 10368 · cach(local) 8246 · s1(local) 7137 · buf(local) 7067 · flag(local) 5453 · *(s32 *)(a0 + 0x20)(nested) 5215 · iVar2(local) 5160 · dst(local) 4874 · iVar1(local) 4836 · iVar3(local) 4693 · e(local) 3918 +DECLARATIONS 99130 function definitions (1889 K&R) · 4279365 extern function declarations over 12139 names (3870 spelled >1 way) · 6415 names with >1 body text · 1078837 data externs over 55569 symbols (18442 typed >1 way) · asm-label aliases 5749 (225 names) · builtins {'memcpy': 301, 'abs': 144} · attributes {'packed': 64, 'aligned': 12} + lying declarations 98648 over 1609 callees {'K&R-empty': 91357, 'narrow': 7291} +STRUCT MAP 18760 types explain 498896/503016 deref sites (99.2 %); unassigned 4120; 4054 types span ≥2 bodies (441056 sites), 14706 single-body; types with conflicts 729, suspect 11 + merges by evidence {'param': 36550, 'assign': 14717, 'ret-of': 3410, 'arg': 10176, 'return': 1523, 'assign&': 1051, 'arg&': 270, 'field': 9623}; vetoed {'arg-conduit': 115291, 'ret-of-multisource': 6651, 'assign-multisource': 34545, 'arg&-conduit': 14516, 'field-multisource': 7008, 'ret-of': 683, 'assign&-multisource': 12499, 'arg&-no-overlap': 3455, 'assign': 347, 'arg-no-overlap': 43018, 'assign&': 69, 'arg': 182, 'return': 12, 'field': 3220} + Unkstruct_800B5CB8 sites 107598 bodies 11186 fields 134 size≥0x10c width-conflicts 50 sign-mixed 55 merges {'param': 9464, 'assign': 7396, 'arg': 6960, 'field': 2617} at D_800B5CB8,D_800D3888,D_80181448 ptr D_8006386C,D_80074778,D_80074780 + Unkstruct_80126B58 sites 65397 bodies 17047 fields 175 size≥0x24c width-conflicts 50 sign-mixed 60 merges {'param': 2100, 'arg': 1086, 'assign&': 106, 'field': 51} at D_80126B58 ptr D_80126B58 + Unkstruct_8018E71C sites 6745 bodies 396 fields 7 size≥0x10 width-conflicts 0 sign-mixed 0 merges {'param': 18, 'arg': 15, 'assign&': 2} at D_8018E71C + Unkstruct_dac960ce sites 4464 bodies 124 fields 13 size≥0x24c width-conflicts 0 sign-mixed 2 merges {'param': 2} + Unkstruct_0caecd54 sites 4340 bodies 124 fields 23 size≥0xfe width-conflicts 0 sign-mixed 1 merges {'param': 2, 'assign': 1, 'return': 1} + Unkstruct_f8ed2b9f sites 4061 bodies 4061 fields 1 size≥0x217 width-conflicts 0 sign-mixed 0 merges {'param': 2} + Unkstruct_a32b99a1 sites 3936 bodies 123 fields 8 size≥0x4b width-conflicts 0 sign-mixed 1 merges {} + Unkstruct_8e3dbe51 sites 3930 bodies 131 fields 5 size≥0x4c width-conflicts 0 sign-mixed 1 merges {} + Unkstruct_8014A1B0 sites 3778 bodies 542 fields 13 size≥0xfe width-conflicts 0 sign-mixed 1 merges {'field': 13, 'arg': 10, 'param': 10, 'return': 1} + Unkstruct_80128EA8 sites 3311 bodies 632 fields 18 size≥0x38 width-conflicts 0 sign-mixed 13 merges {'arg': 23, 'ret-of': 19, 'field': 7, 'param': 2} + Unkstruct_ade2e8a0 sites 3271 bodies 196 fields 26 size≥0xa4 width-conflicts 3 sign-mixed 9 merges {'param': 268, 'arg': 133} + Unkstruct_1fa9e810 sites 3144 bodies 131 fields 3 size≥0x49 width-conflicts 0 sign-mixed 0 merges {} +GLOBAL BLOCKS 2123 runs of ≥4 adjacent scalar D_ symbols (14251 symbols): 0x800cf10c+0x34 ×29 (D_800CF10C..D_800CF13C) · 0x800a6580+0x3a ×27 (D_800A6580..D_800A65B8) · 0x801998a4+0x57 ×24 (D_801998A4..D_801998FA) · 0x80199840+0x56 ×23 (D_80199840..D_80199895) · 0x801a9608+0x50 ×22 (D_801A9608..D_801A9654) · 0x801ab708+0x54 ×21 (D_801AB708..D_801AB758) · 0x801b0df0+0x4b ×21 (D_801B0DF0..D_801B0E3A) · 0x801b83a0+0x4e ×21 (D_801B83A0..D_801B83ED) +PARKED (P36) 24 classes / 453 bodies / 691 needed sites → .run/P37/census/parked.tsv; needs {'signature': 13, 'struct': 7, '?': 4}; 22 PARK names are minimum-lever banks +CONTROLS 4/4: player_block_widths OK (D_80078E8C:4/4 D_80078EB2:2/2 D_80078EB4:2/2 D_80078EB6:2/2 D_80078EB8:2/2 [doc-disputed D_80078F08: code 4 vs actor-struct.md 2] [doc-disputed D_80078F0C: code 4 vs actor-struct.md 2]) · matrix_layouts OK (MATRIX=32 MATRIX_L48=48) · prim_layout_class OK (defs in 1192 files, 2 spellings, 1192/1192 in one layout (64 B)) · tu_conflict_D_800A651C OK (s32:1202 | OtBlk[]:9 | OtBlk_80016450[]:8 | u8[]:8 | s32[][5]:6) + +duplicate-layout classes (top 12): 8B×293 names (488 defs): GTESVec, GVec8, SIn_8017E95C, SV… | 8B×202 names (0 defs): Blk8L, Blk8S16, Blk8U, Blk8_80126940… | 32B×170 names (278 defs): M32_8017F154, M32_80188094, MATRIX, MATRIX2… | 8B×152 names (341 defs): Blk8_801807DC, Blk8_8018453C, COL_8001EFE0, MoveT… | 32B×129 names (0 defs): B20, Blk20, Blk20_800CB68C, Blk20_8016DF5C… | 4B×102 names (0 defs): B4, B4_8017F154, B4_80181970, B4_80181ABC… | 64B×91 names (1428 defs): Prim_8016E7C8, Prim_8016E7C8_8016B6BC, Prim_8016E7C8_8016B9F8, Prim_8016E7C8_8016C2C4… | 8B×72 names (0 defs): B8, B8_17F474, B8_801AEB04, B8_CB578… | 8B×63 names (211 defs): Ang_8017E95C, DVEC_80183534, SOut_8017E95C, SVEC… | 4B×60 names (68 defs): PTAG_85910, PTag, PTag293C, PTag_1412A8… | 8B×58 names (0 defs): CdFileLoc, Cmd_801805C8, M8_8016B6BC, Packed8… | 16B×54 names (0 defs): B16, B16_8017CDE4, B16_80183ED8, B16_801841C8… +VARIANT names (top 12): Prim×5, Rec×4, St×4, S×4, V8×4, Blk8×3, Vec8×3, Obj×3, Ent×3, Blk16×2, CdReq×2, Blk4×2 + +type_census: 7261 definitions (525 layouts, 206 duplicate classes, 39 variant camps) · 503016 cast sites in 69497 bodies over 8 base classes (4 forms + A, coverage OK) · 98648 lying declarations / 1609 callees · controls 4/4 +struct_map: 18760 types over 18760 clusters explain 498896/503016 sites (99.2 %); 4120 unassigned sites; 729 types with conflicts diff --git a/README.md b/README.md index e6ac3a7f2..0d7aee380 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,8 @@ One source per unique function (Phase 35): 103,015 function bodies written once Levers off (Phase 36, snapshot 2026-09-11): 2,141 register pins and 1,869 asm statements remain in 1,980 functions (674 distinct bodies), 4,010 of them marked `// !FAKE:`; 1,589 volatile qualifiers and 50 bare `register` keywords are censused; 6,447 GTE coprocessor operations and 22 whole-body assembly routines kept inside C shells (2,682 sites; the original's scratchpad stack-switch trampolines, one copy per overlay, listed in the verbatim manifest) are not levers and are excluded. +Types (Phase 37, snapshot 2026-09-12): 503,016 raw pointer-cast dereferences remain in 69,497 functions (four forms; 36,681 typed cast-member accesses and 18,912 address-of casts counted apart); 7,261 struct definitions (1,179 in the canonical header, 5,995 inside `.c` files) over 525 distinct layouts, 206 duplicate classes covering 2,789 names; 98,648 call declarations narrower than their callee's definition over 1,609 callees; the struct map clusters the cast sites into 18,760 types by evidence (99.2 % of sites assigned). + _Generated by `tools/progress.py --readme` from `docs/progress.json` — numbers are never typed by hand._ diff --git a/config/tool_dictionary.tsv b/config/tool_dictionary.tsv index 833c57d9e..66c006405 100644 --- a/config/tool_dictionary.tsv +++ b/config/tool_dictionary.tsv @@ -318,6 +318,7 @@ tools/treelock.sh P8 ADAPT hold one mutex over tree-writing campaigns, with stat tools/triage_ladder.py P8 ADAPT decide before and after drafting whether a target needs an agent at all Zero-token pass deciding whether a target needs an agent at all, before and after drafting repo scratch paths LIVE tools/twin_rescan.py P6 ADAPT report which open stubs became mechanical remaps the moment one was banked After a bank, reports which open stubs just became mechanical remaps instead of drafts repo signature files STILL-NEEDED report which open stubs became mechanical remaps the moment one was banked tools/twin_sweep.py P6 ADAPT bank every open stub that already has a banked structural twin Banks every open stub that has an already-banked structural twin, for near-zero tokens repo signature files LIVE +tools/type_census.py P10 ADAPT census every struct definition, raw pointer-cast dereference and function declaration in the C, and cluster the cast sites into the types the tree needs (the struct map) The Phase-37 type census: struct/union/typedef definitions fleet-wide with o32 layouts (duplicate classes by layout+member evidence, VARIANT camps, dead and shadowed canonical names), every cast site in six forms (P *(T*)(…), I *(T*)ident, X ((T*)e)[i], M M2C_FIELD, A address-of, C typed cast-member) with base class/offset/width/sign/access and a per-form coverage assertion against an independent raw regex, the declaration layer (definitions K&R-read, extern spellings per name, multi-body names, asm-label aliases, builtins, attributes, argcheck's lying set), global blocks (runs of adjacent scalar D_ symbols), four known-true controls, and the struct map — union-find over evidence edges only (same global, argument flow into a parameter the callee dereferences with shared offsets, single-source assignment/return flow, pointer-field flow, body-hash identity) with a width-conflict veto; writes type_census.json/txt, struct_map(.top).json, sites.jsonl (--sites), parked.tsv (the P36 parked classes with reasons) and docs/struct-map.md; --check is the T8 gate; --selftest repo paths, the shared-body scanner, argcheck, the P36 ledger (parked.tsv) LIVE tools/uniquify_type.py P10 ADAPT give each conflicting camp of a same-named type its own name Gives each conflicting camp of a same-named type its own name so every camp becomes liftable repo src layout STILL-NEEDED give each conflicting camp of a same-named type its own name so both become liftable tools/validate_targets.py P8 ADAPT gate every target list for validity before agents are spawned The validity gate every target list must pass before agents are spawned repo scratch paths LIVE tools/verbatim_check.py P10 ADAPT guard that every inline-assembly body still reproduces its target bytes Regression guard that every inline-assembly body still reproduces its target bytes repo src layout LIVE diff --git a/decomp-architect/corpus/tools/INDEX.md b/decomp-architect/corpus/tools/INDEX.md index 75c32167c..f7a26c276 100644 --- a/decomp-architect/corpus/tools/INDEX.md +++ b/decomp-architect/corpus/tools/INDEX.md @@ -8,8 +8,8 @@ > its platform SDK need the marked adaptation. The last table lists the tools that are project-only in code (their *shape* is a task; > their code does not transfer). *TODO(platform): the MIPS and PlayStation SDK hard-codes are the ones another platform replaces first.* > -> **Coverage:** 309 tool files in scope (submodules, vendored and downloaded code excluded), of which 309 live rows -> below; per phase: P1 2 · P2 26 · P3 17 · P4 9 · P5 26 · P6 51 · P7 20 · P8 86 · P9 27 · P10 29 · PROJECT-ONLY 16. Superseded tools appear only as pointers to their successor (30 pointer rows); one-offs are omitted. Table rows in all: 339 (the installer checks its copy against this figure). +> **Coverage:** 310 tool files in scope (submodules, vendored and downloaded code excluded), of which 310 live rows +> below; per phase: P1 2 · P2 26 · P3 17 · P4 9 · P5 26 · P6 51 · P7 20 · P8 86 · P9 27 · P10 30 · PROJECT-ONLY 16. Superseded tools appear only as pointers to their successor (30 pointer rows); one-offs are omitted. Table rows in all: 340 (the installer checks its copy against this figure). ## P1 — extraction + manifest @@ -328,6 +328,7 @@ | `ghidra_scripts/ApplySymbols.java` | apply curated names and signatures inside the analysis tool and save | The in-tool half of that mirror: apply curated names and signatures, save on exit | none | | `delever_pack.py` | build the pack one agent needs to read and crack one residue exemplar, without touching the tree | The Phase-36 T7 pack builder (one agent at a time): per residue exemplar of ≥N copies a directory under .run/P36/agents/ with the TU path, the body as the tree has it, the lever-free body (the seed), the residual as mnemonic blocks from delever_search --try (a scratch compile, no tree write), the ledger's NEEDED sites, and every engine attempt with its best moves; ORDER.tsv ranks the exemplars by the best distance reached, then copies. PROMPT.md beside them is the agent's brief. | repo scratch paths; the engine's outcomes and traces | | `lever_census.py` | census every compiler-forcing construct in the C and gate the levers-off phase | The Phase-36 census of lever sites (register pins, asm statements by kind, volatile levers, bare register, asm-label aliases, builtins, attributes; the whole-body hand-asm routines and the GTE ops set apart) derived from the shared-body scanner with a per-token coverage assertion against the raw text, four known-true controls, the !FAKE marker split, --check (0 unmarked pins/asm, 0 orphan markers) and --strict (0 pins, 0 asm) gates, --sites for the delever ledger, a fixture self-test | repo paths, the shared-body scanner | +| `type_census.py` | census every struct definition, raw pointer-cast dereference and function declaration in the C, and cluster the cast sites into the types the tree needs (the struct map) | The Phase-37 type census: struct/union/typedef definitions fleet-wide with o32 layouts (duplicate classes by layout+member evidence, VARIANT camps, dead and shadowed canonical names), every cast site in six forms (P *(T*)(…), I *(T*)ident, X ((T*)e)[i], M M2C_FIELD, A address-of, C typed cast-member) with base class/offset/width/sign/access and a per-form coverage assertion against an independent raw regex, the declaration layer (definitions K&R-read, extern spellings per name, multi-body names, asm-label aliases, builtins, attributes, argcheck's lying set), global blocks (runs of adjacent scalar D_ symbols), four known-true controls, and the struct map — union-find over evidence edges only (same global, argument flow into a parameter the callee dereferences with shared offsets, single-source assignment/return flow, pointer-field flow, body-hash identity) with a width-conflict veto; writes type_census.json/txt, struct_map(.top).json, sites.jsonl (--sites), parked.tsv (the P36 parked classes with reasons) and docs/struct-map.md; --check is the T8 gate; --selftest | repo paths, the shared-body scanner, argcheck, the P36 ledger (parked.tsv) | | `gte_consolidate.py` | consolidate the GTE coprocessor inline-asm macros under Sony's names in one header and sweep dead lever macros | The Phase-36 T5 tool: every asm-bearing macro definition and direct GTE statement SIGNED by the build's own maspsx→as tail (template bytes with operands bound to fixed registers, operand counts, clobbers); one canonical text per signature named by PsyQ's inline_c.h convention (Sony's file supplies names and clobber lists, never opcode words) written to include/gte_inline.h; per file the canonical duplicates deleted, private names renamed, a variant with extra clobbers tried as canonical and kept as a marked _m lever only when the object differs, direct statements rewritten into canonical calls (a concatenation of two included); every file judged through every recipe; --sweep deletes dead asm-bearing macros and drops a compound macro's inner asm when byte-neutral | Sony's inline_c.h path, the census sites, the oracle | | `macro_to_header.py` | convert a shared-body macro header into per-function plain-C headers included at each site | The Phase-35 converter: every DEFINE_ macro body becomes a plain-C header under src/shared// included at its site, the legacy name-parameterized headers converted, the registry text-edited, the macro header deleted; --plan / --apply / --finalize / --verify | the macro form is this project's; a kit-born project shares headers from its first bank | | `asm_verbatim.py` | emit a function's target assembly as an inline-assembly body | Emits the file-scope inline-assembly body form from a disassembly file | repo asm layout | diff --git a/decomp-architect/corpus/tools/P10/lever_census.py b/decomp-architect/corpus/tools/P10/lever_census.py index 749f0ee1f..3ea3e9a5a 100644 --- a/decomp-architect/corpus/tools/P10/lever_census.py +++ b/decomp-architect/corpus/tools/P10/lever_census.py @@ -978,10 +978,13 @@ def run_census(jobs, use_cache=True, out_dir=OUT_DIR_DEFAULT, want_sites=False, # the known-true bodies as they were at T1 (commit 357f8a1ed): a control holds only while the body's normalized text is the one the # count was made on — the campaign removes pins byte-identically, and a control that kept expecting them would fail on its own # staleness (batch tus7 of T4 removed func_80184034's three bare-name pins; the census then refused a correct tree) +# re-keyed at P37 T1 (S106, 2026-09-12; R85): the P36 campaign changed all three bodies — counted again independently with the +# gate-1 grep (`register [^;/]*__asm__\("\$?[a-z0-9]+"\)` over the masked body): 45 → 14, 26 → 8, and the bare-name control moved to +# func_801896EC (2 bare-name pins; func_80184034's are gone). A control returns N-A the day its body changes again. CONTROL_NHASH = { - ("src/800.c", "func_800226C0"): "47f1042f0dda6f163009793a11ef16f405c29af1", - ("src/shared/ov/func_80178004.h", None): "90d67fb489780cf0ef81f1a7b4b4f74dfe3c782b", - ("src/ov_SC03_006/ov_SC03_006_jr_8017AE2C.c", "func_80184034"): "2dce73f8716c32324b1b3517f11bd03a4e9966af", + ("src/800.c", "func_800226C0"): "902372b4e3bf845f39f0b4d4bab7f2ab8ce47121", + ("src/shared/ov/func_80178004.h", None): "27524a8bf23911718b4082cd5cca7d971d8c9090", + ("src/ov_SC03_006/ov_SC03_006_jr_8017AE2C.c", "func_801896EC"): "140f5b7e434d93ebaaea89dbe65c1a702d233020", } @@ -998,11 +1001,11 @@ def controls(sites, defs): return "OK" if got == want else "MISMATCH" out = [] n = sum(1 for s in sites if s["tu"] == "src/800.c" and s["fn"] == "func_800226C0" and s["cls"] == "A") - out.append(("src/800.c func_800226C0 pins", n, 45, status(("src/800.c", "func_800226C0"), n, 45))) + out.append(("src/800.c func_800226C0 pins", n, 14, status(("src/800.c", "func_800226C0"), n, 14))) n = sum(1 for s in sites if s["tu"] == "src/shared/ov/func_80178004.h" and s["cls"] == "A") - out.append(("src/shared/ov/func_80178004.h pins", n, 26, status(("src/shared/ov/func_80178004.h", None), n, 26))) - n = sum(1 for s in sites if s["tu"] == "src/ov_SC03_006/ov_SC03_006_jr_8017AE2C.c" and s["fn"] == "func_80184034" and s["cls"] == "A") - out.append(("ov_SC03_006 func_80184034 bare-name pins", n, 3, status(("src/ov_SC03_006/ov_SC03_006_jr_8017AE2C.c", "func_80184034"), n, 3))) + out.append(("src/shared/ov/func_80178004.h pins", n, 8, status(("src/shared/ov/func_80178004.h", None), n, 8))) + n = sum(1 for s in sites if s["tu"] == "src/ov_SC03_006/ov_SC03_006_jr_8017AE2C.c" and s["fn"] == "func_801896EC" and s["cls"] == "A") + out.append(("ov_SC03_006 func_801896EC bare-name pins", n, 2, status(("src/ov_SC03_006/ov_SC03_006_jr_8017AE2C.c", "func_801896EC"), n, 2))) n = sum(1 for s in sites if s["tu"] == "src/shared/engine_prelude.h" and s["cls"] == "B") out.append(("engine_prelude.h asm sites (a macro definition only)", n, 0, "OK" if n == 0 else "MISMATCH")) return out @@ -1185,13 +1188,18 @@ def main(): ab = [x for x in sites if x["cls"] in "AB" and x["kind"] not in NON_LEVER_KINDS and x["tu"] != a.gte_header] un = [x for x in ab if not x["marked"]] if a.strict: + # P37 (S106): --strict reads its own words — "0 asm statements outside the GTE header" — so a DIRECT GTE statement in a body + # (kind gte / gte-unsigned: Sony's idiom spelled inline instead of as the header's macro call) is a violation here, while the + # --check headline keeps the P36 definition (the series' continuity). verbatim-body stays excluded by the manifest. + direct_gte = [x for x in sites if x["cls"] == "B" and x["kind"] in ("gte", "gte-unsigned") and x["tu"] != a.gte_header] pt = s.get("per_tu_asm_macro_definitions", {}).get("total", 0) gl = s.get("gte_levers", {}).get("sites", 0) print(f"lever_census --check --strict: pins {s['pins']['sites']}, asm {sum(1 for x in ab if x['cls'] == 'B' and x['kind'] != GTE_LEVER_KIND)}, " - f"gte-levers {gl}, per-TU asm macro definitions {pt}, volatile-needed {s['classes']['C']['sites']}, register-needed {s['classes']['D']['sites']} — " - f"{'OK' if not ab and not pt else 'FAIL'}") - if ab or pt: - for x in ab[:10]: + f"gte-levers {gl}, direct GTE statements in bodies {len(direct_gte)}, per-TU asm macro definitions {pt}, " + f"volatile-needed {s['classes']['C']['sites']}, register-needed {s['classes']['D']['sites']} — " + f"{'OK' if not ab and not pt and not direct_gte else 'FAIL'}") + if ab or pt or direct_gte: + for x in (ab + direct_gte)[:10]: print(f" {x['tu']}:{x['line']} {x['fn']} {x['cls']}/{x['kind']} {x['detail']}") rc = 1 else: diff --git a/decomp-architect/corpus/tools/P10/readability_progress.py b/decomp-architect/corpus/tools/P10/readability_progress.py index 7deaa108a..01dc33e95 100644 --- a/decomp-architect/corpus/tools/P10/readability_progress.py +++ b/decomp-architect/corpus/tools/P10/readability_progress.py @@ -43,31 +43,68 @@ def counts(): casts += len(CAST.findall(t)) members += len(MEMBER.findall(t)) pinned = [r for r in rows if r["argpin"]] - return dict(definitions=len(defs), narrow_decls=len(rows), - callees=len({r["callee"] for r in rows}), - kr_empty=sum(1 for r in rows if r["kind"] == "K&R-empty"), - narrow=sum(1 for r in rows if r["kind"] == "narrow"), - pinned_rows=len(pinned), pinned_bodies=len({(r["tu"], r["in_fn"]) for r in pinned}), - raw_casts=casts, struct_members=members) + out = dict(definitions=len(defs), narrow_decls=len(rows), + callees=len({r["callee"] for r in rows}), + kr_empty=sum(1 for r in rows if r["kind"] == "K&R-empty"), + narrow=sum(1 for r in rows if r["kind"] == "narrow"), + pinned_rows=len(pinned), pinned_bodies=len({(r["tu"], r["in_fn"]) for r in pinned}), + raw_casts=casts, struct_members=members) + # Phase 37 T1 (2026-09-12): the type census's columns — the four dereference forms (the CAST regex above sees one of them, over raw + # text), the typed cast-member accesses (the MEMBER regex counts these as members — they are the rewrite's rung 1, not finished + # members), the struct definitions and their duplicate classes, the struct map. A snapshot REFUSES a stale census (R43/R51). + cj = REPO / ".run/P37/census/type_census.json" + head = subprocess.run(["git", "rev-parse", "HEAD"], cwd=REPO, capture_output=True, text=True).stdout.strip() + if not cj.exists(): + sys.exit("readability_progress: no type census — run `tools/type_census.py -j 16` first (its columns are part of the row)") + ts = json.loads(cj.read_text())["summary"] + if not head.startswith(ts.get("head", "?")): + sys.exit(f"readability_progress: the type census is STALE (census {ts.get('head')} vs HEAD {head[:9]}) — rerun tools/type_census.py") + c, d, sm = ts["casts"], ts["definitions"], ts["struct_map"] + out.update(deref_all=c["deref_total"], form_P=c["by_form"].get("P", 0), form_I=c["by_form"].get("I", 0), form_X=c["by_form"].get("X", 0), + form_M=c["by_form"].get("M", 0), addr_form=c["addr_form"], typed_cast_member=c["typed_cast_member"], + struct_defs=d["total"], canon_defs=d["canon"], in_c_defs=d["in_c_file_scope"] + d["in_c_block_scope"], + distinct_layouts=d["distinct_layouts"], dup_classes=d["dup_layout_classes"], dup_names=d["dup_layout_names"], + map_types=sm["types"], map_pct=sm["explained_pct"]) + return out -HEAD = ("date\tlabel\tcommit\tdefinitions\tnarrow_decls\tcallees\tkr_empty\tnarrow\tpinned_rows\tpinned_bodies" - "\traw_casts\tstruct_members\n") +COLS = ["date", "label", "commit", "definitions", "narrow_decls", "callees", "kr_empty", "narrow", "pinned_rows", "pinned_bodies", + "raw_casts", "struct_members", + # P37 columns (appended 2026-09-12; older rows carry blanks — the renderer reads by name, never by position) + "deref_all", "form_P", "form_I", "form_X", "form_M", "addr_form", "typed_cast_member", "struct_defs", "canon_defs", "in_c_defs", + "distinct_layouts", "dup_classes", "dup_names", "map_types", "map_pct"] +HEAD = "\t".join(COLS) + "\n" + + +def _rows(): + lines = [l for l in TSV.read_text().splitlines() if l.strip()] + cols = lines[0].split("\t") + rows = [] + for l in lines[1:]: + vals = l.rstrip("\n").split("\t") + rows.append({c: (vals[i] if i < len(vals) else "") for i, c in enumerate(cols)}) + return rows def render(): - rows = [l.rstrip("\n").split("\t") for l in TSV.read_text().splitlines()[1:] if l.strip()] + rows = _rows() + g = lambda r, k: r.get(k, "") or "—" out = ["# Readability of the matched C — the Gen3 series", "", "> **Generated by `tools/readability_progress.py --snapshot`; never typed (R75).** Companion to", "> `docs/levers.md`, which counts the compiler-forcing levers. This one counts the two things that are wrong", "> with the source even where no lever remains: call declarations that are FALSE, and memory read through raw", - "> pointer casts where the original had a struct.", + "> pointer casts where the original had a struct. From Phase 37 the row carries the type census's columns", + "> (`tools/type_census.py`): all four dereference forms, the typed cast-member intermediate, the definitions and the map.", "", - "| date | label | commit | lying declarations | of which `()` | of which `(void)` | in a pinned body | raw cast derefs | struct member reads |", - "|---|---|---|---:|---:|---:|---:|---:|---:|"] + "| date | label | commit | lying declarations | of which `()` | of which `(void)` | in a pinned body | raw cast derefs (one form, raw text) | struct member reads | **raw derefs, four forms** | typed cast-member | struct defs (canonical / in .c) | layouts | duplicate classes / names | map types (% sites) |", + "|---|---|---|---:|---:|---:|---:|---:|---:|---:|---:|---|---:|---|---|"] for r in rows: - out.append(f"| {r[0]} | {r[1]} | `{r[2][:9]}` | {r[4]} | {r[6]} | {r[7]} | {r[8]} | {r[10]} | {r[11]} |") + defs = f"{g(r,'struct_defs')} ({g(r,'canon_defs')} / {g(r,'in_c_defs')})" if r.get("struct_defs") else "—" + dups = f"{g(r,'dup_classes')} / {g(r,'dup_names')}" if r.get("dup_classes") else "—" + mp = f"{g(r,'map_types')} ({g(r,'map_pct')} %)" if r.get("map_types") else "—" + out.append(f"| {r['date']} | {r['label']} | `{r['commit'][:9]}` | {r['narrow_decls']} | {r['kr_empty']} | {r['narrow']} | {r['pinned_rows']} | " + f"{r['raw_casts']} | {r['struct_members']} | **{g(r,'deref_all')}** | {g(r,'typed_cast_member')} | {defs} | {g(r,'distinct_layouts')} | {dups} | {mp} |") out += ["", "**How to read it.** A *lying declaration* is a call site whose in-scope declaration names fewer parameters", "than the callee's own definition. It is not a style problem: on this processor an argument travels in a", @@ -97,17 +134,17 @@ def main(): print(__doc__) return 2 c = counts() - if not TSV.exists(): - TSV.write_text(HEAD) - with TSV.open("a") as fh: - fh.write("\t".join([datetime.date.today().isoformat(), a.snapshot, head, str(c["definitions"]), - str(c["narrow_decls"]), str(c["callees"]), str(c["kr_empty"]), str(c["narrow"]), - str(c["pinned_rows"]), str(c["pinned_bodies"]), str(c["raw_casts"]), - str(c["struct_members"])]) + "\n") + c.update(date=datetime.date.today().isoformat(), label=a.snapshot, commit=head) + # the header row is rewritten to the current column list; older rows keep their positions (the new columns are appended) + old = [l for l in TSV.read_text().splitlines()[1:] if l.strip()] if TSV.exists() else [] + TSV.write_text(HEAD + "".join(l + "\n" for l in old) + "\t".join(str(c.get(k, "")) for k in COLS) + "\n") render() print(f"readability_progress: {a.snapshot} — {c['narrow_decls']} lying declaration(s) over {c['callees']} callee(s) " f"({c['kr_empty']} `()`, {c['narrow']} `(void)`), {c['pinned_rows']} in {c['pinned_bodies']} pinned bodies; " - f"{c['raw_casts']} raw cast deref(s), {c['struct_members']} struct member read(s), at {head[:9]}") + f"{c['raw_casts']} raw cast deref(s) by the one-form regex, {c['deref_all']} by the census's four forms (+{c['typed_cast_member']} typed " + f"cast-member, +{c['addr_form']} address-of), {c['struct_members']} struct member read(s); {c['struct_defs']} struct definitions over " + f"{c['distinct_layouts']} layouts ({c['dup_classes']} duplicate classes / {c['dup_names']} names); the map: {c['map_types']} types " + f"({c['map_pct']} % of sites), at {head[:9]}") return 0 diff --git a/decomp-architect/corpus/tools/P10/type_census.py b/decomp-architect/corpus/tools/P10/type_census.py new file mode 100644 index 000000000..290f6ab24 --- /dev/null +++ b/decomp-architect/corpus/tools/P10/type_census.py @@ -0,0 +1,1885 @@ +#!/usr/bin/env python3 +"""tools/type_census.py — the type census + the struct map (Phase 37 T1, 2026-09-12). + +WHAT IT MEASURES (every number the structs phase publishes comes from here — R32/R37/R75) +===================================================================================== + 1. DEFINITIONS every struct/union/typedef definition in src/ (the canonical header, every .c at file and block scope, + the per-function shared headers) with its o32 LAYOUT (offset/width/sign leaves, size, align), its exact-text + hash and its layout hash; duplicate classes (same layout, different names), VARIANT camps (same name, + different layout — cookbook §64a: two types, never merged), dead names, shadowing. + 2. CAST SITES every raw pointer-cast dereference in FIVE forms, each with the base expression classified (parameter / + local / D_ global by value / &D_ global by address / absolute address / nested deref / other), the offset, + the cast width and signedness, load vs store, and the stride when indexed: + P *(T *)(base + k) the readability series' regex (tools/readability_progress.py) + I *(T *)ident a cast of a bare identifier (the `*(u16 *)D_801152A8` form) + X ((T *)e)[i] the array-index form + M M2C_FIELD(base, T *, k) m2c's placeholder macro (== *(T *)((s8 *)base + k)) + A (T *)(base + k) the ADDRESS of a field, not dereferenced (call arguments, pointer sets) + 3. DECLARATIONS every function definition's signature (K&R read), every extern declaration spelling per name, the lying + set (tools/argcheck.py as a library), the asm-label aliases (`extern u16 aD_x __asm__("D_x");`), the + builtins and attributes the Phase-36 plan deferred to this phase. + 4. THE STRUCT MAP bases clustered into the types the fleet needs (union-find over EVIDENCE edges only — the same global, + call-argument flow, assignment/return flow, pointer-field flow, dedup identity; NEVER by signature alone), + each type with its members, evidence histogram, layout from the union of its sites, coverage and conflicts. + 5. COVERAGE per form: sites recorded == an independent raw regex count over the same masked text, else FAIL (R32). + A site the parser cannot classify is still a RECORD (base class `other`, with its text) — never a skip. + 6. CONTROLS known-true cases (R39): the player block's live-verified widths (docs/actor-struct.md), MATRIX (32) vs + MATRIX_L48 (48) as two layouts, Prim_8016E7C8's exact class == its definition count, one TU-CONFLICT + ledger row's disagreement reproduced from the declarations. + +USAGE + tools/type_census.py [-j N] [--out-dir .run/P37/census] [--no-cache] # the census + the map + the render + tools/type_census.py --sites # also write sites.jsonl (every record) + tools/type_census.py --check # T8's gate (exit 1 on any violation) + tools/type_census.py --selftest # the fixture: every form, both verdicts +Outputs: /type_census.json, type_census.txt, struct_map.json, sites.jsonl (--sites), docs/struct-map.md (rendered). +""" +import argparse +import collections +import hashlib +import json +import os +import pathlib +import re +import sys +import time +from concurrent.futures import ProcessPoolExecutor + +sys.path.insert(0, str(pathlib.Path(__file__).resolve().parent)) +import share_census as sc # noqa: E402 (mask_text, scan_text, fleet_and_dirs — R33: derive from the shared scanner) +import lever_census as lc # noqa: E402 (enumerate_files, header_includers, src_stamp, git_head) + +REPO = pathlib.Path(__file__).resolve().parent.parent +OUT_DIR_DEFAULT = ".run/P37/census" +TOOL_STAMP = hashlib.sha1(pathlib.Path(__file__).read_bytes()).hexdigest()[:10] +CANON_HEADERS = ("src/shared/engine_types.h",) # the canonical type files (T3/T5 add src/shared/main/types.h, the slots') + +# ---------------------------------------------------------------------------------------------------------------------- +# types and widths (o32) +# ---------------------------------------------------------------------------------------------------------------------- +SCALARS = { + "u8": (1, "u"), "s8": (1, "s"), "char": (1, "s"), "signed char": (1, "s"), "unsigned char": (1, "u"), + "u16": (2, "u"), "s16": (2, "s"), "short": (2, "s"), "unsigned short": (2, "u"), "signed short": (2, "s"), + "short int": (2, "s"), "unsigned short int": (2, "u"), + "u32": (4, "u"), "s32": (4, "s"), "int": (4, "s"), "unsigned": (4, "u"), "unsigned int": (4, "u"), "signed": (4, "s"), + "signed int": (4, "s"), "long": (4, "s"), "unsigned long": (4, "u"), "long int": (4, "s"), "unsigned long int": (4, "u"), + "uint": (4, "u"), "uint32_t": (4, "u"), "int32_t": (4, "s"), "uint16_t": (2, "u"), "int16_t": (2, "s"), + "uint8_t": (1, "u"), "int8_t": (1, "s"), + "u64": (8, "u"), "s64": (8, "s"), "long long": (8, "s"), "unsigned long long": (8, "u"), + "f32": (4, "f"), "float": (4, "f"), "f64": (8, "f"), "double": (8, "f"), + "M2C_UNK": (4, "s"), "M2C_UNK8": (1, "s"), "M2C_UNK16": (2, "s"), "M2C_UNK32": (4, "s"), "M2C_UNK64": (8, "s"), + "void": (0, "v"), +} +# PsyQ layouts the SDK headers fix (include/psyq/*.h) — sizes only; used when a cast names them and for the MATRIX control +SDK_SIZES = {"MATRIX": 32, "SVECTOR": 8, "VECTOR": 16, "CVECTOR": 4, "DVECTOR": 4, "RECT": 8, "RECT32": 16, + "POLY_F3": 20, "POLY_F4": 24, "POLY_FT3": 32, "POLY_FT4": 40, "POLY_G3": 28, "POLY_G4": 36, "POLY_GT3": 40, + "POLY_GT4": 52, "LINE_F2": 16, "LINE_F3": 20, "LINE_F4": 24, "LINE_G2": 20, "LINE_G3": 28, "LINE_G4": 36, + "SPRT": 20, "SPRT_8": 16, "SPRT_16": 16, "TILE": 16, "TILE_1": 12, "TILE_8": 12, "TILE_16": 12, + "DR_TPAGE": 8, "DR_ENV": 64, "DRAWENV": 92, "DISPENV": 20, "TMD_PRIM": 60, "GsDOBJ2": 32, "GsCOORDINATE2": 80, + "GsRVIEW2": 36, "GsF_LIGHT": 16, "GsOT": 12, "GsOT_TAG": 4, "CdlLOC": 4, "CdlFILE": 20, "CdlFILTER": 4, + "CdlATV": 4, "CdlCB": 4} + +def _norm_type(t): + t = re.sub(r"\b(const|volatile|register|extern|static)\b", "", t) + return re.sub(r"\s+", " ", t).strip() + +def scalar_of(t): + """(width, sign) for a scalar/pointer type text; None for an aggregate or unknown name.""" + t = _norm_type(t) + if t.endswith("*"): + return (4, "p") + if t in SCALARS: + return SCALARS[t] + return None + +# ---------------------------------------------------------------------------------------------------------------------- +# the definitions: parse `struct/union … { … }` bodies and compute o32 layouts +# ---------------------------------------------------------------------------------------------------------------------- +DEF_START = re.compile(r"(? (type, [(name, stars, dims, bits)])""" + parts = _split_top(decl, ",") + if not parts: + return None, [] + first = parts[0].strip() + # bitfield? `s16 : 16` / `u8 x : 3` + mb = re.search(r":\s*(\d+)\s*$", first) + if mb: + left = first[:mb.start()].strip() + toks = left.split() + if len(toks) >= 2 and re.match(r"^[A-Za-z_]\w*$", toks[-1]) and toks[-1] not in SCALARS and toks[-2] not in ("struct", "union", "enum"): + return _norm_type(" ".join(toks[:-1])), [(toks[-1], 0, [], int(mb.group(1)))] + return _norm_type(left), [("", 0, [], int(mb.group(1)))] + # split the first part into type + declarator: the declarator is the trailing `*... name [dims]` or a function pointer + fp = re.match(r"^(.*?)\(\s*\*\s*([A-Za-z_]\w*)\s*\)\s*\(.*\)\s*((?:\[[^\]]*\])*)$", first) + decls = [] + if fp: + base_type = "void *" # a function pointer is 4 bytes; the callee type is irrelevant to the layout + dims = re.findall(r"\[([^\]]*)\]", fp.group(3)) + decls.append((fp.group(2), 1, dims, None)) + for extra in parts[1:]: + e = extra.strip() + m2 = re.match(r"^(\**)\s*([A-Za-z_]\w*)\s*((?:\[[^\]]*\])*)$", e) + if m2: + decls.append((m2.group(2), len(m2.group(1)), re.findall(r"\[([^\]]*)\]", m2.group(3)), None)) + return base_type, decls + m = re.match(r"^(.*?)\s*(\**)\s*([A-Za-z_]\w*)\s*((?:\[[^\]]*\])*)\s*$", first, re.S) + if not m: + return _norm_type(first), [] + base_type = _norm_type(m.group(1)) + decls.append((m.group(3), len(m.group(2)), re.findall(r"\[([^\]]*)\]", m.group(4)), None)) + for extra in parts[1:]: + e = extra.strip() + m2 = re.match(r"^(\**)\s*([A-Za-z_]\w*)\s*((?:\[[^\]]*\])*)\s*(?::\s*(\d+))?$", e) + if m2: + decls.append((m2.group(2), len(m2.group(1)), re.findall(r"\[([^\]]*)\]", m2.group(3)), + int(m2.group(4)) if m2.group(4) else None)) + return base_type, decls + +def _eval_dim(d, consts): + d = d.strip() + if not d: + return None # flexible/unsized + try: + return int(eval(d, {"__builtins__": {}}, dict(consts))) # hex, sums, `0x20-0x10`, sizeof-free; the tree's dims are literals + except Exception: + return None + +def parse_struct_body(body, consts=None): + """Fields of one struct/union body text (the text between the braces). Nested definitions are parsed recursively. + Returns [dict(name, type, stars, dims, bits, nested)] in order.""" + fields = [] + consts = consts or {} + i, n = 0, len(body) + while i < n: + # a nested struct/union body? + m = DEF_START.search(body, i) + stmt_end = body.find(";", i) + if m and (stmt_end == -1 or m.start() < stmt_end): + close = _match_brace(body, m.end() - 1) + if close == -1: + break + inner = body[m.end():close] + # the declarators after the nested body up to `;` + j = body.find(";", close) + tail = body[close + 1:j if j != -1 else n] + nested = dict(kind=m.group(2), tag=m.group(3), fields=parse_struct_body(inner, consts) if m.group(2) != "enum" else [], + attrs=(m.group(4) or "") + " ".join(ATTR_RX.findall(tail))) + tail = ATTR_RX.sub("", tail).strip() + decls = [] + if tail: + for part in _split_top(tail, ","): + e = part.strip() + m2 = re.match(r"^(\**)\s*([A-Za-z_]\w*)\s*((?:\[[^\]]*\])*)\s*(?::\s*(\d+))?$", e) + if m2: + decls.append((m2.group(2), len(m2.group(1)), re.findall(r"\[([^\]]*)\]", m2.group(3)), + int(m2.group(4)) if m2.group(4) else None)) + if not decls: + decls = [("", 0, [], None)] # an anonymous member (a union inside a struct) + for (nm, stars, dims, bits) in decls: + fields.append(dict(name=nm, type=(m.group(2) + " " + (m.group(3) or "")).strip(), stars=stars, + dims=[_eval_dim(d, consts) for d in dims], bits=bits, nested=nested)) + i = (j + 1) if j != -1 else n + continue + if stmt_end == -1: + break + stmt = body[i:stmt_end].strip() + i = stmt_end + 1 + if not stmt: + continue + stmt = ATTR_RX.sub("", stmt) + base_type, decls = _split_declarators(stmt) + if base_type is None: + continue + for (nm, stars, dims, bits) in decls: + fields.append(dict(name=nm, type=base_type, stars=stars, dims=[_eval_dim(d, consts) for d in dims], bits=bits, nested=None)) + return fields + +class Resolver: + """Type name -> (size, align, leaves) under the o32 ABI. Scope: a TU's own definitions first, then the shared headers, then the SDK.""" + def __init__(self, defs_by_name): + self.defs = defs_by_name # name -> definition record (tag or typedef name) + self.cache = {} + self.stack = set() + + def layout(self, type_text, stars=0, dims=(), bits=None): + """(size, align, leaves) of one field's type; leaves = [(off, width, sign)]; None when unknown.""" + if stars: + sz, al, leaves = 4, 4, [(0, 4, "p")] + else: + t = _norm_type(type_text) + sc_ = scalar_of(t) + if sc_: + w, s = sc_ + if w == 0: + return None + sz, al, leaves = w, w, [(0, w, s)] + else: + r = self.resolve_name(t) + if r is None: + return None + sz, al, leaves = r + for d in reversed(list(dims)): + if d is None: + d = 0 + leaves = [(k * sz + off, w, s) for k in range(d) for (off, w, s) in leaves] + sz = sz * d + return sz, al, leaves + + def resolve_name(self, name): + name = _norm_type(name) + if name in self.cache: + return self.cache[name] + if name in self.stack: + return None + d = self.defs.get(name) + if d is None: + m = re.match(r"^(struct|union|enum)\s+(\w+)$", name) + if m and m.group(1) == "enum": + return (4, 4, [(0, 4, "s")]) + if m and m.group(2) in self.defs and self.defs[m.group(2)].get("kind") == m.group(1): + d = self.defs[m.group(2)] + elif name in SDK_SIZES: + sz = SDK_SIZES[name] + r = (sz, 4, [(0, 4, "s")] * (sz // 4) if sz % 4 == 0 else [(0, sz, "b")]) + self.cache[name] = r + return r + else: + return None + if d.get("kind") == "enum": + return (4, 4, [(0, 4, "s")]) + if d.get("alias_of"): # `typedef T Name;` — a scalar/pointer alias or an alias of another aggregate + self.stack.add(name) + r = self.layout(d["alias_of"], d.get("alias_stars", 0), d.get("alias_dims", ())) + self.stack.discard(name) + self.cache[name] = r + return r + self.stack.add(name) + r = self.layout_of_fields(d["fields"], d["kind"], packed=("packed" in (d.get("attrs") or ""))) + self.stack.discard(name) + self.cache[name] = r + return r + + def layout_of_fields(self, fields, kind, packed=False): + off, maxal, leaves, size = 0, 1, [], 0 + bit_off = 0 + unknown = False + for f in fields: + if f.get("nested"): + nd = f["nested"] + r = self.layout_of_fields(nd["fields"], nd["kind"], packed=("packed" in (nd.get("attrs") or ""))) if nd["kind"] != "enum" else (4, 4, [(0, 4, "s")]) + else: + r = self.layout(f["type"], f["stars"], f["dims"]) + if r is None: + unknown = True + r = (0, 1, []) + fsz, fal, fleaves = r + if f.get("dims") and f["nested"]: + for d in reversed(f["dims"]): + d = d or 0 + fleaves = [(k * fsz + o, w, s) for k in range(d) for (o, w, s) in fleaves] + fsz = fsz * d + if packed: + fal = 1 + if f.get("bits") is not None: + # bitfields: pack into the base type's storage unit; an anonymous `s16 : 16` is a pad of the base width + w = fsz or 4 + if bit_off == 0: + off = (off + fal - 1) // fal * fal + unit_off = off + self._unit = (unit_off, w) + unit_off, uw = self._unit + if bit_off + f["bits"] > uw * 8: + off = unit_off + uw + off = (off + fal - 1) // fal * fal + unit_off = off + self._unit = (unit_off, w) + bit_off = 0 + if f["name"]: + leaves.append((unit_off, w, "bf")) + bit_off += f["bits"] + maxal = max(maxal, fal) + end = unit_off + w + if bit_off >= uw * 8: + bit_off = 0 + off = end + else: + off = unit_off + size = max(size, end) + if kind == "union": + off = 0 + continue + bit_off = 0 + if kind == "union": + leaves.extend((0 + o, w, s) for (o, w, s) in fleaves) + size = max(size, fsz) + maxal = max(maxal, fal) + continue + off = (off + fal - 1) // fal * fal + leaves.extend((off + o, w, s) for (o, w, s) in fleaves) + off += fsz + size = max(size, off) + maxal = max(maxal, fal) + size = (size + maxal - 1) // maxal * maxal + if unknown: + return None + return size, maxal, sorted(set(leaves)) + +def layout_hash(lay): + if lay is None: + return None + size, al, leaves = lay + return hashlib.sha1(json.dumps([size, leaves]).encode()).hexdigest()[:12] + +def find_definitions(masked, rel, span_of_line, line_of): + """All struct/union/enum definitions and typedef aliases in one masked file. Records carry file, line, kind, tag, names, fields.""" + out = [] + pos = 0 + while True: + m = DEF_START.search(masked, pos) + if not m: + break + open_idx = m.end() - 1 + close = _match_brace(masked, open_idx) + if close == -1: + break + body = masked[open_idx + 1:close] + # the declarators after `}` up to `;` + j = masked.find(";", close) + tail = masked[close + 1:j] if j != -1 else "" + attrs = (m.group(4) or "") + " " + " ".join(ATTR_RX.findall(tail)) + tail_clean = ATTR_RX.sub("", tail).strip() + names = [] + if m.group(1): # typedef + for part in _split_top(tail_clean, ","): + e = part.strip() + m2 = re.match(r"^(\**)\s*([A-Za-z_]\w*)\s*((?:\[[^\]]*\])*)$", e) + if m2: + names.append((m2.group(2), len(m2.group(1)), re.findall(r"\[([^\]]*)\]", m2.group(3)))) + ln = line_of(m.start()) + d = span_of_line.get(ln) + fields = parse_struct_body(body) if m.group(2) != "enum" else [] + text = re.sub(r"\s+", " ", masked[m.start():(j + 1) if j != -1 else close + 1]).strip() + rec = dict(file=rel, line=ln, end=line_of(close), kind=m.group(2), tag=m.group(3), typedef=bool(m.group(1)), + names=[n for (n, s, dd) in names if s == 0 and not dd], ptr_names=[n for (n, s, dd) in names if s or dd], + fields=fields, attrs=attrs.strip(), scope=("block" if d else "file"), fn=(d["name"] if d else None), + text_hash=hashlib.sha1(text.encode()).hexdigest()[:12], nfields=len(fields), + is_canon=(rel in CANON_HEADERS)) + out.append(rec) + # nested definitions inside the body are NOT separate records (they live inside the parent's layout) + pos = (j + 1) if j != -1 else close + 1 + # scalar/alias typedefs: `typedef T Name;` / `typedef struct X Name;` / `typedef T (*Name)(...)` / `typedef T Name[4];` + aliases = [] + for m in re.finditer(r"(?\s*([A-Za-z_]\w*)") # ((T *)e)->f (cast-then-member) +ABS_ADDR = re.compile(r"^0x80[0-9A-Fa-f]{6}$") +ASSIGN_OP = re.compile(r"^\s*(?:(?:\+|-|\*|/|%|&|\||\^|<<|>>)?=(?!=)|\+\+|--)") +IDENT = re.compile(r"^[A-Za-z_]\w*$") +INT_LIT = re.compile(r"^-?(?:0x[0-9A-Fa-f]+|\d+)$") + +def _paren_body(text, open_idx): + """text[open_idx] == '(' -> (inner, close_idx) or (None, -1).""" + depth = 0 + for i in range(open_idx, len(text)): + c = text[i] + if c == "(": + depth += 1 + elif c == ")": + depth -= 1 + if depth == 0: + return text[open_idx + 1:i], i + return None, -1 + +def _strip_parens(e): + e = e.strip() + while e.startswith("(") and e.endswith(")"): + inner, close = _paren_body(e, 0) + if close == len(e) - 1: + e = inner.strip() + else: + break + return e + +def _int(s): + s = s.strip() + try: + return int(s, 0) + except Exception: + return None + +def _split_plus(e): + """Top-level `a + b` / `a - b` split (depth 0, not inside a cast's parens). Returns (lhs, op, rhs) or None.""" + depth = 0 + for i, c in enumerate(e): + if c in "([": + depth += 1 + elif c in ")]": + depth -= 1 + elif depth == 0 and c in "+-" and i > 0: + prev = e[:i].rstrip() + if prev and prev[-1] not in "+-*/%&|^<>=(,": + return e[:i].strip(), c, e[i + 1:].strip() + return None + +def parse_base(expr): + """Classify the inner expression of a cast: returns dict(base, bclass, off, inner_cast, index, stride, text).""" + e = _strip_parens(expr) + rec = dict(base=None, bclass="other", off=0, inner_cast=None, index=None, stride=None, text=re.sub(r"\s+", " ", e)[:120]) + if ABS_ADDR.match(e): + rec.update(base=e, bclass="abs", off=0) + return rec + # strip an outer cast `(s32)X` / `(u8 *)X` / `(char *)X` + m = re.match(r"^\(\s*((?:struct\s+|union\s+)?[A-Za-z_]\w*\s*\**)\s*\)\s*(.+)$", e, re.S) + if m and not m.group(2).lstrip().startswith(("+", "-")): + rec["inner_cast"] = _norm_type(m.group(1)) + e = _strip_parens(m.group(2)) + # `(s32)matrix + 8`: the cast binds to `matrix`; the split below handles `matrix + 8` + sp = _split_plus(e) + if sp: + lhs, op, rhs = sp + lhs_s = _strip_parens(lhs) + rhs_s = _strip_parens(rhs) + # a constant on the right + k = _int(rhs_s) + if k is not None: + b = parse_base(lhs_s) + b["off"] = (b.get("off") or 0) + (k if op == "+" else -k) + b["text"] = rec["text"] + if rec["inner_cast"] and not b.get("inner_cast"): + b["inner_cast"] = rec["inner_cast"] + return b + k = _int(lhs_s) + if k is not None and op == "+": + b = parse_base(rhs_s) + b["off"] = (b.get("off") or 0) + k + b["text"] = rec["text"] + return b + # an index: `base + i * 8` / `base + (i << 2)` / `base + i` + b = parse_base(lhs_s) + if b["bclass"] in ("param", "local", "global", "gaddr", "ident", "nested", "abs"): + b["index"] = re.sub(r"\s+", " ", rhs_s)[:60] + ms = re.match(r"^([A-Za-z_]\w*)\s*\*\s*(0x[0-9A-Fa-f]+|\d+)$", rhs_s) or re.match(r"^\(?\s*([A-Za-z_]\w*)\s*<<\s*(\d+)\s*\)?$", rhs_s) + if ms: + v = _int(ms.group(2)) + b["stride"] = (1 << v) if "<<" in rhs_s else v + b["text"] = rec["text"] + return b + rec["bclass"] = "other" + return rec + # a nested deref + if e.startswith("*") or FORM_M.match(e): + rec.update(base=e[:60], bclass="nested") + return rec + if e.startswith("&"): + inner = _strip_parens(e[1:]) + if IDENT.match(inner): + rec.update(base=inner, bclass=("gaddr" if inner.startswith("D_") else "addr-of")) + return rec + mi = re.match(r"^([A-Za-z_]\w*)\s*\[(.+)\]$", inner) + if mi: + rec.update(base=mi.group(1), bclass=("gaddr" if mi.group(1).startswith("D_") else "addr-of"), index=mi.group(2)[:60]) + return rec + rec.update(base=inner[:60], bclass="addr-of") + return rec + if IDENT.match(e): + rec.update(base=e, bclass=("global" if e.startswith("D_") else "func" if e.startswith("func_") else "ident")) + return rec + mi = re.match(r"^([A-Za-z_]\w*)\s*\[(.+)\]$", e) + if mi: + rec.update(base=mi.group(1), bclass=("global" if mi.group(1).startswith("D_") else "ident"), index=mi.group(2)[:60]) + return rec + mm = re.match(r"^([A-Za-z_]\w*)\s*->\s*([A-Za-z_]\w*)$", e) + if mm: + rec.update(base=e, bclass="member") + return rec + return rec + +def _after(masked, idx): + """The text right after idx (skipping spaces) — for the store test.""" + j = idx + while j < len(masked) and masked[j] in " \t": + j += 1 + return masked[j:j + 3] + +def _store_kind(tail): + m = ASSIGN_OP.match(tail) + if not m: + return "load" + return "rmw" if m.group(0).strip() in ("++", "--") or "=" != m.group(0).strip() else "store" + +def find_sites(masked, rel, span_of_line, line_of, params_of): + sites = [] + raw_counts = collections.Counter() + claimed = set() # start offsets already recorded (a form-P match inside a form-X, etc. are distinct sites — nested is fine) + + def fn_ctx(pos): + ln = line_of(pos) + d = span_of_line.get(ln) + return ln, d + + def classify(bclass, base, d): + if bclass == "ident" and d is not None: + if base in params_of.get(d["name"], ()): + return "param" + return "local" + return bclass + + # P: *(T *)( … ) + for m in FORM_P.finditer(masked): + raw_counts["P"] += 1 + open_idx = m.end() - 1 + inner, close = _paren_body(masked, open_idx) + ln, d = fn_ctx(m.start()) + rec = dict(form="P", tu=rel, fn=(d["name"] if d else None), line=ln, ctype=_norm_type(m.group(1) + " " + m.group(2)), + stars=len(m.group(2))) + if inner is None: + rec.update(bclass="other", base=None, off=0, text="UNBALANCED", refused="unbalanced parens") + else: + b = parse_base(inner) + b["bclass"] = classify(b["bclass"], b.get("base"), d) + rec.update(b) + rec["access"] = _store_kind(_after(masked, close + 1)) + sites.append(rec) + # I: *(T *)ident / *(T *)&ident + for m in FORM_I.finditer(masked): + raw_counts["I"] += 1 + ln, d = fn_ctx(m.start()) + base = m.group(4) + amp = m.group(3) == "&" + if ABS_ADDR.match(base): + bclass = "abs" + elif amp: + bclass = "gaddr" if base.startswith("D_") else "addr-of" + else: + bclass = classify("global" if base.startswith("D_") else "func" if base.startswith("func_") else "ident", base, d) + rec = dict(form="I", tu=rel, fn=(d["name"] if d else None), line=ln, ctype=_norm_type(m.group(1) + " " + m.group(2)), + stars=len(m.group(2)), base=base, bclass=bclass, off=0, inner_cast=None, index=None, stride=None, + text=("&" if amp else "") + base, access=_store_kind(_after(masked, m.end()))) + sites.append(rec) + # X: ((T *)e)[i] + for m in FORM_X.finditer(masked): + raw_counts["X"] += 1 + ln, d = fn_ctx(m.start()) + b = parse_base(m.group(3)) + b["bclass"] = classify(b["bclass"], b.get("base"), d) + # the index expression + idx_inner, idx_close = _paren_body(masked.replace("[", "(", 0), m.end() - 1) if False else (None, -1) + j = masked.find("]", m.end()) + idx = masked[m.end():j].strip() if j != -1 else None + rec = dict(form="X", tu=rel, fn=(d["name"] if d else None), line=ln, ctype=_norm_type(m.group(1) + " " + m.group(2)), + stars=len(m.group(2)), text=b["text"], base=b.get("base"), bclass=b["bclass"], off=b.get("off", 0), + inner_cast=b.get("inner_cast"), index=(idx[:60] if idx else None), stride=None, + access=_store_kind(_after(masked, (j + 1) if j != -1 else m.end()))) + k = _int(idx) if idx else None + if k is not None: + w = scalar_of(rec["ctype"].rstrip("* ").strip()) if rec["stars"] == 1 else (4, "p") + if w: + rec["off"] = rec["off"] + k * w[0] + rec["index"] = None + sites.append(rec) + # M: M2C_FIELD(base, T *, k) + for m in FORM_M.finditer(masked): + raw_counts["M"] += 1 + inner, close = _paren_body(masked, m.end() - 1) + ln, d = fn_ctx(m.start()) + rec = dict(form="M", tu=rel, fn=(d["name"] if d else None), line=ln) + if inner is None: + rec.update(ctype=None, stars=0, base=None, bclass="other", off=0, text="UNBALANCED", refused="unbalanced parens") + else: + args = _split_top(inner, ",") + if len(args) != 3: + rec.update(ctype=None, stars=0, base=None, bclass="other", off=0, text=inner[:80], refused="M2C_FIELD arity") + else: + b = parse_base(args[0]) + b["bclass"] = classify(b["bclass"], b.get("base"), d) + k = _int(_strip_parens(args[2])) + ctype = _norm_type(args[1]) + rec.update(b) + rec.update(ctype=ctype, stars=ctype.count("*"), off=(b.get("off") or 0) + (k if k is not None else 0), + access=_store_kind(_after(masked, close + 1))) + if k is None: + rec["index"] = _strip_parens(args[2])[:60] + sites.append(rec) + # A: (T *)(base + k) — an address, not a dereference + for m in FORM_A.finditer(masked): + raw_counts["A"] += 1 + open_idx = m.end() - 1 + inner, close = _paren_body(masked, open_idx) + ln, d = fn_ctx(m.start()) + rec = dict(form="A", tu=rel, fn=(d["name"] if d else None), line=ln, ctype=_norm_type(m.group(1) + " " + m.group(2)), + stars=len(m.group(2))) + if inner is None: + rec.update(bclass="other", base=None, off=0, text="UNBALANCED", refused="unbalanced parens") + else: + b = parse_base(inner) + b["bclass"] = classify(b["bclass"], b.get("base"), d) + rec.update(b) + rec["access"] = "addr" + sites.append(rec) + # C: ((T *)e)->f — a typed cast followed by a member access: already a COMPONENT_REF (/s); counted apart (rung 1's form) + for m in FORM_C.finditer(masked): + raw_counts["C"] += 1 + ln, d = fn_ctx(m.start()) + b = parse_base(m.group(3)) + b["bclass"] = classify(b["bclass"], b.get("base"), d) + rec = dict(form="C", tu=rel, fn=(d["name"] if d else None), line=ln, ctype=_norm_type(m.group(1) + " " + m.group(2)), + stars=len(m.group(2)), text=b["text"], base=b.get("base"), bclass=b["bclass"], off=b.get("off", 0), + inner_cast=b.get("inner_cast"), index=b.get("index"), stride=None, member=m.group(4), + access=_store_kind(_after(masked, m.end()))) + sites.append(rec) + for r in sites: + # the ACCESSED type is the cast's pointee: `(u16 *)` dereferenced -> u16; `(T **)` -> a pointer + stars = r.get("stars", 0) + ct = r.get("ctype") + if not ct: + w = None + elif stars > 1 or r["form"] == "A": + w = (4, "p") + elif r["form"] == "C": + w = None # the member's width is the type's field's — resolved when the type is + else: + w = scalar_of(ct.rstrip("* ").strip()) + r["width"] = w[0] if w else None + r["sign"] = w[1] if w else ("agg" if ct else None) + return sites, raw_counts + +# ---------------------------------------------------------------------------------------------------------------------- +# declarations, calls and flows (for the declaration census and the struct map) +# ---------------------------------------------------------------------------------------------------------------------- +NAME = r"[A-Za-z_]\w*" +EXTERN_FN = re.compile(r"\bextern\s+([A-Za-z_][\w \t*]*?)\b(" + NAME + r")\s*\(([^;{)]*)\)\s*(__asm__\s*\(\s*\"(\w+)\"\s*\))?\s*;") +EXTERN_DATA = re.compile(r"\bextern\s+([A-Za-z_][\w \t*]*?)\b(" + NAME + r")\s*((?:\[[^\]]*\])*)\s*(__asm__\s*\(\s*\"(\w+)\"\s*\))?\s*;") +BUILTIN = re.compile(r"__builtin_(\w+)") +ATTR_USE = re.compile(r"__attribute__\s*\(\(\s*(\w+)") +CALL = re.compile(r"(?])(" + NAME + r")\s*\(") +KEYWORDS = sc.KEYWORDS | {"sizeof", "return", "if", "while", "for", "switch", "M2C_FIELD", "M2C_BITWISE", "defined"} +ASSIGN = re.compile(r"(?])(" + NAME + r")\s*=(?!=)\s*([^;]+);") +RETURN = re.compile(r"\breturn\s+([^;]+);") + +def _param_names(head_params, body_head_decls): + """Names of a definition's parameters: prototype form `T a, T *b` or K&R `a, b` (types declared before `{`).""" + names = [] + hp = head_params.strip() + if not hp or hp == "void": + return names + for part in _split_top(hp, ","): + p = part.strip() + if not p or p == "...": + continue + m = re.search(r"\(\s*\*\s*(" + NAME + r")\s*\)", p) # a function-pointer parameter + if m: + names.append(m.group(1)) + continue + toks = re.findall(NAME, re.sub(r"\[[^\]]*\]", "", p)) + if not toks: + continue + if len(toks) == 1: + names.append(toks[0]) # K&R name or a bare type — a bare type (`s32`) is filtered below + else: + names.append(toks[-1]) + return [n for n in names if n not in SCALARS and n not in ("struct", "union", "const", "volatile", "unsigned", "signed")] + +def find_decls_and_flows(masked, rel, defs, span_of_line, line_of): + """Per file: function definitions with signatures, extern declaration spellings, aliases, builtins, attributes, and the + flow edges (calls with identifier arguments, identifier assignments, returns) per enclosing function.""" + fndefs, extern_fns, extern_data, aliases, builtins, attrs, flows = [], [], [], [], [], [], [] + raw_lines = masked.split("\n") + line_starts = [0] + for ln in raw_lines: + line_starts.append(line_starts[-1] + len(ln) + 1) + params_of = {} + for d in defs: + # the head: from the def's first line to its `{` + start = line_starts[d["line"] - 1] + brace = masked.find("{", start) + head = masked[start:brace] if brace != -1 else "" + m = re.search(r"\b(" + re.escape(d["name"]) + r")\s*\(", head) + if not m: + # an alias-named def (`__asm__("func_x")`): take the first ident( + m = re.search(r"\b(" + NAME + r")\s*\((?=[^;]*\))", head) + if not m: + continue + inner, close = _paren_body(head, m.end() - 1) + if inner is None: + continue + ret = _norm_type(head[:m.start()].split(";")[-1].replace("static", "").replace("extern", "")).strip() or "int" + kr_tail = head[close + 1:].strip() + pnames = _param_names(inner, kr_tail) + kr = bool(kr_tail) and bool(re.search(NAME + r"\s*[,;]", kr_tail)) + params_of[d["name"]] = pnames + s0 = line_starts[d["line"] - 1] + s1 = line_starts[d["end"]] - 1 if d["end"] < len(line_starts) else len(masked) + d["nhash"] = lc.norm_hash(masked[s0:s1]) # func_/D_ addresses masked: the Phase-35 normalized-text identity + fndefs.append(dict(tu=rel, fn=d["name"], line=d["line"], ret=ret, params=re.sub(r"\s+", " ", inner).strip(), pnames=pnames, + arity=len(pnames) if pnames else (0 if inner.strip() in ("", "void") else len(_split_top(inner, ","))), + kr=kr, nhash=d["nhash"], text_hash=d.get("text_hash"))) + for m in EXTERN_FN.finditer(masked): + ln = line_of(m.start()) + d = span_of_line.get(ln) + extern_fns.append(dict(tu=rel, name=m.group(2), ret=_norm_type(m.group(1)), params=re.sub(r"\s+", " ", m.group(3)).strip(), + line=ln, scope=("block" if d else "file"), alias=m.group(5))) + for m in EXTERN_DATA.finditer(masked): + if masked[m.end() - 1] != ";": + continue + ln = line_of(m.start()) + d = span_of_line.get(ln) + extern_data.append(dict(tu=rel, name=m.group(2), type=_norm_type(m.group(1)), dims=m.group(3) or "", line=ln, + scope=("block" if d else "file"), alias=m.group(5))) + if m.group(5): + aliases.append(dict(tu=rel, name=m.group(2), real=m.group(5), type=_norm_type(m.group(1)), line=ln, kind="data")) + for e in extern_fns: + if e["alias"]: + aliases.append(dict(tu=rel, name=e["name"], real=e["alias"], type=e["ret"], line=e["line"], kind="func")) + for m in BUILTIN.finditer(masked): + ln = line_of(m.start()) + builtins.append(dict(tu=rel, name=m.group(1), line=ln, fn=(span_of_line.get(ln) or {}).get("name"))) + for m in ATTR_USE.finditer(masked): + ln = line_of(m.start()) + attrs.append(dict(tu=rel, name=m.group(1), line=ln)) + # flows, per function body + for d in defs: + s0 = line_starts[d["line"] - 1] + s1 = line_starts[d["end"]] - 1 if d["end"] < len(line_starts) else len(masked) + body = masked[s0:s1] + fn = d["name"] + for m in CALL.finditer(body): + callee = m.group(1) + if callee in KEYWORDS or callee == fn and m.start() < body.find("{"): + continue + inner, close = _paren_body(body, m.end() - 1) + if inner is None or callee in params_of and False: + continue + args = [a.strip() for a in _split_top(inner, ",")] if inner.strip() else [] + for i, a in enumerate(args): + a2 = _strip_parens(a) + a2 = re.sub(r"^\(\s*(?:struct\s+|union\s+)?[A-Za-z_]\w*\s*\**\s*\)\s*", "", a2) # drop a leading cast + if IDENT.match(a2) and a2 not in SCALARS: + flows.append(dict(tu=rel, fn=fn, kind="arg", src=a2, callee=callee, i=i)) + elif re.match(r"^&\s*(D_80[0-9A-Fa-f]{6})$", a2): + flows.append(dict(tu=rel, fn=fn, kind="arg&", src=a2[1:].strip(), callee=callee, i=i)) + for m in ASSIGN.finditer(body): + lhs, rhs = m.group(1), _strip_parens(m.group(2)) + if lhs in KEYWORDS: + continue + rhs2 = re.sub(r"^\(\s*(?:struct\s+|union\s+)?[A-Za-z_]\w*\s*\**\s*\)\s*", "", rhs) + if IDENT.match(rhs2) and rhs2 not in SCALARS: + flows.append(dict(tu=rel, fn=fn, kind="assign", dst=lhs, src=rhs2)) + elif re.match(r"^&\s*(D_80[0-9A-Fa-f]{6})$", rhs2): + flows.append(dict(tu=rel, fn=fn, kind="assign&", dst=lhs, src=rhs2[1:].strip())) + else: + mc = re.match(r"^(" + NAME + r")\s*\((.*)\)$", rhs2, re.S) + if mc and mc.group(1) not in KEYWORDS: + flows.append(dict(tu=rel, fn=fn, kind="ret-of", dst=lhs, callee=mc.group(1))) + continue + # a pointer field read: `x = *(T *)(base + k)` / M2C_FIELD(base, T *, k) / ((T*)base)[i] + mp = FORM_P.match(rhs2) or FORM_M.match(rhs2) + if mp: + if rhs2.startswith("M2C_FIELD"): + inner, _ = _paren_body(rhs2, rhs2.find("(")) + args = _split_top(inner or "", ",") + if len(args) == 3: + b = parse_base(args[0]) + k = _int(_strip_parens(args[2])) + if b.get("base") and k is not None and b["bclass"] != "other": + flows.append(dict(tu=rel, fn=fn, kind="field", dst=lhs, base=b["base"], bclass=b["bclass"], + off=(b.get("off") or 0) + k)) + else: + inner, _ = _paren_body(rhs2, rhs2.find("(", rhs2.find(")"))) + if inner is not None: + b = parse_base(inner) + if b.get("base") and b["bclass"] not in ("other", "nested") and b.get("index") is None: + flows.append(dict(tu=rel, fn=fn, kind="field", dst=lhs, base=b["base"], bclass=b["bclass"], off=b.get("off") or 0)) + for m in RETURN.finditer(body): + v = _strip_parens(m.group(1)) + v = re.sub(r"^\(\s*(?:struct\s+|union\s+)?[A-Za-z_]\w*\s*\**\s*\)\s*", "", v) + if IDENT.match(v) and v not in SCALARS and v not in ("NULL",): + flows.append(dict(tu=rel, fn=fn, kind="return", src=v)) + return fndefs, extern_fns, extern_data, aliases, builtins, attrs, flows, params_of + +# ---------------------------------------------------------------------------------------------------------------------- +# the per-file walker +# ---------------------------------------------------------------------------------------------------------------------- +def walk_file(raw, rel): + masked = sc.mask_text(raw) + line_of = lambda idx: masked.count("\n", 0, idx) + 1 + recs = sc.scan_text(raw, rel, shared_defs=None) + defs = [r for r in recs if r["form"] == "def"] + span_of_line = {} + for d in defs: + for ln in range(d["line"], d["end"] + 1): + span_of_line[ln] = d + definitions, aliases_td, fwd = find_definitions(masked, rel, span_of_line, line_of) + fndefs, extern_fns, extern_data, asm_aliases, builtins, attrs, flows, params_of = find_decls_and_flows(masked, rel, defs, span_of_line, line_of) + sites, raw_counts = find_sites(masked, rel, span_of_line, line_of, params_of) + # every site records the classification of its base in the function's parameter list + abs_casts = sum(1 for s in sites if s.get("bclass") == "abs") + # identifier counts for the dead-name test (type names are identifiers; the canonical header is excluded by the caller) + ident_counts = collections.Counter(m.group(0) for m in re.finditer(r"\b[A-Za-z_]\w*\b", masked)) + ident_counts = {k: v for k, v in ident_counts.items() if not k.startswith(("func_", "D_")) and k not in SCALARS and len(k) > 1} + return dict(rel=rel, definitions=definitions, typedef_aliases=aliases_td, fwd=fwd, sites=sites, raw_counts=dict(raw_counts), ident_counts=ident_counts, + fndefs=fndefs, extern_fns=extern_fns, extern_data=extern_data, asm_aliases=asm_aliases, builtins=builtins, + attrs=attrs, flows=flows, abs_casts=abs_casts, nfuncs=len(defs)) + +def _walk_worker(rel): + raw = (REPO / rel).read_text(errors="surrogateescape") + return walk_file(raw, rel) + +# ---------------------------------------------------------------------------------------------------------------------- +# the struct map: union-find over evidence +# ---------------------------------------------------------------------------------------------------------------------- +class UF: + """Union-find with a per-cluster offset map: a merge that would put two incompatible widths at one offset (or overlap two + fields) is VETOED and counted — a width conflict is evidence of two types, never a union (the Plan agent's rule).""" + def __init__(self): + self.p = {} + self.ev = collections.Counter() + self.veto = collections.Counter() + self.offs = {} # root -> {off: (width, sign)} (the majority per offset at the time of merging) + self.merges_of = {} # root -> Counter(edge kind) — which evidence built the cluster + def add_off(self, x, off, w, sg): + r = self.find(x) + m = self.offs.setdefault(r, {}) + if off not in m: + m[off] = (w, sg) + @staticmethod + def _conflict(ma, mb): + if not ma or not mb: + return False + small, big = (ma, mb) if len(ma) < len(mb) else (mb, ma) + for off, (w, sg) in small.items(): + o = big.get(off) + if o is not None and (o[0] != w or (o[1] != sg and {o[1], sg} - {"p", "s", "u"} == set() and False)): + if o[0] != w: + return True + # overlap: any big field starting inside [off, off+w) or containing off + for k in range(1, w): + if (off + k) in big: + return True + if w > 1: + for back in (1, 2, 3): + o2 = big.get(off - back) + if o2 is not None and o2[0] > back: + return True + return False + def overlap(self, a, b): + """Offsets the two clusters share with equal width — positive evidence that they are one layout.""" + ma, mb = self.offs.get(self.find(a)), self.offs.get(self.find(b)) + if not ma or not mb: + return 0 + small, big = (ma, mb) if len(ma) < len(mb) else (mb, ma) + return sum(1 for off, (w, sg) in small.items() if off in big and big[off][0] == w) + def structured(self, x, n=2): + m = self.offs.get(self.find(x)) + return bool(m) and len(m) >= n + def find(self, x): + p = self.p + if x not in p: + p[x] = x + return x + r = x + while p[r] != r: + r = p[r] + while p[x] != r: + p[x], x = r, p[x] + return r + def union(self, a, b, kind): + ra, rb = self.find(a), self.find(b) + if ra == rb: + return False + ma, mb = self.offs.get(ra), self.offs.get(rb) + if self._conflict(ma, mb): + self.veto[kind] += 1 + return False + if ra > rb: + ra, rb = rb, ra + self.p[rb] = ra + if mb: + m = self.offs.setdefault(ra, {}) + for k, v in mb.items(): + m.setdefault(k, v) + self.offs.pop(rb, None) + mc = self.merges_of.setdefault(ra, collections.Counter()) + mc[kind] += 1 + old = self.merges_of.pop(rb, None) + if old: + mc.update(old) + self.ev[kind] += 1 + return True + +class Identity: + """A function is its DEFINITION, never its bare name (6,247 names carry more than one body text across TUs): a shared header + body is one function fleet-wide (`H:`); a private definition is its normalized-text hash (`F:`, func_/D_ masked — + the cross-address copies of one body share it); a callee with no definition in reach is external to its space (`X::`).""" + def __init__(self, fndefs, tu_aliases, space_of_tu, shared_fn_header): + self.space_of_tu = space_of_tu + self.shared = shared_fn_header + self.by_tu = collections.defaultdict(dict) # tu -> name -> nhash + self.by_name = collections.defaultdict(set) # name -> {nhash} + self.by_alias = collections.defaultdict(dict) # alias -> name -> nhash + for f in fndefs: + self.by_tu[f["tu"]][f["fn"]] = f["nhash"] + self.by_name[f["fn"]].add(f["nhash"]) + for a in tu_aliases.get(f["tu"], ()): + self.by_alias[a].setdefault(f["fn"], f["nhash"]) + self.tu_aliases = tu_aliases + def def_key(self, tu, fn): + h = self.shared.get(fn) + if h and tu.startswith("src/shared/"): + return "H:" + h + nh = self.by_tu.get(tu, {}).get(fn) + if nh: + return "F:" + nh + if h: + return "H:" + h + return "X:" + self.space_of_tu(tu) + ":" + fn + def callee_key(self, tu, callee): + nh = self.by_tu.get(tu, {}).get(callee) + if nh: + return "F:" + nh + h = self.shared.get(callee) + if h: + return "H:" + h + hs = self.by_name.get(callee) + if hs and len(hs) == 1: + return "F:" + next(iter(hs)) + for a in self.tu_aliases.get(tu, ()): + nh = self.by_alias.get(a, {}).get(callee) + if nh: + return "F:" + nh + return "X:" + self.space_of_tu(tu) + ":" + callee + +def build_struct_map(results, tu_aliases, space_of_tu, shared_fn_header, sites_all, ident): + uf = UF() + node_sites = collections.defaultdict(list) # node -> [site idx] + RAW = ("P", "I", "X", "M") + nested_sites = [] # (site idx, inner base node, inner off) — assigned after the flows settle + typed_params = set() # (def key, param index) the callee itself dereferences: the only params flows may enter + pindex = {} + for r in results.values(): + for f in r["fndefs"]: + pindex[(f["tu"], f["fn"])] = {pn: i for i, pn in enumerate(f["pnames"])} + # 1. bases of cast sites (the raw dereference forms only — A and C are counted apart) + for i, s in enumerate(sites_all): + if s["form"] not in RAW: + continue + if s["bclass"] == "nested": + inner = nested_target(s.get("text") or "") + if inner: + ib, ibc, ioff = inner + fk = ident.def_key(s["tu"], s["fn"]) if s.get("fn") else "X:" + ident.space_of_tu(s["tu"]) + ":" + if ibc == "ident": + ibc = "param" if s.get("fn") and ib in pindex.get((s["tu"], s["fn"]), {}) else "local" + nested_sites.append((i, base_node(ib, ibc, fk), ioff)) + continue + node = site_node(s, ident) + if node is None: + continue + s["node"] = node + node_sites[node].append(i) + uf.find(node) + if s.get("index") is None and s.get("width"): + uf.add_off(node, s["off"], s["width"], s["sign"]) + if s["bclass"] == "param" and s.get("fn"): + pi = pindex.get((s["tu"], s["fn"]), {}).get(s["base"]) + if pi is not None: + typed_params.add((ident.def_key(s["tu"], s["fn"]), pi)) + # 1b. a parameter's positional node (P::, what callers flow into) IS its named node (PV::) + for r in results.values(): + for f in r["fndefs"]: + fk = ident.def_key(f["tu"], f["fn"]) + for i, pn in enumerate(f["pnames"]): + uf.union(f"PV:{fk}:{pn}", f"P:{fk}:{i}", "param") + uf.union(f"L:{fk}:{pn}", f"PV:{fk}:{pn}", "param") # a parameter named in a flow is the same base + # 1c. a bare global's declared type seeds its AT node (so `u16 D_A` and `s32 D_B` can never be one type through a reused temp) + for r in results.values(): + for e in r["extern_data"]: + if e["name"].startswith("D_80") and not e["dims"]: + w = scalar_of(e["type"]) + if w and w[0] > 0: + uf.add_off(f"AT:{e['name']}", 0, w[0], w[1]) + # 1d. flow-insensitivity guard: a local that is assigned from more than one distinct source in its function is a reused temp — + # it carries no evidence (m2c's `temp_v0`, `sp10` are reassigned freely); only single-source locals may join two nodes + src_of = collections.defaultdict(set) + for r in results.values(): + for f in r["flows"]: + if f["kind"] in ("assign", "assign&", "ret-of", "field"): + fk = ident.def_key(f["tu"], f["fn"]) + key = (fk, f["dst"]) + if f["kind"] == "assign": + src_of[key].add(("v", f["src"])) + elif f["kind"] == "assign&": + src_of[key].add(("&", f["src"])) + elif f["kind"] == "ret-of": + src_of[key].add(("r", f["callee"])) + else: + src_of[key].add(("f", f["base"], f["off"])) + single = {k for k, v in src_of.items() if len(v) == 1} + # 2. evidence edges + field_edges = [] + for r in results.values(): + for f in r["flows"]: + fk = ident.def_key(f["tu"], f["fn"]) + if f["kind"] in ("assign", "assign&", "ret-of", "field") and (fk, f["dst"]) not in single: + uf.veto[f["kind"] + "-multisource"] += 1 + continue + if f["kind"] in ("arg", "arg&"): + callee = ident.callee_key(f["tu"], f["callee"]) + pnode = f"P:{callee}:{f['i']}" + src = ident_node(f["src"], fk) if f["kind"] == "arg" else f"AT:{f['src']}" + if (callee, f["i"]) not in typed_params: # a conduit parameter (never dereferenced) is no evidence + uf.veto[f["kind"] + "-conduit"] += 1 + elif uf.offs.get(uf.find(src)) and not (uf.structured(pnode) and uf.overlap(src, pnode) >= 1): + # both sides carry offsets: merge only on POSITIVE shared evidence (a helper touching one offset admits nothing) + uf.veto[f["kind"] + "-no-overlap"] += 1 + else: + uf.union(src, pnode, f["kind"]) + elif f["kind"] == "assign": + uf.union(ident_node(f["dst"], fk), ident_node(f["src"], fk), "assign") + elif f["kind"] == "assign&": + uf.union(ident_node(f["dst"], fk), f"AT:{f['src']}", "assign&") + elif f["kind"] == "ret-of": + callee = ident.callee_key(f["tu"], f["callee"]) + uf.union(ident_node(f["dst"], fk), f"R:{callee}", "ret-of") + elif f["kind"] == "return": + uf.union(ident_node(f["src"], fk), f"R:{fk}", "return") + elif f["kind"] == "field": + bnode = base_node(f["base"], f["bclass"], fk) + field_edges.append((ident_node(f["dst"], fk), bnode, f["off"])) + # 3. pointer-field flow to a fixpoint: x = base->off => node(x) ~ FLD::off ; a nested site's base is that field + for _ in range(4): + changed = False + for (dst, bnode, off) in field_edges: + root = uf.find(bnode) + if uf.union(dst, f"FLD:{root}:{off:#x}", "field"): + changed = True + for (i, bnode, off) in nested_sites: + root = uf.find(bnode) + node = f"FLD:{root}:{off:#x}" + s = sites_all[i] + if s.get("node") != node: + if s.get("node"): + if uf.union(s["node"], node, "nested"): + changed = True + else: + s["node"] = node + node_sites[node].append(i) + uf.find(node) + if s.get("index") is None and s.get("width"): + uf.add_off(node, s["off"], s["width"], s["sign"]) + changed = True + # canonicalize FLD nodes whose root spelling went stale + for n in [n for n in list(uf.p) if n.startswith("FLD:")]: + _, oldroot, off = n.split(":", 2) + base_root = uf.find(oldroot) if oldroot in uf.p else oldroot + canon = f"FLD:{base_root}:{off}" + if canon != n and uf.union(n, canon, "field-canon"): + changed = True + if not changed: + break + # 4. clusters -> types + clusters = collections.defaultdict(list) + for node in list(uf.p): + clusters[uf.find(node)].append(node) + types = [] + for root, nodes in clusters.items(): + idxs = [i for n in nodes for i in node_sites.get(n, ())] + if not idxs: + continue + offs = collections.defaultdict(collections.Counter) + fns = set() + for i in idxs: + s = sites_all[i] + fns.add((s["tu"], s["fn"])) + if s.get("index") is None and s.get("width"): + offs[s["off"]][(s["width"], s["sign"])] += 1 + # the layout from the sites: one (width, sign) per offset by majority; a WIDTH conflict is recorded (two types, or a + # reinterpretation); a same-width signedness mix is counted apart (a store's signedness leaves no byte — spelling freedom) + layout, conflicts, sign_mixed = [], [], 0 + for off in sorted(offs): + (w, sg), n = offs[off].most_common(1)[0] + layout.append((off, w, sg, n)) + widths = {a for (a, b) in offs[off]} + if len(widths) > 1: + conflicts.append((off, dict((f"{a}{b}", c) for (a, b), c in offs[off].items()))) + elif len(offs[off]) > 1: + sign_mixed += 1 + # overlapping fields (a u16 at +2 inside an s32 at +0) are conflicts too + prev_end = -1 + for (off, w, sg, n) in layout: + if off < prev_end: + conflicts.append((off, "overlap")) + prev_end = max(prev_end, off + w) + globals_ = sorted(n[3:] for n in nodes if n.startswith("AT:")) + ptr_globals = sorted(n[4:] for n in nodes if n.startswith("PTR:")) + params = sorted(n for n in nodes if n.startswith("P:")) + addr = None + if globals_: + addr = globals_[0].replace("D_", "") + else: + cands = sorted(re.findall(r"func_([0-9A-Fa-f]{8})", " ".join(nodes))) + addr = cands[0] if cands else None + types.append(dict(id=root, name=(f"Unkstruct_{addr}" if addr else f"Unkstruct_{hashlib.sha1(root.encode()).hexdigest()[:8]}"), + sites=len(idxs), bodies=len(fns), nodes=len(nodes), globals_at=globals_[:20], globals_ptr=ptr_globals[:20], + params=len(params), size_hint=(max(o + w for (o, w, _, _) in layout) if layout else 0), + fields=len(layout), layout=layout[:400], conflicts=conflicts[:50], + evidence=collections.Counter(n.split(":")[0] for n in nodes), sign_mixed=sign_mixed, + merges=dict(uf.merges_of.get(root, collections.Counter())), + suspect=(len(layout) > 200 or (layout and max(o for (o, _, _, _) in layout) > 0x2000) or len(conflicts) >= 20))) + types.sort(key=lambda t: -t["sites"]) + return types, uf + +def nested_target(text): + """`*(s32 *)(a0 + 0x20) + 0x1F0` -> ('a0', 'ident'|'global'|…, 0x20): the inner dereference a nested site hangs off.""" + t = text.strip() + m = FORM_P.match(t) or FORM_M.match(t) + if not m: + return None + if t.startswith("M2C_FIELD"): + inner, _ = _paren_body(t, t.find("(")) + args = _split_top(inner or "", ",") + if len(args) != 3: + return None + b = parse_base(args[0]) + k = _int(_strip_parens(args[2])) + if b.get("base") is None or b["bclass"] in ("other", "nested", "member", "addr-of") or k is None: + return None + return b["base"], b["bclass"], (b.get("off") or 0) + k + inner, _ = _paren_body(t, m.end() - 1) + if inner is None: + return None + b = parse_base(inner) + if b.get("base") is None or b["bclass"] in ("other", "nested", "member", "addr-of") or b.get("index") is not None: + return None + return b["base"], b["bclass"], b.get("off") or 0 + +def site_node(s, ident): + b = s.get("base") + bc = s.get("bclass") + if bc in ("other", "nested", "member", "addr-of", "func") or b is None: + return None + fk = ident.def_key(s["tu"], s["fn"]) if s.get("fn") else "X:" + ident.space_of_tu(s["tu"]) + ":" + return base_node(b, bc, fk) + +def base_node(b, bc, fk): + if bc == "abs": + return f"AT:{b}" + if bc == "global": + return f"PTR:{b}" + if bc == "gaddr": + return f"AT:{b}" + if bc == "param": + return f"PV:{fk}:{b}" + if bc == "local": + return f"L:{fk}:{b}" + return f"L:{fk}:{b}" + +def ident_node(name, fk): + if name.startswith("D_80"): + return f"PTR:{name}" + return f"L:{fk}:{name}" + +# ---------------------------------------------------------------------------------------------------------------------- +# the census +# ---------------------------------------------------------------------------------------------------------------------- +def spaces(tu_aliases): + """tu -> symbol space: main (root .c), md_, ov (overlays and the shared ov headers), slot_* (resident modules).""" + def space_of(tu): + if tu.startswith("src/ov_") or tu.startswith("src/shared/ov/"): + return "ov" + if tu.startswith("src/md_"): + return tu.split("/")[1] + if tu.startswith("src/shared/main/"): + return "main" + if tu.startswith("src/shared/slot_"): + return tu.split("/")[2] + als = tu_aliases.get(tu, []) + if als and all(a.startswith("md_") for a in als): + return als[0] + return "main" if not als or "main" in als else als[0] + return space_of + +def run_census(jobs, use_cache=True, out_dir=OUT_DIR_DEFAULT, want_sites=False): + t0 = time.time() + aliases, dirs = sc.fleet_and_dirs() + tu_aliases, headers, orphans = lc.enumerate_files(aliases, dirs) + if orphans: + sys.exit(f"type_census: {len(orphans)} .c file(s) under src/ belong to NO binary's source set (R32): {orphans[:6]}") + inc, inc_tus = lc.header_includers(tu_aliases) + files = sorted(tu_aliases) + list(headers) + sorted(p.relative_to(REPO).as_posix() for p in (REPO / "include").glob("*.h")) + cache_p = REPO / out_dir / "cache" / "walk_cache.json" + cache = {} + if use_cache and cache_p.exists(): + try: + cache = json.loads(cache_p.read_text()) + except Exception: + cache = {} + keys, work = {}, [] + for rel in files: + st = (REPO / rel).stat() + keys[rel] = f"{rel}|{int(st.st_mtime)}|{st.st_size}|{TOOL_STAMP}" + if keys[rel] not in cache: + work.append(rel) + results = {} + if work: + with ProcessPoolExecutor(max_workers=jobs) as ex: + for r in ex.map(_walk_worker, work, chunksize=8): + results[r["rel"]] = r + new_cache = {} + for rel in files: + r = results.get(rel) or cache.get(keys[rel]) + results[rel] = r + new_cache[keys[rel]] = r + if use_cache: + cache_p.parent.mkdir(parents=True, exist_ok=True) + cache_p.write_text(json.dumps(new_cache)) + t_walk = time.time() - t0 + space_of = spaces(tu_aliases) + # ---- shared bodies: fn -> header (one function fleet-wide) + shared_fn_header = {} + for h in headers: + m = re.search(r"/(func_[0-9A-Fa-f]{8})(?:__[0-9a-f]{8}|__t[0-9a-f]{8})?\.h$", h) + if m: + shared_fn_header.setdefault(m.group(1), h) + # ---- 1. definitions + defs_all = [d for r in results.values() for d in r["definitions"]] + td_all = [a for r in results.values() for a in r["typedef_aliases"]] + fwd_all = [f for r in results.values() for f in r["fwd"]] + # name tables: canonical header first, then the file's own definitions (a TU's own wins for its own layouts) + global_defs = {} + for d in defs_all: + if d["file"].startswith("include/") or d["is_canon"]: + for n in d["names"] + ([d["tag"]] if d["tag"] else []): + global_defs.setdefault(n, d) + for a in td_all: + if a["file"].startswith("include/") or a["file"] in CANON_HEADERS: + global_defs.setdefault(a["name"], dict(kind="alias", alias_of=a["alias_of"], alias_stars=a["alias_stars"], alias_dims=a["alias_dims"])) + by_file_defs = collections.defaultdict(dict) + for d in defs_all: + for n in d["names"] + ([d["tag"]] if d["tag"] else []): + by_file_defs[d["file"]].setdefault(n, d) + for a in td_all: + by_file_defs[a["file"]].setdefault(a["name"], dict(kind="alias", alias_of=a["alias_of"], alias_stars=a["alias_stars"], alias_dims=a["alias_dims"])) + layouts = {} + unknown_layout = 0 + for d in defs_all: + scope_defs = dict(global_defs) + scope_defs.update(by_file_defs[d["file"]]) + res = Resolver(scope_defs) + if d["kind"] == "enum": + lay = (4, 4, [(0, 4, "s")]) + else: + lay = res.layout_of_fields(d["fields"], d["kind"], packed=("packed" in d["attrs"])) + d["layout"] = lay + d["lhash"] = layout_hash(lay) + d["size"] = lay[0] if lay else None + if lay is None: + unknown_layout += 1 + # duplicate classes by layout (non-enum, known layout, >= 1 field), exact classes by text + by_lhash = collections.defaultdict(list) + by_text = collections.defaultdict(list) + for d in defs_all: + if d["kind"] == "enum" or d["lhash"] is None or d["nfields"] == 0: + continue + by_lhash[d["lhash"]].append(d) + by_text[d["text_hash"]].append(d) + def names_of(d): + return set(d["names"]) | ({d["tag"]} if d["tag"] else set()) + # duplicate tiers (the Plan agent's stress-test, 2026-09-12): a layout class is ONE type only with evidence beyond the layout — + # tier 1: identical meaningful member names (placeholder names `unk*/f*/field_*/pad*/w/b/…` are wildcards) + # tier 2: opaque copy blocks (every member a placeholder) — merge by (size, align) + # tier 3: layout twins with DIFFERENT meaningful names (`Rect {x,y,w,h}` vs `SVECTOR {vx,vy,vz,pad}`) — NOT duplicates; reported + def name_sig(f): + n = f.get("name") or "" + return "*" if re.match(r"^(?:unk|f|field_?|pad|p|a|b|c|d|w|v|m|t|x|s|u|_|arr|buf|data|val|word|byte|half|tmp|r|q|n)?[0-9A-Fa-fx_]*$", n) else n + def sig_of(d): + return tuple(name_sig(f) for f in d["fields"]) + dup_layout_classes, layout_twins = [], [] + for lh, ds in by_lhash.items(): + nm = set() + for d in ds: + nm |= names_of(d) + if len(nm) <= 1: + continue + sigs = collections.defaultdict(set) + for d in ds: + sg = sig_of(d) + sigs[("*",) if all(x == "*" for x in sg) else sg] |= names_of(d) + # tier 1/2 merge: every wildcard-only definition joins the class; distinct meaningful signatures are separate types + meaningful = {sg: nms for sg, nms in sigs.items() if sg != ("*",)} + opaque = sigs.get(("*",), set()) + rec = dict(lhash=lh, size=ds[0]["size"], n_names=len(nm), n_defs=len(ds), canon=sum(1 for d in ds if d["is_canon"]), + in_c=sum(1 for d in ds if d["file"].endswith(".c")), names=sorted(nm)[:40]) + if len(meaningful) <= 1: + rec["tier"] = 1 if meaningful else 2 + dup_layout_classes.append(rec) + else: + # the opaque names merge with… nothing decidable without flow evidence; each meaningful signature is a type of its own + rec["tier"] = 3 + rec["camps"] = [sorted(nms)[:6] for sg, nms in meaningful.items()] + rec["opaque_names"] = sorted(opaque)[:10] + layout_twins.append(rec) + # names WITHIN one meaningful camp are still duplicates of each other + for sg, nms in meaningful.items(): + if len(nms) > 1: + dup_layout_classes.append(dict(lhash=lh + ":" + hashlib.sha1(repr(sg).encode()).hexdigest()[:6], size=ds[0]["size"], + n_names=len(nms), n_defs=sum(1 for d in ds if sig_of(d) == sg), canon=0, in_c=0, + names=sorted(nms)[:40], tier=1)) + if len(opaque) > 1: + dup_layout_classes.append(dict(lhash=lh + ":opaque", size=ds[0]["size"], n_names=len(opaque), n_defs=0, canon=0, in_c=0, + names=sorted(opaque)[:40], tier=2)) + dup_layout_classes.sort(key=lambda c: -c["n_names"]) + layout_twins.sort(key=lambda c: -c["n_names"]) + exact_classes = {th: len(ds) for th, ds in by_text.items() if len(ds) > 1} + # VARIANT camps: one name, >1 layout + name_layouts = collections.defaultdict(set) + name_defs = collections.defaultdict(int) + for d in defs_all: + if d["kind"] == "enum": + continue + for n in names_of(d): + name_defs[n] += 1 + if d["lhash"]: + name_layouts[n].add(d["lhash"]) + variants = sorted(((n, len(ls)) for n, ls in name_layouts.items() if len(ls) > 1), key=lambda x: -x[1]) + # dead names (canonical header names with no use anywhere else): a use = the name as a token outside its own definition + canon_names = set() + for d in defs_all: + if d["is_canon"]: + canon_names |= names_of(d) + uses = collections.Counter() + for r in results.values(): + if r["rel"] in CANON_HEADERS: + continue + for n, k in r.get("ident_counts", {}).items(): + if n in canon_names: + uses[n] += k + dead = sorted(n for n in canon_names if uses[n] == 0) + in_c_defs = [d for d in defs_all if d["file"].endswith(".c")] + shadow = sorted({n for d in in_c_defs for n in names_of(d) if n in canon_names}) + # ---- 2. sites + sites_all = [] + raw_counts = collections.Counter() + for rel in files: + r = results[rel] + for s in r["sites"]: + s["space"] = space_of(rel) + s["header"] = rel.endswith(".h") + sites_all.append(s) + raw_counts.update(r["raw_counts"]) + by_form = collections.Counter(s["form"] for s in sites_all) + coverage_ok = all(by_form[f] == raw_counts[f] for f in ("P", "I", "X", "M", "A", "C")) + refused = [s for s in sites_all if s.get("refused")] + RAW_FORMS = ("P", "I", "X", "M") # the raw dereference forms — the phase's counter; A (address-of) and C (typed cast-member) are counted apart + by_bclass = collections.Counter(s["bclass"] for s in sites_all if s["form"] in RAW_FORMS) + by_width = collections.Counter(f"{s['sign']}{s['width']}" if s.get("width") else str(s.get("sign")) for s in sites_all if s["form"] in RAW_FORMS) + top_bases = collections.Counter((s["bclass"], s["base"]) for s in sites_all if s["form"] in RAW_FORMS and s.get("base")).most_common(40) + deref_sites = [s for s in sites_all if s["form"] in RAW_FORMS] + bodies_with_sites = len({(s["tu"], s["fn"]) for s in deref_sites if s.get("fn")}) + # the readability series' own regex over the RAW text (continuity with docs/readability-progress.tsv) + import readability_progress as rp + raw_readability = 0 + for rel in files: + if rel.startswith("include/"): + continue + raw_readability += len(rp.CAST.findall((REPO / rel).read_text(errors="surrogateescape"))) + # ---- 3. declarations + fndefs = [f for r in results.values() for f in r["fndefs"]] + extern_fns = [e for r in results.values() for e in r["extern_fns"]] + extern_data = [e for r in results.values() for e in r["extern_data"]] + asm_aliases = [a for r in results.values() for a in r["asm_aliases"]] + builtins = collections.Counter(b["name"] for r in results.values() for b in r["builtins"]) + attrs = collections.Counter(a["name"] for r in results.values() for a in r["attrs"]) + spellings = collections.defaultdict(set) + for e in extern_fns: + spellings[e["name"]].add(e["params"]) + multi_spelled = sum(1 for n, s in spellings.items() if len(s) > 1) + # definitions per name: same name, different body text across TUs (the cross-address / h_text classes) + def_texts = collections.defaultdict(set) + for f in fndefs: + def_texts[f["fn"]].add(f["nhash"]) + multi_body = sum(1 for n, s in def_texts.items() if len(s) > 1) + data_types = collections.defaultdict(set) + for e in extern_data: + data_types[e["name"]].add(e["type"] + e["dims"]) + multi_typed_data = sum(1 for n, s in data_types.items() if len(s) > 1) + # the lying set (argcheck as a library) + import argcheck + ac_defs = argcheck.definitions() + lying = argcheck.scan(ac_defs, only_needed_argpins=False) + lying_kinds = collections.Counter(r["kind"] for r in lying) + lying_callees = len({r["callee"] for r in lying}) + t_decl = time.time() - t0 + # ---- 3b. global blocks: runs of adjacent D_ symbols (address + declared width == the next address) — record candidates + decl_w = collections.defaultdict(collections.Counter) + for e in extern_data: + w = scalar_of(e["type"]) + if w and w[0] > 0: + if e["dims"]: + dims = [_eval_dim(x, {}) for x in re.findall(r"\[([^\]]*)\]", e["dims"])] + if all(dims) and dims: + n = 1 + for x in dims: + n *= x + decl_w[e["name"]][w[0] * n] += 1 + else: + decl_w[e["name"]][w[0]] += 1 + syms = [] + for name, cnt in decl_w.items(): + m = re.match(r"^D_(80[0-9A-Fa-f]{6})$", name) + if m: + syms.append((int(m.group(1), 16), name, cnt.most_common(1)[0][0])) + syms.sort() + global_blocks, run = [], [] + for addr, name, w in syms: + if run and addr == run[-1][0] + run[-1][2]: + run.append((addr, name, w)) + else: + if len(run) >= 4: + global_blocks.append(dict(base=f"{run[0][0]:#x}", size=run[-1][0] + run[-1][2] - run[0][0], members=len(run), + first=run[0][1], last=run[-1][1], widths=dict(collections.Counter(w for _, _, w in run)))) + run = [(addr, name, w)] + if len(run) >= 4: + global_blocks.append(dict(base=f"{run[0][0]:#x}", size=run[-1][0] + run[-1][2] - run[0][0], members=len(run), first=run[0][1], last=run[-1][1], + widths=dict(collections.Counter(w for _, _, w in run)))) + global_blocks.sort(key=lambda b: -b["members"]) + # ---- 4. the struct map + ident = Identity(fndefs, tu_aliases, space_of, shared_fn_header) + types, uf = build_struct_map(results, tu_aliases, space_of, shared_fn_header, sites_all, ident) + explained = sum(t["sites"] for t in types) + unassigned = sum(1 for s in deref_sites if s.get("node") is None) + # ---- 5. controls + ctrl = controls(defs_all, sites_all, extern_data, by_text, name_layouts) + parked = write_parked(out_dir) + # ---- render + write + summary = dict( + head=lc.git_head(), src_stamp=lc.src_stamp(), tool_stamp=TOOL_STAMP, when=time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), + files=len(files), tus=len(tu_aliases), headers=len(headers), functions=sum(r["nfuncs"] for r in results.values()), + definitions=dict(total=len([d for d in defs_all if d["kind"] != "enum"]), enums=sum(1 for d in defs_all if d["kind"] == "enum"), + canon=sum(1 for d in defs_all if d["is_canon"] and d["kind"] != "enum"), + in_c_file_scope=sum(1 for d in in_c_defs if d["scope"] == "file" and d["kind"] != "enum"), + in_c_block_scope=sum(1 for d in in_c_defs if d["scope"] == "block" and d["kind"] != "enum"), + in_shared_fn_headers=sum(1 for d in defs_all if d["file"].startswith("src/shared/") and not d["is_canon"] and d["kind"] != "enum"), + in_include=sum(1 for d in defs_all if d["file"].startswith("include/") and d["kind"] != "enum"), + other_headers=sum(1 for d in defs_all if d["file"].endswith(".h") and not d["is_canon"] and not d["file"].startswith(("include/", "src/shared/")) and d["kind"] != "enum"), + distinct_names=len(name_defs), distinct_layouts=len(by_lhash), unknown_layout=unknown_layout, + dup_layout_classes=len(dup_layout_classes), dup_layout_names=sum(c["n_names"] for c in dup_layout_classes), + dup_tier1=sum(1 for c in dup_layout_classes if c["tier"] == 1), dup_tier2=sum(1 for c in dup_layout_classes if c["tier"] == 2), + layout_twin_classes=len(layout_twins), layout_twin_names=sum(c["n_names"] for c in layout_twins), + exact_classes=len(exact_classes), exact_copies=sum(exact_classes.values()), + variant_names=len(variants), dead_canon_names=len(dead), shadowed_canon_names=len(shadow), + typedef_aliases=len(td_all), forward_decls=len(fwd_all)), + casts=dict(by_form=dict(by_form), raw_counts=dict(raw_counts), coverage_ok=coverage_ok, refused=len(refused), + deref_total=len(deref_sites), addr_form=by_form["A"], typed_cast_member=by_form["C"], bodies=bodies_with_sites, + by_bclass=dict(by_bclass), by_width=dict(by_width.most_common()), readability_raw_regex=raw_readability, + abs_casts=by_bclass.get("abs", 0), top_bases=[[bc, b, n] for ((bc, b), n) in top_bases]), + decls=dict(fn_definitions=len(fndefs), kr_definitions=sum(1 for f in fndefs if f["kr"]), extern_fn_decls=len(extern_fns), + extern_data_decls=len(extern_data), declared_fn_names=len(spellings), multi_spelled_callees=multi_spelled, + multi_body_names=multi_body, data_symbols_declared=len(data_types), multi_typed_data_symbols=multi_typed_data, + asm_label_aliases=len(asm_aliases), asm_label_alias_names=len({a["name"] for a in asm_aliases}), + builtins=dict(builtins), attributes=dict(attrs), + lying=len(lying), lying_callees=lying_callees, lying_kinds=dict(lying_kinds)), + struct_map=dict(types=len(types), explained_sites=explained, deref_sites=len(deref_sites), + explained_pct=round(100.0 * explained / max(1, len(deref_sites)), 1), unassigned_sites=unassigned, + conflicts=sum(1 for t in types if t["conflicts"]), suspect=sum(1 for t in types if t.get("suspect")), + evidence=dict(uf.ev), vetoed=dict(uf.veto), + singletons=sum(1 for t in types if t["bodies"] == 1), multi_body=sum(1 for t in types if t["bodies"] >= 2), + sites_in_multi_body=sum(t["sites"] for t in types if t["bodies"] >= 2), + top=[dict(name=t["name"], sites=t["sites"], bodies=t["bodies"], size_hint=t["size_hint"], fields=t["fields"], + conflicts=len(t["conflicts"]), sign_mixed=t["sign_mixed"], merges=t["merges"], + globals_at=t["globals_at"][:3], globals_ptr=t["globals_ptr"][:3]) for t in types[:25]]), + controls=ctrl, + global_blocks=dict(n=len(global_blocks), members=sum(b["members"] for b in global_blocks), top=global_blocks[:15]), + parked=parked, + timing=dict(walk_s=round(t_walk, 1), decls_s=round(t_decl, 1), total_s=round(time.time() - t0, 1)), + ) + out = REPO / out_dir + out.mkdir(parents=True, exist_ok=True) + (out / "type_census.json").write_text(json.dumps(dict(summary=summary, dup_layout_classes=dup_layout_classes[:300], layout_twins=layout_twins[:100], + variants=variants[:200], dead=dead, shadow=shadow, + refused=[dict(tu=s["tu"], line=s["line"], text=s.get("text"), why=s.get("refused")) for s in refused[:200]]), + indent=1)) + (out / "struct_map.json").write_text(json.dumps(dict(head=summary["head"], types=[dict(t, evidence=dict(t["evidence"])) for t in types]), indent=None)) + # the tracked, compact form: the 300 largest types with their layouts capped at 64 fields (the full map is regenerable) + (out / "struct_map_top.json").write_text(json.dumps(dict(head=summary["head"], when=summary["when"], n_types=len(types), + types=[dict(t, evidence=dict(t["evidence"]), layout=t["layout"][:64], conflicts=t["conflicts"][:12]) for t in types[:300]]), indent=None)) + if want_sites: + with (out / "sites.jsonl").open("w") as fh: + for s in sites_all: + fh.write(json.dumps(s) + "\n") + txt = render(summary, dup_layout_classes, variants, types) + (out / "type_census.txt").write_text(txt) + render_struct_map_md(summary, types, REPO / "docs" / "struct-map.md") + return summary, txt + +# ---------------------------------------------------------------------------------------------------------------------- +# the Phase-36 inheritance: the parked classes, in ONE file with their reasons (the record had none — the reasons were split +# across the S104/S105 log prose, the bank lists' MSG column and each pack's mechanism.md) +# ---------------------------------------------------------------------------------------------------------------------- +PICK_PY = REPO / ".run/P36/s105/pick.py" +PACKS = REPO / ".run/P36/agents" +NEEDS_RX = [("signature", re.compile(r"signature|prototype|\(void\)|returns? the|return type|parameter", re.I)), + ("carve", re.compile(r"\bcarve", re.I)), ("gte", re.compile(r"gte_|stORGB|GTE", re.I)), + ("struct", re.compile(r"\bstruct|\bunion|array|record", re.I)), ("irreducible", re.compile(r"irreducib|PERMANENT|proven.*plain C|NOT closed", re.I))] + +def park_set(): + if PICK_PY.exists(): + m = re.search(r'PARK = set\("""(.*?)"""\.split\(\)\)', PICK_PY.read_text(), re.S) + if m: + return set(m.group(1).split()) + return set() + +def pack_headline(alias, fn): + d = PACKS / f"{alias}__{fn}" + if not d.is_dir(): + # the pack may live under another overlay's alias (the same body): find any pack for the fn + cands = sorted(PACKS.glob(f"*__{fn}")) + if not cands: + return None, None, [] + d = cands[0] + mech = d / "mechanism.md" + head = None + body = "" + if mech.exists(): + body = mech.read_text(errors="replace") + for ln in body.split("\n")[1:12]: + t = ln.strip() + if t and not t.startswith("#"): + head = re.sub(r"\s+", " ", t)[:220] + break + if head is not None: + head = head + " ||| " + re.sub(r"\s+", " ", body[:6000]) # the needs classifier reads the whole note; the TSV keeps the headline + patches = sorted(str(x.relative_to(REPO)) for x in list(d.glob("scratch/*patch*")) + list(d.glob("*.diff")) + list(d.glob("scratch/*.diff")) + list(d.glob("scratch/signature*"))) + return str(d.relative_to(REPO)), head, patches + +def write_parked(out_dir): + try: + import delever_search as ds + except Exception as e: # the P36 ledger machinery is optional for the census proper + return dict(error=str(e)) + park = park_set() + if not park: + return dict(error="no PARK set found in .run/P36/s105/pick.py") + ex = ds.exemplars(include_done=True) + rows = [] + seen_fn = set() + for e in ex: + if e["fn"] not in park: + continue + seen_fn.add(e["fn"]) + pack, head, patches = pack_headline(e["alias"], e["fn"]) + full = head or "" + head = full.split(" ||| ")[0] if head else head + needs = next((k for k, rx in NEEDS_RX if full and rx.search(full)), "?") + rows.append(dict(fn=e["fn"], alias=e["alias"], tu=e["tu"], copies=e["copies"], sites=e["needed"] * e["copies"], needed_per_copy=e["needed"], + kinds=",".join(e["kinds"]), regs=" ".join(e["regs"]), needs=needs, pack=pack or "", patches=";".join(patches), headline=head or "")) + rows.sort(key=lambda r: (-r["sites"], r["fn"])) + banked = sorted(park - seen_fn) # PARK names whose latest ledger verdict is not RESIDUE: minimum-lever banks (their marked sites stay) + out = REPO / out_dir / "parked.tsv" + with out.open("w") as fh: + fh.write("# .run/P37/census/parked.tsv — the Phase-36 parked classes, in one file with their reasons (type_census.write_parked; generated).\n") + fh.write("# A RESIDUE class of the P36 ledger whose exemplar is in .run/P36/s105/pick.py's PARK set; `needs` is read from the pack's mechanism.md headline\n") + fh.write("# (signature | carve | gte | struct | irreducible | ?); `patches` lists the ready patch files. The second block lists PARK names whose latest\n") + fh.write("# ledger verdict is LEVER-FREE (a minimum-lever bank — its surviving marked sites are counted by lever_census, not here).\n") + fh.write("fn\talias\ttu\tcopies\tsites\tneeded_per_copy\tkinds\tregs\tneeds\tpack\tpatches\theadline\n") + for r in rows: + fh.write("\t".join(str(r[k]) for k in ("fn", "alias", "tu", "copies", "sites", "needed_per_copy", "kinds", "regs", "needs", "pack", "patches", "headline")) + "\n") + fh.write("# minimum-lever banks in PARK (LEVER-FREE in the ledger): " + " ".join(banked) + "\n") + return dict(classes=len(rows), bodies=sum(r["copies"] for r in rows), sites=sum(r["sites"] for r in rows), + needs=dict(collections.Counter(r["needs"] for r in rows)), minimum_lever_banks=len(banked), path=str(out.relative_to(REPO))) + +# ---------------------------------------------------------------------------------------------------------------------- +# controls (R39) +# ---------------------------------------------------------------------------------------------------------------------- +PLAYER_BLOCK = { # docs/actor-struct.md + docs/memory-map.md §3.4 — the widths BOTH the record and the matched code agree on + "D_80078E8C": 4, "D_80078EB2": 2, "D_80078EB4": 2, "D_80078EB6": 2, "D_80078EB8": 2} +PLAYER_BLOCK_DOC_DISPUTED = {"D_80078F08": 2, "D_80078F0C": 2} # actor-struct.md says s16 at +0x108/+0x10C; the tree's byte-true declarations decide (reported, not asserted) + +def controls(defs_all, sites_all, extern_data, by_text, name_layouts): + out = {} + # 1. the player block: the fleet's declared width per symbol agrees with the live-verified width + decl_w = collections.defaultdict(collections.Counter) + for e in extern_data: + w = scalar_of(e["type"]) + if w and not e["dims"]: + decl_w[e["name"]][w[0]] += 1 + ok, detail = True, [] + for sym, w in PLAYER_BLOCK.items(): + got = decl_w.get(sym) + maj = got.most_common(1)[0][0] if got else None + detail.append(f"{sym}:{maj if maj else '-'}/{w}") + if maj != w: + ok = False + for sym, w in PLAYER_BLOCK_DOC_DISPUTED.items(): + got = decl_w.get(sym) + maj = got.most_common(1)[0][0] if got else None + detail.append(f"[doc-disputed {sym}: code {maj if maj else '-'} vs actor-struct.md {w}]") + out["player_block_widths"] = dict(ok=ok, detail=" ".join(detail)) + # 2. MATRIX (32) vs MATRIX_L48 (48): two layouts + def size_of(name): + for d in defs_all: + if d["is_canon"] and (name in d["names"] or d["tag"] == name): + return d["size"] + return None + m32, m48 = size_of("MATRIX"), size_of("MATRIX_L48") + out["matrix_layouts"] = dict(ok=(m32 == 32 and m48 == 48), detail=f"MATRIX={m32} MATRIX_L48={m48}") + # 3. Prim_8016E7C8 (defined in ~1,192 .c files under two spellings): ONE layout class covers every definition + prim_defs = [d for d in defs_all if "Prim_8016E7C8" in d["names"] or d["tag"] == "Prim_8016E7C8"] + prim_files = len({d["file"] for d in prim_defs}) + prim_lh = collections.Counter(d["lhash"] for d in prim_defs) + prim_texts = len({d["text_hash"] for d in prim_defs}) + top_lh, top_n = (prim_lh.most_common(1)[0] if prim_lh else (None, 0)) + out["prim_layout_class"] = dict(ok=(prim_files > 1000 and top_n == len(prim_defs) and top_lh is not None), + detail=f"defs in {prim_files} files, {prim_texts} spellings, {top_n}/{len(prim_defs)} in one layout ({prim_defs[0]['size'] if prim_defs else None} B)") + # 4. a TU-CONFLICT ledger row reproduced: D_800A651C is declared with more than one type across TUs + types = collections.Counter(e["type"] + e["dims"] for e in extern_data if e["name"] == "D_800A651C") + out["tu_conflict_D_800A651C"] = dict(ok=(len(types) > 1), detail=" | ".join(f"{t}:{n}" for t, n in types.most_common(5))) + out["ok"] = sum(1 for k, v in out.items() if isinstance(v, dict) and v.get("ok")) + out["n"] = 4 + return out + +# ---------------------------------------------------------------------------------------------------------------------- +# rendering +# ---------------------------------------------------------------------------------------------------------------------- +def render(s, dup_classes, variants, types): + d, c, dc, sm = s["definitions"], s["casts"], s["decls"], s["struct_map"] + L = [] + L.append(f"type_census — {s['when']} at {s['head']} (src stamp {s['src_stamp']}, tool {s['tool_stamp']}); {s['files']} files " + f"({s['tus']} TUs + {s['headers']} headers), {s['functions']} function definitions; walk {s['timing']['walk_s']} s, total {s['timing']['total_s']} s") + L.append("") + L.append(f"DEFINITIONS {d['total']} struct/union bodies (+{d['enums']} enums): canonical header {d['canon']} · .c file-scope {d['in_c_file_scope']} · " + f".c block-scope {d['in_c_block_scope']} · per-function shared headers {d['in_shared_fn_headers']} · other headers {d['other_headers']} · include/ {d['in_include']}") + L.append(f" {d['distinct_names']} distinct names · {d['distinct_layouts']} distinct layouts ({d['unknown_layout']} unresolved) · " + f"{d['dup_layout_classes']} duplicate classes covering {d['dup_layout_names']} names (tier 1 {d['dup_tier1']} same-named, tier 2 {d['dup_tier2']} opaque; " + f"{d['layout_twin_classes']} layout-twin classes / {d['layout_twin_names']} names kept apart) · {d['exact_classes']} exact-text classes / {d['exact_copies']} copies · " + f"{d['variant_names']} VARIANT names (>1 layout) · {d['dead_canon_names']} dead canonical names · {d['shadowed_canon_names']} canonical names redefined in .c · " + f"{d['typedef_aliases']} scalar/alias typedefs · {d['forward_decls']} forward decls") + L.append(f"CAST SITES deref {c['deref_total']} = P {c['by_form'].get('P',0)} + I {c['by_form'].get('I',0)} + X {c['by_form'].get('X',0)} + M {c['by_form'].get('M',0)}" + f" (+ A address-of {c['addr_form']}; + C typed cast-member {c['typed_cast_member']}) in {c['bodies']} bodies · coverage {'OK' if c['coverage_ok'] else 'FAIL'} (raw {c['raw_counts']}) · refused {c['refused']} · " + f"absolute {c['abs_casts']} · readability regex over raw text {c['readability_raw_regex']}") + L.append(f" by base: " + " · ".join(f"{k} {v}" for k, v in sorted(c['by_bclass'].items(), key=lambda x: -x[1]))) + L.append(f" by width: " + " · ".join(f"{k} {v}" for k, v in list(c['by_width'].items())[:10])) + L.append(f" top bases: " + " · ".join(f"{b}({bc}) {n}" for bc, b, n in c['top_bases'][:16])) + L.append(f"DECLARATIONS {dc['fn_definitions']} function definitions ({dc['kr_definitions']} K&R) · {dc['extern_fn_decls']} extern function declarations over " + f"{dc['declared_fn_names']} names ({dc['multi_spelled_callees']} spelled >1 way) · {dc['multi_body_names']} names with >1 body text · " + f"{dc['extern_data_decls']} data externs over {dc['data_symbols_declared']} symbols ({dc['multi_typed_data_symbols']} typed >1 way) · " + f"asm-label aliases {dc['asm_label_aliases']} ({dc['asm_label_alias_names']} names) · builtins {dc['builtins']} · attributes {dc['attributes']}") + L.append(f" lying declarations {dc['lying']} over {dc['lying_callees']} callees {dc['lying_kinds']}") + L.append(f"STRUCT MAP {sm['types']} types explain {sm['explained_sites']}/{sm['deref_sites']} deref sites ({sm['explained_pct']} %); unassigned {sm['unassigned_sites']}; " + f"{sm['multi_body']} types span ≥2 bodies ({sm['sites_in_multi_body']} sites), {sm['singletons']} single-body; types with conflicts {sm['conflicts']}, suspect {sm['suspect']}") + L.append(f" merges by evidence {sm['evidence']}; vetoed {sm['vetoed']}") + for t in sm["top"][:12]: + L.append(f" {t['name']:<22} sites {t['sites']:>7} bodies {t['bodies']:>6} fields {t['fields']:>4} size≥{t['size_hint']:#x} width-conflicts {t['conflicts']} sign-mixed {t['sign_mixed']} " + f"merges {dict(sorted(t['merges'].items(), key=lambda x: -x[1])[:4])} {'at ' + ','.join(t['globals_at']) if t['globals_at'] else ''}{' ptr ' + ','.join(t['globals_ptr']) if t['globals_ptr'] else ''}") + gb = s["global_blocks"] + L.append(f"GLOBAL BLOCKS {gb['n']} runs of ≥4 adjacent scalar D_ symbols ({gb['members']} symbols): " + + " · ".join(f"{b['base']}+{b['size']:#x} ×{b['members']} ({b['first']}..{b['last']})" for b in gb["top"][:8])) + pk = s.get("parked") or {} + if pk.get("error"): + L.append(f"PARKED (P36) not written: {pk['error']}") + else: + L.append(f"PARKED (P36) {pk['classes']} classes / {pk['bodies']} bodies / {pk['sites']} needed sites → {pk['path']}; needs {pk['needs']}; " + f"{pk['minimum_lever_banks']} PARK names are minimum-lever banks") + L.append(f"CONTROLS {s['controls']['ok']}/{s['controls']['n']}: " + " · ".join(f"{k} {'OK' if v['ok'] else 'FAIL'} ({v['detail']})" for k, v in s['controls'].items() if isinstance(v, dict))) + L.append("") + L.append("duplicate-layout classes (top 12): " + " | ".join(f"{cl['size']}B×{cl['n_names']} names ({cl['n_defs']} defs): {', '.join(cl['names'][:4])}…" for cl in dup_classes[:12])) + L.append("VARIANT names (top 12): " + ", ".join(f"{n}×{k}" for n, k in variants[:12])) + L.append("") + L.append(f"type_census: {d['total']} definitions ({d['distinct_layouts']} layouts, {d['dup_layout_classes']} duplicate classes, {d['variant_names']} variant camps) · " + f"{c['deref_total']} cast sites in {c['bodies']} bodies over {len(c['by_bclass'])} base classes (4 forms + A, coverage {'OK' if c['coverage_ok'] else 'FAIL'}) · " + f"{dc['lying']} lying declarations / {dc['lying_callees']} callees · controls {s['controls']['ok']}/{s['controls']['n']}") + L.append(f"struct_map: {sm['types']} types over {sum(1 for _ in [0])*0 + sm['types']} clusters explain {sm['explained_sites']}/{sm['deref_sites']} sites ({sm['explained_pct']} %); " + f"{sm['unassigned_sites']} unassigned sites; {sm['conflicts']} types with conflicts") + return "\n".join(L) + "\n" + +def render_struct_map_md(s, types, path): + sm = s["struct_map"] + L = [f"# The struct map — the types the fleet's cast sites need (Phase 37 T1)", "", + f"> **Generated by `tools/type_census.py` at `{s['head']}` ({s['when']}); never typed (R75).** Every raw pointer-cast dereference in " + f"`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 " + f"by EVIDENCE only — the same global symbol, an argument passed to a callee's parameter, an assignment or return, a pointer field read, " + f"a shared body's fleet-wide identity — never by a similar offset signature. Each cluster is one type the tree needs. Names are " + f"placeholders (`Unkstruct_`: the lowest global instance's address, else the lowest member function's); fields are placeholders " + f"(`unk`) until Phase 38 cites evidence.", "", + f"**{sm['types']} types explain {sm['explained_sites']} of {sm['deref_sites']} dereference sites ({sm['explained_pct']} %); " + f"{sm['unassigned_sites']} sites have a base the census could not classify; {sm['conflicts']} types carry a width conflict.** " + f"Merges by evidence: {', '.join(f'{k} {v}' for k, v in sorted(sm['evidence'].items(), key=lambda x: -x[1]))}.", "", + "| # | type | sites | bodies | fields | size ≥ | width conflicts (+sign mixes) | instance globals | pointer globals |", "|---:|---|---:|---:|---:|---:|---:|---|---|"] + for i, t in enumerate(types[:200], 1): + L.append(f"| {i} | `{t['name']}` | {t['sites']} | {t['bodies']} | {t['fields']} | {t['size_hint']:#x} | {len(t['conflicts'])} (+{t['sign_mixed']} sign) | " + f"{', '.join(t['globals_at'][:4])}{'…' if len(t['globals_at']) > 4 else ''} | {', '.join(t['globals_ptr'][:4])}{'…' if len(t['globals_ptr']) > 4 else ''} |") + L.append("") + L.append(f"*{len(types)} types in all; the table shows the 200 largest by site count. The full map with every type's layout " + f"(offset, width, sign, site count per field) and conflicts is `.run/P37/census/struct_map.json`.*") + path.write_text("\n".join(L) + "\n") + +# ---------------------------------------------------------------------------------------------------------------------- +# selftest +# ---------------------------------------------------------------------------------------------------------------------- +FIXTURE = r'''#include "common.h" +typedef struct { s16 vx, vy, vz, pad; } SV_a; /* 8 bytes */ +typedef struct { short vx; short vy; short vz; short pad; } SV_b; /* the same layout under another name */ +typedef struct { s32 w[8]; } Blk32_x; /* 32 bytes */ +struct Rec { u8 a; u16 b; s32 c; u8 d[3]; }; /* 0,2,4,8..10 -> size 12 */ +typedef struct { s16 : 16; u16 f; } BF; /* a pad bitfield then a u16 -> size 4 */ +typedef struct Node { struct Node *next; s32 v; } Node; +typedef void (*Handler)(s32); +extern u16 D_80078EB4; +extern s32 func_80001000(s32 a0, s16 *p); +extern void func_80002000(); +void f1(s32 a0, s32 *b, s32 c) { + s32 x; + *(u16 *)(a0 + 0x3C) = 5; /* P store, param, +0x3C u16 */ + x = *(s32 *)(a0 + 0x20); /* P load -> pointer field flow */ + *(s16 *)((s32)b + 0x08) += 1; /* P rmw, inner cast */ + *(u8 *)D_80078EB4 = 1; /* I store, global by value */ + *(u32 *)&D_80078EB4 = 2; /* I, global by address */ + ((s16 *)a0)[3] = 7; /* X -> offset 6 */ + M2C_FIELD(a0, u8 *, 0x41) = 0; /* M store */ + func_80001000(a0, (s16 *)(x + 0x10)); /* arg flow a0 -> P:func_80001000:0 ; A form on x */ + *(s32 *)(*(s32 *)(a0 + 0x20) + 0x1F0) = 0; /* nested */ + *(s16 *)0x800A1234 = 0; /* absolute */ + ((Node *)a0)->unk3C = 1; /* C: cast-then-member */ +} +''' + +def selftest(): + res = walk_file(FIXTURE, "src/ov_TEST/t.c") + defs = {n: d for d in res["definitions"] for n in d["names"] + ([d["tag"]] if d["tag"] else [])} + r = Resolver(dict(defs)) + checks = [] + checks.append(("SV_a size 8", r.resolve_name("SV_a")[0] == 8)) + checks.append(("SV_a == SV_b layout", layout_hash(r.resolve_name("SV_a")) == layout_hash(r.resolve_name("SV_b")))) + checks.append(("Blk32_x size 32", r.resolve_name("Blk32_x")[0] == 32)) + checks.append(("struct Rec size 12", r.resolve_name("Rec")[0] == 12)) + checks.append(("BF size 4", r.resolve_name("BF")[0] == 4)) + checks.append(("Node size 8", r.resolve_name("Node")[0] == 8)) + forms = collections.Counter(s["form"] for s in res["sites"]) + checks.append(("forms P5 I3 X1 M1 A1 C1", (forms["P"], forms["I"], forms["X"], forms["M"], forms["A"], forms["C"]) == (5, 3, 1, 1, 1, 1))) + checks.append(("C member", [s for s in res["sites"] if s["form"] == "C"][0]["member"] == "unk3C")) + checks.append(("coverage", dict(forms) == {k: v for k, v in res["raw_counts"].items()})) + p = [s for s in res["sites"] if s["form"] == "P"] + checks.append(("P0 param +0x3C u16 store", p[0]["bclass"] == "param" and p[0]["off"] == 0x3C and p[0]["width"] == 2 and p[0]["access"] == "store")) + checks.append(("P2 inner cast rmw", p[2]["inner_cast"] == "s32" and p[2]["access"] == "rmw" and p[2]["off"] == 8)) + checks.append(("P3 nested", p[3]["bclass"] == "nested")) + checks.append(("I2 abs", [s for s in res["sites"] if s["form"] == "I"][2]["bclass"] == "abs")) + i_ = [s for s in res["sites"] if s["form"] == "I"] + checks.append(("I global / gaddr", i_[0]["bclass"] == "global" and i_[1]["bclass"] == "gaddr")) + x = [s for s in res["sites"] if s["form"] == "X"][0] + checks.append(("X offset 6", x["off"] == 6 and x["bclass"] == "param")) + m = [s for s in res["sites"] if s["form"] == "M"][0] + checks.append(("M off 0x41 store", m["off"] == 0x41 and m["access"] == "store" and m["width"] == 1)) + fl = res["flows"] + checks.append(("arg flow", any(f["kind"] == "arg" and f["src"] == "a0" and f["callee"] == "func_80001000" and f["i"] == 0 for f in fl))) + checks.append(("field flow", any(f["kind"] == "field" and f["dst"] == "x" and f["off"] == 0x20 for f in fl))) + checks.append(("K&R-empty extern", any(e["name"] == "func_80002000" and e["params"] == "" for e in res["extern_fns"]))) + checks.append(("typedef alias fnptr", any(a["name"] == "Handler" and a["fnptr"] for a in res["typedef_aliases"]))) + checks.append(("params of f1", res["fndefs"][0]["pnames"] == ["a0", "b", "c"])) + bad = [n for n, ok in checks if not ok] + print(f"type_census --selftest: {len(checks) - len(bad)}/{len(checks)} checks OK" + (f"; FAILED: {bad}" if bad else "")) + return 0 if not bad else 1 + +# ---------------------------------------------------------------------------------------------------------------------- +def main(): + ap = argparse.ArgumentParser(description=__doc__.split("\n")[0]) + ap.add_argument("-j", "--jobs", type=int, default=os.cpu_count() or 4) + ap.add_argument("--out-dir", default=OUT_DIR_DEFAULT) + ap.add_argument("--no-cache", action="store_true") + ap.add_argument("--sites", action="store_true", help="also write sites.jsonl") + ap.add_argument("--check", action="store_true", help="T8's gate (the invariants; exit 1 on a violation)") + ap.add_argument("--selftest", action="store_true") + ap.add_argument("--quiet", action="store_true") + a = ap.parse_args() + if a.selftest: + sys.exit(selftest()) + summary, txt = run_census(a.jobs, use_cache=not a.no_cache, out_dir=a.out_dir, want_sites=a.sites) + if a.quiet: + print(txt.strip().split("\n")[-2]) + print(txt.strip().split("\n")[-1]) + else: + print(txt) + rc = 0 + if not summary["casts"]["coverage_ok"]: + print("type_census: COVERAGE FAIL — a form's recorded sites != its raw regex count (R32)", file=sys.stderr) + rc = 1 + if summary["controls"]["ok"] != summary["controls"]["n"]: + print("type_census: CONTROL FAIL", file=sys.stderr) + rc = 1 + if a.check: + d = summary["definitions"] + viol = [] + if d["dup_layout_classes"]: + viol.append(f"{d['dup_layout_classes']} duplicate-layout classes") + if d["in_c_file_scope"] + d["in_c_block_scope"] + d["in_shared_fn_headers"] + d["other_headers"]: + viol.append("struct definitions outside the canonical type files") + if summary["casts"]["deref_total"]: + viol.append(f"{summary['casts']['deref_total']} raw cast sites") + if summary["decls"]["lying"]: + viol.append(f"{summary['decls']['lying']} lying declarations") + print("type_census --check: " + ("OK" if not viol else "FAIL — " + "; ".join(viol))) + if viol: + rc = 1 + sys.exit(rc) + +if __name__ == "__main__": + main() diff --git a/decomp-architect/corpus/tools/P9/progress.py b/decomp-architect/corpus/tools/P9/progress.py index 2ad623cea..8418651b8 100644 --- a/decomp-architect/corpus/tools/P9/progress.py +++ b/decomp-architect/corpus/tools/P9/progress.py @@ -1173,6 +1173,26 @@ def fleet(): "hand_asm_routines_in_c_shells": _vb.get("routines"), "hand_asm_routine_sites": _vb.get("sites")} except Exception: _lev = None + # Phase 37 T1: the type census (tools/type_census.py) — the struct debt, the declaration debt and the struct map, published until 0 (R75) + _typ = None + try: + import json as _jt + _tj = ROOT / ".run/P37/census/type_census.json" + if _tj.exists(): + _ts = _jt.loads(_tj.read_text())["summary"] + _d, _c, _dc, _sm = _ts["definitions"], _ts["casts"], _ts["decls"], _ts["struct_map"] + _typ = {"date": _ts.get("when", "")[:10], "head": _ts.get("head"), + "what": "the structs phase's counters: raw pointer-cast dereferences in four forms (P *(T*)(…), I *(T*)ident, X ((T*)e)[i], M M2C_FIELD), " + "struct definitions and their duplicate classes, lying call declarations, and the struct map's types (Phase 37 drives the first three to 0)", + "raw_cast_sites": _c["deref_total"], "raw_cast_forms": _c["by_form"], "raw_cast_bodies": _c["bodies"], + "address_of_sites": _c["addr_form"], "typed_cast_member_sites": _c["typed_cast_member"], "absolute_address_casts": _c["abs_casts"], + "struct_definitions": _d["total"], "canonical_definitions": _d["canon"], "definitions_in_c_files": _d["in_c_file_scope"] + _d["in_c_block_scope"], + "distinct_layouts": _d["distinct_layouts"], "duplicate_classes": _d["dup_layout_classes"], "duplicate_names": _d["dup_layout_names"], + "variant_names": _d["variant_names"], "dead_canonical_names": _d["dead_canon_names"], + "lying_declarations": _dc["lying"], "lying_callees": _dc["lying_callees"], "asm_label_aliases": _dc["asm_label_aliases"], + "multi_spelled_callees": _dc["multi_spelled_callees"], "struct_map_types": _sm["types"], "struct_map_explained_pct": _sm["explained_pct"]} + except Exception: + _typ = None # Phase 35 T5b: the TEXT tier — groups keyed by one normalized text at one address whose bytes vary per binary (verbose members) _tg = [g for g in gs if g.get("tier") == "h_text"] return { @@ -1201,7 +1221,7 @@ def fleet(): "text_tier_groups": len(_tg), "text_tier_instances": sum(len(g.get("members") or []) for g in _tg), "deferred_same_address_texts": (_census.get("deferred_texts") or {}).get("texts"), "deferred_same_address_copies": (_census.get("deferred_texts") or {}).get("sites"), - "levers": _lev}, + "levers": _lev, "types": _typ}, "corrections": [ # dated snapshots of published-number moves with their cause and the command that shows them (R75) {"date": "2026-09-08", "phase": "P35 T2", "metric": "fn_count.total", "delta": 7, "cause": "seven overlays including the whale header but never registered were counted by neither classify nor the registry fold", "command": "tools/progress.py --fleet"}, @@ -1210,7 +1230,11 @@ def fleet(): {"date": "2026-09-08", "phase": "P35 T6", "metric": "counts.real_c_functions", "delta": -10211, "cause": "empty-bodied shared functions were folded into REAL under the macro form; the include form classifies them EMPTY (the instruction-weighted metrics are unchanged)", "command": "tools/progress.py --fleet"}, {"date": "2026-09-09", "phase": "P36 T1b", "metric": "counts.verbatim_asm_bodies", "delta": 22, - "cause": "the §265 lane's IN-FUNCTION form (a whole routine as one __asm__ statement inside a C shell) was invisible to the file-scope detector behind the manifest: 22 scratchpad stack-switch trampolines (one private copy per overlay, 2,682 sites) are hand asm and are listed PERMANENT-VERBATIM; a 23rd asm-body is -O0 compiler output and is listed DECOMPILE-NOW", "command": "tools/lever_census.py; tools/verbatim_check.py"}], + "cause": "the §265 lane's IN-FUNCTION form (a whole routine as one __asm__ statement inside a C shell) was invisible to the file-scope detector behind the manifest: 22 scratchpad stack-switch trampolines (one private copy per overlay, 2,682 sites) are hand asm and are listed PERMANENT-VERBATIM; a 23rd asm-body is -O0 compiler output and is listed DECOMPILE-NOW", "command": "tools/lever_census.py; tools/verbatim_check.py"}, + {"date": "2026-09-12", "phase": "P37 T1", "metric": "counts.types.raw_cast_sites", "delta": 91166, + "cause": "the readability series' regex counted one cast form (`*(T *)(`: 411,850 over raw text); the type census counts four dereference forms over comment-masked text — P 409,007 + I 60,666 (`*(T *)ident`, `*(T *)&D_x`) + X 13,800 (`((T *)e)[i]`) + M 19,543 (`M2C_FIELD`) = 503,016 — with a coverage assertion per form; 18,912 address-of casts and 36,681 typed cast-member accesses are counted apart", "command": "tools/type_census.py"}, + {"date": "2026-09-12", "phase": "P37 T1", "metric": "counts.levers (--strict)", "delta": 6717, + "cause": "lever_census --strict now reads its own words: 6,717 direct GTE coprocessor asm statements in function bodies (Sony's idiom spelled inline instead of as the header's macro call; kinds gte/gte-unsigned, incl. func_8013D9B0's 268 unsigned respellings) are asm statements outside the GTE header — the P36 headline (--check, 4,010) keeps its definition for the series' continuity", "command": "tools/lever_census.py --check --strict"}], "per_binary": [{"binary": r['binary'], "real": r['real'], "shared": r['shared'], "linked": r['linked'], "byte_identical": r['byteident'], "matchable": r['matchable'], "instr_matched": (wm['per_bin'].get(r['binary'], [None, None])[0] if wm else None), @@ -1282,7 +1306,14 @@ def readme_block(d): f"{c['levers']['register_keyword_sites']:,} bare `register` keywords are censused; {c['levers']['gte_sites']:,} GTE coprocessor " f"operations and {c['levers']['hand_asm_routines_in_c_shells']} whole-body assembly routines kept inside C shells " f"({c['levers']['hand_asm_routine_sites']:,} sites; the original's scratchpad stack-switch trampolines, one copy per " - f"overlay, listed in the verbatim manifest) are not levers and are excluded."] if c.get("levers") else []) + [ + f"overlay, listed in the verbatim manifest) are not levers and are excluded."] if c.get("levers") else []) + ([f"", f"Types (Phase 37, snapshot {c['types']['date']}): {c['types']['raw_cast_sites']:,} raw pointer-cast dereferences remain in " + f"{c['types']['raw_cast_bodies']:,} functions (four forms; {c['types']['typed_cast_member_sites']:,} typed cast-member accesses and " + f"{c['types']['address_of_sites']:,} address-of casts counted apart); {c['types']['struct_definitions']:,} struct definitions " + f"({c['types']['canonical_definitions']:,} in the canonical header, {c['types']['definitions_in_c_files']:,} inside `.c` files) over " + f"{c['types']['distinct_layouts']:,} distinct layouts, {c['types']['duplicate_classes']:,} duplicate classes covering " + f"{c['types']['duplicate_names']:,} names; {c['types']['lying_declarations']:,} call declarations narrower than their callee's " + f"definition over {c['types']['lying_callees']:,} callees; the struct map clusters the cast sites into {c['types']['struct_map_types']:,} " + f"types by evidence ({c['types']['struct_map_explained_pct']} % of sites assigned)."] if c.get("types") else []) + [ "", f"_Generated by `tools/progress.py --readme` from `docs/progress.json` — numbers are never typed by hand._", README_END] return "\n".join(out) diff --git a/decomp-architect/tools/MANIFEST.md b/decomp-architect/tools/MANIFEST.md index d913e0c79..7b7c423da 100644 --- a/decomp-architect/tools/MANIFEST.md +++ b/decomp-architect/tools/MANIFEST.md @@ -8,8 +8,8 @@ > its platform SDK need the marked adaptation. The last table lists the tools that are project-only in code (their *shape* is a task; > their code does not transfer). *TODO(platform): the MIPS and PlayStation SDK hard-codes are the ones another platform replaces first.* > -> **Coverage:** 309 tool files in scope (submodules, vendored and downloaded code excluded), of which 309 live rows -> below; per phase: P1 2 · P2 26 · P3 17 · P4 9 · P5 26 · P6 51 · P7 20 · P8 86 · P9 27 · P10 29 · PROJECT-ONLY 16. Superseded tools appear only as pointers to their successor (30 pointer rows); one-offs are omitted. Table rows in all: 339 (the installer checks its copy against this figure). +> **Coverage:** 310 tool files in scope (submodules, vendored and downloaded code excluded), of which 310 live rows +> below; per phase: P1 2 · P2 26 · P3 17 · P4 9 · P5 26 · P6 51 · P7 20 · P8 86 · P9 27 · P10 30 · PROJECT-ONLY 16. Superseded tools appear only as pointers to their successor (30 pointer rows); one-offs are omitted. Table rows in all: 340 (the installer checks its copy against this figure). ## P1 — extraction + manifest @@ -328,6 +328,7 @@ | `ghidra_scripts/ApplySymbols.java` | apply curated names and signatures inside the analysis tool and save | The in-tool half of that mirror: apply curated names and signatures, save on exit | none | | `delever_pack.py` | build the pack one agent needs to read and crack one residue exemplar, without touching the tree | The Phase-36 T7 pack builder (one agent at a time): per residue exemplar of ≥N copies a directory under .run/P36/agents/ with the TU path, the body as the tree has it, the lever-free body (the seed), the residual as mnemonic blocks from delever_search --try (a scratch compile, no tree write), the ledger's NEEDED sites, and every engine attempt with its best moves; ORDER.tsv ranks the exemplars by the best distance reached, then copies. PROMPT.md beside them is the agent's brief. | repo scratch paths; the engine's outcomes and traces | | `lever_census.py` | census every compiler-forcing construct in the C and gate the levers-off phase | The Phase-36 census of lever sites (register pins, asm statements by kind, volatile levers, bare register, asm-label aliases, builtins, attributes; the whole-body hand-asm routines and the GTE ops set apart) derived from the shared-body scanner with a per-token coverage assertion against the raw text, four known-true controls, the !FAKE marker split, --check (0 unmarked pins/asm, 0 orphan markers) and --strict (0 pins, 0 asm) gates, --sites for the delever ledger, a fixture self-test | repo paths, the shared-body scanner | +| `type_census.py` | census every struct definition, raw pointer-cast dereference and function declaration in the C, and cluster the cast sites into the types the tree needs (the struct map) | The Phase-37 type census: struct/union/typedef definitions fleet-wide with o32 layouts (duplicate classes by layout+member evidence, VARIANT camps, dead and shadowed canonical names), every cast site in six forms (P *(T*)(…), I *(T*)ident, X ((T*)e)[i], M M2C_FIELD, A address-of, C typed cast-member) with base class/offset/width/sign/access and a per-form coverage assertion against an independent raw regex, the declaration layer (definitions K&R-read, extern spellings per name, multi-body names, asm-label aliases, builtins, attributes, argcheck's lying set), global blocks (runs of adjacent scalar D_ symbols), four known-true controls, and the struct map — union-find over evidence edges only (same global, argument flow into a parameter the callee dereferences with shared offsets, single-source assignment/return flow, pointer-field flow, body-hash identity) with a width-conflict veto; writes type_census.json/txt, struct_map(.top).json, sites.jsonl (--sites), parked.tsv (the P36 parked classes with reasons) and docs/struct-map.md; --check is the T8 gate; --selftest | repo paths, the shared-body scanner, argcheck, the P36 ledger (parked.tsv) | | `gte_consolidate.py` | consolidate the GTE coprocessor inline-asm macros under Sony's names in one header and sweep dead lever macros | The Phase-36 T5 tool: every asm-bearing macro definition and direct GTE statement SIGNED by the build's own maspsx→as tail (template bytes with operands bound to fixed registers, operand counts, clobbers); one canonical text per signature named by PsyQ's inline_c.h convention (Sony's file supplies names and clobber lists, never opcode words) written to include/gte_inline.h; per file the canonical duplicates deleted, private names renamed, a variant with extra clobbers tried as canonical and kept as a marked _m lever only when the object differs, direct statements rewritten into canonical calls (a concatenation of two included); every file judged through every recipe; --sweep deletes dead asm-bearing macros and drops a compound macro's inner asm when byte-neutral | Sony's inline_c.h path, the census sites, the oracle | | `macro_to_header.py` | convert a shared-body macro header into per-function plain-C headers included at each site | The Phase-35 converter: every DEFINE_ macro body becomes a plain-C header under src/shared// included at its site, the legacy name-parameterized headers converted, the registry text-edited, the macro header deleted; --plan / --apply / --finalize / --verify | the macro form is this project's; a kit-born project shares headers from its first bank | | `asm_verbatim.py` | emit a function's target assembly as an inline-assembly body | Emits the file-scope inline-assembly body form from a disassembly file | repo asm layout | diff --git a/docs/SETUP.md b/docs/SETUP.md index d446299ae..7199c5d4d 100644 --- a/docs/SETUP.md +++ b/docs/SETUP.md @@ -1678,6 +1678,46 @@ fills fast). Nothing is leaking — but the host does not get the memory back on length / priority / hard reg (global.c `allocno_compare`); the callee-saved bank is that order (§501-R). - `tools/cc1_dumps.sh` now also writes the `.loop` dump (`-dL`): the "not desirable"/"moved to"/"matches" lines (§501-R). +### §P37 S106 — 2026-09-12: the type census and the struct map (Phase 37 T1) + +- **`tools/type_census.py [-j N] [--sites] [--check] [--selftest] [--out-dir .run/P37/census]`** — the structs phase's instrument. + One walker per file (worker processes; `share_census.mask_text`/`scan_text` for the masking and the function spans; a per-file cache + keyed by mtime/size/tool stamp under `.run/P37/census/cache/`, ~1 GB, ignored) returns: every struct/union/typedef **definition** with + its o32 layout (`Resolver`: scalars, pointers, arrays, nested aggregates, unions, bit-fields, `packed`; a TU's own definitions first, then + the canonical header, then the SDK sizes) and its layout hash — duplicate classes in three tiers (1 identical meaningful member names, + 2 opaque copy blocks, 3 layout twins with different meaningful names — NOT duplicates, reported), VARIANT camps (one name, several + layouts — §64a), dead canonical names, canonical names redefined in `.c`; every **cast site** in six forms — P `*(T *)(…)`, I + `*(T *)ident` / `*(T *)&D_x` / `*(T *)0x80…`, X `((T *)e)[i]`, M `M2C_FIELD(…)`, A `(T *)(base + k)` (address-of, no deref), C + `((T *)e)->f` (typed cast-member, already a COMPONENT_REF — the rewrite's rung 1) — each with base class (param / local / global by + value `PTR:` / global by address `AT:` / abs / nested / other), offset, accessed width and sign, load/store/rmw, stride; **coverage + (R32)**: per form, sites recorded == an independent raw regex over the same masked text, else exit 1 (the readability regex's + raw-text count is reported beside it for continuity: 411,850 vs 409,007 masked); the **declaration layer** (definitions K&R-read, + 4.28 M extern function declarations over 12,139 names, 3,870 spelled >1 way, 6,415 names with >1 body text, data externs typed >1 + way, asm-label aliases, builtins, attributes, `argcheck`'s lying set); **global blocks** (runs of ≥4 address-adjacent scalar `D_` + symbols by declared width); **the struct map** — union-find over EVIDENCE edges only: a parameter's positional and named nodes; an + argument into a callee parameter ONLY when the callee dereferences it (`typed_params`) AND, when both sides carry offsets, the + callee's map is structured (≥2 offsets) and shares ≥1 offset of equal width with the caller's; single-source locals only (a local + assigned from two sources is a reused temp and carries nothing); `&D_x` → `AT:D_x`; `x = f()` / `return v` through `R:`; pointer-field + reads through `FLD::` to a fixpoint; a **width-conflict veto** on every merge (a bare global's declared type seeds its + node); a function's identity is its body hash (`H:` / `F:` / `X::`), never its name. Per type: + members, sites, bodies, layout from the sites, width conflicts vs same-width sign mixes (a store's signedness leaves no byte), the + evidence mix that built it, a `suspect` flag. Four **controls** (R39): the player block's agreed widths (+ the doc-disputed + `D_80078F08/0C`: the code says 4, `actor-struct.md` says 2), MATRIX 32 vs MATRIX_L48 48, `Prim_8016E7C8` 1,192/1,192 in one layout (two + spellings), the `D_800A651C` TU-CONFLICT row. Writes `type_census.json/.txt`, `struct_map.json` (full, ignored) + `struct_map_top.json` + (300 types, tracked), `sites.jsonl` (`--sites`, 213 MB, ignored), **`parked.tsv`** (the 24 P36 parked classes with copies/sites/kinds, + a `needs` class read from each pack's `mechanism.md`, the patch paths) and **`docs/struct-map.md`** (generated, R75). `--check` is + T8's gate (0 duplicate classes, 0 definitions outside the canonical files, 0 raw casts, 0 lying declarations). Fleet run ≈ 3.5 min at + `-j 16` (walk 49 s). Selftest 21/21 on a fixture with every form. +- **`tools/lever_census.py --check --strict` reads its own words** (S106): a DIRECT GTE coprocessor asm statement in a function body + (kinds `gte` / `gte-unsigned` — Sony's idiom spelled inline instead of as `include/gte_inline.h`'s macro call; 6,717 today, incl. + `func_8013D9B0`'s 268 unsigned respellings) is an asm statement outside the GTE header and FAILS `--strict`; the `--check` headline keeps + the P36 definition (4,010) for the series' continuity. The three stale known-true controls were re-keyed (R85): `func_800226C0` 14 pins, + `func_80178004.h` 8, the bare-name control moved to `func_801896EC` (2) — each counted independently with the gate-1 grep. +- **`tools/readability_progress.py --snapshot`** now REFUSES a stale type census (its `head` must be HEAD) and appends the census's + columns (the four dereference forms, the typed cast-member intermediate, definitions/layouts/duplicate classes, the map); the TSV is + read by column NAME (older rows carry blanks). **`tools/progress.py`** publishes `counts.types` and a "Types (Phase 37, …)" README + sentence, with two dated `corrections` entries (the four-form count vs the one-form regex; `--strict`'s direct GTE statements). + ## Retired tools (`tools/sunset/`, Phase 33.5) *The rows below were moved out of the tool tables above when their tools were retired under the owner's criterion (superseded by a named diff --git a/docs/lever-progress.tsv b/docs/lever-progress.tsv index 06be7aed8..1d5639407 100644 --- a/docs/lever-progress.tsv +++ b/docs/lever-progress.tsv @@ -77,3 +77,4 @@ date milestone head sites_AB pins asm bodies_AB distinct_AB marked unmarked gte_ 2026-09-11 S105 f10 (4) ff22c1fba 4026 2152 1874 1985 679 4026 0 450 314 1589 50 7802 445 76 2026-09-11 S105 f11 (4 + 4 copies) — T7 ENDS 31cf8695f 4010 2141 1869 1980 674 4010 0 450 314 1589 50 7802 445 76 2026-09-11 P36 close (T8/T9 done; the @unstuck retag) 60c4bb1cc 4010 2141 1869 1980 674 4010 0 450 314 1589 50 7802 445 76 +2026-09-11 P37 T1 — the lever census re-keyed (controls) and --strict made literal; 4,010 unchanged 23fc5d215 4010 2141 1869 1980 674 4010 0 450 314 1589 50 7802 445 76 diff --git a/docs/levers.md b/docs/levers.md index f6a769471..d1517662d 100644 --- a/docs/levers.md +++ b/docs/levers.md @@ -123,6 +123,7 @@ counted, not marked). E, F and G belong to the canonical type layer and are the | 2026-09-11 | S105 f10 (4) | 2152 | 1874 | **4026** | 1985 | 679 | 450 | 314 | 1589 | 50 | 7802 | 445 | 76 | `ff22c1fba` | | 2026-09-11 | S105 f11 (4 + 4 copies) — T7 ENDS | 2141 | 1869 | **4010** | 1980 | 674 | 450 | 314 | 1589 | 50 | 7802 | 445 | 76 | `31cf8695f` | | 2026-09-11 | P36 close (T8/T9 done; the @unstuck retag) | 2141 | 1869 | **4010** | 1980 | 674 | 450 | 314 | 1589 | 50 | 7802 | 445 | 76 | `60c4bb1cc` | +| 2026-09-11 | P37 T1 — the lever census re-keyed (controls) and --strict made literal; 4,010 unchanged | 2141 | 1869 | **4010** | 1980 | 674 | 450 | 314 | 1589 | 50 | 7802 | 445 | 76 | `23fc5d215` | ### The campaign — every batch, from the ledger (derived on every render) diff --git a/docs/progress.json b/docs/progress.json index d6c135381..34e986b1d 100644 --- a/docs/progress.json +++ b/docs/progress.json @@ -63,6 +63,38 @@ "gte_sites": 6447, "hand_asm_routines_in_c_shells": 22, "hand_asm_routine_sites": 2682 + }, + "types": { + "date": "2026-09-12", + "head": "23fc5d215", + "what": "the structs phase's counters: raw pointer-cast dereferences in four forms (P *(T*)(\u2026), I *(T*)ident, X ((T*)e)[i], M M2C_FIELD), struct definitions and their duplicate classes, lying call declarations, and the struct map's types (Phase 37 drives the first three to 0)", + "raw_cast_sites": 503016, + "raw_cast_forms": { + "P": 409007, + "I": 60666, + "X": 13800, + "A": 18912, + "C": 36681, + "M": 19543 + }, + "raw_cast_bodies": 69497, + "address_of_sites": 18912, + "typed_cast_member_sites": 36681, + "absolute_address_casts": 0, + "struct_definitions": 7261, + "canonical_definitions": 1179, + "definitions_in_c_files": 5995, + "distinct_layouts": 525, + "duplicate_classes": 206, + "duplicate_names": 2789, + "variant_names": 39, + "dead_canonical_names": 141, + "lying_declarations": 98648, + "lying_callees": 1609, + "asm_label_aliases": 5749, + "multi_spelled_callees": 3870, + "struct_map_types": 18760, + "struct_map_explained_pct": 99.2 } }, "corrections": [ @@ -97,6 +129,22 @@ "delta": 22, "cause": "the \u00a7265 lane's IN-FUNCTION form (a whole routine as one __asm__ statement inside a C shell) was invisible to the file-scope detector behind the manifest: 22 scratchpad stack-switch trampolines (one private copy per overlay, 2,682 sites) are hand asm and are listed PERMANENT-VERBATIM; a 23rd asm-body is -O0 compiler output and is listed DECOMPILE-NOW", "command": "tools/lever_census.py; tools/verbatim_check.py" + }, + { + "date": "2026-09-12", + "phase": "P37 T1", + "metric": "counts.types.raw_cast_sites", + "delta": 91166, + "cause": "the readability series' regex counted one cast form (`*(T *)(`: 411,850 over raw text); the type census counts four dereference forms over comment-masked text \u2014 P 409,007 + I 60,666 (`*(T *)ident`, `*(T *)&D_x`) + X 13,800 (`((T *)e)[i]`) + M 19,543 (`M2C_FIELD`) = 503,016 \u2014 with a coverage assertion per form; 18,912 address-of casts and 36,681 typed cast-member accesses are counted apart", + "command": "tools/type_census.py" + }, + { + "date": "2026-09-12", + "phase": "P37 T1", + "metric": "counts.levers (--strict)", + "delta": 6717, + "cause": "lever_census --strict now reads its own words: 6,717 direct GTE coprocessor asm statements in function bodies (Sony's idiom spelled inline instead of as the header's macro call; kinds gte/gte-unsigned, incl. func_8013D9B0's 268 unsigned respellings) are asm statements outside the GTE header \u2014 the P36 headline (--check, 4,010) keeps its definition for the series' continuity", + "command": "tools/lever_census.py --check --strict" } ], "per_binary": [ diff --git a/docs/readability-progress.tsv b/docs/readability-progress.tsv index ba43153f8..91c9b78e5 100644 --- a/docs/readability-progress.tsv +++ b/docs/readability-progress.tsv @@ -1,3 +1,4 @@ -date label commit definitions narrow_decls callees kr_empty narrow pinned_rows pinned_bodies raw_casts struct_members +date label commit definitions narrow_decls callees kr_empty narrow pinned_rows pinned_bodies raw_casts struct_members deref_all form_P form_I form_X form_M addr_form typed_cast_member struct_defs canon_defs in_c_defs distinct_layouts dup_classes dup_names map_types map_pct 2026-09-10 P36 S102 — after the 16,759 free declaration repairs 51028a78d377b0ff8e0a12a86500ed2ae1f2346d 15626 94001 1564 86701 7300 461 314 414148 173286 2026-09-11 P36 close 7a7f78e255ec3661992d12b5ceb1bd2ec2c1d680 15726 98648 1609 91357 7291 33 25 411850 177902 +2026-09-11 P37 T1 — the type census (four forms, definitions, the map) 23fc5d21592452084c7ae11fed1e98e0a40913a7 15726 98648 1609 91357 7291 33 25 411850 177902 503016 409007 60666 13800 19543 18912 36681 7261 1179 5995 525 206 2789 18760 99.2 diff --git a/docs/readability.md b/docs/readability.md index 8dabb3a89..acd8335d0 100644 --- a/docs/readability.md +++ b/docs/readability.md @@ -3,12 +3,14 @@ > **Generated by `tools/readability_progress.py --snapshot`; never typed (R75).** Companion to > `docs/levers.md`, which counts the compiler-forcing levers. This one counts the two things that are wrong > with the source even where no lever remains: call declarations that are FALSE, and memory read through raw -> pointer casts where the original had a struct. +> pointer casts where the original had a struct. From Phase 37 the row carries the type census's columns +> (`tools/type_census.py`): all four dereference forms, the typed cast-member intermediate, the definitions and the map. -| date | label | commit | lying declarations | of which `()` | of which `(void)` | in a pinned body | raw cast derefs | struct member reads | -|---|---|---|---:|---:|---:|---:|---:|---:| -| 2026-09-10 | P36 S102 — after the 16,759 free declaration repairs | `51028a78d` | 94001 | 86701 | 7300 | 461 | 414148 | 173286 | -| 2026-09-11 | P36 close | `7a7f78e25` | 98648 | 91357 | 7291 | 33 | 411850 | 177902 | +| date | label | commit | lying declarations | of which `()` | of which `(void)` | in a pinned body | raw cast derefs (one form, raw text) | struct member reads | **raw derefs, four forms** | typed cast-member | struct defs (canonical / in .c) | layouts | duplicate classes / names | map types (% sites) | +|---|---|---|---:|---:|---:|---:|---:|---:|---:|---:|---|---:|---|---| +| 2026-09-10 | P36 S102 — after the 16,759 free declaration repairs | `51028a78d` | 94001 | 86701 | 7300 | 461 | 414148 | 173286 | **—** | — | — | — | — | — | +| 2026-09-11 | P36 close | `7a7f78e25` | 98648 | 91357 | 7291 | 33 | 411850 | 177902 | **—** | — | — | — | — | — | +| 2026-09-11 | P37 T1 — the type census (four forms, definitions, the map) | `23fc5d215` | 98648 | 91357 | 7291 | 33 | 411850 | 177902 | **503016** | 36681 | 7261 (1179 / 5995) | 525 | 206 / 2789 | 18760 (99.2 %) | **How to read it.** A *lying declaration* is a call site whose in-scope declaration names fewer parameters than the callee's own definition. It is not a style problem: on this processor an argument travels in a diff --git a/docs/struct-map.md b/docs/struct-map.md new file mode 100644 index 000000000..dbb124411 --- /dev/null +++ b/docs/struct-map.md @@ -0,0 +1,210 @@ +# The struct map — the types the fleet's cast sites need (Phase 37 T1) + +> **Generated by `tools/type_census.py` at `23fc5d215` (2026-09-12T05:44:31Z); 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. + +**18760 types explain 498896 of 503016 dereference sites (99.2 %); 4120 sites have a base the census could not classify; 729 types carry a width conflict.** Merges by evidence: param 36550, assign 14717, arg 10176, field 9623, ret-of 3410, return 1523, assign& 1051, arg& 270. + +| # | type | sites | bodies | fields | size ≥ | width conflicts (+sign mixes) | instance globals | pointer globals | +|---:|---|---:|---:|---:|---:|---:|---|---| +| 1 | `Unkstruct_800B5CB8` | 107598 | 11186 | 134 | 0x10c | 50 (+55 sign) | D_800B5CB8, D_800D3888, D_80181448, D_80181538… | D_8006386C, D_80074778, D_80074780, D_80074784… | +| 2 | `Unkstruct_80126B58` | 65397 | 17047 | 175 | 0x24c | 50 (+60 sign) | D_80126B58 | D_80126B58 | +| 3 | `Unkstruct_8018E71C` | 6745 | 396 | 7 | 0x10 | 0 (+0 sign) | D_8018E71C | | +| 4 | `Unkstruct_dac960ce` | 4464 | 124 | 13 | 0x24c | 0 (+2 sign) | | | +| 5 | `Unkstruct_0caecd54` | 4340 | 124 | 23 | 0xfe | 0 (+1 sign) | | | +| 6 | `Unkstruct_f8ed2b9f` | 4061 | 4061 | 1 | 0x217 | 0 (+0 sign) | | | +| 7 | `Unkstruct_a32b99a1` | 3936 | 123 | 8 | 0x4b | 0 (+1 sign) | | | +| 8 | `Unkstruct_8e3dbe51` | 3930 | 131 | 5 | 0x4c | 0 (+1 sign) | | | +| 9 | `Unkstruct_8014A1B0` | 3778 | 542 | 13 | 0xfe | 0 (+1 sign) | | | +| 10 | `Unkstruct_80128EA8` | 3311 | 632 | 18 | 0x38 | 0 (+13 sign) | | | +| 11 | `Unkstruct_ade2e8a0` | 3271 | 196 | 26 | 0xa4 | 3 (+9 sign) | | | +| 12 | `Unkstruct_1fa9e810` | 3144 | 131 | 3 | 0x49 | 0 (+0 sign) | | | +| 13 | `Unkstruct_30b21035` | 3100 | 124 | 13 | 0x54 | 0 (+0 sign) | | | +| 14 | `Unkstruct_80126948` | 2986 | 832 | 34 | 0xa4 | 0 (+10 sign) | D_80126948, D_80126E60 | D_80114EE8, D_801151D4, D_80126948, D_80126E60… | +| 15 | `Unkstruct_adc0bee4` | 2646 | 126 | 8 | 0x34 | 0 (+3 sign) | | | +| 16 | `Unkstruct_198fc7cc` | 2580 | 129 | 16 | 0x38 | 3 (+1 sign) | | | +| 17 | `Unkstruct_801439FC` | 2489 | 981 | 57 | 0x10c | 9 (+22 sign) | | | +| 18 | `Unkstruct_80130D48` | 2382 | 587 | 25 | 0x64 | 6 (+3 sign) | | D_80072C84, D_80078E78 | +| 19 | `Unkstruct_ed8f1335` | 2356 | 124 | 18 | 0x24 | 0 (+0 sign) | | | +| 20 | `Unkstruct_8016B4F8` | 2140 | 535 | 5 | 0x30 | 0 (+0 sign) | | | +| 21 | `Unkstruct_80139C7C` | 2111 | 265 | 14 | 0x44 | 0 (+3 sign) | | | +| 22 | `Unkstruct_b047cdf2` | 2108 | 124 | 6 | 0x20 | 0 (+0 sign) | | | +| 23 | `Unkstruct_2729e670` | 2091 | 123 | 6 | 0x4b | 0 (+0 sign) | | | +| 24 | `Unkstruct_dd542e54` | 2016 | 126 | 7 | 0x18 | 0 (+0 sign) | | | +| 25 | `Unkstruct_f49880fd` | 2000 | 125 | 6 | 0x54 | 0 (+1 sign) | | | +| 26 | `Unkstruct_a8d34bce` | 1948 | 1948 | 1 | 0x215 | 0 (+0 sign) | | | +| 27 | `Unkstruct_568f7bda` | 1875 | 125 | 9 | 0x38 | 0 (+0 sign) | | | +| 28 | `Unkstruct_8016DF5C` | 1791 | 131 | 9 | 0x38 | 0 (+3 sign) | | | +| 29 | `Unkstruct_f1f49381` | 1764 | 126 | 10 | 0x38 | 0 (+0 sign) | | | +| 30 | `Unkstruct_8011F7A8` | 1746 | 271 | 7 | 0x11e | 0 (+0 sign) | D_8011F7A8 | | +| 31 | `Unkstruct_84612d18` | 1722 | 123 | 8 | 0x4b | 0 (+0 sign) | | | +| 32 | `Unkstruct_57db4d07` | 1664 | 128 | 13 | 0x0 | 13 (+0 sign) | | | +| 33 | `Unkstruct_4692fc17` | 1612 | 124 | 4 | 0x1e | 0 (+3 sign) | | | +| 34 | `Unkstruct_eda88e53` | 1596 | 133 | 6 | 0x54 | 6 (+0 sign) | | | +| 35 | `Unkstruct_8012D3B4` | 1588 | 183 | 23 | 0x24 | 16 (+9 sign) | | D_80074808, D_800A5E60 | +| 36 | `Unkstruct_4e09b6d9` | 1572 | 131 | 9 | 0x32 | 0 (+1 sign) | | | +| 37 | `Unkstruct_23e45db5` | 1512 | 126 | 11 | 0x16 | 0 (+0 sign) | | | +| 38 | `Unkstruct_47470ce3` | 1488 | 124 | 6 | 0x1e | 0 (+0 sign) | | | +| 39 | `Unkstruct_b5c0372a` | 1441 | 131 | 9 | 0x58 | 0 (+0 sign) | | | +| 40 | `Unkstruct_0980b9f0` | 1441 | 131 | 4 | 0x49 | 0 (+0 sign) | | | +| 41 | `Unkstruct_ba6e2e9f` | 1439 | 1439 | 1 | 0x4 | 0 (+0 sign) | | | +| 42 | `Unkstruct_a68f6d03` | 1364 | 124 | 9 | 0x14 | 0 (+0 sign) | | | +| 43 | `Unkstruct_8fdd92d1` | 1300 | 130 | 4 | 0x24 | 2 (+0 sign) | | | +| 44 | `Unkstruct_110cf29e` | 1250 | 125 | 7 | 0x2c | 0 (+0 sign) | | | +| 45 | `Unkstruct_4db8cec8` | 1240 | 124 | 8 | 0x36 | 0 (+0 sign) | | | +| 46 | `Unkstruct_f0bc3b7a` | 1240 | 124 | 7 | 0x100 | 0 (+0 sign) | | | +| 47 | `Unkstruct_297e7547` | 1240 | 124 | 10 | 0x58 | 0 (+0 sign) | | | +| 48 | `Unkstruct_dd59c999` | 1240 | 124 | 6 | 0x38 | 0 (+2 sign) | | | +| 49 | `Unkstruct_919ca3ea` | 1230 | 123 | 6 | 0x10 | 0 (+0 sign) | | | +| 50 | `Unkstruct_a459e3e5` | 1220 | 122 | 6 | 0x34 | 0 (+0 sign) | | | +| 51 | `Unkstruct_8014CA00` | 1219 | 407 | 4 | 0x2e | 0 (+3 sign) | | | +| 52 | `Unkstruct_74787850` | 1206 | 1073 | 1 | 0x2 | 0 (+1 sign) | | D_801152A8 | +| 53 | `Unkstruct_f9a7989e` | 1179 | 131 | 3 | 0x36 | 0 (+1 sign) | | | +| 54 | `Unkstruct_0b30043d` | 1128 | 376 | 3 | 0x5e | 0 (+0 sign) | | | +| 55 | `Unkstruct_301381d4` | 1116 | 124 | 3 | 0x36 | 0 (+1 sign) | | | +| 56 | `Unkstruct_0ced46e2` | 1116 | 124 | 5 | 0xfe | 0 (+0 sign) | | | +| 57 | `Unkstruct_f153f338` | 1107 | 123 | 5 | 0x34 | 0 (+0 sign) | | | +| 58 | `Unkstruct_50a3f6b4` | 1040 | 130 | 3 | 0x36 | 0 (+0 sign) | | | +| 59 | `Unkstruct_800B9A02` | 992 | 434 | 1 | 0x2 | 0 (+0 sign) | D_800B9A02 | | +| 60 | `Unkstruct_f74e3af7` | 992 | 124 | 5 | 0xfe | 0 (+0 sign) | | | +| 61 | `Unkstruct_6b138cb0` | 931 | 133 | 7 | 0x20 | 1 (+0 sign) | | | +| 62 | `Unkstruct_b774eeeb` | 917 | 131 | 4 | 0x41 | 0 (+0 sign) | | | +| 63 | `Unkstruct_6d856e9d` | 917 | 131 | 5 | 0x1e | 3 (+1 sign) | | | +| 64 | `Unkstruct_d0c6cce6` | 917 | 131 | 4 | 0x38 | 0 (+0 sign) | | | +| 65 | `Unkstruct_859b4fab` | 910 | 130 | 4 | 0xb0 | 0 (+0 sign) | | | +| 66 | `Unkstruct_801463A0` | 907 | 210 | 13 | 0x54 | 0 (+1 sign) | | D_80126B78 | +| 67 | `Unkstruct_6d3f3f5d` | 889 | 127 | 6 | 0x38 | 0 (+0 sign) | | | +| 68 | `Unkstruct_1e86c313` | 882 | 126 | 4 | 0x8 | 0 (+0 sign) | | | +| 69 | `Unkstruct_a41ec127` | 882 | 126 | 6 | 0x38 | 0 (+0 sign) | | | +| 70 | `Unkstruct_3f697924` | 875 | 125 | 5 | 0x38 | 0 (+0 sign) | | | +| 71 | `Unkstruct_e505dcd3` | 868 | 124 | 4 | 0x8 | 0 (+0 sign) | | | +| 72 | `Unkstruct_fe02110c` | 868 | 124 | 3 | 0x10 | 0 (+2 sign) | | | +| 73 | `Unkstruct_92677d11` | 861 | 123 | 5 | 0x240 | 0 (+0 sign) | | | +| 74 | `Unkstruct_86465c2c` | 861 | 123 | 7 | 0x20 | 0 (+0 sign) | | | +| 75 | `Unkstruct_ffd2397c` | 854 | 122 | 5 | 0x34 | 0 (+0 sign) | | | +| 76 | `Unkstruct_17738e2c` | 821 | 30 | 32 | 0xa4 | 12 (+5 sign) | | | +| 77 | `Unkstruct_801270C0` | 821 | 820 | 1 | 0x2 | 0 (+0 sign) | D_801270C0 | | +| 78 | `Unkstruct_2932a0a7` | 798 | 133 | 6 | 0x12 | 5 (+0 sign) | | | +| 79 | `Unkstruct_0a8f505b` | 790 | 83 | 14 | 0x10c | 0 (+5 sign) | | | +| 80 | `Unkstruct_12f4cee2` | 786 | 131 | 5 | 0x28 | 0 (+0 sign) | | | +| 81 | `Unkstruct_d2490774` | 786 | 131 | 3 | 0xb0 | 0 (+0 sign) | | | +| 82 | `Unkstruct_80135260` | 780 | 130 | 3 | 0x54 | 0 (+0 sign) | | | +| 83 | `Unkstruct_b196f9c0` | 768 | 128 | 5 | 0x14 | 1 (+0 sign) | | | +| 84 | `Unkstruct_36c327cf` | 762 | 127 | 2 | 0x18 | 0 (+0 sign) | | | +| 85 | `Unkstruct_6cd0e445` | 756 | 126 | 2 | 0x10 | 0 (+0 sign) | | | +| 86 | `Unkstruct_c0b9c5d5` | 750 | 125 | 6 | 0x10 | 0 (+0 sign) | | | +| 87 | `Unkstruct_64375b18` | 744 | 124 | 5 | 0xa0 | 0 (+0 sign) | | | +| 88 | `Unkstruct_438adcd1` | 744 | 124 | 5 | 0x14 | 0 (+0 sign) | | | +| 89 | `Unkstruct_97b6f459` | 744 | 124 | 5 | 0x28 | 0 (+0 sign) | | | +| 90 | `Unkstruct_38975874` | 744 | 124 | 4 | 0x84 | 0 (+0 sign) | | | +| 91 | `Unkstruct_76b1caf3` | 744 | 124 | 2 | 0x3 | 0 (+0 sign) | | | +| 92 | `Unkstruct_8016BBE0` | 690 | 139 | 9 | 0x38 | 0 (+0 sign) | | | +| 93 | `Unkstruct_80146A6C` | 680 | 137 | 7 | 0x2c | 0 (+0 sign) | | | +| 94 | `Unkstruct_800AF630` | 671 | 537 | 3 | 0xa3dc | 0 (+0 sign) | D_800AF630 | | +| 95 | `Unkstruct_8012C284` | 668 | 533 | 1 | 0x2 | 0 (+1 sign) | | D_80126720 | +| 96 | `Unkstruct_80115128` | 667 | 534 | 1 | 0x2 | 0 (+0 sign) | D_80115128 | | +| 97 | `Unkstruct_3271c3cc` | 665 | 133 | 3 | 0x5e | 0 (+0 sign) | | | +| 98 | `Unkstruct_61789347` | 665 | 133 | 0 | 0x0 | 0 (+0 sign) | | | +| 99 | `Unkstruct_05fa9429` | 665 | 133 | 0 | 0x0 | 0 (+0 sign) | | | +| 100 | `Unkstruct_801345F8` | 665 | 133 | 0 | 0x0 | 0 (+0 sign) | | | +| 101 | `Unkstruct_801345F8` | 665 | 133 | 0 | 0x0 | 0 (+0 sign) | | | +| 102 | `Unkstruct_801152A0` | 665 | 399 | 1 | 0x2 | 0 (+0 sign) | D_801152A0 | | +| 103 | `Unkstruct_89230a8b` | 665 | 133 | 5 | 0x1c | 0 (+0 sign) | | | +| 104 | `Unkstruct_fdd04bae` | 650 | 130 | 3 | 0x38 | 0 (+0 sign) | | | +| 105 | `Unkstruct_eb8b6fbf` | 645 | 129 | 5 | 0xfe | 0 (+0 sign) | | | +| 106 | `Unkstruct_90d0825c` | 645 | 129 | 5 | 0x1c | 1 (+0 sign) | | | +| 107 | `Unkstruct_27c177f1` | 645 | 129 | 4 | 0x34 | 0 (+0 sign) | | | +| 108 | `Unkstruct_4f9f60b8` | 630 | 126 | 4 | 0x78 | 0 (+0 sign) | | | +| 109 | `Unkstruct_7a31a22f` | 630 | 126 | 2 | 0x19c | 0 (+0 sign) | | | +| 110 | `Unkstruct_187abeff` | 630 | 126 | 5 | 0x68 | 0 (+0 sign) | | | +| 111 | `Unkstruct_dafba7ce` | 630 | 126 | 4 | 0x20 | 0 (+0 sign) | | | +| 112 | `Unkstruct_20d4328b` | 630 | 126 | 4 | 0x38 | 0 (+0 sign) | | | +| 113 | `Unkstruct_d94ab931` | 625 | 125 | 4 | 0x6 | 2 (+1 sign) | | | +| 114 | `Unkstruct_7ef9c9ef` | 625 | 125 | 4 | 0x6 | 2 (+1 sign) | | | +| 115 | `Unkstruct_8ce68494` | 625 | 125 | 2 | 0x1a | 0 (+0 sign) | | | +| 116 | `Unkstruct_57ae03d1` | 620 | 124 | 2 | 0x2c | 0 (+0 sign) | | | +| 117 | `Unkstruct_af1e9d57` | 620 | 248 | 4 | 0x64 | 0 (+0 sign) | | | +| 118 | `Unkstruct_172cbd29` | 620 | 124 | 2 | 0x1fc | 0 (+0 sign) | | | +| 119 | `Unkstruct_2c2c1d2e` | 620 | 124 | 4 | 0x24 | 0 (+0 sign) | | | +| 120 | `Unkstruct_aaf4c4dd` | 615 | 615 | 1 | 0x16 | 0 (+0 sign) | | | +| 121 | `Unkstruct_293d71dc` | 600 | 75 | 0 | 0x0 | 0 (+0 sign) | | | +| 122 | `Unkstruct_78eaa73c` | 553 | 7 | 15 | 0x10a | 0 (+7 sign) | | | +| 123 | `Unkstruct_8011512E` | 532 | 133 | 1 | 0x2 | 0 (+0 sign) | D_8011512E | | +| 124 | `Unkstruct_8016BFA8` | 532 | 133 | 4 | 0x24 | 0 (+0 sign) | | | +| 125 | `Unkstruct_30befa8c` | 520 | 130 | 3 | 0xfe | 0 (+0 sign) | | | +| 126 | `Unkstruct_00ddc7c9` | 520 | 130 | 1 | 0x2 | 1 (+0 sign) | | | +| 127 | `Unkstruct_01082f7a` | 520 | 520 | 1 | 0x4 | 0 (+0 sign) | | | +| 128 | `Unkstruct_db0ee441` | 516 | 129 | 4 | 0x38 | 0 (+0 sign) | | | +| 129 | `Unkstruct_7476116e` | 516 | 129 | 1 | 0x4 | 0 (+0 sign) | | | +| 130 | `Unkstruct_290ce261` | 504 | 126 | 3 | 0xfe | 0 (+0 sign) | | | +| 131 | `Unkstruct_d6100faa` | 504 | 126 | 3 | 0x20 | 0 (+0 sign) | | | +| 132 | `Unkstruct_5ebcbddc` | 504 | 126 | 3 | 0xe | 0 (+0 sign) | | | +| 133 | `Unkstruct_7cb40b10` | 500 | 500 | 1 | 0x4 | 0 (+0 sign) | | | +| 134 | `Unkstruct_4e078af8` | 496 | 124 | 2 | 0x4 | 0 (+2 sign) | | | +| 135 | `Unkstruct_494cef68` | 496 | 124 | 2 | 0x188 | 0 (+0 sign) | | | +| 136 | `Unkstruct_93df0322` | 496 | 124 | 4 | 0x38 | 0 (+0 sign) | | | +| 137 | `Unkstruct_3b2b6e45` | 496 | 124 | 4 | 0x38 | 0 (+0 sign) | | | +| 138 | `Unkstruct_31283f15` | 492 | 123 | 3 | 0x6 | 0 (+0 sign) | | | +| 139 | `Unkstruct_a05973fa` | 492 | 123 | 3 | 0x2c | 0 (+0 sign) | | | +| 140 | `Unkstruct_48c11385` | 441 | 21 | 5 | 0x68 | 0 (+0 sign) | | | +| 141 | `Unkstruct_a55a221e` | 428 | 428 | 1 | 0x215 | 0 (+0 sign) | | | +| 142 | `Unkstruct_02864986` | 420 | 420 | 1 | 0x2 | 0 (+1 sign) | | D_80115158 | +| 143 | `Unkstruct_80131B14` | 404 | 383 | 5 | 0x32 | 0 (+0 sign) | | | +| 144 | `Unkstruct_8011511A` | 404 | 146 | 1 | 0x2 | 0 (+1 sign) | D_8011511A | | +| 145 | `Unkstruct_8016B5C0` | 399 | 133 | 2 | 0x1c | 0 (+0 sign) | | | +| 146 | `Unkstruct_8016BFA8` | 399 | 133 | 3 | 0x6 | 0 (+0 sign) | | | +| 147 | `Unkstruct_8011F7F0` | 399 | 133 | 3 | 0x42 | 0 (+0 sign) | D_8011F7F0 | | +| 148 | `Unkstruct_2552224c` | 393 | 131 | 3 | 0x10 | 0 (+0 sign) | | | +| 149 | `Unkstruct_1649b9a7` | 392 | 28 | 8 | 0x38 | 0 (+2 sign) | | | +| 150 | `Unkstruct_ea5ed765` | 390 | 130 | 1 | 0xdb | 0 (+0 sign) | | | +| 151 | `Unkstruct_80135260` | 390 | 130 | 3 | 0x6 | 0 (+0 sign) | | | +| 152 | `Unkstruct_a472a6ba` | 387 | 129 | 3 | 0x1c | 0 (+0 sign) | | | +| 153 | `Unkstruct_630777a3` | 387 | 258 | 2 | 0x5 | 0 (+0 sign) | | | +| 154 | `Unkstruct_f2440762` | 384 | 128 | 1 | 0x4 | 0 (+0 sign) | | | +| 155 | `Unkstruct_80164BDC` | 384 | 128 | 5 | 0x64 | 0 (+1 sign) | | | +| 156 | `Unkstruct_8c2ab96e` | 384 | 128 | 3 | 0x8 | 0 (+0 sign) | | | +| 157 | `Unkstruct_d448adea` | 384 | 48 | 0 | 0x0 | 0 (+0 sign) | | | +| 158 | `Unkstruct_e79a0730` | 378 | 126 | 2 | 0x24 | 0 (+0 sign) | | | +| 159 | `Unkstruct_1a8e907f` | 378 | 126 | 1 | 0x4 | 0 (+0 sign) | | | +| 160 | `Unkstruct_e1c73ac0` | 378 | 126 | 3 | 0x6 | 0 (+0 sign) | | | +| 161 | `Unkstruct_8ba4da0a` | 378 | 126 | 3 | 0x1c | 0 (+0 sign) | | | +| 162 | `Unkstruct_93e44aed` | 378 | 126 | 2 | 0x1c | 0 (+0 sign) | | | +| 163 | `Unkstruct_24687968` | 378 | 126 | 3 | 0xe | 0 (+0 sign) | | | +| 164 | `Unkstruct_89684c99` | 375 | 125 | 3 | 0x6 | 0 (+0 sign) | | | +| 165 | `Unkstruct_831a2d3a` | 375 | 125 | 2 | 0x24 | 0 (+0 sign) | | | +| 166 | `Unkstruct_89f82b52` | 372 | 124 | 3 | 0x1ca | 0 (+0 sign) | | | +| 167 | `Unkstruct_924d03d6` | 372 | 124 | 3 | 0x6 | 0 (+0 sign) | | | +| 168 | `Unkstruct_7fd6458b` | 372 | 124 | 1 | 0x40 | 0 (+0 sign) | | | +| 169 | `Unkstruct_92a372de` | 372 | 124 | 2 | 0x24 | 0 (+0 sign) | | | +| 170 | `Unkstruct_4a31f01c` | 372 | 124 | 3 | 0x1c | 0 (+0 sign) | | | +| 171 | `Unkstruct_39de3511` | 372 | 124 | 3 | 0x12 | 0 (+0 sign) | | | +| 172 | `Unkstruct_1b4331f0` | 369 | 123 | 3 | 0x5e | 0 (+0 sign) | | | +| 173 | `Unkstruct_75e9a6af` | 369 | 123 | 3 | 0x10 | 0 (+0 sign) | | | +| 174 | `Unkstruct_b39064df` | 366 | 14 | 24 | 0xa2 | 3 (+3 sign) | | | +| 175 | `Unkstruct_5c635b4b` | 364 | 14 | 13 | 0x34 | 0 (+0 sign) | | | +| 176 | `Unkstruct_800AE620` | 325 | 322 | 0 | 0x0 | 0 (+0 sign) | D_800AE620 | | +| 177 | `Unkstruct_814e4d87` | 300 | 75 | 0 | 0x0 | 0 (+0 sign) | | | +| 178 | `Unkstruct_09b02bee` | 300 | 75 | 2 | 0x4 | 0 (+0 sign) | | | +| 179 | `Unkstruct_1ef3b11b` | 280 | 10 | 7 | 0x10c | 0 (+1 sign) | | | +| 180 | `Unkstruct_80115188` | 274 | 270 | 1 | 0x4 | 0 (+0 sign) | D_80115188 | | +| 181 | `Unkstruct_80129CF8` | 273 | 90 | 33 | 0xa435 | 0 (+5 sign) | | D_800AF630 | +| 182 | `Unkstruct_a2d6c72b` | 273 | 21 | 4 | 0x100 | 0 (+0 sign) | | | +| 183 | `Unkstruct_80078EB4` | 270 | 137 | 1 | 0x2 | 0 (+0 sign) | D_80078EB4 | | +| 184 | `Unkstruct_80115118` | 268 | 265 | 1 | 0x2 | 0 (+1 sign) | D_80115118 | | +| 185 | `Unkstruct_801152B0` | 268 | 268 | 0 | 0x0 | 0 (+0 sign) | D_801152B0 | | +| 186 | `Unkstruct_801269F4` | 267 | 134 | 1 | 0x2 | 0 (+0 sign) | D_801269F4 | | +| 187 | `Unkstruct_8012C1DC` | 267 | 134 | 3 | 0x1c | 0 (+0 sign) | | | +| 188 | `Unkstruct_8011515C` | 267 | 267 | 1 | 0x2 | 0 (+1 sign) | D_8011515C | | +| 189 | `Unkstruct_640f8122` | 266 | 133 | 1 | 0x2e | 0 (+0 sign) | | | +| 190 | `Unkstruct_02495693` | 266 | 133 | 2 | 0x1e | 0 (+0 sign) | | | +| 191 | `Unkstruct_3f149285` | 266 | 133 | 1 | 0x2 | 0 (+0 sign) | | | +| 192 | `Unkstruct_a310cf42` | 266 | 133 | 1 | 0x4 | 0 (+0 sign) | | | +| 193 | `Unkstruct_80115124` | 266 | 266 | 1 | 0x2 | 0 (+0 sign) | D_80115124 | | +| 194 | `Unkstruct_800D4BE0` | 266 | 133 | 1 | 0x4 | 0 (+0 sign) | D_800D4BE0 | | +| 195 | `Unkstruct_800D4F8C` | 266 | 133 | 1 | 0x4 | 0 (+0 sign) | D_800D4F8C | | +| 196 | `Unkstruct_8016BFA8` | 266 | 133 | 0 | 0x0 | 0 (+0 sign) | | | +| 197 | `Unkstruct_8016BFA8` | 266 | 133 | 0 | 0x0 | 0 (+0 sign) | | | +| 198 | `Unkstruct_80176734` | 266 | 133 | 1 | 0x2c | 0 (+0 sign) | | D_8011F7B0 | +| 199 | `Unkstruct_80126B62` | 265 | 252 | 2 | 0xe | 0 (+1 sign) | D_80126B62 | | +| 200 | `Unkstruct_76f4299b` | 262 | 131 | 1 | 0x4a | 0 (+0 sign) | | | + +*18760 types in all; the table shows the 200 largest by site count. The full map with every type's layout (offset, width, sign, site count per field) and conflicts is `.run/P37/census/struct_map.json`.* diff --git a/docs/tool-index.md b/docs/tool-index.md index bc807c070..cc219a850 100644 --- a/docs/tool-index.md +++ b/docs/tool-index.md @@ -5,7 +5,7 @@ freshness). The derived columns come from the tree on every run; the authored on dictionary, whose coverage is asserted both ways. Read it by NEED: find the phrase that matches what you are trying to do, then the tool, then what proved it. The same data generates the day-one kit's manifest and its verbatim tool corpus.* -**Coverage:** 309 tool files in scope (submodules, vendored and downloaded code excluded; `find` and `git ls-files` agree) + 38 retired under `tools/sunset/`. Classes: LIVE 244 (a runtime consumer), REFERENCED 31 (a SETUP row only), ORPHAN 34 (neither) — of 309. Portability: PORTABLE 23, ADAPT 269, PROJECT-ONLY 17. +**Coverage:** 310 tool files in scope (submodules, vendored and downloaded code excluded; `find` and `git ls-files` agree) + 38 retired under `tools/sunset/`. Classes: LIVE 246 (a runtime consumer), REFERENCED 31 (a SETUP row only), ORPHAN 33 (neither) — of 310. Portability: PORTABLE 23, ADAPT 270, PROJECT-ONLY 17. ## P1 — extraction + manifest @@ -295,7 +295,7 @@ then what proved it. The same data generates the day-one kit's manifest and its | build a progress timeline from the repository's own committed digests | `timeline.py` | Builds a progress timeline from the repository's own committed digests, with a self-check | Makefile | repo doc paths | LIVE | | check that every relative link in the public docs resolves | `doc_links.py` | Checks that every relative link in the public docs resolves and the link policy holds | Makefile, wiki_render.py, wiki_sync.sh | repo doc paths | LIVE | | compile every eligible translation unit with the pinned toolchain, using no derived bytes | `compile_only.py` | Compiles every eligible translation unit with the pinned toolchain, without any game bytes | .github/workflows/no-rom.yml, delever_oracle.py, lever_census.py, macro_to_header.py (+1) | compiler triple, repo makefile parsing | LIVE | -| compute and publish progress metrics as report, machine data and per-binary breakdowns | `progress.py` | Computes and publishes the progress metrics as report, JSON and per-binary breakdowns | Makefile, docs/wave-playbook.md, api_agent.py, atlas.py (+35) | repo src/config layout | LIVE | +| compute and publish progress metrics as report, machine data and per-binary breakdowns | `progress.py` | Computes and publishes the progress metrics as report, JSON and per-binary breakdowns | Makefile, docs/wave-playbook.md, api_agent.py, atlas.py (+36) | repo src/config layout | LIVE | | convert progress metrics into an external progress-report schema | `objdiff_report.py` | Converts the progress JSON into the external progress-report schema | .github/workflows/progress.yml | external report schema | LIVE | | emit the public ordinal-to-hash map and the private old-to-new map | `public_rewrite/build_commit_map.py` | Emits the public ordinal-to-new-hash map and the private old-to-new map | probe_github.sh, resolve_tokens.py | repo doc/scratch paths | LIVE | | gate a first push: prove no derived bytes among tracked files | `audit_public.py` | The first-push gate: no derived bytes among tracked files, four independent checks | .github/workflows/no-rom.yml, gate_scan.py | repo purge-set and path lists (the kit's template reads `config/firewall.txt` instead) | LIVE | @@ -323,19 +323,20 @@ then what proved it. The same data generates the day-one kit's manifest and its | add per-site function-pointer casts so a draft can call a differently typed callee | `cast_call_sites.py` | Adds per-site function-pointer casts so a draft can call a differently typed callee | canon_sig_reconcile.py, cast_self_callers.py, family_sweep.py, gate_stage.py (+4) | repo src layout | LIVE | | apply curated names and signatures inside the analysis tool and save | `ghidra_scripts/ApplySymbols.java` | The in-tool half of that mirror: apply curated names and signatures, save on exit | ghidra_apply_symbols.sh, ghidra_export_annotations.sh, ghidra_rebuild.sh, ExportAnnotations.java (+1) | none | LIVE | | build the pack one agent needs to read and crack one residue exemplar, without touching the tree | `delever_pack.py` | The Phase-36 T7 pack builder (one agent at a time): per residue exemplar of ≥N copies a directory under .run/P36/agents/ with the TU path, the body as the tree has it, the lever-free body (the seed), the residual as mnemonic blocks from delever_search --try (a scratch compile, no tree write), the ledger's NEEDED sites, and every engine attempt with its best moves; ORDER.tsv ranks the exemplars by the best distance reached, then copies. PROMPT.md beside them is the agent's brief. | — | repo scratch paths; the engine's outcomes and traces | REFERENCED | -| census every compiler-forcing construct in the C and gate the levers-off phase | `lever_census.py` | The Phase-36 census of lever sites (register pins, asm statements by kind, volatile levers, bare register, asm-label aliases, builtins, attributes; the whole-body hand-asm routines and the GTE ops set apart) derived from the shared-body scanner with a per-token coverage assertion against the raw text, four known-true controls, the !FAKE marker split, --check (0 unmarked pins/asm, 0 orphan markers) and --strict (0 pins, 0 asm) gates, --sites for the delever ledger, a fixture self-test | Makefile, argcheck.py, delever.py, delever_cycle.sh (+6) | repo paths, the shared-body scanner | LIVE | +| census every compiler-forcing construct in the C and gate the levers-off phase | `lever_census.py` | The Phase-36 census of lever sites (register pins, asm statements by kind, volatile levers, bare register, asm-label aliases, builtins, attributes; the whole-body hand-asm routines and the GTE ops set apart) derived from the shared-body scanner with a per-token coverage assertion against the raw text, four known-true controls, the !FAKE marker split, --check (0 unmarked pins/asm, 0 orphan markers) and --strict (0 pins, 0 asm) gates, --sites for the delever ledger, a fixture self-test | Makefile, argcheck.py, delever.py, delever_cycle.sh (+7) | repo paths, the shared-body scanner | LIVE | +| census every struct definition, raw pointer-cast dereference and function declaration in the C, and cluster the cast sites into the types the tree needs (the struct map) | `type_census.py` | The Phase-37 type census: struct/union/typedef definitions fleet-wide with o32 layouts (duplicate classes by layout+member evidence, VARIANT camps, dead and shadowed canonical names), every cast site in six forms (P *(T*)(…), I *(T*)ident, X ((T*)e)[i], M M2C_FIELD, A address-of, C typed cast-member) with base class/offset/width/sign/access and a per-form coverage assertion against an independent raw regex, the declaration layer (definitions K&R-read, extern spellings per name, multi-body names, asm-label aliases, builtins, attributes, argcheck's lying set), global blocks (runs of adjacent scalar D_ symbols), four known-true controls, and the struct map — union-find over evidence edges only (same global, argument flow into a parameter the callee dereferences with shared offsets, single-source assignment/return flow, pointer-field flow, body-hash identity) with a width-conflict veto; writes type_census.json/txt, struct_map(.top).json, sites.jsonl (--sites), parked.tsv (the P36 parked classes with reasons) and docs/struct-map.md; --check is the T8 gate; --selftest | progress.py, readability_progress.py | repo paths, the shared-body scanner, argcheck, the P36 ledger (parked.tsv) | LIVE | | consolidate the GTE coprocessor inline-asm macros under Sony's names in one header and sweep dead lever macros | `gte_consolidate.py` | The Phase-36 T5 tool: every asm-bearing macro definition and direct GTE statement SIGNED by the build's own maspsx→as tail (template bytes with operands bound to fixed registers, operand counts, clobbers); one canonical text per signature named by PsyQ's inline_c.h convention (Sony's file supplies names and clobber lists, never opcode words) written to include/gte_inline.h; per file the canonical duplicates deleted, private names renamed, a variant with extra clobbers tried as canonical and kept as a marked _m lever only when the object differs, direct statements rewritten into canonical calls (a concatenation of two included); every file judged through every recipe; --sweep deletes dead asm-bearing macros and drops a compound macro's inner asm when byte-neutral | delever.py, delever_cycle.sh, delever_permute.py, lever_census.py | Sony's inline_c.h path, the census sites, the oracle | LIVE | | convert a shared-body macro header into per-function plain-C headers included at each site | `macro_to_header.py` | The Phase-35 converter: every DEFINE_ macro body becomes a plain-C header under src/shared// included at its site, the legacy name-parameterized headers converted, the registry text-edited, the macro header deleted; --plan / --apply / --finalize / --verify | share_body.py, tool_census.py | the macro form is this project's; a kit-born project shares headers from its first bank | LIVE | | emit a function's target assembly as an inline-assembly body | `asm_verbatim.py` | Emits the file-scope inline-assembly body form from a disassembly file | docs/wave-playbook.md, draft_prechecks.py, gate_main.py, recover_route.py | repo asm layout | LIVE | | extract inline-defined types and typedefs from a source file into a shared header | `build_engine_types.py` | Extracts inline-defined named types and typedefs from a source file into a shared header | inject_capped_externs.py, lift_types.py, uniquify_type.py | repo shared-header path | LIVE | -| find a lever-free spelling of a body by a guided search on the byte distance, not a blind test | `delever_search.py` | The Phase-36 rung G: the same shape generators as rung R (declaration order/move, initializer split, commutative swap, temp inlined/introduced/hoisted, block wrap/unwrap, adjacent swap) and the same per-TU oracle, but every candidate SCORED — the function's instructions read out of the scratch object and compared, reloc-masked, with the fleet run's baseline object, as an edit distance — the residual CLASSIFIED (REG caller/callee, COUNT, ORDER, MIXED) to choose the move families, and a beam search composing two and three moves under a compile budget; a score-0 verified on every recipe and banked through delever --apply-body, then --propagate to the class. Controls: the tree's own text must score 0 (per body), --positive-control perturbs a matching body and requires the way back, --selftest. | delever.py, delever_pack.py, delever_regen.py | repo scratch paths; the recipe oracle | LIVE | -| find every call site whose in-scope declaration is narrower than the callee real definition | `argcheck.py` | The static filter for the missing-argument class: six T7 agents independently reached score 0 by restoring an argument the decompiled source had dropped (m2c drops them at unprototyped and indirect call sites), and no candidate generator can reach it because every family rewrites statements and declarations while this changes a call ARITY. Reads the real arity from the DEFINITION wherever it lives (a .c under src/ or a shared body header) and reports each narrower declaration with the scope that says which fix is available: the cast route is body-only at either scope, widening the declaration itself needs block scope. Known blind spot, stated in the docstring: it cannot see a definition that is uniformly wrong. | decl_repair.py, delever.py, readability_progress.py | repo paths; the census walk | LIVE | +| find a lever-free spelling of a body by a guided search on the byte distance, not a blind test | `delever_search.py` | The Phase-36 rung G: the same shape generators as rung R (declaration order/move, initializer split, commutative swap, temp inlined/introduced/hoisted, block wrap/unwrap, adjacent swap) and the same per-TU oracle, but every candidate SCORED — the function's instructions read out of the scratch object and compared, reloc-masked, with the fleet run's baseline object, as an edit distance — the residual CLASSIFIED (REG caller/callee, COUNT, ORDER, MIXED) to choose the move families, and a beam search composing two and three moves under a compile budget; a score-0 verified on every recipe and banked through delever --apply-body, then --propagate to the class. Controls: the tree's own text must score 0 (per body), --positive-control perturbs a matching body and requires the way back, --selftest. | delever.py, delever_pack.py, delever_regen.py, type_census.py | repo scratch paths; the recipe oracle | LIVE | +| find every call site whose in-scope declaration is narrower than the callee real definition | `argcheck.py` | The static filter for the missing-argument class: six T7 agents independently reached score 0 by restoring an argument the decompiled source had dropped (m2c drops them at unprototyped and indirect call sites), and no candidate generator can reach it because every family rewrites statements and declarations while this changes a call ARITY. Reads the real arity from the DEFINITION wherever it lives (a .c under src/ or a shared body header) and reports each narrower declaration with the scope that says which fix is available: the cast route is body-only at either scope, widening the declaration itself needs block scope. Known blind spot, stated in the docstring: it cannot see a definition that is uniformly wrong. | decl_repair.py, delever.py, readability_progress.py, type_census.py | repo paths; the census walk | LIVE | | flag address-named references whose address now has a curated name | `lint_symbol_refs.py` | Flags address-named references in committed sources whose address now has a curated name | .github/workflows/no-rom.yml, Makefile | repo symbol/src paths | LIVE | | give each conflicting camp of a same-named type its own name | `uniquify_type.py` | Gives each conflicting camp of a same-named type its own name so every camp becomes liftable | — | repo src layout | REFERENCED | | guard that every inline-assembly body still reproduces its target bytes | `verbatim_check.py` | Regression guard that every inline-assembly body still reproduces its target bytes | .github/workflows/no-rom.yml, Makefile, lever_census.py, progress.py (+2) | repo src layout | LIVE | | judge one translation-unit edit by the bytes of its object in under a second | `delever_oracle.py` | The Phase-36 fast byte oracle: every object's exact build command captured once via make -n -W (the Makefile's own recipe, pad stage and -O0 overrides included), a candidate compiled in place with -o/-MF redirected to scratch and compared with the fleet run's object; --calibrate proves 100 % equality untouched, twin == primary and a positive control before any verdict is trusted | delever.py, delever_cycle.sh, delever_permute.py, delever_search.py (+1) | the Makefile's object rules, the twin rule | LIVE | | keep the lever count as a series a chart and a story can be drawn from | `lever_progress.py` | The Phase-36 lever series: a milestone row appended per census snapshot (its totals by class with the tree's HEAD, since a census is a moment that cannot be recovered later) plus the campaign table derived from the de-lever ledger on every render — per batch the rungs used, the bodies first judged, the sites removed and rewritten, and, scored as a transition against what that body's previous row left, the sites a later rung closed and the bodies it made lever-free; renders both into docs/levers.md's generated block and --check refuses a series that is not this tree's | readability_progress.py | the census json, the delever ledger | LIVE | -| measure duplicate function bodies across the fleet and assert one source per unique function | `share_census.py` | The census of byte-identical function classes across every binary with their source forms and verdicts, plus the S1 invariant check with its exception ledger and a fixture self-test | Makefile, audit_binaries.py, dedup_integrate.py, delever.py (+11) | repo paths, the registry and signature schemas | LIVE | +| measure duplicate function bodies across the fleet and assert one source per unique function | `share_census.py` | The census of byte-identical function classes across every binary with their source forms and verdicts, plus the S1 invariant check with its exception ledger and a fixture self-test | Makefile, audit_binaries.py, dedup_integrate.py, delever.py (+12) | repo paths, the registry and signature schemas | LIVE | | mirror the curated symbol file into the analysis database with a real save | `ghidra_apply_symbols.sh` | Mirrors the curated symbol file into the analysis program headlessly, with a real save | — | repo symbol path, project name | REFERENCED | | re-run newly harvested generator families over the whole residue and bank what closes, without re-sweeping | `delever_regen.py` | The Phase-36 regen pass (S103): for every residue class, the lever-free body and the engine's best text are fed to delever.recipe_candidates with ONLY the named generator families (the two newest by default) and every candidate is scored read-only through delever_search --try --body, one worker per class; a TSV under .run/P36/regen/ lists each class's best; --bank re-scores each score-0 row on the current tree, then apply_body_core + --propagate (the one writer). Built because no search ever revisits a residue class after a new generator lands. | — | repo scratch paths, the delever generator registry | ORPHAN | | refuse, from one place, the command line of a tool the project has frozen | `frozen.py` | The one refusal a FROZEN tool prints from its main(): the tool, the successor and why; imports never exit (libraries stay usable) | aprop_autodraft.py, blocker_probe.py, canon_sig_reconcile.py, conform_decls.py (+10) | nothing | LIVE | @@ -346,7 +347,7 @@ then what proved it. The same data generates the day-one kit's manifest and its | see which register local-alloc gives each value inside one basic block, and why, before trying a register move | `localalloc_sim.py` | Simulates gcc 2.7.2's block_alloc for the block containing a given insn from a .lreg dump: quantity births/deaths, ties (combine_regs), copy suggestions, qty_compare_1 priority, find_free_reg — and prints the simulated hard register beside the one the dump records (0 mismatches over 150 validated block simulations, S103). Complements alloc_table.py, which shows global allocation only. | — | the cc1 dump format | ORPHAN | | share one byte-identical function class across its binaries through an include-at-site header, gated per binary | `share_body.py` | The Phase-35 successor of dedup_propagate + dedup_extend for the include-at-site form: exemplar by majority text, the header written once, every private copy replaced by the include at its position, per-binary byte gate with object comparison, bisect on red, the registry appended or extended by text, the exception ledger on refusal; --plan / --apply --bucket extend|new | aprop_autodraft.py, audit_binaries.py, auto_driver.py, blocker_probe.py (+18) | repo paths, the registry and signature schemas | LIVE | | take register pins, asm statements, volatile and register levers out of matched C, byte-gated per site | `delever.py` | The Phase-36 de-lever engine and campaign tool: positional rewrites per lever class (pin -> plain declaration, barrier/keep-alive deleted, a launder deleted or turned into the assignment it is, a hand-placed instruction -> its C, the zero-register variable -> 0, a macro-carried site deleted/valued/refused by its macro's shape, volatile/register dropped); per body replay -> rung A strip-all -> rung B greedy through delever_oracle; the file is the write unit and its final compile through every recipe the proof; --plan/--apply batches (TUs parallel, exemplar files first; headers serial, includers parallel), the ledger keyed by tu+fn+addr with the body's nhash before/after, !FAKE markers on class A/B survivors, --redraw for bodies refused by an older tool, --restore from inflight.json, --scrub for orphan markers, --apply-body for T6/T7, --recipes (rung R: the byte-neutral shape recipes — the formerly-pinned declarations permuted, one moved through the declaration run, an initializer split — each judged by the oracle, with an identity control on both the splice and the oracle), --selftest with a stub oracle, --probe (T2) | delever_cycle.sh, delever_pack.py, delever_permute.py, delever_regen.py (+3) | the census site records, the oracle | LIVE | -| track how honest and how readable the matched C is over time, as a generated series | `readability_progress.py` | The Gen3 companion to docs/levers.md: levers are only one way the source is untrue. Counts lying call declarations (a call site whose in-scope declaration names fewer parameters than the callee definition, split by the K&R-empty and (void) forms, and how many sit in a body that still holds an argument-register pin) and raw cast dereferences against struct member reads, which is the struct debt. Appends a dated row carrying its commit to docs/readability-progress.tsv and renders docs/readability.md; --check asserts the last row is this tree. | — | repo paths | ORPHAN | +| track how honest and how readable the matched C is over time, as a generated series | `readability_progress.py` | The Gen3 companion to docs/levers.md: levers are only one way the source is untrue. Counts lying call declarations (a call site whose in-scope declaration names fewer parameters than the callee definition, split by the K&R-empty and (void) forms, and how many sit in a body that still holds an argument-register pin) and raw cast dereferences against struct member reads, which is the struct debt. Appends a dated row carrying its commit to docs/readability-progress.tsv and renders docs/readability.md; --check asserts the last row is this tree. | type_census.py | repo paths | LIVE | | turn an inline-assembly body back into a stub the toolchain can reach | `verbatim_to_stub.py` | Turns an inline-assembly body back into an include-assembly stub | — | repo src/asm layout | REFERENCED | | widen every call declaration that lies, and measure on the bytes which repairs are free | `decl_repair.py` | The free-correctness half of the missing-argument class: a declaration is repaired only when every call to that function in the unit ALREADY passes the arguments, so the code is right and only the promise is wrong. Each candidate is compiled from a scratch copy through the unit own recipe and compared on .text/.rodata/.data (never whole-object: the object records its own source path, which made the first fleet run return 0 free of 3,634 units). Every unit is negative-controlled by compiling it UNCHANGED first, and a unit whose control fails is reported as a harness failure rather than a result. --apply writes only the units this run judged identical. | — | repo paths; the recipe oracle | ORPHAN | diff --git a/docs/wiki/Reference-index.md b/docs/wiki/Reference-index.md index d57d2c6ef..3c07e31f0 100644 --- a/docs/wiki/Reference-index.md +++ b/docs/wiki/Reference-index.md @@ -41,6 +41,7 @@ in the Archive index, not here. The conventions behind this page: [Docs and scra | [`levers.md`](../levers.md) | The register pins and compiler hints: the taxonomy, the generated count over time (the post-100% chart's data), how they got in, how each rung takes them out, and the argument on whether to refuse them from the first bank or clean them up at the end. | Read whole; §2's tables are generated. | authored + a generated block (`tools/lever_progress.py`), the series in `lever-progress.tsv` | | [`lever-progress.tsv`](../lever-progress.tsv) | The lever series' data: one row per milestone (date, task, HEAD, sites by class, marked/unmarked, GTE variants, per-TU asm macros) appended by `tools/lever_progress.py --snapshot` — a census is a moment and cannot be recovered later. | Read as a table; the chart source. | generated (`tools/lever_progress.py`), never edited | | [`readability.md`](../readability.md) | The other Gen3 series beside the levers: lying call declarations (split `()` / `(void)`, how many sit in a pinned body) and raw cast dereferences against struct member reads — the struct debt the structs phase inherits. | Read whole; the block is generated. | authored + a generated block (`tools/readability_progress.py`), the series in `readability-progress.tsv` | +| [`struct-map.md`](../struct-map.md) | The struct map (Phase 37): every raw pointer-cast dereference in `src/` assigned to a base and the bases clustered by evidence into the types the tree needs — the 200 largest with sites, bodies, fields, size, width conflicts and instance/pointer globals; the input the structs phase authors its canonical types from. | Read the table; the full map with every type's layout is `.run/P37/census/struct_map_top.json` (regenerate with `tools/type_census.py`). | generated (`tools/type_census.py`), never edited | | [`readability-progress.tsv`](../readability-progress.tsv) | The readability series' data: one dated row per snapshot with its commit (declarations, pinned-body declarations, raw casts, struct member reads). | Read as a table. | generated (`tools/readability_progress.py`), never edited | | [`accelerators.md`](../accelerators.md) | What was learned late that a future project should know on day one: each entry with when it was found, when it could have been, what it would have saved. | Read whole; the entries are short. | authored | | [`generic-decomp-package.md`](../generic-decomp-package.md) | The thesis for the next project: what it inherits and does before cracking — the knowledge base seeded from the compiler's source and sibling projects, the structural tooling, the similarity join as a band not a point, the differential-oracle harness, the widening review. | Read whole. | authored | diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index 3b296a34f..f9a40f528 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -50,7 +50,7 @@ untouched; twin checks 0 (0 mismatch); positive control DIFFERS on build/src/800.o; 2.3 s — OK` (main 0.108 s/object, ov 0.15–0.16, md_SC07_004 0.504) (`.run/P37/baseline/oracle_t0.log`); `.gitignore` P37 allowlist (by-contents, R84; `git check-ignore` verified: logs and `.tsv` tracked, `.o` ignored); this file. Verify at the commit: `git status` clean. -- ☐ **T1** (xHigh; the layout/cluster model reviewed at Max) — `tools/type_census.py` + **the struct map** (added after T0 — Drew asked, Claude recommended, +- ☑ **T1** (S106; the commit carrying this line) — `tools/type_census.py` + **the struct map** (added after T0 — Drew asked, Claude recommended, Drew approved "Yes — T1 delivers the map"; P5d): definitions with o32 layouts + duplicate classes + VARIANT camps + dead names; cast sites in all four forms + `M2C_FIELD` with base class/offset/width/sign/load-store; the declaration layer (definitions K&R-read, in-scope declarations per TU, the lying set, multi-spelled callees, aliases, builtins, attributes); the P36 @@ -161,33 +161,101 @@ bucketed by what each bucket needs before any plan is proposed. **Candidates for - **S106 — gate-1 adjustment (P5d): T1 delivers the struct map.** Drew's question + "Yes — T1 delivers the map"; the T1 task line, T4's typed prototypes and the decisions above updated; committed as the next log commit. -## 🛑 SESSION CHECKPOINT — S106 (2026-09-11/12, LIVE — refreshed at every task close): gate 1 APPROVED, **T0 ☑** (baseline + oracle + allowlist + this file, committed) — 🛑 **T1 NEXT (the type census, xHigh; its layout/cluster model at Max)** | R22 `check-all: 218 passed, 0 failed of 218` at `db212f167` | the P36 close `79b2f6f15` is committed AND PUSHED (`origin/main`); no tag (Drew: no tags/releases at closes); T0 `0a55cb0fd` local +- **S106 — T1 design (X1).** One walker per file in worker processes (the masking and the function spans from `share_census`, the + cache/coverage pattern from `lever_census`) → definitions with o32 layouts (`Resolver`), six cast-site forms with base/offset/width/ + sign/access, the declaration records, the flow edges; the parent computes duplicate tiers, coverage, controls, global blocks and the + struct map (union-find over evidence only). **The Plan agent's stress-test landed** (322k tokens; its design goes into T3's notes) and + corrected four premises before the fleet run: (1) a whole-object oracle says DIFFERS on a correct global-block edit because the + RELOCATION SPELLING changes (`D_80078EB4` → `g.hp`) while the linked bytes are identical — T3 needs a resolved-relocation mode + (control: `md_SC07_004`'s `D_801F8870[1]`) and a committed linker fragment for every new base symbol; (2) function identity is never + the bare name (6,415 names carry >1 body text) — the map keys a function by its body hash; (3) a sixth site form exists, `((T *)p)->f` + (36,681 sites: a COMPONENT_REF already, the readability MEMBER regex counts it as a member — it is the rewrite's rung 1, not a finished + member); (4) "one definition per layout" is too strong — `{s16 ×4}` carries 177 names, some genuinely different types (`Rect` vs + `SVECTOR`): a duplicate is same layout AND (identical meaningful member names | an opaque copy block | flow evidence); layout twins + without evidence are reported, not merged — **milestone item 1's "per layout" reads "per type" from here (a clarification for Drew, + not a scope change)**. Also from the agent: caller bytes DO depend on a narrow prototype's widths in both directions (the return axis + too: `extern u8 f(void)` makes the caller mask eagerly), and rung 1 (body-local `((Unk *)a0)->f`, no signature change, the same `/s`) + decouples the byte question from the declaration question — rung 2 (the typed signature) follows the declaration solver. +- **S106 — T1 built.** `tools/type_census.py` (selftest 21/21 on a fixture with every form); five fleet runs to converge the map: run 1 + a mega-cluster of 297,668 sites (Steensgaard's classic over-merge through untyped conduit parameters) and A/C sites counted against a + deref denominator (105 %); run 2 typed-use parameters + a width-conflict veto + nested bases → 173,025; run 3 the single-source rule + for locals + declared-type seeding of `AT:` nodes → 166,789 (the entity type: max offset 0x24C = `actor-struct.md`'s record size); + run 4 positive shared evidence required on inter-function edges (the callee's map structured ≥2 offsets, ≥1 offset in common) → + two large types (107,598 sites / 0x10C spanning 9,753 pointer globals — the cross-address copies of per-overlay globals, still partly + fused at low offsets; 65,397 sites / 0x24C with one instance global `D_80126B58`), their conflicts mostly same-width sign mixes (a + store's signedness leaves no byte), now counted apart from width conflicts; run 5 = the final numbers. **The map is a model with + stated rules and reported conflicts; T2 tests it on bytes, T5 refines it.** +- **S106 — T1 verify lines (HEAD `23fc5d215`, 3 m 20 s at -j16).** `type_census: 7261 definitions (525 layouts, 206 duplicate classes, + 39 variant camps) · 503016 cast sites in 69497 bodies over 8 base classes (4 forms + A, coverage OK) · 98648 lying declarations / 1609 + callees · controls 4/4` · `struct_map: 18760 types over 18760 clusters explain 498896/503016 sites (99.2 %); 4120 unassigned sites; 729 + types with conflicts`. DEFINITIONS: canonical header 1,179 · `.c` file-scope 4,091 · `.c` block-scope 1,904 · per-function shared headers + 63 · other headers 24; 3,109 distinct names; duplicate tiers: 122 same-named + 84 opaque classes (2,789 names), 46 layout-twin classes / + 1,844 names kept apart; 588 exact-text classes / 4,469 copies; 39 VARIANT names; 141 dead canonical names; 75 canonical names redefined + in `.c`. CAST SITES: **deref 503,016 = P 409,007 + I 60,666 + X 13,800 + M 19,543** (+ A 18,912 address-of; + C 36,681 typed cast-member) + in 69,497 bodies; coverage OK on all six forms; refused 0; the readability regex over raw text 411,850 (the 2,843 difference = casts + inside comments/strings/macro blocks); by base: param 276,860 · local 149,915 · gaddr 40,122 · nested 24,076 · global 8,860 · other 1,678; + by width: s4 145,167 · u2 142,775 · s2 131,818 · u1 43,174 · agg 13,472 · p4 12,016 · u4 11,165 · s1 3,429; top bases a0 92,255 · + param_1 81,595 · arg0 67,704 (the first parameter 241,554 = 48 %). DECLARATIONS: 99,130 definitions (1,889 K&R) · 4,279,365 extern + function declarations over 12,139 names (3,870 spelled >1 way) · 6,415 names with >1 body text · 1,078,837 data externs over 55,569 + symbols (18,442 typed >1 way) · asm-label aliases 5,749 (225 names) · builtins memcpy 301 / abs 144 · attributes packed 64 / aligned 12 · + lying 98,648 / 1,609 callees (K&R-empty 91,357, narrow 7,291). GLOBAL BLOCKS: 2,123 runs of ≥4 adjacent scalar `D_` symbols (14,251 + symbols). PARKED (P36): **24 classes / 453 bodies / 691 needed sites → `.run/P37/census/parked.tsv`**, needs {signature 13, struct 7, + ? 4}; 22 PARK names are minimum-lever banks. CONTROLS 4/4 (the doc dispute reported: `D_80078F08/0C` code 4 vs `actor-struct.md` 2 — + a T9 correction; the bytes side with the code). `lever_census`: controls re-keyed (14 / 8 / `func_801896EC` 2, each counted + independently) → 4/4 OK; `--check: 4,010 … 0 UNMARKED — OK`; **`--check --strict: pins 2141, asm 1419, gte-levers 450, direct GTE + statements in bodies 6717, per-TU asm macro definitions 314 … FAIL`** — `--strict` now reads its own words: a direct GTE coprocessor + statement in a body is an asm statement outside the GTE header (the P36 close excluded 6,447 `gte` + 270 `gte-unsigned` as Sony's + idiom; under decision 1 they are work — macro calls from the one header; `func_8013D9B0`'s 268 are among them, resolved this way). + Published (R75): `progress.py --json --readme` → `counts.types` + the README "Types (Phase 37, snapshot 2026-09-12)" sentence + two + dated `corrections` (the four-form count; `--strict`'s direct GTE statements); `progress.py --check` fresh; `readability_progress + --snapshot` (the TSV now read by column NAME; 16 census columns appended) → `503016 by the census's four forms (+36681 typed + cast-member, +18912 address-of) … 7261 struct definitions over 525 layouts (206 duplicate classes / 2789 names); the map: 18760 types + (99.2 % of sites)`; `lever_progress --snapshot` (79 milestones, 4,010 unchanged) → `--check OK`; `docs/struct-map.md` generated (200 + types) + its Reference-index row; dictionary row + SETUP §P37 S106 (R87/R21); `make kit-corpus` → `tool_census --check: OK`; + `doc_links --strict: OK`; `kit_lint: OK`; `kit_coverage: OK`. Files: `.run/P37/census/{type_census.json,type_census.txt,struct_map_top.json, + parked.tsv}` tracked; `struct_map.json` (6.4 MB) and `sites.jsonl` (213 MB) regenerable, ignored. + +## 🛑 SESSION CHECKPOINT — S106 (2026-09-11/12, LIVE — refreshed at every task close): gate 1 APPROVED, **T0 ☑ T1 ☑** (the type census + the struct map, committed) — 🛑 **T2 NEXT (the probe, Max)** | R22 `check-all: 218 passed, 0 failed of 218` at `db212f167` | the P36 close `79b2f6f15` is committed AND PUSHED (`origin/main`); no tag (Drew: no tags/releases at closes); T0 `0a55cb0fd` local **Replay this block into the chat at the next session start (R64); it is the ONLY in-phase context the next session inherits.** 1. **Where we are.** Phase 37 (the structs phase) opened 2026-09-11 in S106 at Max. Gate 1 approved with Drew's four decisions: **grind to zero** (raw casts, lying declarations, levers — the plan's §"What zero means" defines each honestly); **placeholders + cited evidence** for every type/field name; **T7 = the P36 agent lane at Drew's cap, started only on his word**; **the full canonical declaration layer**. - R107–R117 ratified. T0's baseline and oracle calibration are done (the log entry above has every verify line). T0 is committed (this file, `.gitignore`, `.run/P37/baseline/*.log`, the recalibrated `.run/P36/delever/calibration.json`). - NEXT = **T1 — the type census `tools/type_census.py` + THE STRUCT MAP** (`.run/P37/census/struct_map.json` + `docs/struct-map.md`) - at xHigh (its layout/cluster model at Max) — added to T1 on Drew's word after T0 (P5d); T4's prototypes carry the map's parameter types. -2. **What the next session must know before T1.** (a) The population table in the approved plan below is a gate-1 grep census — T1 - re-derives every number with a self-asserting tool (R32/R37) and its verify line is the plan's. (b) The four cast forms: `*(T *)(…)` - (411,850, the readability regex `tools/readability_progress.py:31`), `*(T *)ident` (26,279), `((T *)e)[i]` (14,491), `M2C_FIELD(` - (19,542) — the last three are UNCOUNTED by the series today (R32 gap; T1 adds them with a dated `corrections` entry). (c) The 24 parked - P36 classes have NO list with reasons anywhere — the reasons are split across `phase-ends/logs/Phase36.md:2261-2267` and `:2197-2199`, - the bank lists' MSG column (`.run/P36/s105/banks_*.txt`), and each pack's `mechanism.md` headline; `.run/P36/s105/pick.py`'s PARK set (44 - names) mixes parked classes with minimum-lever banks; patch files exist for 6 (`main__func_800385C0/scratch/signature.patch`, + R107–R117 ratified. T0 (baseline, oracle calibration, allowlist, this file) and T1 (the type census + the struct map; every verify + line in the log above) are committed. **NEXT = T2 — the probe (Max):** three stratified probes on the calibrated oracle — (i) struct + spelling on ~150 bodies over the top bases (identical / differing / closing under S+A / residual by pass), (ii) the canonical prototype + per TU on ~300 TUs + the 24 parked patches (`.run/P37/census/parked.tsv`) as the known-true set, (iii) the definition fold on 20 TUs — + plus the Plan agent's two probes: the layout engine audited against cc1 (the negative-array-size offsetof idiom over every definition; + 0 errors) and the linked-relocation oracle mode's control (`md_SC07_004`'s `D_801F8870[1]`: IDENTICAL linked, DIFFERS whole-object). + T2 prices T4–T7 with denominators (R41). The probe drives a `restruct --try` for rung 1 only (body-local `((Unk *)a0)->unkK`) — the + Plan agent's "build first" order: layout engine + cc1 audit → linked oracle mode → census (done) → `--try`. +2. **What the next session must know (T1's findings, for T2–T5).** (a) The phase's counters, re-derived by `tools/type_census.py` (coverage OK, controls 4/4): **503,016 raw dereferences** (P 409,007 + + I 60,666 + X 13,800 + M 19,543) in 69,497 bodies + 18,912 address-of + 36,681 typed cast-member (rung 1's form, counted apart); + 7,261 struct definitions (1,179 canonical, 5,995 inside `.c`), 525 layouts, 206 duplicate classes (2,789 names; 46 layout-twin classes / + 1,844 names are NOT duplicates without flow evidence), 39 VARIANT names, 141 dead canonical names; 98,648 lying declarations / 1,609 + callees; 6,415 names with >1 body text (identity = body hash, never the name); **the lever finish line is 4,010 marked sites + 6,717 + direct GTE statements in bodies + 314 per-TU asm macro definitions** (`lever_census --check --strict`, now literal). (b) The struct map + (`.run/P37/census/struct_map_top.json`, `docs/struct-map.md`): 18,760 types explain 99.2 % of the sites; the two largest — 107,598 sites / + 0x10C over 9,753 pointer globals (partly fused at low offsets) and 65,397 sites / 0x24C with the instance global `D_80126B58` (the + actor record) — carry width conflicts the map reports; the map's merge rules are in SETUP §P37 S106; it is a MODEL — T2 tests it on + bytes (does the member spelling hold?) before T5 authors anything from it. (c) The Plan agent's four corrections (the log entry "T1 + design"): the relocation-spelling oracle mode + linker fragment for base symbols (T3), body-hash identity (done), form C (done), + duplicates = layout + evidence (done; milestone item 1 reads "per type"). (d) Two doc corrections owed at T9: `actor-struct.md`'s + `s16` at +0x108/+0x10C (the code declares 4-byte fields; the bytes decide), and `include/common.h:28-30`'s "identical codegen to + `p->field`" for `M2C_FIELD` (false — the `/s` flag differs; `gen3-handoff.md:161-164` says the same). (e) The 24 parked + P36 classes are now ONE file, `.run/P37/census/parked.tsv` (fn, alias, tu, copies, sites, kinds, regs, needs {signature 13, struct 7, ? 4}, + pack, patches, headline; 453 bodies / 691 needed sites; 22 more PARK names are minimum-lever banks) — generated by the census from the + P36 ledger + `pick.py`'s PARK set + each pack's `mechanism.md`; patch files exist for 6 (`main__func_800385C0/scratch/signature.patch`, `main__func_80029D3C/scratch/patch_signature.c`, `ov_SC07_007__func_80180FA4/scratch/signature_3args.patch`, `ov_SC02_027__func_80180A54/scratch/signature.patch`, `md_SC07_004__func_801A1E94/signature.diff`, `…__func_801A5C44/signature.diff`), - whole-TU scratch copies for 8 more; `func_80180200` has no pack (it lives in `ov_SC03_115__func_8017FC5C/`). (d) `func_8013D9B0`'s 268 - markers are kind `gte-unsigned` (NON_LEVER) — OUTSIDE the 4,010 headline though the PhaseEnd lists it among the residue heads; T1 resolves - this on the bytes. (e) `lever_census`'s known-true controls: three of four return N-A (their T1 body hashes are stale) — re-key them (R85). - (f) The 4,010 reconcile exactly against the ledger: 1,637 drawable RESIDUE + 1,080 minimum-lever banks in PARK + 593 parked RESIDUE + + whole-TU scratch copies for 8 more; `func_80180200` has no pack (it lives in `ov_SC03_115__func_8017FC5C/`). (f) `func_8013D9B0`'s 268 + markers (kind `gte-unsigned`) are now inside `--strict`'s direct-GTE count (resolved: they are asm statements outside the header, to + become macro calls). `lever_census`'s controls are re-keyed and 4/4 OK. (g) The 4,010 reconcile exactly against the ledger: 1,637 drawable RESIDUE + 1,080 minimum-lever banks in PARK + 593 parked RESIDUE + 450 GTE clobber variants (`gte-lever`; 64 per-TU `_m` macro definitions, `gte_rt_m` 55) + 94 arg-only pins (83 classes) + 83 whose latest ledger row is a failed attempt (invisible to `pick.py`; `delever.py --redraw`) + 24 + 18 + 13 asm-body + 10 drawn + 8 file-scope. - (g) The §396(a) refuting body IS recorded: `.run/P36/agents/ov_SC03_110__func_801800F0/mechanism.md:64-70` (d11) — T9 writes the correction. - (h) The type tools' reach: `lift_types.py` scans only `src/ov_*/*.c` (line 49); `engine_types.h` is included by 3,818 TUs via + (h) The §396(a) refuting body IS recorded: `.run/P36/agents/ov_SC03_110__func_801800F0/mechanism.md:64-70` (d11) — T9 writes the correction. + (i) The type tools' reach: `lift_types.py` scans only `src/ov_*/*.c` (line 49); `engine_types.h` is included by 3,818 TUs via `engine_prelude.h` but by 0 of the 85 root `.c` and 12 of 87 `md_*`; `decl_repair.py` compares `.text/.rodata/.data` sections (the scratch path lands in the object) while `delever_oracle` compares whole objects compiled in place. 3. **Environment.** `~/bfm-decomp` on ext4; `.venv/bin/python`; every build with `JOBS=16`/`-j`; the headless Ghidra MCP was started by @@ -195,7 +263,8 @@ bucketed by what each bucket needs before any plan is proposed. **Candidates for `ghidra/` (nothing does until T8; R23). The oracle's snapshot baseline: `.run/P36/delever/baseline/` (7,428 objects at `db212f167`, taken after the green R22 — R112). The Plan agent (tool design stress-test) may still be running or have reported: its report goes into T3's design notes; if it is lost, T3's design at Max re-derives it from the plan's §B questions. -4. **Commands that work.** R22: `make clean && make extract-all JOBS=16 && make check-all JOBS=16` (≈86 s; read the exit code with +4. **Commands that work.** Census: `.venv/bin/python tools/type_census.py -j 16 [--sites]` (≈3.5 min; `--selftest` 21/21; outputs under + `.run/P37/census/`; `docs/struct-map.md` regenerated). R22: `make clean && make extract-all JOBS=16 && make check-all JOBS=16` (≈86 s; read the exit code with `pipefail`). Oracle: `.venv/bin/python tools/delever_oracle.py --calibrate -j 16` (147/147 in 2.3 s). Census (P36's, for the lever side): `.venv/bin/python tools/lever_census.py --check -j 16`. Series: `tools/readability_progress.py --snapshot