122805Smckusick /* 222805Smckusick * Copyright (c) 1980 Regents of the University of California. 322805Smckusick * All rights reserved. The Berkeley software License Agreement 422805Smckusick * specifies the terms and conditions for redistribution. 522805Smckusick * 6*33253Sbostic * @(#)defs.h 5.4 (Berkeley) 01/03/88 722805Smckusick */ 822805Smckusick 922805Smckusick /* 1022805Smckusick * defs.h 1122805Smckusick * 1222805Smckusick * Definitions for f77pass1 1322805Smckusick * 1422805Smckusick * University of Utah CS Dept modification history: 1522805Smckusick * 1622805Smckusick * $Log: defs.h,v $ 1725814Sdonn * Revision 5.5 86/01/10 17:11:11 donn 1825814Sdonn * Add a vparamval field to Nameblock struct -- fix up klugy sharing between 1925814Sdonn * Paramblock and Nameblock structs. 2025814Sdonn * 2125814Sdonn * Revision 5.4 85/11/25 00:23:47 donn 2225814Sdonn * 4.3 beta 2325814Sdonn * 2424475Sdonn * Revision 5.3 85/08/10 06:31:09 donn 2524475Sdonn * Added missing definition for intrconv(). 2624475Sdonn * 2724475Sdonn * Revision 5.2 85/08/10 04:01:53 donn 2824475Sdonn * Jerry Berkman's change to add a definition for 'dblflag' and to ifdef 2924475Sdonn * the Fortran 66 compatibility flags. 3024475Sdonn * 3124475Sdonn * Revision 5.1 85/08/10 03:44:01 donn 3224475Sdonn * 4.3 alpha 3324475Sdonn * 3422805Smckusick * Revision 2.3 85/06/07 21:06:48 root 3522805Smckusick * Add copyright 3622805Smckusick * 3722805Smckusick * Revision 2.2 85/01/11 21:02:58 donn 3822805Smckusick * Added 'issaved' bit to addrblocks to help implement SAVE statements. 3922805Smckusick * 4022805Smckusick * Revision 2.1 84/07/19 12:02:46 donn 4122805Smckusick * Changed comment headers for UofU. 4222805Smckusick * 4322805Smckusick * Revision 1.2 84/02/27 00:49:40 donn 4422805Smckusick * Added external references to lists of argument temporaries, used in the 4522805Smckusick * Berkeley changes to reduce offsets of data. 4622805Smckusick * 4722805Smckusick */ 4822805Smckusick 4922805Smckusick #include <stdio.h> 5022805Smckusick 5122805Smckusick #ifdef unix 5222805Smckusick # include <ctype.h> 5322805Smckusick #endif 5422805Smckusick 5522805Smckusick #include "ftypes.h" 5622805Smckusick #include "defines.h" 5722805Smckusick #include "machdefs.h" 5822805Smckusick 5922805Smckusick #define VL 16 6022805Smckusick 6122805Smckusick #define MAXDIM 20 6222805Smckusick #define MAXINCLUDES 10 6322805Smckusick #define MAXLITERALS 30 6422805Smckusick #define MAXCTL 20 6522805Smckusick #define MAXHASH 1009 6622805Smckusick #define MAXSTNO 401 6722805Smckusick #define MAXEXT 200 6822805Smckusick #define MAXEQUIV 150 6922805Smckusick #define MAXLABLIST 256 7022805Smckusick #define MAXDEBUGFLAG 20 7122805Smckusick 7222805Smckusick typedef union Expression *expptr; 7322805Smckusick typedef union Taggedblock *tagptr; 7422805Smckusick typedef struct Chain *chainp; 7522805Smckusick typedef struct Addrblock *Addrp; 7622805Smckusick typedef struct Tempblock *Tempp; 7722805Smckusick typedef struct Constblock *Constp; 7822805Smckusick typedef struct Exprblock *Exprp; 7922805Smckusick typedef struct Nameblock *Namep; 8022805Smckusick 8122805Smckusick extern FILEP infile; 8222805Smckusick extern FILEP diagfile; 8322805Smckusick extern FILEP textfile; 8422805Smckusick extern FILEP asmfile; 8522805Smckusick extern FILEP initfile; 8622805Smckusick extern long int headoffset; 8722805Smckusick 8822805Smckusick extern char token [ ]; 8922805Smckusick extern int toklen; 9022805Smckusick extern int lineno; 9122805Smckusick extern char *infname; 9222805Smckusick extern int needkwd; 9322805Smckusick extern struct Labelblock *thislabel; 9422805Smckusick 9522805Smckusick extern int maxctl; 9622805Smckusick extern int maxequiv; 9722805Smckusick extern int maxstno; 9822805Smckusick extern int maxhash; 9922805Smckusick extern int maxext; 10022805Smckusick 10122805Smckusick extern flag profileflag; 10224475Sdonn extern flag dblflag; 10322805Smckusick extern flag optimflag; 10422805Smckusick extern flag nowarnflag; 10522805Smckusick extern flag ftn66flag; 10624475Sdonn #ifdef ONLY66 10722805Smckusick extern flag no66flag; 10822805Smckusick extern flag noextflag; 10924475Sdonn #endif 11022805Smckusick extern flag shiftcase; 11122805Smckusick extern flag undeftype; 11222805Smckusick extern flag shortsubs; 11322805Smckusick extern flag onetripflag; 11422805Smckusick extern flag checksubs; 11522805Smckusick extern flag debugflag[]; 11622805Smckusick extern flag equivdcl; 11722805Smckusick extern int nerr; 11822805Smckusick extern int nwarn; 11922805Smckusick extern int ndata; 12022805Smckusick 12122805Smckusick extern int parstate; 12222805Smckusick extern flag headerdone; 12322805Smckusick extern int blklevel; 12422805Smckusick extern flag saveall; 12522805Smckusick extern flag substars; 12622805Smckusick extern int impltype[ ]; 12722805Smckusick extern int implleng[ ]; 12822805Smckusick extern int implstg[ ]; 12922805Smckusick 13022805Smckusick extern int tyint; 13122805Smckusick extern int tylogical; 13222805Smckusick extern ftnint typesize[]; 13322805Smckusick extern int typealign[]; 13422805Smckusick extern int procno; 13522805Smckusick extern int proctype; 13622805Smckusick extern char * procname; 13722805Smckusick extern int rtvlabel[ ]; 13822805Smckusick extern int fudgelabel; /* to confuse the pdp11 optimizer */ 13922805Smckusick extern Addrp typeaddr; 14022805Smckusick extern Addrp retslot; 14122805Smckusick extern int cxslot; 14222805Smckusick extern int chslot; 14322805Smckusick extern int chlgslot; 14422805Smckusick extern int procclass; 14522805Smckusick extern ftnint procleng; 14622805Smckusick extern int nentry; 14722805Smckusick extern flag multitype; 14822805Smckusick extern int blklevel; 14922805Smckusick extern int lastlabno; 15022805Smckusick extern int lastvarno; 15122805Smckusick extern int lastargslot; 15222805Smckusick extern int argloc; 15322805Smckusick extern ftnint autoleng; 15422805Smckusick extern ftnint bssleng; 15522805Smckusick extern int retlabel; 15622805Smckusick extern int ret0label; 15722805Smckusick extern int dorange; 15822805Smckusick extern int regnum[ ]; 15922805Smckusick extern Namep regnamep[ ]; 16022805Smckusick extern int maxregvar; 16122805Smckusick extern int highregvar; 16222805Smckusick extern int nregvar; 16322805Smckusick extern ftnint lowbss; 16422805Smckusick extern ftnint highbss; 16522805Smckusick extern int bsslabel; 16622805Smckusick extern flag anyinits; 16722805Smckusick extern flag anylocals; 16822805Smckusick 16922805Smckusick extern chainp templist; 17022805Smckusick extern chainp argtemplist; 17122805Smckusick extern chainp activearglist; 17222805Smckusick extern int maxdim; 17322805Smckusick extern chainp holdtemps; 17422805Smckusick extern struct Entrypoint *entries; 17522805Smckusick extern struct Rplblock *rpllist; 17622805Smckusick extern struct Chain *curdtp; 17722805Smckusick extern ftnint curdtelt; 17822805Smckusick extern flag toomanyinit; 17922805Smckusick 18022805Smckusick extern flag inioctl; 18122805Smckusick extern int iostmt; 18222805Smckusick extern Addrp ioblkp; 18322805Smckusick extern int nioctl; 18422805Smckusick extern int nequiv; 18522805Smckusick extern int eqvstart; /* offset to eqv number to guarantee uniqueness */ 18622805Smckusick extern int nintnames; 18722805Smckusick 18822805Smckusick #ifdef SDB 18922805Smckusick extern int dbglabel; 19022805Smckusick extern flag sdbflag; 19122805Smckusick #endif 19222805Smckusick 19322805Smckusick extern int cdatafile; 19422805Smckusick extern int cchkfile; 19522805Smckusick extern int vdatafile; 19622805Smckusick extern int vchkfile; 19722805Smckusick 19822805Smckusick extern char cdatafname[]; 19922805Smckusick extern char cchkfname[]; 20022805Smckusick extern char vdatafname[]; 20122805Smckusick extern char vchkfname[]; 20222805Smckusick 20322805Smckusick extern long cdatahwm; 20422805Smckusick extern long vdatahwm; 20522805Smckusick 20622805Smckusick 20722805Smckusick struct Chain 20822805Smckusick { 20922805Smckusick chainp nextp; 21022805Smckusick tagptr datap; 21122805Smckusick }; 21222805Smckusick 21322805Smckusick extern chainp chains; 21422805Smckusick 21522805Smckusick struct Headblock 21622805Smckusick { 21722805Smckusick field tag; 21822805Smckusick field vtype; 21922805Smckusick field vclass; 22022805Smckusick field vstg; 22122805Smckusick expptr vleng; 22222805Smckusick } ; 22322805Smckusick 22422805Smckusick struct Ctlframe 22522805Smckusick { 22622805Smckusick unsigned ctltype:8; 22722805Smckusick unsigned dostepsign:8; 22822805Smckusick int ctlabels[4]; 22922805Smckusick int dolabel; 23022805Smckusick Namep donamep; 23122805Smckusick expptr domax; 23222805Smckusick expptr dostep; 23322805Smckusick }; 23422805Smckusick #define endlabel ctlabels[0] 23522805Smckusick #define elselabel ctlabels[1] 23622805Smckusick #define dobodylabel ctlabels[1] 23722805Smckusick #define doposlabel ctlabels[2] 23822805Smckusick #define doneglabel ctlabels[3] 23922805Smckusick extern struct Ctlframe *ctls; 24022805Smckusick extern struct Ctlframe *ctlstack; 24122805Smckusick extern struct Ctlframe *lastctl; 24222805Smckusick 24322805Smckusick struct Extsym 24422805Smckusick { 24522805Smckusick char extname[XL+1]; 24622805Smckusick field extstg; 24722805Smckusick unsigned extsave:1; 24822805Smckusick unsigned extinit:1; 24922805Smckusick chainp extp; 25022805Smckusick ftnint extleng; 25122805Smckusick ftnint maxleng; 25222805Smckusick char init; 25322805Smckusick long initoffset; 25422805Smckusick }; 25522805Smckusick 25622805Smckusick extern struct Extsym *extsymtab; 25722805Smckusick extern struct Extsym *nextext; 25822805Smckusick extern struct Extsym *lastext; 25922805Smckusick 26022805Smckusick struct Labelblock 26122805Smckusick { 26222805Smckusick int labelno; 26322805Smckusick unsigned blklevel:8; 26422805Smckusick unsigned labused:1; 26522805Smckusick unsigned labinacc:1; 26622805Smckusick unsigned labdefined:1; 26722805Smckusick unsigned labtype:2; 26822805Smckusick ftnint stateno; 26922805Smckusick }; 27022805Smckusick 27122805Smckusick extern struct Labelblock *labeltab; 27222805Smckusick extern struct Labelblock *labtabend; 27322805Smckusick extern struct Labelblock *highlabtab; 27422805Smckusick 27522805Smckusick struct Entrypoint 27622805Smckusick { 27722805Smckusick struct Entrypoint *entnextp; 27822805Smckusick struct Extsym *entryname; 27922805Smckusick chainp arglist; 28022805Smckusick int entrylabel; 28122805Smckusick int typelabel; 28222805Smckusick Namep enamep; 28322805Smckusick }; 28422805Smckusick 28522805Smckusick struct Primblock 28622805Smckusick { 28722805Smckusick field tag; 28822805Smckusick field vtype; 28922805Smckusick Namep namep; 29022805Smckusick struct Listblock *argsp; 29122805Smckusick expptr fcharp; 29222805Smckusick expptr lcharp; 29322805Smckusick }; 29422805Smckusick 29522805Smckusick 29622805Smckusick struct Hashentry 29722805Smckusick { 29822805Smckusick int hashval; 29922805Smckusick Namep varp; 30022805Smckusick }; 30122805Smckusick extern struct Hashentry *hashtab; 30222805Smckusick extern struct Hashentry *lasthash; 30322805Smckusick 30422805Smckusick struct Intrpacked /* bits for intrinsic function description */ 30522805Smckusick { 30622805Smckusick unsigned f1:3; 30722805Smckusick unsigned f2:4; 30822805Smckusick unsigned f3:7; 30922805Smckusick }; 31022805Smckusick 31122805Smckusick struct Nameblock 31222805Smckusick { 31322805Smckusick field tag; 31422805Smckusick field vtype; 31522805Smckusick field vclass; 31622805Smckusick field vstg; 31722805Smckusick expptr vleng; 31822805Smckusick char varname[VL]; 31925814Sdonn expptr vparamval; 32022805Smckusick unsigned vdovar:1; 32122805Smckusick unsigned vdcldone:1; 32222805Smckusick unsigned vadjdim:1; 32322805Smckusick unsigned vsave:1; 32422805Smckusick unsigned vprocclass:3; 32522805Smckusick unsigned vregno:4; 32622805Smckusick union { 32722805Smckusick int varno; 32822805Smckusick struct Intrpacked intrdesc; /* bits for intrinsic function*/ 32922805Smckusick } vardesc; 33022805Smckusick struct Dimblock *vdim; 33122805Smckusick ftnint voffset; 33222805Smckusick union { 33322805Smckusick chainp namelist; /* points to chain of names in */ 33422805Smckusick chainp vstfdesc; /* points to (formals, expr) pair */ 33522805Smckusick } varxptr; 33622805Smckusick char inlcomm; 33722805Smckusick char init; 33822805Smckusick long initoffset; 33922805Smckusick ftnint varsize; 34022805Smckusick }; 34122805Smckusick 34222805Smckusick 34322805Smckusick struct Paramblock 34422805Smckusick { 34522805Smckusick field tag; 34622805Smckusick field vtype; 34722805Smckusick field vclass; 34822805Smckusick field vstg; 34922805Smckusick expptr vleng; 35022805Smckusick char varname[VL]; 35122805Smckusick expptr paramval; 35222805Smckusick } ; 35322805Smckusick 35422805Smckusick 35522805Smckusick struct Exprblock 35622805Smckusick { 35722805Smckusick field tag; 35822805Smckusick field vtype; 35922805Smckusick field vclass; 36022805Smckusick field vstg; 36122805Smckusick expptr vleng; 36222805Smckusick unsigned opcode:6; 36322805Smckusick expptr leftp; 36422805Smckusick expptr rightp; 36522805Smckusick }; 36622805Smckusick 36722805Smckusick 36822805Smckusick union Constant 36922805Smckusick { 37022805Smckusick char *ccp; 37122805Smckusick ftnint ci; 37222805Smckusick double cd[2]; 37322805Smckusick }; 37422805Smckusick 37522805Smckusick struct Constblock 37622805Smckusick { 37722805Smckusick field tag; 37822805Smckusick field vtype; 37922805Smckusick field vclass; 38022805Smckusick field vstg; 38122805Smckusick expptr vleng; 382*33253Sbostic union Constant constant; 38322805Smckusick }; 38422805Smckusick 38522805Smckusick 38622805Smckusick struct Listblock 38722805Smckusick { 38822805Smckusick field tag; 38922805Smckusick field vtype; 39022805Smckusick chainp listp; 39122805Smckusick }; 39222805Smckusick 39322805Smckusick 39422805Smckusick 39522805Smckusick struct Addrblock 39622805Smckusick { 39722805Smckusick field tag; 39822805Smckusick field vtype; 39922805Smckusick field vclass; 40022805Smckusick field vstg; 40122805Smckusick expptr vleng; 40222805Smckusick int memno; 40322805Smckusick expptr memoffset; 40422805Smckusick unsigned istemp:1; 40522805Smckusick unsigned isarray:1; 40622805Smckusick unsigned issaved:1; 40722805Smckusick unsigned ntempelt:10; 40822805Smckusick ftnint varleng; 40922805Smckusick ftnint varsize; 41022805Smckusick }; 41122805Smckusick 41222805Smckusick 41322805Smckusick 41422805Smckusick struct Tempblock 41522805Smckusick { 41622805Smckusick field tag; 41722805Smckusick field vtype; 41822805Smckusick field vclass; 41922805Smckusick expptr vleng; 42022805Smckusick Addrp memalloc; 42122805Smckusick unsigned istemp:1; 42222805Smckusick unsigned ntempelt:10; 42322805Smckusick ftnint varleng; 42422805Smckusick }; 42522805Smckusick 42622805Smckusick 42722805Smckusick 42822805Smckusick struct Errorblock 42922805Smckusick { 43022805Smckusick field tag; 43122805Smckusick field vtype; 43222805Smckusick }; 43322805Smckusick 43422805Smckusick 43522805Smckusick union Expression 43622805Smckusick { 43722805Smckusick field tag; 43822805Smckusick struct Headblock headblock; 43922805Smckusick struct Exprblock exprblock; 44022805Smckusick struct Addrblock addrblock; 44122805Smckusick struct Tempblock tempblock; 44222805Smckusick struct Constblock constblock; 44322805Smckusick struct Errorblock errorblock; 44422805Smckusick struct Listblock listblock; 44522805Smckusick struct Primblock primblock; 44622805Smckusick } ; 44722805Smckusick 44822805Smckusick 44922805Smckusick 45022805Smckusick struct Dimblock 45122805Smckusick { 45222805Smckusick int ndim; 45322805Smckusick expptr nelt; 45422805Smckusick expptr baseoffset; 45522805Smckusick expptr basexpr; 45622805Smckusick struct 45722805Smckusick { 45822805Smckusick expptr dimsize; 45922805Smckusick expptr dimexpr; 46022805Smckusick expptr lb; 46122805Smckusick expptr lbaddr; 46222805Smckusick expptr ub; 46322805Smckusick expptr ubaddr; 46422805Smckusick } dims[1]; 46522805Smckusick }; 46622805Smckusick 46722805Smckusick 46822805Smckusick struct Impldoblock 46922805Smckusick { 47022805Smckusick field tag; 47122805Smckusick unsigned isactive:1; 47222805Smckusick unsigned isbusy:1; 47322805Smckusick Namep varnp; 47422805Smckusick Constp varvp; 47522805Smckusick chainp impdospec; 47622805Smckusick expptr implb; 47722805Smckusick expptr impub; 47822805Smckusick expptr impstep; 47922805Smckusick ftnint impdiff; 48022805Smckusick ftnint implim; 48122805Smckusick struct Chain *datalist; 48222805Smckusick }; 48322805Smckusick 48422805Smckusick 48522805Smckusick struct Rplblock /* name replacement block */ 48622805Smckusick { 48722805Smckusick struct Rplblock *rplnextp; 48822805Smckusick Namep rplnp; 48922805Smckusick expptr rplvp; 49022805Smckusick expptr rplxp; 49122805Smckusick int rpltag; 49222805Smckusick }; 49322805Smckusick 49422805Smckusick 49522805Smckusick 49622805Smckusick struct Equivblock 49722805Smckusick { 49822805Smckusick struct Eqvchain *equivs; 49922805Smckusick flag eqvinit; 50022805Smckusick long int eqvtop; 50122805Smckusick long int eqvbottom; 50222805Smckusick char inlcomm; 50322805Smckusick char init; 50422805Smckusick long initoffset; 50522805Smckusick } ; 50622805Smckusick #define eqvleng eqvtop 50722805Smckusick 50822805Smckusick extern struct Equivblock *eqvclass; 50922805Smckusick 51022805Smckusick 51122805Smckusick struct Eqvchain 51222805Smckusick { 51322805Smckusick struct Eqvchain *eqvnextp; 51422805Smckusick union 51522805Smckusick { 51622805Smckusick struct Primblock *eqvlhs; 51722805Smckusick Namep eqvname; 51822805Smckusick } eqvitem; 51922805Smckusick long int eqvoffset; 52022805Smckusick } ; 52122805Smckusick 52222805Smckusick 52322805Smckusick union Taggedblock 52422805Smckusick { 52522805Smckusick field tag; 52622805Smckusick struct Headblock headblock; 52722805Smckusick struct Nameblock nameblock; 52822805Smckusick struct Paramblock paramblock; 52922805Smckusick struct Exprblock exprblock; 53022805Smckusick struct Constblock constblock; 53122805Smckusick struct Listblock listblock; 53222805Smckusick struct Addrblock addrblock; 53322805Smckusick struct Tempblock tempblock; 53422805Smckusick struct Errorblock errorblock; 53522805Smckusick struct Primblock primblock; 53622805Smckusick struct Impldoblock impldoblock; 53722805Smckusick } ; 53822805Smckusick 53922805Smckusick 54022805Smckusick 54122805Smckusick 54222805Smckusick struct Literal 54322805Smckusick { 54422805Smckusick short littype; 54522805Smckusick short litnum; 54622805Smckusick union { 54722805Smckusick ftnint litival; 54822805Smckusick double litdval; 54922805Smckusick struct { 55022805Smckusick char litclen; /* small integer */ 55122805Smckusick char litcstr[XL]; 55222805Smckusick } litcval; 55322805Smckusick } litval; 55422805Smckusick }; 55522805Smckusick 55622805Smckusick extern struct Literal litpool[ ]; 55722805Smckusick extern int nliterals; 55822805Smckusick 55922805Smckusick 56022805Smckusick 56122805Smckusick /* popular functions with non integer return values */ 56222805Smckusick 56322805Smckusick 56422805Smckusick int *ckalloc(); 56522805Smckusick char *varstr(), *nounder(), *varunder(); 56622805Smckusick char *copyn(), *copys(); 56722805Smckusick chainp hookup(), mkchain(); 56822805Smckusick ftnint convci(); 56922805Smckusick char *convic(); 57022805Smckusick char *setdoto(); 57122805Smckusick double convcd(); 57222805Smckusick Namep mkname(); 57322805Smckusick struct Labelblock *mklabel(), *execlab(); 57422805Smckusick struct Extsym *mkext(), *newentry(); 57522805Smckusick expptr addrof(), call1(), call2(), call3(), call4(); 57622805Smckusick Tempp mktmpn(); 57722805Smckusick Addrp builtin(), mktemp(), altmpn(), mkaltemp(), mkaltmpn(), autovar(); 57822805Smckusick Addrp mkplace(), mkaddr(), putconst(), memversion(); 57924475Sdonn expptr mkprim(), mklhs(), mkexpr(), mkconv(), intrconv(), mkfunct(); 58024475Sdonn expptr fixexpr(), fixtype(); 58122805Smckusick expptr errnode(), mkintcon(); 58222805Smckusick tagptr cpexpr(); 58322805Smckusick ftnint lmin(), lmax(), iarrlen(); 584