From c9b56ea10e16c884720a68f5b2bb8c821049521d Mon Sep 17 00:00:00 2001 From: David C W Brown Date: Tue, 16 Jun 2020 18:12:30 +0100 Subject: [PATCH] Remove GC blocking IF test, add abstract comment to each compiler mod. --- src/compiler/OPB.Mod | 2 +- src/compiler/OPP.Mod | 1 + src/compiler/OPS.Mod | 1 + src/compiler/OPT.Mod | 1 + src/compiler/OPV.Mod | 1 + src/runtime/Heap.Mod | 59 ++++++++++++++++++++++++-------------------- 6 files changed, 37 insertions(+), 28 deletions(-) diff --git a/src/compiler/OPB.Mod b/src/compiler/OPB.Mod index 84085804..718d9b9e 100644 --- a/src/compiler/OPB.Mod +++ b/src/compiler/OPB.Mod @@ -1,5 +1,5 @@ +(* Oberon Portable build parse tree (front end) *) MODULE OPB; (* RC 6.3.89 / 21.2.94 *) (* object model 17.1.93 *) -(* build parse tree *) IMPORT OPT, OPS, OPM, SYSTEM; diff --git a/src/compiler/OPP.Mod b/src/compiler/OPP.Mod index 2b9fb0b1..96117cad 100644 --- a/src/compiler/OPP.Mod +++ b/src/compiler/OPP.Mod @@ -1,3 +1,4 @@ +(* OPP - Oberon Portable Parser (front end) *) MODULE OPP; (* NW, RC 6.3.89 / 10.2.94 *) (* object model 4.12.93 *) IMPORT diff --git a/src/compiler/OPS.Mod b/src/compiler/OPS.Mod index 909cdee2..9cb59e37 100644 --- a/src/compiler/OPS.Mod +++ b/src/compiler/OPS.Mod @@ -1,3 +1,4 @@ +(* Oberon Portable Scanner (front end) *) MODULE OPS; (* NW, RC 6.3.89 / 18.10.92 *) (* object model 3.6.92 *) IMPORT OPM, SYSTEM; diff --git a/src/compiler/OPT.Mod b/src/compiler/OPT.Mod index 2641703e..758bb505 100644 --- a/src/compiler/OPT.Mod +++ b/src/compiler/OPT.Mod @@ -1,3 +1,4 @@ +(* OPT - Oberon Portable Symbol Table (front end) *) MODULE OPT; (* NW, RC 6.3.89 / 23.1.92 *) (* object model 24.2.94 *) (* diff --git a/src/compiler/OPV.Mod b/src/compiler/OPV.Mod index 371d69d3..c6b26c05 100644 --- a/src/compiler/OPV.Mod +++ b/src/compiler/OPV.Mod @@ -1,3 +1,4 @@ +(* OPV - parse tree traverser (back end) *) MODULE OPV; (* J. Templ 16.2.95 / 3.7.96 26.7.2002 jt bug fix OPS.in Len: wrong result if called for fixed OPT.Array diff --git a/src/runtime/Heap.Mod b/src/runtime/Heap.Mod index 885b4899..4c57fa3c 100644 --- a/src/runtime/Heap.Mod +++ b/src/runtime/Heap.Mod @@ -91,7 +91,7 @@ MODULE Heap; (* finalization candidates *) fin: FinNode; - (* garbage collector locking *) + (* garbage collector busy flag *) lockdepth: INTEGER; interrupted: BOOLEAN; @@ -549,6 +549,8 @@ MODULE Heap; END END MarkStack; + + PROCEDURE GC*(markStack: BOOLEAN); VAR m: Module; @@ -556,34 +558,37 @@ MODULE Heap; i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23: S.ADDRESS; cand: ARRAY 10000 OF S.ADDRESS; BEGIN - IF (lockdepth = 0) OR (lockdepth = 1) & ~markStack THEN - Lock(); - m := S.VAL(Module, modules); - WHILE m # NIL DO - IF m.enumPtrs # NIL THEN m.enumPtrs(MarkP) END; - m := m^.next + Lock(); + m := S.VAL(Module, modules); + WHILE m # NIL DO + IF m.enumPtrs # NIL THEN m.enumPtrs(MarkP) END; + m := m^.next + END; + IF markStack THEN + (* generate register pressure to force callee saved registers to memory; + may be simplified by inlining OS calls or processor specific instructions + *) + i0 := -100; i1 := -101; i2 := -102; i3 := -103; i4 := -104; i5 := -105; i6 := -106; i7 := -107; + i8 := 1; i9 := 2; i10 := 3; i11 := 4; i12 := 5; i13 := 6; i14 := 7; i15 := 8; + i16 := 9; i17 := 10; i18 := 11; i19 := 12; i20 := 13; i21 := 14; i22 := 15; i23 := 16; + LOOP + INC(i0, 1); INC(i1, 2); INC(i2, 3); INC(i3, 4); INC(i4, 5); INC(i5, 6); INC(i6, 7); INC(i7, 8); + INC(i8, 9); INC(i9, 10); INC(i10, 11); INC(i11, 12); INC(i12, 13); INC(i13, 14); INC(i14, 15); INC(i15, 16); + INC(i16, 17); INC(i17, 18); INC(i18, 19); INC(i19, 20); INC(i20, 21); INC(i21, 22); INC(i22, 23); INC(i23, 24); + IF (i0 = -99) & (i15 = 24) THEN (* True at first iteration *) + MarkStack(32, cand); EXIT + END END; - IF markStack THEN - (* generate register pressure to force callee saved registers to memory; - may be simplified by inlining OS calls or processor specific instructions - *) - i0 := -100; i1 := -101; i2 := -102; i3 := -103; i4 := -104; i5 := -105; i6 := -106; i7 := -107; - i8 := 1; i9 := 2; i10 := 3; i11 := 4; i12 := 5; i13 := 6; i14 := 7; i15 := 8; - i16 := 9; i17 := 10; i18 := 11; i19 := 12; i20 := 13; i21 := 14; i22 := 15; i23 := 16; - LOOP INC(i0, 1); INC(i1, 2); INC(i2, 3); INC(i3, 4); INC(i4, 5); INC(i5, 6); INC(i6, 7); INC(i7, 8); - INC(i8, 9); INC(i9, 10); INC(i10, 11); INC(i11, 12); INC(i12, 13); INC(i13, 14); INC(i14, 15); INC(i15, 16); - INC(i16, 17); INC(i17, 18); INC(i18, 19); INC(i19, 20); INC(i20, 21); INC(i21, 22); INC(i22, 23); INC(i23, 24); - IF (i0 = -99) & (i15 = 24) THEN MarkStack(32, cand); EXIT END - END; - IF i0 + i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + i10 + i11 + i12 + i13 + i14 + i15 - + i16 + i17 + i18 + i19 + i20 + i21 + i22 + i23 > 10000 THEN RETURN (* use all variables *) - END; + IF i0 + i1 + i2 + i3 + i4 + i5 + i6 + i7 (* use all variables *) + + i8 + i9 + i10 + i11 + i12 + i13 + i14 + i15 + + i16 + i17 + i18 + i19 + i20 + i21 + i22 + i23 > 10000 THEN (* Always false *) + RETURN END; - CheckFin; - Scan; - Finalize; - Unlock() - END + END; + CheckFin; + Scan; + Finalize; + Unlock() END GC; PROCEDURE RegisterFinalizer*(obj: S.PTR; finalize: Finalizer);