summary_v3-corpus.md 3.5 KB

Step: V3 compiler corpus run (gm2 testsuite)

Tag v3-corpus-run. V3 suite 151/151, fixpoint OK (unchanged — this only adds a harness and a doc).

Why

The TopSpeed corpus validated the sidecar grammar, not V3 the compiler (the sidecar is a separate TSM2 binary built from TopSpeed-V3-M2.atg; it reuses V3's SymTab/QbeGen/FileIO sources but never runs compiler/M2). So this step runs V3 itself over a real standard-Modula-2 corpus: the gm2 testsuite testsuite/gm2/pim/pass and testsuite/gm2/iso/run/pass.

Harness: tools/v3-corpus/corpus.sh (copies each file to a scratch tree, compiles alone, splits failures into CRASH / LIB / LANG — see its README).

Baseline (after the crash fix)

files
total 612
compile-OK (0 errors) 219
CRASH (M2 died, rc ≥ 128) 0
LIB (imports a gm2 library V3 lacks) 187
LANG (real V3 gap) 206

(Before the fix: 219 OK / 7 CRASH / 182 LIB / 204 LANG.) So ~187 of the 393 failures are simply missing gm2 libraries (StrIO, NumberIO, STextIO, SWholeIO, FpuIO, WholeStr, StdIO, M2RTS, DynamicStrings, Processes, …) — expected, not language gaps. The signal is the 206 LANG files.

Fix: long-line buffer overflow (the 7 "set crashes")

The 7 crashes (largeset, program2, set9, sets3, smallset4/5/6) were not set bugs: those files contain a ~860-char line (a 76-literal enumeration), and

  • PrintListing's line buffer was ARRAY [0 .. 255] OF CHAR, and
  • GetLine wrote without bounding to HIGH(line).

A source line longer than 255 chars therefore overflowed the stack (corrupting locals and the return address) — hence the garbage line number in the .LST and the segfault.

Fixed in compiler/src/compiler.frm:

  • GetLine now truncates at HIGH(line) (still consuming the rest of the line so positions stay correct);
  • PrintListing's buffer is now ARRAY [0 .. 4095] OF CHAR;
  • PrintErr's caret loop is bounded by HIGH(line).

Regression test: compiler/tests/t_longline.mod (406-char line, exit 0). Suite 152/152; fixpoint OK (2,339,115 bytes).

Top remaining LANG gaps (from the corpus)

  • 48 not supported yet — deliberate V3 230s; the corpus shows which constructs matter, e.g. array constructors (array {'h','e','l','l','o'} in arrayconst1).
  • undeclared identifier — mostly SYSTEM facilities V3 does not expose (FROM SYSTEM IMPORT BYTE; → BYTE), plus small library holes.
  • Anchored subranges INTEGER [-1 .. 24] (array2, array3) — PIM form V3's Subrange does not parse (';' expected at [).
  • Unnamed parameters in procedure types (PROCEDURE (VAR ARRAY OF REAL) in another.mod) — PIM allows them; V3 requires a name (ident expected).
  • Assorted: incompatible assignment/comparison on char arrays, invalid ArrayType, invalid call, FOR … BY, etc.

Reproduce

cd tools/v3-corpus
./corpus.sh            # -> 219 compile-OK / 0 CRASH / 187 LIB / 206 LANG

Suggested next steps

  1. SYSTEM facilities: expose at least BYTE / WORD / SHORTADDR etc. so FROM SYSTEM IMPORT … works.
  2. Anchored subranges T[lo..hi] (small grammar addition).
  3. Unnamed proc-type parameters (small grammar addition).
  4. Array constructors array{…} (bigger: codegen).

Files

tools/v3-corpus/{corpus.sh,README.md}, compiler/src/compiler.frm (long-line fix), compiler/tests/t_longline.mod, compiler/run_tests.sh, this doc.