1 /*        Id: defs.h,v 1.23 2011/12/12 09:18:25 plunky Exp  */
2 /*        $NetBSD: defs.h,v 1.1.1.4 2012/01/11 20:33:25 plunky Exp $  */
3 /*
4  * Copyright(C) Caldera International Inc. 2001-2002. All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * Redistributions of source code and documentation must retain the above
11  * copyright notice, this list of conditions and the following disclaimer.
12  * Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditionsand the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  * All advertising materials mentioning features or use of this software
16  * must display the following acknowledgement:
17  *        This product includes software developed or owned by Caldera
18  *        International, Inc.
19  * Neither the name of Caldera International, Inc. nor the names of other
20  * contributors may be used to endorse or promote products derived from
21  * this software without specific prior written permission.
22  *
23  * USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
24  * INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
25  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27  * DISCLAIMED.  IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE
28  * FOR ANY DIRECT, INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OFLIABILITY, WHETHER IN CONTRACT,
32  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
33  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34  * POSSIBILITY OF SUCH DAMAGE.
35  */
36 #include <stdio.h>
37 #include <ctype.h>
38 #include <stdlib.h>
39 
40 /* Copied from ../../cc/ccom/pass1.h. */
41 #define DATA        1
42 #define RDATA       2
43 #define UDATA       4
44 
45 #define VL 6
46 #define XL 8
47 
48 #define MAXINCLUDES 10
49 #define MAXLITERALS 20
50 #define MAXCTL 20
51 #define MAXHASH 401
52 #define MAXSTNO 1000
53 #define MAXEXT 200
54 #define MAXEQUIV 150
55 #define MAXLABLIST 100
56 
57 typedef struct bigblock *bigptr;
58 typedef union chainedblock *chainp;
59 
60 extern FILE *infile;
61 extern FILE *diagfile;
62 extern long int headoffset;
63 
64 extern char token [ ];
65 extern int toklen;
66 extern int lineno;
67 extern char *infname;
68 extern int needkwd;
69 extern struct labelblock *thislabel;
70 
71 extern int mflag, tflag;
72 
73 extern flag profileflag;
74 extern flag optimflag;
75 extern flag quietflag;
76 extern flag nowarnflag;
77 extern flag ftn66flag;
78 extern flag shiftcase;
79 extern flag undeftype;
80 extern flag shortsubs;
81 extern flag onetripflag;
82 extern flag checksubs;
83 extern flag debugflag;
84 extern int nerr;
85 extern int nwarn;
86 extern int ndata;
87 
88 extern int parstate;
89 extern flag headerdone;
90 extern int blklevel;
91 extern flag saveall;
92 extern flag substars;
93 extern int impltype[ ];
94 extern int implleng[ ];
95 extern int implstg[ ];
96 
97 extern int tyint;
98 extern int tylogical;
99 extern ftnint typesize[];
100 extern int typealign[];
101 extern int procno;
102 extern int proctype;
103 extern char * procname;
104 extern int rtvlabel[ ];
105 extern int fudgelabel;        /* to confuse the pdp11 optimizer */
106 extern struct bigblock *typeaddr;
107 extern struct bigblock *retslot;
108 extern int cxslot;
109 extern int chslot;
110 extern int chlgslot;
111 extern int procclass;
112 extern ftnint procleng;
113 extern int nentry;
114 extern flag multitype;
115 extern int blklevel;
116 extern int lastlabno;
117 extern int lastvarno;
118 extern int lastargslot;
119 extern int argloc;
120 extern ftnint autoleng;
121 extern ftnint bssleng;
122 extern int retlabel;
123 extern int ret0label;
124 extern int dorange;
125 extern int regnum[ ];
126 extern bigptr regnamep[ ];
127 extern int maxregvar;
128 extern int highregvar;
129 
130 extern chainp templist;
131 extern chainp holdtemps;
132 extern chainp entries;
133 extern chainp rpllist;
134 extern chainp curdtp;
135 extern ftnint curdtelt;
136 extern flag toomanyinit;
137 
138 extern flag inioctl;
139 extern int iostmt;
140 extern struct bigblock *ioblkp;
141 extern int nioctl;
142 extern int nequiv;
143 extern int nintnames;
144 extern int nextnames;
145 
146 struct chain
147           {
148           chainp nextp;
149           bigptr datap;
150           };
151 
152 extern chainp chains;
153 
154 struct ctlframe
155           {
156           unsigned ctltype:8;
157           unsigned dostepsign:8;
158           int ctlabels[4];
159           int dolabel;
160           struct bigblock *donamep;
161           bigptr domax;
162           bigptr dostep;
163           };
164 #define endlabel ctlabels[0]
165 #define elselabel ctlabels[1]
166 #define dobodylabel ctlabels[1]
167 #define doposlabel ctlabels[2]
168 #define doneglabel ctlabels[3]
169 extern struct ctlframe ctls[ ];
170 extern struct ctlframe *ctlstack;
171 extern struct ctlframe *lastctl;
172 
173 struct extsym
174           {
175           char extname[XL];
176           unsigned extstg:4;
177           unsigned extsave:1;
178           unsigned extinit:1;
179           chainp extp;
180           ftnint extleng;
181           ftnint maxleng;
182           };
183 
184 extern struct extsym extsymtab[ ];
185 extern struct extsym *nextext;
186 extern struct extsym *lastext;
187 
188 struct labelblock
189           {
190           int labelno;
191           unsigned blklevel:8;
192           unsigned labused:1;
193           unsigned labinacc:1;
194           unsigned labdefined:1;
195           unsigned labtype:2;
196           ftnint stateno;
197           };
198 
199 extern struct labelblock labeltab[ ];
200 extern struct labelblock *labtabend;
201 extern struct labelblock *highlabtab;
202 
203 struct entrypoint
204           {
205           chainp nextp;
206           struct extsym *entryname;
207           chainp arglist;
208           int entrylabel;
209           int typelabel;
210           ptr enamep;
211           };
212 
213 struct primblock
214           {
215           struct bigblock *namep;
216           struct bigblock *argsp;
217           bigptr fcharp;
218           bigptr lcharp;
219           };
220 
221 
222 struct hashentry
223           {
224           int hashval;
225           struct bigblock *varp;
226           };
227 extern struct hashentry hashtab[ ];
228 extern struct hashentry *lasthash;
229 
230 struct intrpacked   /* bits for intrinsic function description */
231           {
232           unsigned f1:3;
233           unsigned f2:4;
234           unsigned f3:7;
235           };
236 
237 struct nameblock
238           {
239           char varname[VL];
240           unsigned vdovar:1;
241           unsigned vdcldone:1;
242           unsigned vadjdim:1;
243           unsigned vsave:1;
244           unsigned vprocclass:3;
245           unsigned vregno:4;
246           union     {
247                     int varno;
248                     chainp vstfdesc;    /* points to (formals, expr) pair */
249                     struct intrpacked intrdesc;   /* bits for intrinsic function */
250                     } vardesc;
251           struct dimblock *vdim;
252           int voffset;
253           };
254 
255 
256 struct paramblock
257           {
258           char varname[VL];
259           bigptr paramval;
260           } ;
261 
262 
263 struct exprblock
264           {
265           unsigned opcode:6;
266           bigptr leftp;
267           bigptr rightp;
268           };
269 
270 struct dcomplex {
271           double dreal, dimag;
272 };
273 
274 union constant
275           {
276           char *ccp;
277           ftnint ci;
278           double cd[2];
279           struct dcomplex dc;
280           };
281 
282 struct constblock
283           {
284           union constant fconst;
285           };
286 
287 
288 struct listblock
289           {
290           chainp listp;
291           };
292 
293 
294 
295 struct addrblock
296           {
297           int memno;
298           bigptr memoffset;
299           unsigned istemp:1;
300           unsigned ntempelt:10;
301           };
302 
303 
304 
305 struct errorblock
306           {
307           int pad;
308           };
309 
310 
311 struct dimblock
312           {
313           int ndim;
314           bigptr nelt;
315           bigptr baseoffset;
316           bigptr basexpr;
317           struct
318                     {
319                     bigptr dimsize;
320                     bigptr dimexpr;
321                     } dims[1];
322           };
323 
324 
325 struct impldoblock  /* XXXX */
326           {
327 #define   isactive vtype
328 #define isbusy vclass
329           struct bigblock *varnp;
330           struct bigblock *varvp;
331           bigptr implb;
332           bigptr impub;
333           bigptr impstep;
334           ftnint impdiff;
335           ftnint implim;
336           chainp datalist;
337           };
338 
339 
340 struct rplblock     /* name replacement block */
341           {
342           chainp nextp;
343           struct bigblock *rplnp;
344           ptr rplvp;
345           struct bigblock *rplxp;
346           int rpltag;
347           };
348 
349 
350 
351 struct equivblock
352           {
353           ptr equivs;
354           unsigned eqvinit:1;
355           long int eqvtop;
356           long int eqvbottom;
357           } ;
358 #define eqvleng eqvtop
359 
360 extern struct equivblock eqvclass[ ];
361 
362 
363 struct eqvchain
364           {
365           chainp nextp;
366           ptr eqvitem;
367           long int eqvoffset;
368           } ;
369 
370 union chainedblock
371           {
372           struct chain chain;
373           struct entrypoint entrypoint;
374           struct rplblock rplblock;
375           struct eqvchain eqvchain;
376           };
377 
378 
379 struct bigblock {
380           unsigned tag:4;
381           unsigned vtype:4;
382           unsigned vclass:4;
383           unsigned vstg:4;
384           bigptr vleng;
385           union {
386                     struct exprblock _expr;
387                     struct addrblock _addr;
388                     struct constblock _const;
389                     struct errorblock _error;
390                     struct listblock _list;
391                     struct primblock _prim;
392                     struct nameblock _name;
393                     struct paramblock _param;
394                     struct impldoblock _impldo;
395           } _u;
396 #define   b_expr              _u._expr
397 #define   b_addr              _u._addr
398 #define   b_const             _u._const
399 #define   b_error             _u._error
400 #define   b_list              _u._list
401 #define   b_prim              _u._prim
402 #define   b_name              _u._name
403 #define   b_param             _u._param
404 #define   b_impldo  _u._impldo
405 };
406 
407 struct literal
408           {
409           short littype;
410           short litnum;
411           union     {
412                     ftnint litival;
413                     double litdval;
414                     struct    {
415                               char litclen;       /* small integer */
416                               char litcstr[XL];
417                               } litcval;
418                     } litval;
419           };
420 
421 extern struct literal litpool[ ];
422 extern int nliterals;
423 
424 
425 
426 
427 
428 /* popular functions with non integer return values */
429 #define   expptr bigptr
430 #define   tagptr bigptr
431 
432 ptr cpblock(int ,void *);
433 
434 ptr ckalloc(int);
435 char *varstr(int, char *), *nounder(int, char *), *varunder(int, char *);
436 char *copyn(int, char *), *copys(char *);
437 chainp hookup(chainp, chainp), mkchain(bigptr, chainp);
438 ftnint convci(int, char *), iarrlen(struct bigblock *q);
439 ftnint lmin(ftnint, ftnint), lmax(ftnint, ftnint);
440 ftnint simoffset(expptr *);
441 char *memname(int, int), *convic(ftnint), *setdoto(char *);
442 double convcd(int, char *);
443 struct extsym *mkext(char *),
444           *newentry(struct bigblock *),
445           *comblock(int, char *s);
446 struct bigblock *mkname(int, char *);
447 struct labelblock *mklabel(ftnint);
448 struct bigblock *addrof(expptr), *call1(int, char *, expptr),
449           *call2(int, char *, expptr, expptr),
450           *call3(int, char *, expptr, expptr, expptr),
451           *call4(int, char *, expptr, expptr, expptr, expptr);
452 struct bigblock *call0(int, char *), *mkexpr(int, bigptr, bigptr);
453 struct bigblock *callk(int, char *, bigptr);
454 
455 struct bigblock *builtin(int, char *), *fmktemp(int, bigptr),
456           *mktmpn(int, int, bigptr), *nextdata(ftnint *, ftnint *),
457           *autovar(int, int, bigptr), *mklhs(struct bigblock *),
458           *mkaddr(struct bigblock *), *putconst(struct bigblock *),
459           *memversion(struct bigblock *);
460 struct bigblock *mkscalar(struct bigblock *np);
461 struct bigblock *realpart(struct bigblock *p);
462 struct bigblock *imagpart(struct bigblock *p);
463 
464 struct bigblock *mkintcon(ftnint), *mkbitcon(int, int, char *),
465           *mklogcon(int), *mkaddcon(int), *mkrealcon(int, double),
466           *mkstrcon(int, char *), *mkcxcon(bigptr,bigptr);
467 bigptr mkconst(int t);
468 
469 bigptr mklist(chainp p);
470 bigptr mkiodo(chainp, chainp);
471 
472 
473 bigptr mkconv(int, bigptr),
474           mkfunct(struct bigblock *), fixexpr(struct bigblock *),
475           fixtype(bigptr);
476 
477 
478 bigptr cpexpr(bigptr), mkprim(bigptr, struct bigblock *, bigptr, bigptr);
479 struct bigblock *mkarg(int, int);
480 struct bigblock *errnode(void);
481 void initkey(void), prtail(void), puteof(void), done(int);
482 void fileinit(void), procinit(void), endproc(void), doext(void), preven(int);
483 int inilex(char *), yyparse(void), newlabel(void), lengtype(int, int);
484 void err(char *, ...), warn(char *, ...), fatal(char *, ...), enddcl(void);
485 void p2pass(char *s), frexpr(bigptr), execerr(char *, ...);
486 void setimpl(int, ftnint, int, int), setlog(void), newproc(void);
487 void prdbginfo(void), impldcl(struct bigblock *p);
488 void putbracket(void), enddcl(void), doequiv(void);
489 void puthead(char *), startproc(struct extsym *, int);
490 void dclerr(char *s, struct bigblock *v), putforce(int, bigptr);
491 void entrypt(int, int, ftnint, struct extsym *, chainp);
492 void settype(struct bigblock *, int, int), putlabel(int);
493 void putbranch(struct bigblock *p), goret(int), putrbrack(int);
494 void prolog(struct entrypoint *, struct bigblock *), prendproc(void);
495 void prlocvar(char *, ftnint), prext(char *, ftnint, int);
496 void vardcl(struct bigblock *v), frchain(chainp *p);
497 void frtemp(struct bigblock *p), incomm(struct extsym *, struct bigblock *);
498 void setintr(struct bigblock * v), setext(struct bigblock * v);
499 struct uux { expptr lb, ub; };
500 void setbound(struct bigblock *, int, struct uux []);
501 void setfmt(struct labelblock *lp), frdata(chainp), frrpl(void),
502           dataval(struct bigblock *, struct bigblock *),
503           consnegop(struct bigblock *p), exdo(int, chainp), exelse(void),
504           exendif(void), exif(bigptr), exelif(bigptr),
505           exequals(struct bigblock *, bigptr),
506           exassign(struct bigblock *, struct labelblock *),
507           exarif(bigptr, struct labelblock *, struct labelblock *,
508               struct labelblock *);
509 
510 
511 
512 int intrfunct(char s[VL]), eqn(int, char *, char *);
513 int fmtstmt(struct labelblock *lp);
514 int cktype(int, int, int);
515 int yylex(void), inregister(struct bigblock *);
516 int inilex(char *), iocname(void);
517 int maxtype(int, int), flog2(ftnint), hextoi(int);
518 int cmpstr(char *, char *, ftnint, ftnint);
519 int enregister(struct bigblock *np);
520 int conssgn(bigptr p);
521 int fixargs(int, struct bigblock *);
522 int addressable(bigptr p);
523 
524 void prlabel(int);
525 void prconi(FILE *, int, ftnint);
526 void prcona(ftnint);
527 void prconr(FILE *, int, double);
528 void prarif(bigptr, int, int, int);
529 void putstr(char *, ftnint);
530 NODE *putex1(bigptr p);
531 void puteq(bigptr, bigptr);
532 void popstack(chainp *p);
533 void consconv(int, union constant *, int, union constant *);
534 void yyerror(char *s);
535 void enddo(int);
536 void doinclude(char *);
537 void flline(void);
538 void startioctl(void);
539 void endioctl(void), endio(void), ioclause(int, bigptr), doio(chainp);
540 void excall(struct bigblock *, struct bigblock *, int, struct labelblock *[]);
541 void exreturn(expptr p);
542 void exstop(int, expptr);
543 void exgoto(struct labelblock *);
544 void exasgoto(bigptr);
545 void putcmgo(expptr, int, struct labelblock *[]);
546 void putexpr(expptr p);
547 void putif(expptr, int);
548 void putgoto(int);
549 void deregister(struct bigblock *np);
550 NODE *putx(expptr p);
551 void cpn(int, char *, char *);
552 void prcmgoto(expptr, int, int, int);
553 char *lexline(ftnint *n);
554 bigptr suboffset(struct bigblock *p);
555 struct bigblock *intraddr(struct bigblock *np);
556 struct bigblock *intrcall(bigptr, bigptr, int);
557 void setloc(int);
558 void prnloc(char *name);
559 void fprint(bigptr p, int indx);
560 void ckfree(void *p);
561 
562 #undef expptr
563 #undef tagptr
564 
565 #define   err1 err
566 #define err2 err
567 #define   warn1 warn
568 #define   fatal1 fatal
569