1 (* ==================================================================== *)
2 (* *)
3 (* StatDesc Module for the Gardens Point Component Pascal Compiler. *)
4 (* Implements statement descriptors that are extensions of *)
5 (* Symbols.Stmt *)
6 (* *)
7 (* Copyright (c) John Gough 1999, 2000. *)
8 (* *)
9 (* ==================================================================== *)
10 (* Empty Assign Return Block ProcCall ForLoop Choice ExitSt TestLoop CaseSt *)
11 (* ==================================================================== *)
15 IMPORT
16 GPCPcopyright,
17 GPText,
18 Console,
19 FileNames,
20 LitValue,
31 (* ============================================================ *)
39 (* ============================================================ *)
45 (* ============================================================ *)
47 TYPE
49 (* ----------------------------------------- *
50 * kind- : INTEGER; (* tag for unions *)
52 * ----------------------------------------- *)
55 (* ============================================================ *)
57 TYPE
59 (* ----------------------------------------- *
60 * kind- : INTEGER; (* tag for unions *)
62 * ----------------------------------------- *)
67 (* ============================================================ *)
69 TYPE
71 (* ----------------------------------------- *
72 * kind- : INTEGER; (* tag for unions *)
74 * ----------------------------------------- *)
78 (* ============================================================ *)
80 TYPE
82 (* ----------------------------------------- *
83 * kind- : INTEGER; (* tag for unions *)
85 * ----------------------------------------- *)
90 (* ============================================================ *)
92 TYPE
94 (* ----------------------------------------- *
95 * kind- : INTEGER; (* tag for unions *)
97 * ----------------------------------------- *)
101 (* ============================================================ *)
103 TYPE
105 (* ----------------------------------------- *
106 * kind- : INTEGER; (* tag for unions *)
108 * ----------------------------------------- *)
116 (* ============================================================ *)
118 TYPE
120 (* ----------------------------------------- *
121 * kind- : INTEGER; (* tag for unions *)
123 * ----------------------------------------- *
131 * ----------------------------------------- *)
137 (* ============================================================ *)
139 TYPE
141 (* ----------------------------------------- *
142 * kind- : INTEGER; (* tag for unions *)
144 * ----------------------------------------- *)
148 (* ============================================================ *)
150 TYPE
152 (* ----------------------------------------- *
153 * kind- : INTEGER; (* tag for unions *)
155 * ----------------------------------------- *
160 * ----------------------------------------- *)
168 (* ============================================================ *)
170 TYPE
177 (* ---------------------------------- *)
179 TYPE
186 (* ---------------------------------- *)
188 TYPE
190 (* ----------------------------------------- *
191 * kind- : INTEGER; (* tag for unions *)
193 * ----------------------------------------- *)
201 (* ---------------------------------------------------------- *
202 * Notes on the semantics of this structure. "blocks" holds *
203 * an ordered list of case statement code blocks. "labels" *
204 * is a list of ranges, intially in textual order, with flds *
205 * loC, hiC and ord corresponding to the range min, max and *
206 * the selected block ordinal number. This list is later *
207 * sorted on the loC value, and adjacent values merged if *
208 * they select the same block. The "groups" list of triples *
209 * groups ranges into dense subranges in the selector space. *
210 * The fields loC, hiC, and ord to hold the lower and upper *
211 * indices into the labels list, and the number of non- *
212 * default values in the group. Groups are guaranteed to *
213 * have density (nonDefN / (max-min+1)) > DENSITY *
214 * ---------------------------------------------------------- *)
216 (* ============================================================ *)
220 BEGIN
224 (* ---------------------------------- *)
227 BEGIN
231 (* ---------------------------------- *)
234 BEGIN
239 (* ---------------------------------- *)
244 BEGIN
256 (* ---------------------------------- *)
258 (*
259 *PROCEDURE (VAR seq : TripleSeq)Diagnose(IN str : ARRAY OF CHAR),NEW;
260 * VAR index : INTEGER;
261 *BEGIN
262 * Console.WriteString("Diagnose TripleSeq " + str); Console.WriteLn;
263 * FOR index := 0 TO seq.tide-1 DO
264 * Console.WriteInt(index, 3);
265 * Console.WriteInt(seq.a[index].loC, 8);
266 * Console.WriteInt(seq.a[index].hiC, 8);
267 * Console.WriteInt(seq.a[index].ord, 8);
268 * Console.WriteLn;
269 * END;
270 *END Diagnose;
271 *)
273 (* ============================================================ *)
274 (* Various Statement Text-Span Constructors *)
275 (* ============================================================ *)
278 BEGIN
284 BEGIN
291 BEGIN
296 BEGIN
301 BEGIN
305 (*PROCEDURE (s : ProcCall)Span*() : S.Span;
306 BEGIN
307 RETURN s.expr.tSpan;
308 END Span;*)
311 (* ============================================================ *)
312 (* Various Statement Descriptor Constructors *)
313 (* ============================================================ *)
317 BEGIN
322 (* ---------------------------------- *)
326 BEGIN
331 (* ---------------------------------- *)
335 BEGIN
340 (* ---------------------------------- *)
344 BEGIN
349 (* ---------------------------------- *)
353 BEGIN
358 (* ---------------------------------- *)
362 BEGIN
367 (* ---------------------------------- *)
371 BEGIN
376 (* ---------------------------------- *)
380 BEGIN
385 (* ---------------------------------- *)
389 BEGIN
394 (* ---------------------------------- *)
398 BEGIN
403 (* ---------------------------------- *)
407 BEGIN
412 (* ---------------------------------- *)
416 BEGIN
421 (* ---------------------------------- *)
425 BEGIN
430 (* ============================================================ *)
433 (* A for loop is simple if it always executes at least once. *)
437 BEGIN
445 ELSE
448 ELSE
453 (* ============================================================ *)
454 (* Type Erasure *)
455 (* ============================================================ *)
460 BEGIN
467 BEGIN
479 (* ============================================================ *)
480 (* Statement Attribution *)
481 (* ============================================================ *)
486 (* ---------------------------------- *)
490 BEGIN
496 (* ---------------------------------- *)
501 BEGIN
502 (*
503 * Assert: lhsX is a designator, it has been
504 * attributed during parsing, and has a non-null type.
505 *
506 * First: attribute the right-hand-side expression.
507 *)
509 (*
510 * First check: is the designator writeable.
511 *)
517 (*
518 * Second check: does the expression need dereferencing.
519 *)
525 (*
526 * Third check: does the expression need type coercion.
527 *)
532 (*
533 * Fourth check: are value copies allowed here.
534 *)
559 (* ---------------------------------- *)
566 BEGIN
569 ELSE
575 ELSE
578 ELSE
605 (* ---------------------------------- *)
611 BEGIN
618 (* ---------------------------------- *)
621 BEGIN
629 (* ---------------------------------- *)
636 BEGIN
651 (* ---------------------------------- *)
656 (* ---------------------------------- *)
659 BEGIN
665 (* ---------------------------------- *)
668 (* At this point the select expression has already been attributed *)
669 (* during parsing, and the raw case ordinals have been checked. *)
672 (* ------------------------- *)
678 BEGIN
681 REPEAT
693 (* ------------------------- *)
701 BEGIN
704 (* overlap is from "lo" to MIN(mx, hi) ... *)
712 (*
713 * We want to place a full diagnostic on the earlier
714 * of the two cases, if there are two. Place a simple
715 * diagnostic on the second of the two cases.
716 *)
730 (* ------------------------- *)
738 BEGIN
744 (* test for overlaps ! *)
748 ELSE
760 (* ------------------------- *)
770 BEGIN
771 (* IF G.verbose THEN cs.labels.Diagnose("selector labels") END; *)
772 (*
773 * Perform the backward pass, merging dense groups.
774 * Indices are between cs.labels.tide-1 and 0.
775 *)
778 (* Invariant: all ranges with index > "index" have been *
779 * grouped and appended to the first pass list p1Grp. *)
785 (* Invariant: crGrp groups info on all ranges with *
786 * index >= "index" not already appended to tempGP *)
792 ELSE
798 (* IF G.verbose THEN p1Grp.Diagnose("first pass groups") END; *)
799 (*
800 * Perform the forward pass, merging dense groups.
801 * Indices are between 0 and p1Grp.tide-1.
802 * Note the implicit list reversal here.
803 *)
806 (* Invariant: all groups with index > "index" have been *
807 * grouped and appended to the final list cs.groups. *)
812 (* Invariant: crGrp contains info on all groups with *
813 * index >= "index" not already appended to tempGP *)
820 ELSE
827 (* IF G.verbose THEN cs.groups.Diagnose("final groups") END; *)
830 (* ------------------------- *)
832 BEGIN
834 (*
835 * First: do all controlled statement attribution.
836 *)
841 (*
842 * Next: sort all triples on the loC value.
843 *)
844 (* IF G.verbose THEN s.labels.Diagnose("unsorted labels") END; *)
846 (* IF G.verbose THEN s.labels.Diagnose("sorted labels") END; *)
847 (*
848 * Next: compact adjacent cases with same block-ord.
849 *)
851 (*
852 * Next: create lists of dense subranges.
853 *)
857 (* ============================================================ *)
858 (* Flow attribute evaluation for all statement types *)
859 (* ============================================================ *)
863 BEGIN
870 (* ---------------------------------- *)
873 (* Invariant: param lvIn is unchanged by this procedure *)
875 BEGIN
881 (* ---------------------------------- *)
884 BEGIN
888 (* ---------------------------------- *)
891 BEGIN
897 (* ---------------------------------- *)
900 BEGIN
904 (* ---------------------------------- *)
908 BEGIN
909 (*
910 * The limits are evaluated in a prescribed order,
911 * chaining the live set. The body may or may not
912 * be evaluated. [We might later test this for static
913 * evaluation, but might need to emit different code
914 * for the two cases, to keep the verifier happy.]
915 * [This is now done, 30-Mar-2000, (kjg)]
916 *)
923 (*
924 * If this for loop is simple, it will be executed
925 * at least once. Thus the flow-attribution consequences
926 * of execution will be included in live-out var-set.
927 *)
933 (* ---------------------------------- *)
942 BEGIN
947 (*
948 * In the case of IF statements there is always the possiblity
949 * that a predicate evaluation will have a side-effect. Thus ...
950 *)
962 (*
963 * If we did not find an elsepart, then we must
964 * merge the result of executing the implicit "skip".
965 *)
967 ELSE
968 (*
969 * In the case of WITH statements there is no evaluation
970 * involved in the predicate test, and hence no side-effect.
971 *)
983 (* ---------------------------------- *)
986 (* Merge all exit sets into the "merge" set of the enclosing *)
987 (* LOOP. Return the input live set, unchanged. *)
988 BEGIN
993 (* ---------------------------------- *)
997 BEGIN
999 (*
1000 * For a WHILE statement, the expression is evaluated first.
1001 *)
1006 (*
1007 * For a REPEAT statement, the expression is evaluated last.
1008 *)
1020 (* ---------------------------------- *)
1026 BEGIN
1029 (*
1030 * The live-out set of this statement is the intersection
1031 * of the live-out of all of the components of the CASE.
1032 * All cases receive the same input set: the result of the
1033 * evaluation of the select expression.
1034 *)
1038 (*
1039 * In the event that there is no ELSE case, and unlike the
1040 * case of the IF statement, the program aborts and does
1041 * not effect the accumulated live-out set, lvOu.
1042 *)
1049 (* ============================================================ *)
1050 (* Diagnostic Procedures *)
1051 (* ============================================================ *)
1054 BEGIN
1070 ELSE
1080 (* ---------------------------------- *)
1083 BEGIN
1087 (* ---------------------------------- *)
1090 BEGIN
1095 (* ---------------------------------- *)
1099 BEGIN
1108 (* ---------------------------------- *)
1111 BEGIN
1117 (* ---------------------------------- *)
1120 BEGIN
1125 (* ---------------------------------- *)
1128 BEGIN
1139 (* ---------------------------------- *)
1146 BEGIN
1153 ELSE
1158 ELSE
1165 (* ---------------------------------- *)
1168 BEGIN
1172 (* ---------------------------------- *)
1175 BEGIN
1183 (* ---------------------------------- *)
1191 (* ------------------------- *)
1193 BEGIN
1200 (* ------------------------- *)
1202 BEGIN
1224 (* write out last label and case *)
1238 ELSE
1245 (* ============================================================ *)
1248 (* ============================================================ *)