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