From 5f52e38f936e391b7e9f031f833e89b90815c0d8 Mon Sep 17 00:00:00 2001 From: Bruno Macabeus Date: Sun, 2 Aug 2026 15:39:34 +0100 Subject: [PATCH 1/8] feat(symbols): recover an array global's RANK, not just its element count MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit asmlift could not represent how many subscripts an array global takes, so it spelled every one with a single subscript. On `extern u16 gBgTilemapBufs[4][0x400]` — the project's own declaration — `gBgTilemapBufs[i]` is a ROW: four `incompatible types in assignment` errors, and, where a row address reaches an integer context, only a warning and a silently different address than the asm computed. kleod:CopyBGScrollTiles noncompile(1) -> diff:34 kleod:UpdateHUDCounterDisplay noncompile(1) -> diff:125 These were asmlift's only two noncompile rows on the board. m2c produces nothing usable on either (noncompile), so both conversions are pure gain against the comparison. Not a one-row shape: the vendored contexts declare 576 multidimensional arrays in kleod alone, and the re-vendored maps carry 444 rank>1 array globals across the six projects. The rank comes from @gba-kit/debug-info's new `dims` (its `arrayLength()` multiplied the DW_TAG_subrange dimensions into one count), REQUIRED by a capability gate on the same key-presence terms as the cv-qualifier and pointee gates: a package that cannot report rank must not be read as "rank 1", because that is the silent case. L3 `index` gains optional `lead` — the constant leading subscripts. The node still denotes ONE `width`-byte element, so its type, legalization and stride contract are unchanged; this is a spelling of the same address. Compared by exprEquals (it is part of the address), declined by the Pascal backend and by reindex, and excluded from the C++ receiver hook — three places that would otherwise DROP it silently. L2→L3 `bareArrayLead` is the one gate on the bare-name spelling, shared by both access paths. Rank > 1 pins the leading dimensions at 0 and puts the flat element index last (`g[0][i]`) — the same arithmetic, and what the reference source spells. decl `extern u16 g[][1024];` — inner extents exactly, outermost left unsized as ever. Access and declaration read the rank through ONE function (arrayInnerExtents), so an unspellable rank falls back to the `((T *)&g)[i]`/`extern T g[];` pair together. Requires @gba-kit/debug-info >= 0.5.0 (branch feat/array-rank-dims, unpublished). --- .../dataset/real/tu/af/PROVENANCE.json | 2 +- .../dataset/real/tu/af/symbols.json.gz | Bin 381632 -> 381699 bytes .../dataset/real/tu/kleod/PROVENANCE.json | 2 +- .../dataset/real/tu/kleod/symbols.json.gz | Bin 17008 -> 17243 bytes .../real/tu/marioparty3/PROVENANCE.json | 2 +- .../real/tu/marioparty3/symbols.json.gz | Bin 451607 -> 451844 bytes .../real/tu/pokeemerald/PROVENANCE.json | 2 +- .../real/tu/pokeemerald/symbols.json.gz | Bin 547825 -> 563748 bytes .../dataset/real/tu/sa3/PROVENANCE.json | 4 +- .../dataset/real/tu/sa3/symbols.json.gz | Bin 91105 -> 91256 bytes .../real/tu/snowboardkids2/PROVENANCE.json | 2 +- .../real/tu/snowboardkids2/symbols.json.gz | Bin 69029 -> 69096 bytes packages/cli/package.json | 2 +- packages/cli/src/symbols-provider.ts | 35 ++++++++++- .../cli/test/offline/symbols-provider.test.ts | 32 +++++++++- packages/core/src/backend/cfamily.ts | 5 ++ packages/core/src/backend/cpp.ts | 4 +- packages/core/src/backend/pascal.ts | 7 +++ packages/core/src/declare.ts | 10 +++- packages/core/src/l3/ast.ts | 21 ++++++- packages/core/src/l3/reindex.ts | 4 ++ packages/core/src/structure/structure.ts | 41 +++++++++++-- packages/core/src/symbols.ts | 36 ++++++++++++ packages/core/test/declare.test.ts | 28 +++++++++ packages/core/test/symbols.test.ts | 55 +++++++++++++++++- 25 files changed, 270 insertions(+), 24 deletions(-) diff --git a/apps/benchmark/dataset/real/tu/af/PROVENANCE.json b/apps/benchmark/dataset/real/tu/af/PROVENANCE.json index bc94d12f..06d1efbb 100644 --- a/apps/benchmark/dataset/real/tu/af/PROVENANCE.json +++ b/apps/benchmark/dataset/real/tu/af/PROVENANCE.json @@ -3,5 +3,5 @@ "commit": "4515c15b5848b1ec85e78cb3776e12990cafe004", "dirty": false, "cpp": "cpp-14 (Homebrew GCC 14.2.0_1) 14.2.0", - "generatedAt": "2026-08-01T15:04:28.072Z" + "generatedAt": "2026-08-02T14:37:44.577Z" } diff --git a/apps/benchmark/dataset/real/tu/af/symbols.json.gz b/apps/benchmark/dataset/real/tu/af/symbols.json.gz index 4c65a4aef8aa1dec254608b34f0a6f06ab92f424..4745dbf023c33d803dfeb67d8a4ce705998c55c2 100644 GIT binary patch delta 241006 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