1 /*-
2 * %sccs.include.proprietary.c%
3 */
4
5 #ifndef lint
6 static char sccsid[] = "@(#)3.flow.c 8.1 (Berkeley) 06/06/93";
7 #endif /* not lint */
8
9 #include <stdio.h>
10 #
11 /*
12 correct the flow of control in the new program - use GOTO's which may
13 be changed later to NEXT, BREAK, etc.
14 */
15 #include "def.h"
16 #include "3.def.h"
17
18 #define BRANCHTYPE(v) (NTYPE(v) == GOVX )
19 #define HASLEX(t) (t != GOVX && t != COMPVX && t != ASGOVX && t != ITERVX )
20 /* for these, control never flows directly to following statement */
21
22
getflow()23 getflow()
24 {
25 fixflow(START,UNDEFINED);
26 }
27
28
fixflow(v,autolex)29 fixflow(v,autolex)
30 VERT v;
31 VERT autolex; /* lexical successor of v */
32 {
33 VERT lex,chlex,z,x,w;
34 int i;
35 lex = lexval(v,autolex);
36 if (HASLEX(NTYPE(v)) && NTYPE(v) != ICASVX)
37 if (DEFINED(REACH(v)) && REACH(v) != lex)
38 insib(v,makebr(REACH(v)));
39 else if (NTYPE(v) == DOVX && ARC(v,1) != lex)
40 insib(v,makebr(ARC(v,1)));
41 if (NTYPE(v) == ITERVX)
42 {
43 BRK(v) = autolex;
44 chlex = v;
45 }
46 else
47 chlex = lexval(v,autolex);
48
49 for (i = 0; i < CHILDNUM(v); ++i)
50 {
51 w = LCHILD(v,i);
52 if (DEFINED(w))
53 fixflow(w,chlex);
54 else
55 {
56 ASSERT(i < ARCNUM(v),fixflow);
57 z = ARC(v,i);
58 ASSERT(DEFINED(z), fixflow);
59 if (z != chlex)
60 {
61 x = makebr(z);
62 LCHILD(v,i) = x;
63 RSIB(x) = UNDEFINED;
64 }
65 }
66 }
67 if (DEFINED(RSIB(v)))
68 fixflow(RSIB(v),autolex);
69 }
70
71
lexval(v,lastlex)72 lexval(v,lastlex)
73 VERT v,lastlex;
74 {
75 VERT sib;
76 if (!HASLEX(NTYPE(v))) return(UNDEFINED);
77 sib = RSIB(v);
78 if (NTYPE(v) == ICASVX || NTYPE(v) == ACASVX)
79 return(lastlex);
80 else if (!DEFINED(sib))
81 return(lastlex);
82 else if (BRANCHTYPE(sib))
83 return(ARC(sib,0));
84 else return(sib);
85 }
86
87
makebr(w)88 makebr(w) /* make branching node leading to w */
89 VERT w;
90 {
91 VERT new;
92 new = create(GOVX,1);
93 ARC(new,0) = w;
94 RSIB(new) = UNDEFINED;
95 REACH(new) = UNDEFINED;
96 return(new);
97 }
98