|
@@ -8,88 +8,88 @@ The TopSpeed corpus validated the *sidecar grammar*, not V3 the
|
|
|
compiler (the sidecar is a separate `TSM2` binary built from
|
|
compiler (the sidecar is a separate `TSM2` binary built from
|
|
|
`TopSpeed-V3-M2.atg`; it reuses V3's `SymTab`/`QbeGen`/`FileIO` sources
|
|
`TopSpeed-V3-M2.atg`; it reuses V3's `SymTab`/`QbeGen`/`FileIO` sources
|
|
|
but never runs `compiler/M2`). So this work runs **V3 itself** over two
|
|
but never runs `compiler/M2`). So this work runs **V3 itself** over two
|
|
|
-real Modula-2 corpora.
|
|
|
|
|
|
|
+real Modula-2 corpora and fixes what it finds.
|
|
|
|
|
|
|
|
Harness: `tools/v3-corpus/corpus.sh` — compiles each file with
|
|
Harness: `tools/v3-corpus/corpus.sh` — compiles each file with
|
|
|
-`compiler/M2` alone (pairing an IMPLEMENTATION with its sibling
|
|
|
|
|
-DEFINITION), in a scratch tree, and splits failures into CRASH (M2
|
|
|
|
|
-died) / LIB (imports a module outside V3's known stdlib) / LANG (real
|
|
|
|
|
|
|
+`compiler/M2` in a scratch tree, together with its sibling DEFINITION
|
|
|
|
|
+and the DEFINITION of every module it imports (`$V3_LIBS` search path),
|
|
|
|
|
+and splits failures into CRASH / LIB (unresolved import) / LANG (real
|
|
|
gap).
|
|
gap).
|
|
|
|
|
|
|
|
## Corpora and results
|
|
## Corpora and results
|
|
|
|
|
|
|
|
-**1. gm2 testsuite** — `testsuite/gm2/pim/pass` + `iso/run/pass`
|
|
|
|
|
-(612 files):
|
|
|
|
|
|
|
+**1. gm2 testsuite** (`gm2/pim/pass` + `gm2/iso/run/pass`, 612 files):
|
|
|
|
|
|
|
|
-| | files |
|
|
|
|
|
-| --- | --- |
|
|
|
|
|
-| **compile-OK** | **242** |
|
|
|
|
|
-| CRASH | 0 |
|
|
|
|
|
-| LIB (missing gm2 library) | 185 |
|
|
|
|
|
-| LANG (real V3 gap) | 185 |
|
|
|
|
|
|
|
+| | no libs | with `$V3_LIBS` |
|
|
|
|
|
+| --- | --- | --- |
|
|
|
|
|
+| **compile-OK** | 242 | **272** |
|
|
|
|
|
+| CRASH | 0 | 0 |
|
|
|
|
|
+| LIB | 185 | **9** |
|
|
|
|
|
+| LANG | 185 | **331** |
|
|
|
|
|
|
|
|
-**2. gm2 standard libraries** — `$HOME/bin/Modula2/Gm2/lib/gcc/…/m2/`
|
|
|
|
|
-(`m2pim`/`m2iso`/`m2log`/`m2cor`/`m2min`, 336 files, `.def`+`.mod`):
|
|
|
|
|
|
|
+**2. gm2 standard libraries** (`m2pim`/`m2iso`/`m2log`/`m2cor`/`m2min`,
|
|
|
|
|
+336 files):
|
|
|
|
|
|
|
|
-| | files |
|
|
|
|
|
-| --- | --- |
|
|
|
|
|
-| **compile-OK** | **78** |
|
|
|
|
|
-| CRASH | 0 |
|
|
|
|
|
-| LIB | 176 |
|
|
|
|
|
-| LANG | 82 |
|
|
|
|
|
|
|
+| | no libs | with `$V3_LIBS` |
|
|
|
|
|
+| --- | --- | --- |
|
|
|
|
|
+| **compile-OK** | 78 | **115** |
|
|
|
|
|
+| LIB | 176 | **0** |
|
|
|
|
|
+| LANG | 82 | **221** |
|
|
|
|
|
|
|
|
-(LIB is high in both because each file is compiled alone — cross-module
|
|
|
|
|
-imports are not resolved; the real signal is LANG.)
|
|
|
|
|
|
|
+(With the import path set, LIB noise is gone and the true LANG counts
|
|
|
|
|
+are visible.)
|
|
|
|
|
|
|
|
## Fixes landed
|
|
## Fixes landed
|
|
|
|
|
|
|
|
-### A. Long-line buffer overflow (the 7 "set" crashes) — `v3-fix-longline-crash`
|
|
|
|
|
-
|
|
|
|
|
-`PrintListing`'s line buffer was `ARRAY [0 .. 255]` and `GetLine` wrote
|
|
|
|
|
-without bounding to `HIGH(line)`, so a source line > 255 chars (an
|
|
|
|
|
-860-char enum line in the gm2 set tests) overflowed the stack. Fixed
|
|
|
|
|
-in `compiler/src/compiler.frm` (truncate in `GetLine`, buffer →
|
|
|
|
|
-4096, bounded caret loop); regression `t_longline.mod`; CRASH → 0.
|
|
|
|
|
-
|
|
|
|
|
-### B. `EXPORT QUALIFIED` in DEFINITION modules — this step
|
|
|
|
|
-
|
|
|
|
|
-gm2/PIM definition modules carry an export list
|
|
|
|
|
-(`EXPORT QUALIFIED ReadString, WriteString, …;`). V3's `DefUnit` did
|
|
|
|
|
-not accept it → `'END' expected` on the first such file. Added the
|
|
|
|
|
-clause (parsed; the names are already exported by the module scope).
|
|
|
|
|
-This raised **both** corpora: testsuite compile-OK **219 → 242**, gm2
|
|
|
|
|
-libs **42 → 78**.
|
|
|
|
|
|
|
+1. **Long-line buffer overflow** (`v3-fix-longline-crash`) — `GetLine`
|
|
|
|
|
+ wrote past a 256-byte listing buffer; a long line (an 860-char enum)
|
|
|
|
|
+ overflowed the stack. Fixed (`GetLine` truncates, buffer 4096,
|
|
|
|
|
+ bounded caret loop); CRASH → 0.
|
|
|
|
|
+2. **`EXPORT QUALIFIED`** in DEFINITION modules (`v3-export-qualified`).
|
|
|
|
|
+3. **`SYSTEM` facilities** — predefine `BYTE`/`SBYTE`/`WORD`/`SWORD`/
|
|
|
|
|
+ `LONGWORD`/`SHORTADDR`/`LONGADDR`/`PROC`/`LOC` (mapped onto V3's
|
|
|
|
|
+ integer family / `ADDRESS`) so `FROM SYSTEM IMPORT BYTE;` and
|
|
|
|
|
+ `ARRAY OF BYTE` resolve.
|
|
|
|
|
+4. **Anchored subranges** `T[lo..hi]` (`INTEGER [-1 .. 24]`).
|
|
|
|
|
+5. **Unnamed procedure-type parameters** (`PROCEDURE (VAR ARRAY OF
|
|
|
|
|
+ REAL)`) plus **open arrays in procedure types** and structural
|
|
|
|
|
+ proc-type formal compatibility (`ParamTypesOk`), so assigning a
|
|
|
|
|
+ procedure with an open-array parameter to a procedure variable works.
|
|
|
|
|
+6. **Harness import resolution** — `corpus.sh` now finds and passes the
|
|
|
|
|
+ `.def` of each imported module (`$V3_LIBS`), removing the LIB noise.
|
|
|
|
|
|
|
|
## Remaining LANG gaps
|
|
## Remaining LANG gaps
|
|
|
|
|
|
|
|
-- Tests suite: **185** files, mostly gm2-specific libraries' call sites
|
|
|
|
|
- and deliberate V3 `230`s (array constructors, …).
|
|
|
|
|
-- gm2 libs: **82** files, dominated by **gm2-specific syntax** —
|
|
|
|
|
- `PROCEDURE __BUILTIN__ name(...)` (`Builtins`/`libc`/`libm`/…),
|
|
|
|
|
- C-name pragmas, ISO module attributes — which are *not* V3's dialect.
|
|
|
|
|
-- Genuine V3 gaps still seen: **`SYSTEM` facilities** (`FROM SYSTEM
|
|
|
|
|
- IMPORT BYTE`), **anchored subranges** `T[lo..hi]`, **unnamed
|
|
|
|
|
- procedure-type parameters**.
|
|
|
|
|
|
|
+- **`ARRAY <ordinalType> OF T`** (index-type arrays, e.g.
|
|
|
|
|
+ `ARRAY btype OF INTEGER` in `array2`/`array3`) — V3 only has
|
|
|
|
|
+ `ARRAY [lo..hi] OF` / `ARRAY OF`. The big one.
|
|
|
|
|
+- **`undeclared identifier`** — SYSTEM facilities beyond the set
|
|
|
|
|
+ above, and small library holes.
|
|
|
|
|
+- **gm2-specific syntax** — `PROCEDURE __BUILTIN__ name(…)`, C-name
|
|
|
|
|
+ pragmas, ISO module attributes (not V3's dialect; skip).
|
|
|
|
|
+- **`not supported yet`** — deliberate `230`s (array constructors, …).
|
|
|
|
|
|
|
|
## Reproduce
|
|
## Reproduce
|
|
|
|
|
|
|
|
```sh
|
|
```sh
|
|
|
cd tools/v3-corpus
|
|
cd tools/v3-corpus
|
|
|
-./corpus.sh # gm2 testsuite -> 242 OK / 185 LANG
|
|
|
|
|
|
|
+./corpus.sh # testsuite, no libs
|
|
|
G=$HOME/bin/Modula2/Gm2/lib/gcc/x86_64-pc-linux-gnu/16.0.1/m2
|
|
G=$HOME/bin/Modula2/Gm2/lib/gcc/x86_64-pc-linux-gnu/16.0.1/m2
|
|
|
-./corpus.sh $G/m2pim $G/m2iso $G/m2log $G/m2cor $G/m2min # 78 OK
|
|
|
|
|
|
|
+V3_LIBS="$G/m2pim:$G/m2iso:$G/m2log:$G/m2cor:$G/m2min" ./corpus.sh
|
|
|
|
|
+V3_LIBS="$G/m2pim:$G/m2iso:$G/m2log:$G/m2cor:$G/m2min" \
|
|
|
|
|
+ ./corpus.sh "$G/m2pim" "$G/m2iso" "$G/m2log" "$G/m2cor" "$G/m2min"
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
## Suggested next steps
|
|
## Suggested next steps
|
|
|
|
|
|
|
|
-1. **`SYSTEM` facilities**: expose `BYTE`/`WORD`/`SHORTADDR` etc.
|
|
|
|
|
-2. **Anchored subranges** `T[lo..hi]` (small grammar addition).
|
|
|
|
|
-3. **Unnamed proc-type parameters** (small grammar addition).
|
|
|
|
|
-4. Resolve cross-module imports in the harness (pass each file's
|
|
|
|
|
- imported `.def`s) to remove the LIB noise and isolate LANG.
|
|
|
|
|
|
|
+1. **`ARRAY <type> OF T`** (index-type arrays) — a real PIM feature.
|
|
|
|
|
+2. More `SYSTEM` facilities / library holes.
|
|
|
|
|
+3. Array constructors `array{…}` (codegen).
|
|
|
|
|
|
|
|
## Files
|
|
## Files
|
|
|
|
|
|
|
|
`tools/v3-corpus/{corpus.sh,README.md}`, `compiler/src/compiler.frm`
|
|
`tools/v3-corpus/{corpus.sh,README.md}`, `compiler/src/compiler.frm`
|
|
|
-(long-line fix), `compiler/src/M2.atg` (`EXPORT QUALIFIED`),
|
|
|
|
|
-`compiler/tests/t_longline.mod`, `compiler/run_tests.sh`, this doc.
|
|
|
|
|
|
|
+(long-line), `compiler/src/M2.atg` (`EXPORT QUALIFIED`, anchored
|
|
|
|
|
+subranges, unnamed proc-type params), `compiler/src/SymTab.def`/`.mod`
|
|
|
|
|
+(SYSTEM predefs, `ParamTypesOk`), `compiler/tests/t_longline.mod`,
|
|
|
|
|
+`compiler/run_tests.sh`, this doc.
|