|
@@ -99,15 +99,6 @@ VAR
|
|
|
nVal : ARRAY [0 .. 255] OF QVal; (* VAR-actual note keys *)
|
|
nVal : ARRAY [0 .. 255] OF QVal; (* VAR-actual note keys *)
|
|
|
nAddr : ARRAY [0 .. 255] OF QVal; (* VAR-actual note addresses *)
|
|
nAddr : ARRAY [0 .. 255] OF QVal; (* VAR-actual note addresses *)
|
|
|
nn : CARDINAL;
|
|
nn : CARDINAL;
|
|
|
- (* Forward-global designator patch sites: a not-yet-declared
|
|
|
|
|
- identifier inside a procedure body emits "site =l copy 0" plus a
|
|
|
|
|
- load/store operand "fwd<id>"; both are text-patched once the
|
|
|
|
|
- module's declarations are complete. *)
|
|
|
|
|
- nFwd : CARDINAL;
|
|
|
|
|
- dbgFwd : INTEGER;
|
|
|
|
|
- fwdSite : ARRAY [0 .. 255] OF SymTab.Name; (* real name to patch in *)
|
|
|
|
|
- fwdOper : ARRAY [0 .. 255] OF QVal; (* final load/store class *)
|
|
|
|
|
- fwdGlob : ARRAY [0 .. 255] OF BOOLEAN;
|
|
|
|
|
(* Session-state snapshot: Lower runs per unit while the grammar's
|
|
(* Session-state snapshot: Lower runs per unit while the grammar's
|
|
|
suppressed inline emit still mutates these, so Lower saves/restores
|
|
suppressed inline emit still mutates these, so Lower saves/restores
|
|
|
its own values around each unit. *)
|
|
its own values around each unit. *)
|
|
@@ -349,137 +340,6 @@ PROCEDURE AppNum (VAR d: ARRAY OF CHAR; v: CARDINAL);
|
|
|
END
|
|
END
|
|
|
END AppNum;
|
|
END AppNum;
|
|
|
|
|
|
|
|
-PROCEDURE FwdMangle (id: INTEGER; VAR q: QVal);
|
|
|
|
|
- BEGIN
|
|
|
|
|
- Cpy(q, "$fwd");
|
|
|
|
|
- AppNum(q, VAL(CARDINAL, id))
|
|
|
|
|
- END FwdMangle;
|
|
|
|
|
-
|
|
|
|
|
-PROCEDURE FixLoadClass (ph: ARRAY OF CHAR; cls: CHAR);
|
|
|
|
|
-(* Re-class "<tmp> =<x> load<x> <ph>" -> "<tmp> =<cls> load<cls> <ph>".
|
|
|
|
|
- The default emit for an unresolved alias is `l` (pointer-like). *)
|
|
|
|
|
- VAR i, j, n: CARDINAL; found: BOOLEAN;
|
|
|
|
|
- BEGIN
|
|
|
|
|
- n := Len(ph);
|
|
|
|
|
- i := 0;
|
|
|
|
|
- WHILE i + n <= sessUsed DO
|
|
|
|
|
- (* "=c loadc " is 9 chars: '=', c, ' ', 'l','o','a','d', c, ' ' *)
|
|
|
|
|
- found := (i + 9 + n <= sessUsed);
|
|
|
|
|
- IF found THEN
|
|
|
|
|
- found := (sessBuf[i] = "=")
|
|
|
|
|
- AND (sessBuf[i+2] = " ")
|
|
|
|
|
- AND (sessBuf[i+3] = "l") AND (sessBuf[i+4] = "o")
|
|
|
|
|
- AND (sessBuf[i+5] = "a") AND (sessBuf[i+6] = "d")
|
|
|
|
|
- AND (sessBuf[i+8] = " ")
|
|
|
|
|
- AND (sessBuf[i+1] = sessBuf[i+7])
|
|
|
|
|
- END;
|
|
|
|
|
- IF found THEN
|
|
|
|
|
- j := 0; found := TRUE;
|
|
|
|
|
- WHILE (j < n) AND found DO
|
|
|
|
|
- IF sessBuf[i + 9 + j] # ph[j] THEN found := FALSE END; INC(j)
|
|
|
|
|
- END
|
|
|
|
|
- END;
|
|
|
|
|
- IF found THEN
|
|
|
|
|
- sessBuf[i + 1] := cls;
|
|
|
|
|
- sessBuf[i + 7] := cls
|
|
|
|
|
- END;
|
|
|
|
|
- INC(i)
|
|
|
|
|
- END
|
|
|
|
|
- END FixLoadClass;
|
|
|
|
|
-
|
|
|
|
|
-PROCEDURE FixStoreClass (ph: ARRAY OF CHAR; cls: CHAR);
|
|
|
|
|
-(* Re-class "store<x> <val>, <ph>" -> "store<cls> <val>, <ph>": blinks
|
|
|
|
|
- the opcode word that opens the line holding the operand <ph>. *)
|
|
|
|
|
- VAR i, j, n: CARDINAL; found: BOOLEAN;
|
|
|
|
|
- BEGIN
|
|
|
|
|
- n := Len(ph);
|
|
|
|
|
- i := 0;
|
|
|
|
|
- WHILE i + n <= sessUsed DO
|
|
|
|
|
- found := TRUE; j := 0;
|
|
|
|
|
- WHILE (j < n) AND found DO
|
|
|
|
|
- IF sessBuf[i + j] # ph[j] THEN found := FALSE END; INC(j)
|
|
|
|
|
- END;
|
|
|
|
|
- IF found THEN
|
|
|
|
|
- j := i;
|
|
|
|
|
- WHILE (j > 0) AND (sessBuf[j - 1] # CHR(10)) DO DEC(j) END;
|
|
|
|
|
- WHILE (j < i) AND ((sessBuf[j] = " ") OR (sessBuf[j] = CHR(9))) DO
|
|
|
|
|
- INC(j)
|
|
|
|
|
- END;
|
|
|
|
|
- IF (j + 6 <= i)
|
|
|
|
|
- AND (sessBuf[j] = "s") AND (sessBuf[j+1] = "t")
|
|
|
|
|
- AND (sessBuf[j+2] = "o") AND (sessBuf[j+3] = "r")
|
|
|
|
|
- AND (sessBuf[j+4] = "e") THEN
|
|
|
|
|
- sessBuf[j + 5] := cls
|
|
|
|
|
- END
|
|
|
|
|
- END;
|
|
|
|
|
- INC(i)
|
|
|
|
|
- END
|
|
|
|
|
- END FixStoreClass;
|
|
|
|
|
-
|
|
|
|
|
-PROCEDURE BufReplaceAll (pat, rep: ARRAY OF CHAR);
|
|
|
|
|
-(* Literal substring replacement over sessBuf (in place, memmove
|
|
|
|
|
- semantics for both growth and shrink). *)
|
|
|
|
|
- VAR i, j: CARDINAL; n, m, tail, k: CARDINAL; found: BOOLEAN;
|
|
|
|
|
- BEGIN
|
|
|
|
|
- n := Len(pat); m := Len(rep);
|
|
|
|
|
- IF (n = 0) OR (m = 0) THEN RETURN END;
|
|
|
|
|
- i := 0;
|
|
|
|
|
- WHILE i + n <= sessUsed DO
|
|
|
|
|
- found := TRUE; j := 0;
|
|
|
|
|
- WHILE (j < n) AND found DO
|
|
|
|
|
- IF sessBuf[i + j] # pat[j] THEN found := FALSE END; INC(j)
|
|
|
|
|
- END;
|
|
|
|
|
- IF NOT found THEN INC(i)
|
|
|
|
|
- ELSE
|
|
|
|
|
- IF m > n THEN
|
|
|
|
|
- tail := sessUsed;
|
|
|
|
|
- k := m - n;
|
|
|
|
|
- IF tail + k <= HIGH(sessBuf) THEN
|
|
|
|
|
- WHILE tail > i + n DO
|
|
|
|
|
- DEC(tail);
|
|
|
|
|
- sessBuf[tail + k] := sessBuf[tail]
|
|
|
|
|
- END;
|
|
|
|
|
- sessUsed := sessUsed + k
|
|
|
|
|
- END
|
|
|
|
|
- ELSIF m < n THEN
|
|
|
|
|
- tail := i + n;
|
|
|
|
|
- k := n - m;
|
|
|
|
|
- WHILE tail < sessUsed DO
|
|
|
|
|
- sessBuf[tail - k] := sessBuf[tail]; INC(tail)
|
|
|
|
|
- END;
|
|
|
|
|
- sessUsed := sessUsed - k
|
|
|
|
|
- END;
|
|
|
|
|
- j := 0;
|
|
|
|
|
- WHILE j < m DO sessBuf[i + j] := rep[j]; INC(j) END;
|
|
|
|
|
- i := i + m
|
|
|
|
|
- END
|
|
|
|
|
- END;
|
|
|
|
|
- IF sessUsed <= HIGH(sessBuf) THEN sessBuf[sessUsed] := CHR(0) END
|
|
|
|
|
- END BufReplaceAll;
|
|
|
|
|
-
|
|
|
|
|
-PROCEDURE FwdPatchAll;
|
|
|
|
|
-(* Rewrites each forward placeholder into the real designator, and
|
|
|
|
|
- re-classes the load that reads through it. Loads are emitted by the
|
|
|
|
|
- frontend as "<tmp> =<x> load<x> <ph>"; the default class is `w`, so
|
|
|
|
|
- for a `d`/`l` slot the opcode is rewritten to loadd/loadl. Stores
|
|
|
|
|
- are emitted as "store<x> <val>, <ph>"; the class letter of the store
|
|
|
|
|
- is rewritten in place. *)
|
|
|
|
|
- VAR k: INTEGER; ph, sym: QVal; c: CHAR;
|
|
|
|
|
- BEGIN
|
|
|
|
|
- k := 0;
|
|
|
|
|
- WHILE k < VAL(INTEGER, nFwd) DO
|
|
|
|
|
- IF fwdSite[k][0] # CHR(0) THEN
|
|
|
|
|
- FwdMangle(k + 1, ph);
|
|
|
|
|
- Cpy(sym, fwdSite[k]);
|
|
|
|
|
- IF fwdOper[k][0] = CHR(0) THEN c := "w" ELSE c := fwdOper[k][0] END;
|
|
|
|
|
- FixLoadClass(ph, c);
|
|
|
|
|
- FixStoreClass(ph, c);
|
|
|
|
|
- BufReplaceAll(ph, sym)
|
|
|
|
|
- END;
|
|
|
|
|
- INC(k)
|
|
|
|
|
- END;
|
|
|
|
|
- nFwd := 0
|
|
|
|
|
- END FwdPatchAll;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -912,7 +772,6 @@ PROCEDURE EndModule (name: ARRAY OF CHAR);
|
|
|
FlushUStrings;
|
|
FlushUStrings;
|
|
|
FlushCtors;
|
|
FlushCtors;
|
|
|
EmitVTables;
|
|
EmitVTables;
|
|
|
- FwdPatchAll;
|
|
|
|
|
(* the image is named after the program module *)
|
|
(* the image is named after the program module *)
|
|
|
fname[0] := CHR(0);
|
|
fname[0] := CHR(0);
|
|
|
App(fname, "gen_ssa/");
|
|
App(fname, "gen_ssa/");
|