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