Просмотр исходного кода

resolve-check step 1: Check module scaffold (no-op)

Adds Check.def/Check.mod with Resolve(unit) (the walk entry point) and
Begin/EndSession/BeginUnit hooks, compiled into build.sh and called by
the driver between Parse and Lower.  Gated by doCheck (default TRUE;
the driver option -noresolve disables it) so later increments can
byte-compare.

No behaviour change: suite 190/190, fixpoint OK (3,474,263 bytes),
default and -noresolve emit byte-identical .ssa.
Eric Streit 2 дней назад
Родитель
Сommit
50df0679fc
4 измененных файлов с 65 добавлено и 6 удалено
  1. 3 3
      compiler/build.sh
  2. 22 0
      compiler/src/Check.def
  3. 25 0
      compiler/src/Check.mod
  4. 15 3
      compiler/src/compiler.frm

+ 3 - 3
compiler/build.sh

@@ -24,16 +24,16 @@ mkdir -p gen_ssa
 
 echo "=== Compiling ==="
 rm -f ./*.o
-for m in FileIO AST Lower SymTab QbeGen M2S M2P M2; do
+for m in FileIO AST Lower SymTab QbeGen Check M2S M2P M2; do
   gm2 -fiso -I src -c "src/$m.mod" || exit 1
 done
 
 echo "=== Phase 1: generating the module list ==="
 gm2 -fiso -I src -fgen-module-list=src/modules.lst -o /dev/null \
-    M2S.o M2P.o FileIO.o AST.o Lower.o SymTab.o QbeGen.o src/M2.mod || exit 1
+    M2S.o M2P.o FileIO.o AST.o Lower.o SymTab.o QbeGen.o Check.o src/M2.mod || exit 1
 
 echo "=== Phase 2: compiling main module and linking ==="
 gm2 -fiso -I src -fuse-list=src/modules.lst -o M2 \
-    M2S.o M2P.o FileIO.o AST.o Lower.o SymTab.o QbeGen.o src/M2.mod || exit 1
+    M2S.o M2P.o FileIO.o AST.o Lower.o SymTab.o QbeGen.o Check.o src/M2.mod || exit 1
 
 echo "=== M2 built ==="

+ 22 - 0
compiler/src/Check.def

@@ -0,0 +1,22 @@
+DEFINITION MODULE Check;
+
+(* Resolve / check pass (two-phase, part 2).  A walk over a parsed unit's
+   AST that binds identifiers to symbols, resolves and completes types,
+   and emits the 2xx diagnostics -- run by the driver between Parse and
+   Lower.  See docs/plan-resolve-check.md. *)
+
+IMPORT AST;
+
+PROCEDURE BeginSession (progName: ARRAY OF CHAR);
+(* Per-session setup (alongside Lower.BeginSession). *)
+
+PROCEDURE BeginUnit;
+(* Per-unit setup (called before Parse). *)
+
+PROCEDURE Resolve (unit: AST.Node);
+(* Resolve and check the parsed unit.  No-op in step 1. *)
+
+PROCEDURE EndSession;
+(* Per-session teardown. *)
+
+END Check.

+ 25 - 0
compiler/src/Check.mod

@@ -0,0 +1,25 @@
+IMPLEMENTATION MODULE Check;
+
+(* Resolve / check pass (two-phase, part 2).  Step 1: the scaffold is a
+   no-op, wired into the driver so later increments can move checks here.
+   See docs/plan-resolve-check.md. *)
+
+IMPORT AST;
+
+PROCEDURE BeginSession (progName: ARRAY OF CHAR);
+BEGIN
+END BeginSession;
+
+PROCEDURE BeginUnit;
+BEGIN
+END BeginUnit;
+
+PROCEDURE Resolve (unit: AST.Node);
+BEGIN
+END Resolve;
+
+PROCEDURE EndSession;
+BEGIN
+END EndSession;
+
+END Check.

+ 15 - 3
compiler/src/compiler.frm

@@ -12,7 +12,7 @@ MODULE -->Grammar;
     RefineSeen, RefineIsDef, RefineInst, RefineGen,
     RefineActualCount, RefineActualGet;
   IMPORT
-    Strings, Storage, SYSTEM, FileIO, SymTab, QbeGen, AST, Lower;
+    Strings, Storage, SYSTEM, FileIO, SymTab, QbeGen, AST, Lower, Check;
     (* and any others needed *)
 
   TYPE
@@ -286,6 +286,7 @@ MODULE -->Grammar;
     nFiles: CARDINAL;
     f: CARDINAL;
     bad: BOOLEAN;
+    doCheck: BOOLEAN;   (* run the resolve/check pass (Check.Resolve) *)
 
     (* generics (Increment 2): module name -> source path, def and impl *)
     genDefNm:  ARRAY [0 .. 31] OF ARRAY [0 .. 63] OF CHAR;
@@ -403,8 +404,10 @@ MODULE -->Grammar;
     END;
     AST.Init;
     Lower.BeginUnit;
+    Check.BeginUnit;
     Parse;
     InstEnd;
+    IF doCheck THEN Check.Resolve(GetUnit()) END;
     Lower.LowerUnitNow(GetUnit(), FALSE);
     IF (src # FileIO.StdIn) & (src # FileIO.StdOut) THEN
       FileIO.Close(src)
@@ -415,11 +418,16 @@ MODULE -->Grammar;
   BEGIN
     (* collect the session's source files (program module last) *)
     nFiles := 0;
+    doCheck := TRUE;
     LOOP
       FileIO.NextParameter(sourceName);
       IF (sourceName[0] = CHR(0)) OR (nFiles > HIGH(files)) THEN EXIT END;
-      Strings.Assign(sourceName, files[nFiles]);
-      INC(nFiles)
+      IF EqNm(sourceName, "-noresolve") THEN
+        doCheck := FALSE
+      ELSE
+        Strings.Assign(sourceName, files[nFiles]);
+        INC(nFiles)
+      END
     END;
     IF nFiles = 0 THEN
       FileIO.WriteString(FileIO.StdOut, "No input file specified");
@@ -430,6 +438,7 @@ MODULE -->Grammar;
     SymTab.Init;
     QbeGen.OpenModule(progName);
     Lower.BeginSession(progName);
+    Check.BeginSession(progName);
     Error := StoreError;
 
     (* parse each unit into the shared session *)
@@ -451,6 +460,7 @@ MODULE -->Grammar;
       FileIO.WriteLn(FileIO.StdOut);
       AST.Init;
       Lower.BeginUnit;
+      Check.BeginUnit;
       Parse;
       UnitNameGet(uname);
       IF RefineSeen() THEN
@@ -460,6 +470,7 @@ MODULE -->Grammar;
            emit the abstract template *)
         NoteGen(uname, UnitIsDefModule(), sourceName)
       ELSE
+        IF doCheck THEN Check.Resolve(GetUnit()) END;
         Lower.LowerUnitNow(GetUnit(), f = nFiles - 1)
       END;
       PrintListing;
@@ -478,6 +489,7 @@ MODULE -->Grammar;
     END;
 
     Lower.EndSession;
+    Check.EndSession;
 
     IF bad OR NOT SymTab.HaveProgram()
       THEN FileIO.WriteString(FileIO.StdOut, "Incorrect source")