|
|
1.1 root 1: SUBROUTINE CONSTR(MAINND)
2: LOGICAL SYSERR, ERR, ABORT, INSYM, GREEN, INDIR
3: LOGICAL OVER
4: C NOTE SETNOD SETS ABORT FOR 2 P.U. WITH SAME NAME
5: C CONSTR SETS ABORT IF IT FINDS NO SYMBOL TABLES FROM PASS1
6: C ASLEV SETS ABORT IF IT FINDS RECURSION IN CALLING GRAPH
7: INTEGER OUTUT2, OUTUT3, OUTUT4, SYMLEN
8: INTEGER PNODE, PLAT, LS(2)
9: COMMON /HEAD/ LNODE, PNODE, NODE(500)
10: COMMON /SCR1/ LINODE, INODE(500)
11: COMMON /PARAMS/ I1, I2, I3, SYMLEN, OUTUT2, OUTUT3, OUTUT4
12: COMMON /GRAPH/ LLAT, PLAT, LAT(6000)
13: COMMON /DETECT/ ERR, SYSERR, ABORT
14: DATA IBR /1/, JBR /4/
15: DATA LS(1) /1H,/, LS(2) /1H /
16: C
17: C CONSTR DIRECTS THE FIRST PORTION OF PASS2
18: C CALLS SETNOD TO CONSTRUCT THE LAT NODES FOR EACH P.U..
19: C CALLS SETEXT TO SETUP BASIC EXERNALS NODES
20: C AS NEEDED.
21: C CALLS SETREF TO MAKE CONNECTS BETWEEN THE NODES
22: C CALLS INVOKE TO CALCULATE LEVELS AND ASSIMILATE
23: C ALL PROC INFO NECESSARY
24: C CALLS ERASE TO GET RID OF NON-REFERENCE LINKS IN
25: C CALLING GRAPH
26: C CALLS CHKALL TO DO FINAL CHECKS OF ALL REFS AND TO
27: C WRITE ALL GOOD REFS OUT FOR FUTURE PROCESSING
28: C FORMS SUPERROOT IN GRAPH
29: C CALLS OUTPUT ROUTINES WHENEVER CAN, TO GIVE PARTIAL
30: C LISTINGS OF CURRENT DATA STRUCTURE
31: C
32: C USE INSYM TO POSSIBLY SKIP OVER BAD REFS WITH DUMMY SYM TBL
33: C SETREF READS REFS FROM OUTUT3, WRITES ON OUTUT4
34: C INVOKE READS FROM OUTUT4
35: C CHKALL READS FROM OUTUT4, WRITES OUTUT3
36: C UNSAFE READS FROM OUTUT3
37: C INITIALIZE LEVEL ARRAY AND ISR
38: ISR = 0
39: DO 10 I=1,LNODE
40: INODE(I) = 0
41: 10 CONTINUE
42: C INITIALIZE LOGICAL FLAGS FOR DETECTION OF PRESENCE OF
43: C EXTERNAL ENTITIES (GREEN) AND INDIRECT REFS(INDIR)
44: GREEN = .FALSE.
45: INDIR = .FALSE.
46: 20 IF(.NOT.INSYM(0,0)) GOTO 30
47: C
48: C SUCCESSFULLY READ SYMBOL TABLE
49: C
50: CALL SETNOD
51: IF (SYSERR .OR. ABORT) GO TO 130
52: GO TO 20
53: 30 REWIND OUTUT2
54: IF (PNODE.EQ.1) GO TO 150
55: C CHANGE LEVEL ON ASFS SO DONT PROCESS THEM
56: L = PNODE - 1
57: DO 40 I=1,L
58: IF (NODE(I).LT.0) INODE(I) = -2
59: 40 CONTINUE
60: C
61: C SETUP BASIC EXTERNAL DEFNS AS NEEDED
62: C
63: CALL SETEXT
64: IF (SYSERR) GO TO 130
65: C
66: C READ IN SYMBOL TABLES
67: C SETREF WILL READ IN REFS
68: C
69: 50 IF(.NOT.INSYM(OUTUT3, OUTUT4)) GOTO 60
70: CALL SETREF ( GREEN, INDIR )
71: IF (SYSERR .OR. ABORT) GO TO 130
72: GO TO 50
73: 60 REWIND OUTUT2
74: REWIND OUTUT3
75: WRITE (OUTUT4) IBR, JBR, IBR
76: REWIND OUTUT4
77: IF(.NOT.INDIR) GOTO 70
78: C
79: C CALL LEVEL ALG
80: C
81: CALL INVOKE
82: IF (ABORT .OR. SYSERR) GO TO 130
83: REWIND OUTUT2
84: REWIND OUTUT4
85: C
86: C CHECK AND EXPAND REFS AND SAVE ALL GOOD ONES FOR LATER
87: C
88: 70 IF(.NOT.INSYM(OUTUT4,OUTUT3)) GOTO 80
89: CALL CHKALL
90: IF (SYSERR) GO TO 130
91: GO TO 70
92: 80 WRITE (OUTUT3) IBR, JBR, IBR
93: C
94: C CONSTRUCT SUPEROOT IN LAT
95: C
96: IF (PNODE+1.GT.LNODE) GO TO 180
97: IF (PLAT+SYMLEN+7.GT.LLAT) GO TO 160
98: NODE(PNODE) = PLAT
99: C MAINND IS SUPEROOT INDEX IN NODE
100: C ISR IS SUPEROOT INDEX IN LAT
101: MAINND = PNODE
102: ISR = PLAT
103: PNODE = PNODE + 1
104: LAT(PLAT) = LS(1)
105: PLAT = PLAT + 1
106: IF (SYMLEN.EQ.1) GO TO 100
107: DO 90 I=2,SYMLEN
108: L = PLAT + I - 2
109: LAT(L) = LS(2)
110: 90 CONTINUE
111: PLAT = L + 1
112: 100 L = PLAT + 5
113: DO 110 I=PLAT,L
114: LAT(I) = 0
115: 110 CONTINUE
116: LAT(L+1) = 5
117: PLAT = L + 2
118: C
119: C LOOK FOR CALLABLE PGM UNITS WITHOUT PARENTS
120: C
121: L = PNODE - 2
122: DO 120 I=1,L
123: K = SYMLEN + 3 + IABS(NODE(I))
124: IF (LAT(K).EQ.0) CALL SETPD(IABS(NODE(I)), ISR)
125: IF (SYSERR) GO TO 130
126: 120 CONTINUE
127: 130 IF(.NOT.GREEN) GOTO 190
128: C ERASE GREEN LINKS
129: L = PNODE - 2
130: DO 210 I = 1,L
131: C SKIP ASF NODES
132: IF(NODE(I) .LT. 0) GOTO 210
133: C FIND HEAD OF GREEN LINKS
134: N = NODE(I) + SYMLEN + 3
135: 220 IF(LAT(N+1) .LE. 0) GOTO 230
136: N = LAT(N+1)
137: GOTO 220
138: 230 LAT(N+1) = 0
139: 210 CONTINUE
140: 190 OVER = SYSERR
141: SYSERR = .FALSE.
142: CALL OUT2 (ISR)
143: SYSERR = SYSERR.OR.OVER
144: IF(SYSERR) CALL ERROR1(
145: * 56H ILLEGAL COMMON USAGE AND UNSAFE REFERENCES NOT VERIFIED,
146: * 56)
147: CALL OUT2C
148: 140 RETURN
149: 150 ABORT = .TRUE.
150: GO TO 140
151: 160 CALL ERROR1(33H IN CONSTR, TABLE OVERFLOW OF LAT, 33)
152: 170 SYSERR = .TRUE.
153: GO TO 130
154: 180 CALL ERROR1(34H IN CONSTR, TABLE OVERFLOW OF NODE, 34)
155: GO TO 170
156: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.