Commit | Line | Data |
---|---|---|
853979d9 BJ |
1 | #include <stdio.h> |
2 | ||
3 | #ifdef unix | |
4 | # include <ctype.h> | |
5 | #endif | |
6 | ||
7 | #include "ftypes" | |
8 | #include "defines" | |
9 | #include "machdefs" | |
10 | ||
11 | #define VL 6 | |
12 | ||
13 | #define MAXDIM 20 | |
14 | #define MAXINCLUDES 10 | |
15 | #define MAXLITERALS 20 | |
16 | #define MAXCTL 20 | |
17 | #define MAXHASH 401 | |
18 | #define MAXSTNO 201 | |
19 | #define MAXEXT 200 | |
20 | #define MAXEQUIV 150 | |
21 | #define MAXLABLIST 125 | |
22 | ||
23 | typedef union Expression *expptr; | |
24 | typedef union Taggedblock *tagptr; | |
25 | typedef struct Chain *chainp; | |
26 | typedef struct Addrblock *Addrp; | |
27 | typedef struct Constblock *Constp; | |
28 | typedef struct Exprblock *Exprp; | |
29 | typedef struct Nameblock *Namep; | |
30 | ||
31 | extern FILEP infile; | |
32 | extern FILEP diagfile; | |
33 | extern FILEP textfile; | |
34 | extern FILEP asmfile; | |
35 | extern FILEP initfile; | |
36 | extern long int headoffset; | |
37 | ||
38 | extern char token [ ]; | |
39 | extern int toklen; | |
40 | extern int lineno; | |
41 | extern char *infname; | |
42 | extern int needkwd; | |
43 | extern struct Labelblock *thislabel; | |
44 | ||
45 | extern int maxctl; | |
46 | extern int maxequiv; | |
47 | extern int maxstno; | |
48 | extern int maxhash; | |
49 | extern int maxext; | |
50 | ||
51 | extern flag profileflag; | |
52 | extern flag optimflag; | |
53 | extern flag nowarnflag; | |
54 | extern flag ftn66flag; | |
55 | extern flag no66flag; | |
56 | extern flag noextflag; | |
57 | extern flag shiftcase; | |
58 | extern flag undeftype; | |
59 | extern flag shortsubs; | |
60 | extern flag onetripflag; | |
61 | extern flag checksubs; | |
62 | extern flag debugflag; | |
63 | extern int nerr; | |
64 | extern int nwarn; | |
65 | extern int ndata; | |
66 | ||
67 | extern int parstate; | |
68 | extern flag headerdone; | |
69 | extern int blklevel; | |
70 | extern flag saveall; | |
71 | extern flag substars; | |
72 | extern int impltype[ ]; | |
73 | extern int implleng[ ]; | |
74 | extern int implstg[ ]; | |
75 | ||
76 | extern int tyint; | |
77 | extern int tylogical; | |
78 | extern ftnint typesize[]; | |
79 | extern int typealign[]; | |
80 | extern int procno; | |
81 | extern int proctype; | |
82 | extern char * procname; | |
83 | extern int rtvlabel[ ]; | |
84 | extern int fudgelabel; /* to confuse the pdp11 optimizer */ | |
85 | extern Addrp typeaddr; | |
86 | extern Addrp retslot; | |
87 | extern int cxslot; | |
88 | extern int chslot; | |
89 | extern int chlgslot; | |
90 | extern int procclass; | |
91 | extern ftnint procleng; | |
92 | extern int nentry; | |
93 | extern flag multitype; | |
94 | extern int blklevel; | |
95 | extern int lastlabno; | |
96 | extern int lastvarno; | |
97 | extern int lastargslot; | |
98 | extern int argloc; | |
99 | extern ftnint autoleng; | |
100 | extern ftnint bssleng; | |
101 | extern int retlabel; | |
102 | extern int ret0label; | |
103 | extern int dorange; | |
104 | extern int regnum[ ]; | |
105 | extern Namep regnamep[ ]; | |
106 | extern int maxregvar; | |
107 | extern int highregvar; | |
108 | extern int nregvar; | |
109 | ||
110 | extern chainp templist; | |
111 | extern int maxdim; | |
112 | extern chainp holdtemps; | |
113 | extern struct Entrypoint *entries; | |
114 | extern struct Rplblock *rpllist; | |
115 | extern struct Chain *curdtp; | |
116 | extern ftnint curdtelt; | |
117 | extern flag toomanyinit; | |
118 | ||
119 | extern flag inioctl; | |
120 | extern int iostmt; | |
121 | extern Addrp ioblkp; | |
122 | extern int nioctl; | |
123 | extern int nequiv; | |
124 | extern int eqvstart; /* offset to eqv number to guarantee uniqueness */ | |
125 | extern int nintnames; | |
126 | ||
127 | #ifdef SDB | |
128 | extern int dbglabel; | |
129 | extern flag sdbflag; | |
130 | #endif | |
131 | \f | |
132 | struct Chain | |
133 | { | |
134 | chainp nextp; | |
135 | tagptr datap; | |
136 | }; | |
137 | ||
138 | extern chainp chains; | |
139 | ||
140 | struct Headblock | |
141 | { | |
142 | field tag; | |
143 | field vtype; | |
144 | field vclass; | |
145 | field vstg; | |
146 | expptr vleng; | |
147 | } ; | |
148 | ||
149 | struct Ctlframe | |
150 | { | |
151 | unsigned ctltype:8; | |
152 | unsigned dostepsign:8; | |
153 | int ctlabels[4]; | |
154 | int dolabel; | |
155 | Namep donamep; | |
156 | expptr domax; | |
157 | expptr dostep; | |
158 | }; | |
159 | #define endlabel ctlabels[0] | |
160 | #define elselabel ctlabels[1] | |
161 | #define dobodylabel ctlabels[1] | |
162 | #define doposlabel ctlabels[2] | |
163 | #define doneglabel ctlabels[3] | |
164 | extern struct Ctlframe *ctls; | |
165 | extern struct Ctlframe *ctlstack; | |
166 | extern struct Ctlframe *lastctl; | |
167 | ||
168 | struct Extsym | |
169 | { | |
170 | char extname[XL]; | |
171 | field extstg; | |
172 | unsigned extsave:1; | |
173 | unsigned extinit:1; | |
174 | chainp extp; | |
175 | ftnint extleng; | |
176 | ftnint maxleng; | |
177 | }; | |
178 | ||
179 | extern struct Extsym *extsymtab; | |
180 | extern struct Extsym *nextext; | |
181 | extern struct Extsym *lastext; | |
182 | ||
183 | struct Labelblock | |
184 | { | |
185 | int labelno; | |
186 | unsigned blklevel:8; | |
187 | unsigned labused:1; | |
188 | unsigned labinacc:1; | |
189 | unsigned labdefined:1; | |
190 | unsigned labtype:2; | |
191 | ftnint stateno; | |
192 | }; | |
193 | ||
194 | extern struct Labelblock *labeltab; | |
195 | extern struct Labelblock *labtabend; | |
196 | extern struct Labelblock *highlabtab; | |
197 | ||
198 | struct Entrypoint | |
199 | { | |
200 | struct Entrypoint *entnextp; | |
201 | struct Extsym *entryname; | |
202 | chainp arglist; | |
203 | int entrylabel; | |
204 | int typelabel; | |
205 | Namep enamep; | |
206 | }; | |
207 | ||
208 | struct Primblock | |
209 | { | |
210 | field tag; | |
211 | field vtype; | |
212 | Namep namep; | |
213 | struct Listblock *argsp; | |
214 | expptr fcharp; | |
215 | expptr lcharp; | |
216 | }; | |
217 | ||
218 | ||
219 | struct Hashentry | |
220 | { | |
221 | int hashval; | |
222 | Namep varp; | |
223 | }; | |
224 | extern struct Hashentry *hashtab; | |
225 | extern struct Hashentry *lasthash; | |
226 | ||
227 | struct Intrpacked /* bits for intrinsic function description */ | |
228 | { | |
229 | unsigned f1:3; | |
230 | unsigned f2:4; | |
231 | unsigned f3:7; | |
232 | }; | |
233 | ||
234 | struct Nameblock | |
235 | { | |
236 | field tag; | |
237 | field vtype; | |
238 | field vclass; | |
239 | field vstg; | |
240 | expptr vleng; | |
241 | char varname[VL]; | |
242 | unsigned vdovar:1; | |
243 | unsigned vdcldone:1; | |
244 | unsigned vadjdim:1; | |
245 | unsigned vsave:1; | |
246 | unsigned vprocclass:3; | |
247 | unsigned vregno:4; | |
248 | union { | |
249 | int varno; | |
250 | struct Intrpacked intrdesc; /* bits for intrinsic function*/ | |
251 | } vardesc; | |
252 | struct Dimblock *vdim; | |
253 | ftnint voffset; | |
254 | union { | |
255 | chainp namelist; /* points to chain of names in */ | |
256 | chainp vstfdesc; /* points to (formals, expr) pair */ | |
257 | } varxptr; | |
258 | }; | |
259 | ||
260 | ||
261 | struct Paramblock | |
262 | { | |
263 | field tag; | |
264 | field vtype; | |
265 | field vclass; | |
266 | field vstg; | |
267 | expptr vleng; | |
268 | char varname[VL]; | |
269 | expptr paramval; | |
270 | } ; | |
271 | ||
272 | ||
273 | struct Exprblock | |
274 | { | |
275 | field tag; | |
276 | field vtype; | |
277 | field vclass; | |
278 | field vstg; | |
279 | expptr vleng; | |
280 | unsigned opcode:6; | |
281 | expptr leftp; | |
282 | expptr rightp; | |
283 | }; | |
284 | ||
285 | ||
286 | union Constant | |
287 | { | |
288 | char *ccp; | |
289 | ftnint ci; | |
290 | double cd[2]; | |
291 | }; | |
292 | ||
293 | struct Constblock | |
294 | { | |
295 | field tag; | |
296 | field vtype; | |
297 | field vclass; | |
298 | field vstg; | |
299 | expptr vleng; | |
300 | union Constant const; | |
301 | }; | |
302 | ||
303 | ||
304 | struct Listblock | |
305 | { | |
306 | field tag; | |
307 | field vtype; | |
308 | chainp listp; | |
309 | }; | |
310 | ||
311 | ||
312 | ||
313 | struct Addrblock | |
314 | { | |
315 | field tag; | |
316 | field vtype; | |
317 | field vclass; | |
318 | field vstg; | |
319 | expptr vleng; | |
320 | int memno; | |
321 | expptr memoffset; | |
322 | unsigned istemp:1; | |
323 | unsigned ntempelt:10; | |
324 | ftnint varleng; | |
325 | }; | |
326 | ||
327 | ||
328 | ||
329 | struct Errorblock | |
330 | { | |
331 | field tag; | |
332 | field vtype; | |
333 | }; | |
334 | ||
335 | ||
336 | union Expression | |
337 | { | |
338 | field tag; | |
339 | struct Headblock headblock; | |
340 | struct Exprblock exprblock; | |
341 | struct Addrblock addrblock; | |
342 | struct Constblock constblock; | |
343 | struct Errorblock errorblock; | |
344 | struct Listblock listblock; | |
345 | struct Primblock primblock; | |
346 | } ; | |
347 | ||
348 | ||
349 | ||
350 | struct Dimblock | |
351 | { | |
352 | int ndim; | |
353 | expptr nelt; | |
354 | expptr baseoffset; | |
355 | expptr basexpr; | |
356 | struct | |
357 | { | |
358 | expptr dimsize; | |
359 | expptr dimexpr; | |
360 | } dims[1]; | |
361 | }; | |
362 | ||
363 | ||
364 | struct Impldoblock | |
365 | { | |
366 | field tag; | |
367 | unsigned isactive:1; | |
368 | unsigned isbusy:1; | |
369 | Namep varnp; | |
370 | Constp varvp; | |
371 | chainp impdospec; | |
372 | expptr implb; | |
373 | expptr impub; | |
374 | expptr impstep; | |
375 | ftnint impdiff; | |
376 | ftnint implim; | |
377 | struct Chain *datalist; | |
378 | }; | |
379 | ||
380 | ||
381 | struct Rplblock /* name replacement block */ | |
382 | { | |
383 | struct Rplblock *rplnextp; | |
384 | Namep rplnp; | |
385 | expptr rplvp; | |
386 | expptr rplxp; | |
387 | int rpltag; | |
388 | }; | |
389 | ||
390 | ||
391 | ||
392 | struct Equivblock | |
393 | { | |
394 | struct Eqvchain *equivs; | |
395 | flag eqvinit; | |
396 | long int eqvtop; | |
397 | long int eqvbottom; | |
398 | } ; | |
399 | #define eqvleng eqvtop | |
400 | ||
401 | extern struct Equivblock *eqvclass; | |
402 | ||
403 | ||
404 | struct Eqvchain | |
405 | { | |
406 | struct Eqvchain *eqvnextp; | |
407 | union | |
408 | { | |
409 | struct Primblock *eqvlhs; | |
410 | Namep eqvname; | |
411 | } eqvitem; | |
412 | long int eqvoffset; | |
413 | } ; | |
414 | ||
415 | ||
416 | union Taggedblock | |
417 | { | |
418 | field tag; | |
419 | struct Headblock headblock; | |
420 | struct Nameblock nameblock; | |
421 | struct Paramblock paramblock; | |
422 | struct Exprblock exprblock; | |
423 | struct Constblock constblock; | |
424 | struct Listblock listblock; | |
425 | struct Addrblock addrblock; | |
426 | struct Errorblock errorblock; | |
427 | struct Primblock primblock; | |
428 | struct Impldoblock impldoblock; | |
429 | } ; | |
430 | ||
431 | ||
432 | ||
433 | ||
434 | struct Literal | |
435 | { | |
436 | short littype; | |
437 | short litnum; | |
438 | union { | |
439 | ftnint litival; | |
440 | double litdval; | |
441 | struct { | |
442 | char litclen; /* small integer */ | |
443 | char litcstr[XL]; | |
444 | } litcval; | |
445 | } litval; | |
446 | }; | |
447 | ||
448 | extern struct Literal litpool[ ]; | |
449 | extern int nliterals; | |
450 | ||
451 | ||
452 | ||
453 | /* popular functions with non integer return values */ | |
454 | ||
455 | ||
456 | int *ckalloc(); | |
457 | char *varstr(), *nounder(), *varunder(); | |
458 | char *copyn(), *copys(); | |
459 | chainp hookup(), mkchain(); | |
460 | ftnint convci(); | |
461 | char *convic(); | |
462 | char *setdoto(); | |
463 | double convcd(); | |
464 | Namep mkname(); | |
465 | struct Labelblock *mklabel(), *execlab(); | |
466 | struct Extsym *mkext(), *newentry(); | |
467 | expptr addrof(), call1(), call2(), call3(), call4(); | |
468 | Addrp builtin(), mktemp(), mktmpn(), autovar(); | |
469 | Addrp mkplace(), mkaddr(), putconst(), memversion(); | |
470 | expptr mkprim(), mklhs(), mkexpr(), mkconv(), mkfunct(), fixexpr(), fixtype(); | |
471 | expptr errnode(), mkintcon(); | |
472 | tagptr cpexpr(); | |
473 | ftnint lmin(), lmax(), iarrlen(); |