122861Smckusick /* 222861Smckusick * Copyright (c) 1980 Regents of the University of California. 322861Smckusick * All rights reserved. The Berkeley software License Agreement 422861Smckusick * specifies the terms and conditions for redistribution. 522861Smckusick */ 622861Smckusick 722861Smckusick #ifndef lint 8*24484Sdonn static char sccsid[] = "@(#)proc.c 5.3 (Berkeley) 08/29/85"; 922861Smckusick #endif not lint 1022861Smckusick 1122861Smckusick /* 1222861Smckusick * proc.c 1322861Smckusick * 1422861Smckusick * Routines for handling procedures, f77 compiler, pass 1. 1522861Smckusick * 1622861Smckusick * University of Utah CS Dept modification history: 1722861Smckusick * 18*24484Sdonn * $Header: proc.c,v 5.2 85/08/10 05:03:34 donn Exp $ 1922861Smckusick * $Log: proc.c,v $ 20*24484Sdonn * Revision 5.2 85/08/10 05:03:34 donn 21*24484Sdonn * Support for NAMELIST i/o from Jerry Berkman. 22*24484Sdonn * 23*24484Sdonn * Revision 5.1 85/08/10 03:49:14 donn 24*24484Sdonn * 4.3 alpha 25*24484Sdonn * 2623477Smckusick * Revision 3.11 85/06/04 03:45:29 donn 2723477Smckusick * Changed retval() to recognize that a function declaration might have 2823477Smckusick * bombed out earlier, leaving an error node behind... 2923477Smckusick * 3022861Smckusick * Revision 3.10 85/03/08 23:13:06 donn 3122861Smckusick * Finally figured out why function calls and array elements are not legal 3222861Smckusick * dummy array dimension declarator elements. Hacked safedim() to stop 'em. 3322861Smckusick * 3422861Smckusick * Revision 3.9 85/02/02 00:26:10 donn 3522861Smckusick * Removed the call to entrystab() in enddcl() -- this was redundant (it was 3622861Smckusick * also done in startproc()) and confusing to dbx to boot. 3722861Smckusick * 3822861Smckusick * Revision 3.8 85/01/14 04:21:53 donn 3922861Smckusick * Added changes to implement Jerry's '-q' option. 4022861Smckusick * 4122861Smckusick * Revision 3.7 85/01/11 21:10:35 donn 4222861Smckusick * In conjunction with other changes to implement SAVE statements, function 4322861Smckusick * nameblocks were changed to make it appear that they are 'saved' too -- 4422861Smckusick * this arranges things so that function return values are forced out of 4522861Smckusick * register before a return. 4622861Smckusick * 4722861Smckusick * Revision 3.6 84/12/10 19:27:20 donn 4822861Smckusick * comblock() signals an illegal common block name by returning a null pointer, 4922861Smckusick * but incomm() wasn't able to handle it, leading to core dumps. I put the 5022861Smckusick * fix in incomm() to pick up null common blocks. 5122861Smckusick * 5222861Smckusick * Revision 3.5 84/11/21 20:33:31 donn 5322861Smckusick * It seems that I/O elements are treated as character strings so that their 5422861Smckusick * length can be passed to the I/O routines... Unfortunately the compiler 5522861Smckusick * assumes that no temporaries can be of type CHARACTER and casually tosses 5622861Smckusick * length and type info away when removing TEMP blocks. This has been fixed... 5722861Smckusick * 5822861Smckusick * Revision 3.4 84/11/05 22:19:30 donn 5922861Smckusick * Fixed a silly bug in the last fix. 6022861Smckusick * 6122861Smckusick * Revision 3.3 84/10/29 08:15:23 donn 6222861Smckusick * Added code to check the type and shape of subscript declarations, 6322861Smckusick * per Jerry Berkman's suggestion. 6422861Smckusick * 6522861Smckusick * Revision 3.2 84/10/29 05:52:07 donn 6622861Smckusick * Added change suggested by Jerry Berkman to report an error when an array 6722861Smckusick * is redimensioned. 6822861Smckusick * 6922861Smckusick * Revision 3.1 84/10/13 02:12:31 donn 7022861Smckusick * Merged Jerry Berkman's version into mine. 7122861Smckusick * 7222861Smckusick * Revision 2.1 84/07/19 12:04:09 donn 7322861Smckusick * Changed comment headers for UofU. 7422861Smckusick * 7522861Smckusick * Revision 1.6 84/07/19 11:32:15 donn 7622861Smckusick * Incorporated fix to setbound() to detect backward array subscript limits. 7722861Smckusick * The fix is by Bob Corbett, donated by Jerry Berkman. 7822861Smckusick * 7922861Smckusick * Revision 1.5 84/07/18 18:25:50 donn 8022861Smckusick * Fixed problem with doentry() where a placeholder for a return value 8122861Smckusick * was not allocated if the first entry didn't require one but a later 8222861Smckusick * entry did. 8322861Smckusick * 8422861Smckusick * Revision 1.4 84/05/24 20:52:09 donn 8522861Smckusick * Installed firewall #ifdef around the code that recycles stack temporaries, 8622861Smckusick * since it seems to be broken and lacks a good fix for the time being. 8722861Smckusick * 8822861Smckusick * Revision 1.3 84/04/16 09:50:46 donn 8922861Smckusick * Fixed mkargtemp() so that it only passes back a copy of a temporary, keeping 9022861Smckusick * the original for its own use. This fixes a set of bugs that are caused by 9122861Smckusick * elements in the argtemplist getting stomped on. 9222861Smckusick * 9322861Smckusick * Revision 1.2 84/02/28 21:12:58 donn 9422861Smckusick * Added Berkeley changes for subroutine call argument temporaries fix. 9522861Smckusick * 9622861Smckusick */ 9722861Smckusick 9822861Smckusick #include "defs.h" 9922861Smckusick 10022861Smckusick #ifdef SDB 10122861Smckusick # include <a.out.h> 10222861Smckusick # ifndef N_SO 10322861Smckusick # include <stab.h> 10422861Smckusick # endif 10522861Smckusick #endif 10622861Smckusick 10722861Smckusick extern flag namesflag; 10822861Smckusick 10922861Smckusick typedef 11022861Smckusick struct SizeList 11122861Smckusick { 11222861Smckusick struct SizeList *next; 11322861Smckusick ftnint size; 11422861Smckusick struct VarList *vars; 11522861Smckusick } 11622861Smckusick sizelist; 11722861Smckusick 11822861Smckusick 11922861Smckusick typedef 12022861Smckusick struct VarList 12122861Smckusick { 12222861Smckusick struct VarList *next; 12322861Smckusick Namep np; 12422861Smckusick struct Equivblock *ep; 12522861Smckusick } 12622861Smckusick varlist; 12722861Smckusick 12822861Smckusick 12922861Smckusick LOCAL sizelist *varsizes; 13022861Smckusick 13122861Smckusick 13222861Smckusick /* start a new procedure */ 13322861Smckusick 13422861Smckusick newproc() 13522861Smckusick { 13622861Smckusick if(parstate != OUTSIDE) 13722861Smckusick { 13822861Smckusick execerr("missing end statement", CNULL); 13922861Smckusick endproc(); 14022861Smckusick } 14122861Smckusick 14222861Smckusick parstate = INSIDE; 14322861Smckusick procclass = CLMAIN; /* default */ 14422861Smckusick } 14522861Smckusick 14622861Smckusick 14722861Smckusick 14822861Smckusick /* end of procedure. generate variables, epilogs, and prologs */ 14922861Smckusick 15022861Smckusick endproc() 15122861Smckusick { 15222861Smckusick struct Labelblock *lp; 15322861Smckusick 15422861Smckusick if(parstate < INDATA) 15522861Smckusick enddcl(); 15622861Smckusick if(ctlstack >= ctls) 15722861Smckusick err("DO loop or BLOCK IF not closed"); 15822861Smckusick for(lp = labeltab ; lp < labtabend ; ++lp) 15922861Smckusick if(lp->stateno!=0 && lp->labdefined==NO) 16022861Smckusick errstr("missing statement number %s", convic(lp->stateno) ); 16122861Smckusick 16222861Smckusick if (optimflag) 16322861Smckusick optimize(); 16422861Smckusick 16522861Smckusick outiodata(); 16622861Smckusick epicode(); 16722861Smckusick procode(); 16822861Smckusick donmlist(); 16922861Smckusick dobss(); 17022861Smckusick 17122861Smckusick #if FAMILY == PCC 17222861Smckusick putbracket(); 17322861Smckusick #endif 17422861Smckusick fixlwm(); 17522861Smckusick procinit(); /* clean up for next procedure */ 17622861Smckusick } 17722861Smckusick 17822861Smckusick 17922861Smckusick 18022861Smckusick /* End of declaration section of procedure. Allocate storage. */ 18122861Smckusick 18222861Smckusick enddcl() 18322861Smckusick { 18422861Smckusick register struct Entrypoint *ep; 18522861Smckusick 18622861Smckusick parstate = INEXEC; 18722861Smckusick docommon(); 18822861Smckusick doequiv(); 18922861Smckusick docomleng(); 19022861Smckusick for(ep = entries ; ep ; ep = ep->entnextp) { 19122861Smckusick doentry(ep); 19222861Smckusick } 19322861Smckusick } 19422861Smckusick 19522861Smckusick /* ROUTINES CALLED WHEN ENCOUNTERING ENTRY POINTS */ 19622861Smckusick 19722861Smckusick /* Main program or Block data */ 19822861Smckusick 19922861Smckusick startproc(prgname, class) 20022861Smckusick Namep prgname; 20122861Smckusick int class; 20222861Smckusick { 20322861Smckusick struct Extsym *progname; 20422861Smckusick register struct Entrypoint *p; 20522861Smckusick 20622861Smckusick if(prgname) 20722861Smckusick procname = prgname->varname; 20822861Smckusick if(namesflag == YES) { 20922861Smckusick fprintf(diagfile, " %s", (class==CLMAIN ? "MAIN" : "BLOCK DATA") ); 21022861Smckusick if(prgname) 21122861Smckusick fprintf(diagfile, " %s", varstr(XL, procname) ); 21222861Smckusick fprintf(diagfile, ":\n"); 21322861Smckusick } 21422861Smckusick 21522861Smckusick if( prgname ) 21622861Smckusick progname = newentry( prgname ); 21722861Smckusick else 21822861Smckusick progname = NULL; 21922861Smckusick 22022861Smckusick p = ALLOC(Entrypoint); 22122861Smckusick if(class == CLMAIN) 22222861Smckusick puthead("MAIN_", CLMAIN); 22322861Smckusick else 22422861Smckusick puthead(CNULL, CLBLOCK); 22522861Smckusick if(class == CLMAIN) 22622861Smckusick newentry( mkname(5, "MAIN") ); 22722861Smckusick p->entryname = progname; 22822861Smckusick p->entrylabel = newlabel(); 22922861Smckusick entries = p; 23022861Smckusick 23122861Smckusick procclass = class; 23222861Smckusick retlabel = newlabel(); 23322861Smckusick #ifdef SDB 23422861Smckusick if(sdbflag) { 23522861Smckusick entrystab(p,class); 23622861Smckusick } 23722861Smckusick #endif 23822861Smckusick } 23922861Smckusick 24022861Smckusick /* subroutine or function statement */ 24122861Smckusick 24222861Smckusick struct Extsym *newentry(v) 24322861Smckusick register Namep v; 24422861Smckusick { 24522861Smckusick register struct Extsym *p; 24622861Smckusick 24722861Smckusick p = mkext( varunder(VL, v->varname) ); 24822861Smckusick 24922861Smckusick if(p==NULL || p->extinit || ! ONEOF(p->extstg, M(STGUNKNOWN)|M(STGEXT)) ) 25022861Smckusick { 25122861Smckusick if(p == 0) 25222861Smckusick dclerr("invalid entry name", v); 25322861Smckusick else dclerr("external name already used", v); 25422861Smckusick return(0); 25522861Smckusick } 25622861Smckusick v->vstg = STGAUTO; 25722861Smckusick v->vprocclass = PTHISPROC; 25822861Smckusick v->vclass = CLPROC; 25922861Smckusick p->extstg = STGEXT; 26022861Smckusick p->extinit = YES; 26122861Smckusick return(p); 26222861Smckusick } 26322861Smckusick 26422861Smckusick 26522861Smckusick entrypt(class, type, length, entname, args) 26622861Smckusick int class, type; 26722861Smckusick ftnint length; 26822861Smckusick Namep entname; 26922861Smckusick chainp args; 27022861Smckusick { 27122861Smckusick struct Extsym *entry; 27222861Smckusick register Namep q; 27322861Smckusick register struct Entrypoint *p, *ep; 27422861Smckusick 27522861Smckusick if(namesflag == YES) { 27622861Smckusick if(class == CLENTRY) 27722861Smckusick fprintf(diagfile, " entry "); 27822861Smckusick if(entname) 27922861Smckusick fprintf(diagfile, " %s", varstr(XL, entname->varname) ); 28022861Smckusick fprintf(diagfile, ":\n"); 28122861Smckusick } 28222861Smckusick 28322861Smckusick if( entname->vclass == CLPARAM ) { 28422861Smckusick errstr("entry name %s used in 'parameter' statement", 28522861Smckusick varstr(XL, entname->varname) ); 28622861Smckusick return; 28722861Smckusick } 28822861Smckusick if( ((type == TYSUBR) || (class == CLENTRY && proctype == TYSUBR)) 28922861Smckusick && (entname->vtype != TYUNKNOWN && entname->vtype != TYSUBR) ) { 29022861Smckusick errstr("subroutine entry %s previously declared", 29122861Smckusick varstr(XL, entname->varname) ); 29222861Smckusick return; 29322861Smckusick } 29422861Smckusick if( (entname->vstg != STGEXT && entname->vstg != STGUNKNOWN) 29522861Smckusick || (entname->vdim != NULL) ) { 29622861Smckusick errstr("subroutine or function entry %s previously declared", 29722861Smckusick varstr(XL, entname->varname) ); 29822861Smckusick return; 29922861Smckusick } 30022861Smckusick 30122861Smckusick if( (class == CLPROC || class == CLENTRY) && type != TYSUBR ) 30222861Smckusick /* arrange to save function return values */ 30322861Smckusick entname->vsave = YES; 30422861Smckusick 30522861Smckusick entry = newentry( entname ); 30622861Smckusick 30722861Smckusick if(class != CLENTRY) 30822861Smckusick puthead( varstr(XL, procname = entry->extname), class); 30922861Smckusick q = mkname(VL, nounder(XL,entry->extname) ); 31022861Smckusick 31122861Smckusick if( (type = lengtype(type, (int) length)) != TYCHAR) 31222861Smckusick length = 0; 31322861Smckusick if(class == CLPROC) 31422861Smckusick { 31522861Smckusick procclass = CLPROC; 31622861Smckusick proctype = type; 31722861Smckusick procleng = length; 31822861Smckusick 31922861Smckusick retlabel = newlabel(); 32022861Smckusick if(type == TYSUBR) 32122861Smckusick ret0label = newlabel(); 32222861Smckusick } 32322861Smckusick 32422861Smckusick p = ALLOC(Entrypoint); 32522861Smckusick if(entries) /* put new block at end of entries list */ 32622861Smckusick { 32722861Smckusick for(ep = entries; ep->entnextp; ep = ep->entnextp) 32822861Smckusick ; 32922861Smckusick ep->entnextp = p; 33022861Smckusick } 33122861Smckusick else 33222861Smckusick entries = p; 33322861Smckusick 33422861Smckusick p->entryname = entry; 33522861Smckusick p->arglist = args; 33622861Smckusick p->entrylabel = newlabel(); 33722861Smckusick p->enamep = q; 33822861Smckusick 33922861Smckusick if(class == CLENTRY) 34022861Smckusick { 34122861Smckusick class = CLPROC; 34222861Smckusick if(proctype == TYSUBR) 34322861Smckusick type = TYSUBR; 34422861Smckusick } 34522861Smckusick 34622861Smckusick q->vclass = class; 34722861Smckusick q->vprocclass = PTHISPROC; 34822861Smckusick settype(q, type, (int) length); 34922861Smckusick /* hold all initial entry points till end of declarations */ 35022861Smckusick if(parstate >= INDATA) { 35122861Smckusick doentry(p); 35222861Smckusick } 35322861Smckusick #ifdef SDB 35422861Smckusick if(sdbflag) 35522861Smckusick { /* may need to preserve CLENTRY here */ 35622861Smckusick entrystab(p,class); 35722861Smckusick } 35822861Smckusick #endif 35922861Smckusick } 36022861Smckusick 36122861Smckusick /* generate epilogs */ 36222861Smckusick 36322861Smckusick LOCAL epicode() 36422861Smckusick { 36522861Smckusick register int i; 36622861Smckusick 36722861Smckusick if(procclass==CLPROC) 36822861Smckusick { 36922861Smckusick if(proctype==TYSUBR) 37022861Smckusick { 37122861Smckusick putlabel(ret0label); 37222861Smckusick if(substars) 37322861Smckusick putforce(TYINT, ICON(0) ); 37422861Smckusick putlabel(retlabel); 37522861Smckusick goret(TYSUBR); 37622861Smckusick } 37722861Smckusick else { 37822861Smckusick putlabel(retlabel); 37922861Smckusick if(multitype) 38022861Smckusick { 38122861Smckusick typeaddr = autovar(1, TYADDR, PNULL); 38222861Smckusick putbranch( cpexpr(typeaddr) ); 38322861Smckusick for(i = 0; i < NTYPES ; ++i) 38422861Smckusick if(rtvlabel[i] != 0) 38522861Smckusick { 38622861Smckusick putlabel(rtvlabel[i]); 38722861Smckusick retval(i); 38822861Smckusick } 38922861Smckusick } 39022861Smckusick else 39122861Smckusick retval(proctype); 39222861Smckusick } 39322861Smckusick } 39422861Smckusick 39522861Smckusick else if(procclass != CLBLOCK) 39622861Smckusick { 39722861Smckusick putlabel(retlabel); 39822861Smckusick goret(TYSUBR); 39922861Smckusick } 40022861Smckusick } 40122861Smckusick 40222861Smckusick 40322861Smckusick /* generate code to return value of type t */ 40422861Smckusick 40522861Smckusick LOCAL retval(t) 40622861Smckusick register int t; 40722861Smckusick { 40822861Smckusick register Addrp p; 40922861Smckusick 41022861Smckusick switch(t) 41122861Smckusick { 41222861Smckusick case TYCHAR: 41322861Smckusick case TYCOMPLEX: 41422861Smckusick case TYDCOMPLEX: 41522861Smckusick break; 41622861Smckusick 41722861Smckusick case TYLOGICAL: 41822861Smckusick t = tylogical; 41922861Smckusick case TYADDR: 42022861Smckusick case TYSHORT: 42122861Smckusick case TYLONG: 42222861Smckusick p = (Addrp) cpexpr(retslot); 42322861Smckusick p->vtype = t; 42422861Smckusick putforce(t, p); 42522861Smckusick break; 42622861Smckusick 42722861Smckusick case TYREAL: 42822861Smckusick case TYDREAL: 42922861Smckusick p = (Addrp) cpexpr(retslot); 43022861Smckusick p->vtype = t; 43122861Smckusick putforce(t, p); 43222861Smckusick break; 43322861Smckusick 43423477Smckusick case TYERROR: 43523477Smckusick return; /* someone else already complained */ 43623477Smckusick 43722861Smckusick default: 43822861Smckusick badtype("retval", t); 43922861Smckusick } 44022861Smckusick goret(t); 44122861Smckusick } 44222861Smckusick 44322861Smckusick 44422861Smckusick /* Allocate extra argument array if needed. Generate prologs. */ 44522861Smckusick 44622861Smckusick LOCAL procode() 44722861Smckusick { 44822861Smckusick register struct Entrypoint *p; 44922861Smckusick Addrp argvec; 45022861Smckusick 45122861Smckusick #if TARGET==GCOS 45222861Smckusick argvec = autovar(lastargslot/SZADDR, TYADDR, PNULL); 45322861Smckusick #else 45422861Smckusick if(lastargslot>0 && nentry>1) 45522861Smckusick #if TARGET == VAX 45622861Smckusick argvec = autovar(1 + lastargslot/SZADDR, TYADDR, PNULL); 45722861Smckusick #else 45822861Smckusick argvec = autovar(lastargslot/SZADDR, TYADDR, PNULL); 45922861Smckusick #endif 46022861Smckusick else 46122861Smckusick argvec = NULL; 46222861Smckusick #endif 46322861Smckusick 46422861Smckusick 46522861Smckusick #if TARGET == PDP11 46622861Smckusick /* for the optimizer */ 46722861Smckusick if(fudgelabel) 46822861Smckusick putlabel(fudgelabel); 46922861Smckusick #endif 47022861Smckusick 47122861Smckusick for(p = entries ; p ; p = p->entnextp) 47222861Smckusick prolog(p, argvec); 47322861Smckusick 47422861Smckusick #if FAMILY == PCC 47522861Smckusick putrbrack(procno); 47622861Smckusick #endif 47722861Smckusick 47822861Smckusick prendproc(); 47922861Smckusick } 48022861Smckusick 48122861Smckusick 48222861Smckusick /* 48322861Smckusick manipulate argument lists (allocate argument slot positions) 48422861Smckusick * keep track of return types and labels 48522861Smckusick */ 48622861Smckusick 48722861Smckusick LOCAL doentry(ep) 48822861Smckusick struct Entrypoint *ep; 48922861Smckusick { 49022861Smckusick register int type; 49122861Smckusick register Namep np; 49222861Smckusick chainp p; 49322861Smckusick register Namep q; 49422861Smckusick Addrp mkarg(); 49522861Smckusick 49622861Smckusick ++nentry; 49722861Smckusick if(procclass == CLMAIN) 49822861Smckusick { 49922861Smckusick if (optimflag) 50022861Smckusick optbuff (SKLABEL, 0, ep->entrylabel, 0); 50122861Smckusick else 50222861Smckusick putlabel(ep->entrylabel); 50322861Smckusick return; 50422861Smckusick } 50522861Smckusick else if(procclass == CLBLOCK) 50622861Smckusick return; 50722861Smckusick 50822861Smckusick impldcl( np = mkname(VL, nounder(XL, ep->entryname->extname) ) ); 50922861Smckusick type = np->vtype; 51022861Smckusick if(proctype == TYUNKNOWN) 51122861Smckusick if( (proctype = type) == TYCHAR) 51222861Smckusick procleng = (np->vleng ? np->vleng->constblock.const.ci : (ftnint) (-1)); 51322861Smckusick 51422861Smckusick if(proctype == TYCHAR) 51522861Smckusick { 51622861Smckusick if(type != TYCHAR) 51722861Smckusick err("noncharacter entry of character function"); 51822861Smckusick else if( (np->vleng ? np->vleng->constblock.const.ci : (ftnint) (-1)) != procleng) 51922861Smckusick err("mismatched character entry lengths"); 52022861Smckusick } 52122861Smckusick else if(type == TYCHAR) 52222861Smckusick err("character entry of noncharacter function"); 52322861Smckusick else if(type != proctype) 52422861Smckusick multitype = YES; 52522861Smckusick if(rtvlabel[type] == 0) 52622861Smckusick rtvlabel[type] = newlabel(); 52722861Smckusick ep->typelabel = rtvlabel[type]; 52822861Smckusick 52922861Smckusick if(type == TYCHAR) 53022861Smckusick { 53122861Smckusick if(chslot < 0) 53222861Smckusick { 53322861Smckusick chslot = nextarg(TYADDR); 53422861Smckusick chlgslot = nextarg(TYLENG); 53522861Smckusick } 53622861Smckusick np->vstg = STGARG; 53722861Smckusick np->vardesc.varno = chslot; 53822861Smckusick if(procleng < 0) 53922861Smckusick np->vleng = (expptr) mkarg(TYLENG, chlgslot); 54022861Smckusick } 54122861Smckusick else if( ISCOMPLEX(type) ) 54222861Smckusick { 54322861Smckusick np->vstg = STGARG; 54422861Smckusick if(cxslot < 0) 54522861Smckusick cxslot = nextarg(TYADDR); 54622861Smckusick np->vardesc.varno = cxslot; 54722861Smckusick } 54822861Smckusick else if(type != TYSUBR) 54922861Smckusick { 55022861Smckusick if(retslot == NULL) 55122861Smckusick retslot = autovar(1, TYDREAL, PNULL); 55222861Smckusick np->vstg = STGAUTO; 55322861Smckusick np->voffset = retslot->memoffset->constblock.const.ci; 55422861Smckusick } 55522861Smckusick 55622861Smckusick for(p = ep->arglist ; p ; p = p->nextp) 55722861Smckusick if(! (( q = (Namep) (p->datap) )->vdcldone) ) 55822861Smckusick q->vardesc.varno = nextarg(TYADDR); 55922861Smckusick 56022861Smckusick for(p = ep->arglist ; p ; p = p->nextp) 56122861Smckusick if(! (( q = (Namep) (p->datap) )->vdcldone) ) 56222861Smckusick { 56322861Smckusick impldcl(q); 56422861Smckusick q->vdcldone = YES; 56522861Smckusick if(q->vtype == TYCHAR) 56622861Smckusick { 56722861Smckusick if(q->vleng == NULL) /* character*(*) */ 56822861Smckusick q->vleng = (expptr) 56922861Smckusick mkarg(TYLENG, nextarg(TYLENG) ); 57022861Smckusick else if(nentry == 1) 57122861Smckusick nextarg(TYLENG); 57222861Smckusick } 57322861Smckusick else if(q->vclass==CLPROC && nentry==1) 57422861Smckusick nextarg(TYLENG) ; 57522861Smckusick #ifdef SDB 57622861Smckusick if(sdbflag) { 57722861Smckusick namestab(q); 57822861Smckusick } 57922861Smckusick #endif 58022861Smckusick } 58122861Smckusick 58222861Smckusick if (optimflag) 58322861Smckusick optbuff (SKLABEL, 0, ep->entrylabel, 0); 58422861Smckusick else 58522861Smckusick putlabel(ep->entrylabel); 58622861Smckusick } 58722861Smckusick 58822861Smckusick 58922861Smckusick 59022861Smckusick LOCAL nextarg(type) 59122861Smckusick int type; 59222861Smckusick { 59322861Smckusick int k; 59422861Smckusick k = lastargslot; 59522861Smckusick lastargslot += typesize[type]; 59622861Smckusick return(k); 59722861Smckusick } 59822861Smckusick 59922861Smckusick /* generate variable references */ 60022861Smckusick 60122861Smckusick LOCAL dobss() 60222861Smckusick { 60322861Smckusick register struct Hashentry *p; 60422861Smckusick register Namep q; 60522861Smckusick register int i; 60622861Smckusick int align; 60722861Smckusick ftnint leng, iarrl; 60822861Smckusick char *memname(); 60922861Smckusick int qstg, qclass, qtype; 61022861Smckusick 61122861Smckusick pruse(asmfile, USEBSS); 61222861Smckusick varsizes = NULL; 61322861Smckusick 61422861Smckusick for(p = hashtab ; p<lasthash ; ++p) 61522861Smckusick if(q = p->varp) 61622861Smckusick { 61722861Smckusick qstg = q->vstg; 61822861Smckusick qtype = q->vtype; 61922861Smckusick qclass = q->vclass; 62022861Smckusick 62122861Smckusick if( (qclass==CLUNKNOWN && qstg!=STGARG) || 62222861Smckusick (qclass==CLVAR && qstg==STGUNKNOWN) ) 62322861Smckusick warn1("local variable %s never used", varstr(VL,q->varname) ); 62422861Smckusick else if(qclass==CLPROC && q->vprocclass==PEXTERNAL && qstg!=STGARG) 62522861Smckusick mkext(varunder(VL, q->varname)) ->extstg = STGEXT; 62622861Smckusick 62722861Smckusick if (qclass == CLVAR && qstg == STGBSS) 62822861Smckusick { 62922861Smckusick if (SMALLVAR(q->varsize)) 63022861Smckusick { 63122861Smckusick enlist(q->varsize, q, NULL); 63222861Smckusick q->inlcomm = NO; 63322861Smckusick } 63422861Smckusick else 63522861Smckusick { 63622861Smckusick if (q->init == NO) 63722861Smckusick { 63822861Smckusick preven(ALIDOUBLE); 63922861Smckusick prlocvar(memname(qstg, q->vardesc.varno), q->varsize); 64022861Smckusick q->inlcomm = YES; 64122861Smckusick } 64222861Smckusick else 64322861Smckusick prlocdata(memname(qstg, q->vardesc.varno), q->varsize, 64422861Smckusick q->vtype, q->initoffset, &(q->inlcomm)); 64522861Smckusick } 64622861Smckusick } 64722861Smckusick else if(qclass==CLVAR && qstg!=STGARG) 64822861Smckusick { 64922861Smckusick if(q->vdim && !ISICON(q->vdim->nelt) ) 65022861Smckusick dclerr("adjustable dimension on non-argument", q); 65122861Smckusick if(qtype==TYCHAR && (q->vleng==NULL || !ISICON(q->vleng))) 65222861Smckusick dclerr("adjustable leng on nonargument", q); 65322861Smckusick } 65422861Smckusick 65522861Smckusick chkdim(q); 65622861Smckusick } 65722861Smckusick 65822861Smckusick for (i = 0 ; i < nequiv ; ++i) 65922861Smckusick if ( (leng = eqvclass[i].eqvleng) != 0 ) 66022861Smckusick { 66122861Smckusick if (SMALLVAR(leng)) 66222861Smckusick enlist(leng, NULL, eqvclass + i); 66322861Smckusick else if (eqvclass[i].init == NO) 66422861Smckusick { 66522861Smckusick preven(ALIDOUBLE); 66622861Smckusick prlocvar(memname(STGEQUIV, i), leng); 66722861Smckusick eqvclass[i].inlcomm = YES; 66822861Smckusick } 66922861Smckusick else 67022861Smckusick prlocdata(memname(STGEQUIV, i), leng, TYDREAL, 67122861Smckusick eqvclass[i].initoffset, &(eqvclass[i].inlcomm)); 67222861Smckusick } 67322861Smckusick 67422861Smckusick outlocvars(); 67522861Smckusick #ifdef SDB 67622861Smckusick if(sdbflag) { 67722861Smckusick for(p = hashtab ; p<lasthash ; ++p) if(q = p->varp) { 67822861Smckusick qstg = q->vstg; 67922861Smckusick qclass = q->vclass; 68022861Smckusick if( ONEOF(qclass, M(CLVAR))) { 68122861Smckusick if (! ONEOF(qstg,M(STGCOMMON)|M(STGARG) ) ) namestab(q); 68222861Smckusick } 68322861Smckusick } 68422861Smckusick } 68522861Smckusick #endif 68622861Smckusick 68722861Smckusick close(vdatafile); 68822861Smckusick close(vchkfile); 68922861Smckusick unlink(vdatafname); 69022861Smckusick unlink(vchkfname); 69122861Smckusick vdatahwm = 0; 69222861Smckusick } 69322861Smckusick 69422861Smckusick 69522861Smckusick 69622861Smckusick donmlist() 69722861Smckusick { 69822861Smckusick register struct Hashentry *p; 69922861Smckusick register Namep q; 70022861Smckusick 70122861Smckusick pruse(asmfile, USEINIT); 70222861Smckusick 70322861Smckusick for(p=hashtab; p<lasthash; ++p) 70422861Smckusick if( (q = p->varp) && q->vclass==CLNAMELIST) 70522861Smckusick namelist(q); 70622861Smckusick } 70722861Smckusick 70822861Smckusick 70922861Smckusick doext() 71022861Smckusick { 71122861Smckusick struct Extsym *p; 71222861Smckusick 71322861Smckusick for(p = extsymtab ; p<nextext ; ++p) 71422861Smckusick prext(p); 71522861Smckusick } 71622861Smckusick 71722861Smckusick 71822861Smckusick 71922861Smckusick 72022861Smckusick ftnint iarrlen(q) 72122861Smckusick register Namep q; 72222861Smckusick { 72322861Smckusick ftnint leng; 72422861Smckusick 72522861Smckusick leng = typesize[q->vtype]; 72622861Smckusick if(leng <= 0) 72722861Smckusick return(-1); 72822861Smckusick if(q->vdim) 72922861Smckusick if( ISICON(q->vdim->nelt) ) 73022861Smckusick leng *= q->vdim->nelt->constblock.const.ci; 73122861Smckusick else return(-1); 73222861Smckusick if(q->vleng) 73322861Smckusick if( ISICON(q->vleng) ) 73422861Smckusick leng *= q->vleng->constblock.const.ci; 73522861Smckusick else return(-1); 73622861Smckusick return(leng); 73722861Smckusick } 73822861Smckusick 73922861Smckusick /* This routine creates a static block representing the namelist. 74022861Smckusick An equivalent declaration of the structure produced is: 74122861Smckusick struct namelist 74222861Smckusick { 74322861Smckusick char namelistname[16]; 74422861Smckusick struct namelistentry 74522861Smckusick { 746*24484Sdonn char varname[16]; # 16 plus null padding -> 20 74722861Smckusick char *varaddr; 748*24484Sdonn short int type; 749*24484Sdonn short int len; # length of type 75022861Smckusick struct dimensions *dimp; # null means scalar 75122861Smckusick } names[]; 75222861Smckusick }; 75322861Smckusick 75422861Smckusick struct dimensions 75522861Smckusick { 75622861Smckusick int numberofdimensions; 75722861Smckusick int numberofelements 75822861Smckusick int baseoffset; 75922861Smckusick int span[numberofdimensions]; 76022861Smckusick }; 76122861Smckusick where the namelistentry list terminates with a null varname 76222861Smckusick If dimp is not null, then the corner element of the array is at 76322861Smckusick varaddr. However, the element with subscripts (i1,...,in) is at 76422861Smckusick varaddr - dimp->baseoffset + sizeoftype * (i1+span[0]*(i2+span[1]*...) 76522861Smckusick */ 76622861Smckusick 76722861Smckusick namelist(np) 76822861Smckusick Namep np; 76922861Smckusick { 77022861Smckusick register chainp q; 77122861Smckusick register Namep v; 77222861Smckusick register struct Dimblock *dp; 77322861Smckusick char *memname(); 77422861Smckusick int type, dimno, dimoffset; 77522861Smckusick flag bad; 77622861Smckusick 77722861Smckusick 77822861Smckusick preven(ALILONG); 77922861Smckusick fprintf(asmfile, LABELFMT, memname(STGINIT, np->vardesc.varno)); 78022861Smckusick putstr(asmfile, varstr(VL, np->varname), 16); 78122861Smckusick dimno = ++lastvarno; 78222861Smckusick dimoffset = 0; 78322861Smckusick bad = NO; 78422861Smckusick 78522861Smckusick for(q = np->varxptr.namelist ; q ; q = q->nextp) 78622861Smckusick { 78722861Smckusick vardcl( v = (Namep) (q->datap) ); 78822861Smckusick type = v->vtype; 78922861Smckusick if( ONEOF(v->vstg, MSKSTATIC) ) 79022861Smckusick { 79122861Smckusick preven(ALILONG); 79222861Smckusick putstr(asmfile, varstr(VL,v->varname), 16); 79322861Smckusick praddr(asmfile, v->vstg, v->vardesc.varno, v->voffset); 794*24484Sdonn prconi(asmfile, TYSHORT, type ); 795*24484Sdonn prconi(asmfile, TYSHORT, 79622861Smckusick type==TYCHAR ? 797*24484Sdonn (v->vleng->constblock.const.ci) : 798*24484Sdonn (ftnint) typesize[type]); 79922861Smckusick if(v->vdim) 80022861Smckusick { 80122861Smckusick praddr(asmfile, STGINIT, dimno, (ftnint)dimoffset); 802*24484Sdonn dimoffset += (3 + v->vdim->ndim) * SZINT; 80322861Smckusick } 80422861Smckusick else 80522861Smckusick praddr(asmfile, STGNULL,0,(ftnint) 0); 80622861Smckusick } 80722861Smckusick else 80822861Smckusick { 80922861Smckusick dclerr("may not appear in namelist", v); 81022861Smckusick bad = YES; 81122861Smckusick } 81222861Smckusick } 81322861Smckusick 81422861Smckusick if(bad) 81522861Smckusick return; 81622861Smckusick 81722861Smckusick putstr(asmfile, "", 16); 81822861Smckusick 81922861Smckusick if(dimoffset > 0) 82022861Smckusick { 82122861Smckusick fprintf(asmfile, LABELFMT, memname(STGINIT,dimno)); 82222861Smckusick for(q = np->varxptr.namelist ; q ; q = q->nextp) 82322861Smckusick if(dp = q->datap->nameblock.vdim) 82422861Smckusick { 82522861Smckusick int i; 82622861Smckusick prconi(asmfile, TYINT, (ftnint) (dp->ndim) ); 82722861Smckusick prconi(asmfile, TYINT, 82822861Smckusick (ftnint) (dp->nelt->constblock.const.ci) ); 82922861Smckusick prconi(asmfile, TYINT, 83022861Smckusick (ftnint) (dp->baseoffset->constblock.const.ci)); 83122861Smckusick for(i=0; i<dp->ndim ; ++i) 83222861Smckusick prconi(asmfile, TYINT, 83322861Smckusick dp->dims[i].dimsize->constblock.const.ci); 83422861Smckusick } 83522861Smckusick } 83622861Smckusick 83722861Smckusick } 83822861Smckusick 83922861Smckusick LOCAL docommon() 84022861Smckusick { 84122861Smckusick register struct Extsym *p; 84222861Smckusick register chainp q; 84322861Smckusick struct Dimblock *t; 84422861Smckusick expptr neltp; 84522861Smckusick register Namep v; 84622861Smckusick ftnint size; 84722861Smckusick int type; 84822861Smckusick 84922861Smckusick for(p = extsymtab ; p<nextext ; ++p) 85022861Smckusick if(p->extstg==STGCOMMON) 85122861Smckusick { 85222861Smckusick #ifdef SDB 85322861Smckusick if(sdbflag) 85422861Smckusick prstab(varstr(XL,p->extname), N_BCOMM, 0, 0); 85522861Smckusick #endif 85622861Smckusick for(q = p->extp ; q ; q = q->nextp) 85722861Smckusick { 85822861Smckusick v = (Namep) (q->datap); 85922861Smckusick if(v->vdcldone == NO) 86022861Smckusick vardcl(v); 86122861Smckusick type = v->vtype; 86222861Smckusick if(p->extleng % typealign[type] != 0) 86322861Smckusick { 86422861Smckusick dclerr("common alignment", v); 86522861Smckusick p->extleng = roundup(p->extleng, typealign[type]); 86622861Smckusick } 86722861Smckusick v->voffset = p->extleng; 86822861Smckusick v->vardesc.varno = p - extsymtab; 86922861Smckusick if(type == TYCHAR) 87022861Smckusick size = v->vleng->constblock.const.ci; 87122861Smckusick else size = typesize[type]; 87222861Smckusick if(t = v->vdim) 87322861Smckusick if( (neltp = t->nelt) && ISCONST(neltp) ) 87422861Smckusick size *= neltp->constblock.const.ci; 87522861Smckusick else 87622861Smckusick dclerr("adjustable array in common", v); 87722861Smckusick p->extleng += size; 87822861Smckusick #ifdef SDB 87922861Smckusick if(sdbflag) 88022861Smckusick { 88122861Smckusick namestab(v); 88222861Smckusick } 88322861Smckusick #endif 88422861Smckusick } 88522861Smckusick 88622861Smckusick frchain( &(p->extp) ); 88722861Smckusick #ifdef SDB 88822861Smckusick if(sdbflag) 88922861Smckusick prstab(varstr(XL,p->extname), N_ECOMM, 0, 0); 89022861Smckusick #endif 89122861Smckusick } 89222861Smckusick } 89322861Smckusick 89422861Smckusick 89522861Smckusick 89622861Smckusick 89722861Smckusick 89822861Smckusick LOCAL docomleng() 89922861Smckusick { 90022861Smckusick register struct Extsym *p; 90122861Smckusick 90222861Smckusick for(p = extsymtab ; p < nextext ; ++p) 90322861Smckusick if(p->extstg == STGCOMMON) 90422861Smckusick { 90522861Smckusick if(p->maxleng!=0 && p->extleng!=0 && p->maxleng!=p->extleng 90622861Smckusick && !eqn(XL,"_BLNK__ ",p->extname) ) 90722861Smckusick warn1("incompatible lengths for common block %s", 90822861Smckusick nounder(XL, p->extname) ); 90922861Smckusick if(p->maxleng < p->extleng) 91022861Smckusick p->maxleng = p->extleng; 91122861Smckusick p->extleng = 0; 91222861Smckusick } 91322861Smckusick } 91422861Smckusick 91522861Smckusick 91622861Smckusick 91722861Smckusick 91822861Smckusick /* ROUTINES DEALING WITH AUTOMATIC AND TEMPORARY STORAGE */ 91922861Smckusick 92022861Smckusick /* frees a temporary block */ 92122861Smckusick 92222861Smckusick frtemp(p) 92322861Smckusick Tempp p; 92422861Smckusick { 92522861Smckusick Addrp t; 92622861Smckusick 92722861Smckusick if (optimflag) 92822861Smckusick { 92922861Smckusick if (p->tag != TTEMP) 93022861Smckusick badtag ("frtemp",p->tag); 93122861Smckusick t = p->memalloc; 93222861Smckusick } 93322861Smckusick else 93422861Smckusick t = (Addrp) p; 93522861Smckusick 93622861Smckusick /* restore clobbered character string lengths */ 93722861Smckusick if(t->vtype==TYCHAR && t->varleng!=0) 93822861Smckusick { 93922861Smckusick frexpr(t->vleng); 94022861Smckusick t->vleng = ICON(t->varleng); 94122861Smckusick } 94222861Smckusick 94322861Smckusick /* put block on chain of temps to be reclaimed */ 94422861Smckusick holdtemps = mkchain(t, holdtemps); 94522861Smckusick } 94622861Smckusick 94722861Smckusick 94822861Smckusick 94922861Smckusick /* allocate an automatic variable slot */ 95022861Smckusick 95122861Smckusick Addrp autovar(nelt, t, lengp) 95222861Smckusick register int nelt, t; 95322861Smckusick expptr lengp; 95422861Smckusick { 95522861Smckusick ftnint leng; 95622861Smckusick register Addrp q; 95722861Smckusick 95822861Smckusick if(lengp) 95922861Smckusick if( ISICON(lengp) ) 96022861Smckusick leng = lengp->constblock.const.ci; 96122861Smckusick else { 96222861Smckusick fatal("automatic variable of nonconstant length"); 96322861Smckusick } 96422861Smckusick else 96522861Smckusick leng = typesize[t]; 96622861Smckusick autoleng = roundup( autoleng, typealign[t]); 96722861Smckusick 96822861Smckusick q = ALLOC(Addrblock); 96922861Smckusick q->tag = TADDR; 97022861Smckusick q->vtype = t; 97122861Smckusick if(lengp) 97222861Smckusick { 97322861Smckusick q->vleng = ICON(leng); 97422861Smckusick q->varleng = leng; 97522861Smckusick } 97622861Smckusick q->vstg = STGAUTO; 97722861Smckusick q->memno = newlabel(); 97822861Smckusick q->ntempelt = nelt; 97922861Smckusick #if TARGET==PDP11 || TARGET==VAX 98022861Smckusick /* stack grows downward */ 98122861Smckusick autoleng += nelt*leng; 98222861Smckusick q->memoffset = ICON( - autoleng ); 98322861Smckusick #else 98422861Smckusick q->memoffset = ICON( autoleng ); 98522861Smckusick autoleng += nelt*leng; 98622861Smckusick #endif 98722861Smckusick 98822861Smckusick return(q); 98922861Smckusick } 99022861Smckusick 99122861Smckusick 99222861Smckusick 99322861Smckusick /* 99422861Smckusick * create a temporary block (TTEMP) when optimizing, 99522861Smckusick * an ordinary TADDR block when not optimizing 99622861Smckusick */ 99722861Smckusick 99822861Smckusick Tempp mktmpn(nelt, type, lengp) 99922861Smckusick int nelt; 100022861Smckusick register int type; 100122861Smckusick expptr lengp; 100222861Smckusick { 100322861Smckusick ftnint leng; 100422861Smckusick chainp p, oldp; 100522861Smckusick register Tempp q; 100622861Smckusick Addrp altemp; 100722861Smckusick 100822861Smckusick if (! optimflag) 100922861Smckusick return ( (Tempp) mkaltmpn(nelt,type,lengp) ); 101022861Smckusick if(type==TYUNKNOWN || type==TYERROR) 101122861Smckusick badtype("mktmpn", type); 101222861Smckusick 101322861Smckusick if(type==TYCHAR) 101422861Smckusick if( ISICON(lengp) ) 101522861Smckusick leng = lengp->constblock.const.ci; 101622861Smckusick else { 101722861Smckusick err("adjustable length"); 101822861Smckusick return( (Tempp) errnode() ); 101922861Smckusick } 102022861Smckusick else 102122861Smckusick leng = typesize[type]; 102222861Smckusick 102322861Smckusick q = ALLOC(Tempblock); 102422861Smckusick q->tag = TTEMP; 102522861Smckusick q->vtype = type; 102622861Smckusick if(type == TYCHAR) 102722861Smckusick { 102822861Smckusick q->vleng = ICON(leng); 102922861Smckusick q->varleng = leng; 103022861Smckusick } 103122861Smckusick 103222861Smckusick altemp = ALLOC(Addrblock); 103322861Smckusick altemp->tag = TADDR; 103422861Smckusick altemp->vstg = STGUNKNOWN; 103522861Smckusick q->memalloc = altemp; 103622861Smckusick 103722861Smckusick q->ntempelt = nelt; 103822861Smckusick q->istemp = YES; 103922861Smckusick return(q); 104022861Smckusick } 104122861Smckusick 104222861Smckusick 104322861Smckusick 104422861Smckusick Addrp mktemp(type, lengp) 104522861Smckusick int type; 104622861Smckusick expptr lengp; 104722861Smckusick { 104822861Smckusick return( (Addrp) mktmpn(1,type,lengp) ); 104922861Smckusick } 105022861Smckusick 105122861Smckusick 105222861Smckusick 105322861Smckusick /* allocate a temporary location for the given temporary block; 105422861Smckusick if already allocated, return its location */ 105522861Smckusick 105622861Smckusick Addrp altmpn(tp) 105722861Smckusick Tempp tp; 105822861Smckusick 105922861Smckusick { 106022861Smckusick Addrp t, q; 106122861Smckusick 106222861Smckusick if (tp->tag != TTEMP) 106322861Smckusick badtag ("altmpn",tp->tag); 106422861Smckusick 106522861Smckusick t = tp->memalloc; 106622861Smckusick if (t->vstg != STGUNKNOWN) 106722861Smckusick { 106822861Smckusick if (tp->vtype == TYCHAR) 106922861Smckusick { 107022861Smckusick /* 107122861Smckusick * Unformatted I/O parameters are treated like character 107222861Smckusick * strings (sigh) -- propagate type and length. 107322861Smckusick */ 107422861Smckusick t = (Addrp) cpexpr(t); 107522861Smckusick t->vtype = tp->vtype; 107622861Smckusick t->vleng = tp->vleng; 107722861Smckusick t->varleng = tp->varleng; 107822861Smckusick } 107922861Smckusick return (t); 108022861Smckusick } 108122861Smckusick 108222861Smckusick q = mkaltmpn (tp->ntempelt, tp->vtype, tp->vleng); 108322861Smckusick cpn (sizeof(struct Addrblock), (char*)q, (char*)t); 108422861Smckusick free ( (charptr) q); 108522861Smckusick return(t); 108622861Smckusick } 108722861Smckusick 108822861Smckusick 108922861Smckusick 109022861Smckusick /* create and allocate space immediately for a temporary */ 109122861Smckusick 109222861Smckusick Addrp mkaltemp(type,lengp) 109322861Smckusick int type; 109422861Smckusick expptr lengp; 109522861Smckusick { 109622861Smckusick return (mkaltmpn(1,type,lengp)); 109722861Smckusick } 109822861Smckusick 109922861Smckusick 110022861Smckusick 110122861Smckusick Addrp mkaltmpn(nelt,type,lengp) 110222861Smckusick int nelt; 110322861Smckusick register int type; 110422861Smckusick expptr lengp; 110522861Smckusick { 110622861Smckusick ftnint leng; 110722861Smckusick chainp p, oldp; 110822861Smckusick register Addrp q; 110922861Smckusick 111022861Smckusick if(type==TYUNKNOWN || type==TYERROR) 111122861Smckusick badtype("mkaltmpn", type); 111222861Smckusick 111322861Smckusick if(type==TYCHAR) 111422861Smckusick if( ISICON(lengp) ) 111522861Smckusick leng = lengp->constblock.const.ci; 111622861Smckusick else { 111722861Smckusick err("adjustable length"); 111822861Smckusick return( (Addrp) errnode() ); 111922861Smckusick } 112022861Smckusick 112122861Smckusick /* 112222861Smckusick * if a temporary of appropriate shape is on the templist, 112322861Smckusick * remove it from the list and return it 112422861Smckusick */ 112522861Smckusick 112622861Smckusick #ifdef notdef 112722861Smckusick /* 112822861Smckusick * This code is broken until SKFRTEMP slots can be processed in putopt() 112922861Smckusick * instead of in optimize() -- all kinds of things in putpcc.c can 113022861Smckusick * bomb because of this. Sigh. 113122861Smckusick */ 113222861Smckusick for(oldp=CHNULL, p=templist ; p ; oldp=p, p=p->nextp) 113322861Smckusick { 113422861Smckusick q = (Addrp) (p->datap); 113522861Smckusick if(q->vtype==type && q->ntempelt==nelt && 113622861Smckusick (type!=TYCHAR || q->vleng->constblock.const.ci==leng) ) 113722861Smckusick { 113822861Smckusick if(oldp) 113922861Smckusick oldp->nextp = p->nextp; 114022861Smckusick else 114122861Smckusick templist = p->nextp; 114222861Smckusick free( (charptr) p); 114322861Smckusick 114422861Smckusick if (debugflag[14]) 114522861Smckusick fprintf(diagfile,"mkaltmpn reusing offset %d\n", 114622861Smckusick q->memoffset->constblock.const.ci); 114722861Smckusick return(q); 114822861Smckusick } 114922861Smckusick } 115022861Smckusick #endif notdef 115122861Smckusick q = autovar(nelt, type, lengp); 115222861Smckusick q->istemp = YES; 115322861Smckusick 115422861Smckusick if (debugflag[14]) 115522861Smckusick fprintf(diagfile,"mkaltmpn new offset %d\n", 115622861Smckusick q->memoffset->constblock.const.ci); 115722861Smckusick return(q); 115822861Smckusick } 115922861Smckusick 116022861Smckusick 116122861Smckusick 116222861Smckusick /* The following routine is a patch which is only needed because the */ 116322861Smckusick /* code for processing actual arguments for calls does not allocate */ 116422861Smckusick /* the temps it needs before optimization takes place. A better */ 116522861Smckusick /* solution is possible, but I do not have the time to implement it */ 116622861Smckusick /* now. */ 116722861Smckusick /* */ 116822861Smckusick /* Robert P. Corbett */ 116922861Smckusick 117022861Smckusick Addrp 117122861Smckusick mkargtemp(type, lengp) 117222861Smckusick int type; 117322861Smckusick expptr lengp; 117422861Smckusick { 117522861Smckusick ftnint leng; 117622861Smckusick chainp oldp, p; 117722861Smckusick Addrp q; 117822861Smckusick 117922861Smckusick if (type == TYUNKNOWN || type == TYERROR) 118022861Smckusick badtype("mkargtemp", type); 118122861Smckusick 118222861Smckusick if (type == TYCHAR) 118322861Smckusick { 118422861Smckusick if (ISICON(lengp)) 118522861Smckusick leng = lengp->constblock.const.ci; 118622861Smckusick else 118722861Smckusick { 118822861Smckusick err("adjustable length"); 118922861Smckusick return ((Addrp) errnode()); 119022861Smckusick } 119122861Smckusick } 119222861Smckusick 119322861Smckusick oldp = CHNULL; 119422861Smckusick p = argtemplist; 119522861Smckusick 119622861Smckusick while (p) 119722861Smckusick { 119822861Smckusick q = (Addrp) (p->datap); 119922861Smckusick if (q->vtype == type 120022861Smckusick && (type != TYCHAR || q->vleng->constblock.const.ci == leng)) 120122861Smckusick { 120222861Smckusick if (oldp) 120322861Smckusick oldp->nextp = p->nextp; 120422861Smckusick else 120522861Smckusick argtemplist = p->nextp; 120622861Smckusick 120722861Smckusick p->nextp = activearglist; 120822861Smckusick activearglist = p; 120922861Smckusick 121022861Smckusick return ((Addrp) cpexpr(q)); 121122861Smckusick } 121222861Smckusick 121322861Smckusick oldp = p; 121422861Smckusick p = p->nextp; 121522861Smckusick } 121622861Smckusick 121722861Smckusick q = autovar(1, type, lengp); 121822861Smckusick activearglist = mkchain(q, activearglist); 121922861Smckusick return ((Addrp) cpexpr(q)); 122022861Smckusick } 122122861Smckusick 122222861Smckusick /* VARIOUS ROUTINES FOR PROCESSING DECLARATIONS */ 122322861Smckusick 122422861Smckusick struct Extsym *comblock(len, s) 122522861Smckusick register int len; 122622861Smckusick register char *s; 122722861Smckusick { 122822861Smckusick struct Extsym *p; 122922861Smckusick 123022861Smckusick if(len == 0) 123122861Smckusick { 123222861Smckusick s = BLANKCOMMON; 123322861Smckusick len = strlen(s); 123422861Smckusick } 123522861Smckusick p = mkext( varunder(len, s) ); 123622861Smckusick if(p->extstg == STGUNKNOWN) 123722861Smckusick p->extstg = STGCOMMON; 123822861Smckusick else if(p->extstg != STGCOMMON) 123922861Smckusick { 124022861Smckusick errstr("%s cannot be a common block name", s); 124122861Smckusick return(0); 124222861Smckusick } 124322861Smckusick 124422861Smckusick return( p ); 124522861Smckusick } 124622861Smckusick 124722861Smckusick 124822861Smckusick incomm(c, v) 124922861Smckusick struct Extsym *c; 125022861Smckusick Namep v; 125122861Smckusick { 125222861Smckusick if(v->vstg != STGUNKNOWN) 125322861Smckusick dclerr("incompatible common declaration", v); 125422861Smckusick else 125522861Smckusick { 125622861Smckusick if(c == (struct Extsym *) 0) 125722861Smckusick return; /* Illegal common block name upstream */ 125822861Smckusick v->vstg = STGCOMMON; 125922861Smckusick c->extp = hookup(c->extp, mkchain(v,CHNULL) ); 126022861Smckusick } 126122861Smckusick } 126222861Smckusick 126322861Smckusick 126422861Smckusick 126522861Smckusick 126622861Smckusick settype(v, type, length) 126722861Smckusick register Namep v; 126822861Smckusick register int type; 126922861Smckusick register int length; 127022861Smckusick { 127122861Smckusick if(type == TYUNKNOWN) 127222861Smckusick return; 127322861Smckusick 127422861Smckusick if(type==TYSUBR && v->vtype!=TYUNKNOWN && v->vstg==STGARG) 127522861Smckusick { 127622861Smckusick v->vtype = TYSUBR; 127722861Smckusick frexpr(v->vleng); 127822861Smckusick } 127922861Smckusick else if(type < 0) /* storage class set */ 128022861Smckusick { 128122861Smckusick if(v->vstg == STGUNKNOWN) 128222861Smckusick v->vstg = - type; 128322861Smckusick else if(v->vstg != -type) 128422861Smckusick dclerr("incompatible storage declarations", v); 128522861Smckusick } 128622861Smckusick else if(v->vtype == TYUNKNOWN) 128722861Smckusick { 128822861Smckusick if( (v->vtype = lengtype(type, length))==TYCHAR && length>=0) 128922861Smckusick v->vleng = ICON(length); 129022861Smckusick } 129122861Smckusick else if(v->vtype!=type || (type==TYCHAR && v->vleng->constblock.const.ci!=length) ) 129222861Smckusick dclerr("incompatible type declarations", v); 129322861Smckusick } 129422861Smckusick 129522861Smckusick 129622861Smckusick 129722861Smckusick 129822861Smckusick 129922861Smckusick lengtype(type, length) 130022861Smckusick register int type; 130122861Smckusick register int length; 130222861Smckusick { 130322861Smckusick switch(type) 130422861Smckusick { 130522861Smckusick case TYREAL: 130622861Smckusick if(length == 8) 130722861Smckusick return(TYDREAL); 130822861Smckusick if(length == 4) 130922861Smckusick goto ret; 131022861Smckusick break; 131122861Smckusick 131222861Smckusick case TYCOMPLEX: 131322861Smckusick if(length == 16) 131422861Smckusick return(TYDCOMPLEX); 131522861Smckusick if(length == 8) 131622861Smckusick goto ret; 131722861Smckusick break; 131822861Smckusick 131922861Smckusick case TYSHORT: 132022861Smckusick case TYDREAL: 132122861Smckusick case TYDCOMPLEX: 132222861Smckusick case TYCHAR: 132322861Smckusick case TYUNKNOWN: 132422861Smckusick case TYSUBR: 132522861Smckusick case TYERROR: 132622861Smckusick goto ret; 132722861Smckusick 132822861Smckusick case TYLOGICAL: 132922861Smckusick if(length == typesize[TYLOGICAL]) 133022861Smckusick goto ret; 133122861Smckusick break; 133222861Smckusick 133322861Smckusick case TYLONG: 133422861Smckusick if(length == 0) 133522861Smckusick return(tyint); 133622861Smckusick if(length == 2) 133722861Smckusick return(TYSHORT); 133822861Smckusick if(length == 4) 133922861Smckusick goto ret; 134022861Smckusick break; 134122861Smckusick default: 134222861Smckusick badtype("lengtype", type); 134322861Smckusick } 134422861Smckusick 134522861Smckusick if(length != 0) 134622861Smckusick err("incompatible type-length combination"); 134722861Smckusick 134822861Smckusick ret: 134922861Smckusick return(type); 135022861Smckusick } 135122861Smckusick 135222861Smckusick 135322861Smckusick 135422861Smckusick 135522861Smckusick 135622861Smckusick setintr(v) 135722861Smckusick register Namep v; 135822861Smckusick { 135922861Smckusick register int k; 136022861Smckusick 136122861Smckusick if(v->vstg == STGUNKNOWN) 136222861Smckusick v->vstg = STGINTR; 136322861Smckusick else if(v->vstg!=STGINTR) 136422861Smckusick dclerr("incompatible use of intrinsic function", v); 136522861Smckusick if(v->vclass==CLUNKNOWN) 136622861Smckusick v->vclass = CLPROC; 136722861Smckusick if(v->vprocclass == PUNKNOWN) 136822861Smckusick v->vprocclass = PINTRINSIC; 136922861Smckusick else if(v->vprocclass != PINTRINSIC) 137022861Smckusick dclerr("invalid intrinsic declaration", v); 137122861Smckusick if(k = intrfunct(v->varname)) 137222861Smckusick v->vardesc.varno = k; 137322861Smckusick else 137422861Smckusick dclerr("unknown intrinsic function", v); 137522861Smckusick } 137622861Smckusick 137722861Smckusick 137822861Smckusick 137922861Smckusick setext(v) 138022861Smckusick register Namep v; 138122861Smckusick { 138222861Smckusick if(v->vclass == CLUNKNOWN) 138322861Smckusick v->vclass = CLPROC; 138422861Smckusick else if(v->vclass != CLPROC) 138522861Smckusick dclerr("conflicting declarations", v); 138622861Smckusick 138722861Smckusick if(v->vprocclass == PUNKNOWN) 138822861Smckusick v->vprocclass = PEXTERNAL; 138922861Smckusick else if(v->vprocclass != PEXTERNAL) 139022861Smckusick dclerr("conflicting declarations", v); 139122861Smckusick } 139222861Smckusick 139322861Smckusick 139422861Smckusick 139522861Smckusick 139622861Smckusick /* create dimensions block for array variable */ 139722861Smckusick 139822861Smckusick setbound(v, nd, dims) 139922861Smckusick register Namep v; 140022861Smckusick int nd; 140122861Smckusick struct { expptr lb, ub; } dims[ ]; 140222861Smckusick { 140322861Smckusick register expptr q, t; 140422861Smckusick register struct Dimblock *p; 140522861Smckusick int i; 140622861Smckusick 140722861Smckusick if(v->vclass == CLUNKNOWN) 140822861Smckusick v->vclass = CLVAR; 140922861Smckusick else if(v->vclass != CLVAR) 141022861Smckusick { 141122861Smckusick dclerr("only variables may be arrays", v); 141222861Smckusick return; 141322861Smckusick } 141422861Smckusick if(v->vdim) 141522861Smckusick { 141622861Smckusick dclerr("redimensioned array", v); 141722861Smckusick return; 141822861Smckusick } 141922861Smckusick 142022861Smckusick v->vdim = p = (struct Dimblock *) 142122861Smckusick ckalloc( sizeof(int) + (3+6*nd)*sizeof(expptr) ); 142222861Smckusick p->ndim = nd; 142322861Smckusick p->nelt = ICON(1); 142422861Smckusick 142522861Smckusick for(i=0 ; i<nd ; ++i) 142622861Smckusick { 142722861Smckusick #ifdef SDB 142822861Smckusick if(sdbflag) { 142922861Smckusick /* Save the bounds trees built up by the grammar routines for use in stabs */ 143022861Smckusick 143122861Smckusick if(dims[i].lb == NULL) p->dims[i].lb=ICON(1); 143222861Smckusick else p->dims[i].lb= (expptr) cpexpr(dims[i].lb); 143322861Smckusick if(ISCONST(p->dims[i].lb)) p->dims[i].lbaddr = (expptr) PNULL; 143422861Smckusick else p->dims[i].lbaddr = (expptr) autovar(1, tyint, PNULL); 143522861Smckusick 143622861Smckusick if(dims[i].ub == NULL) p->dims[i].ub=ICON(1); 143722861Smckusick else p->dims[i].ub = (expptr) cpexpr(dims[i].ub); 143822861Smckusick if(ISCONST(p->dims[i].ub)) p->dims[i].ubaddr = (expptr) PNULL; 143922861Smckusick else p->dims[i].ubaddr = (expptr) autovar(1, tyint, PNULL); 144022861Smckusick } 144122861Smckusick #endif 144222861Smckusick if( (q = dims[i].ub) == NULL) 144322861Smckusick { 144422861Smckusick if(i == nd-1) 144522861Smckusick { 144622861Smckusick frexpr(p->nelt); 144722861Smckusick p->nelt = NULL; 144822861Smckusick } 144922861Smckusick else 145022861Smckusick err("only last bound may be asterisk"); 145122861Smckusick p->dims[i].dimsize = ICON(1);; 145222861Smckusick p->dims[i].dimexpr = NULL; 145322861Smckusick } 145422861Smckusick else 145522861Smckusick { 145622861Smckusick if(dims[i].lb) 145722861Smckusick { 145822861Smckusick q = mkexpr(OPMINUS, q, cpexpr(dims[i].lb)); 145922861Smckusick q = mkexpr(OPPLUS, q, ICON(1) ); 146022861Smckusick } 146122861Smckusick if( ISCONST(q) ) 146222861Smckusick { 146322861Smckusick if (!ISINT(q->headblock.vtype)) { 146422861Smckusick dclerr("dimension bounds must be integer expression", v); 146522861Smckusick frexpr(q); 146622861Smckusick q = ICON(0); 146722861Smckusick } 146822861Smckusick if ( q->constblock.const.ci <= 0) 146922861Smckusick { 147022861Smckusick dclerr("array bounds out of sequence", v); 147122861Smckusick frexpr(q); 147222861Smckusick q = ICON(0); 147322861Smckusick } 147422861Smckusick p->dims[i].dimsize = q; 147522861Smckusick p->dims[i].dimexpr = (expptr) PNULL; 147622861Smckusick } 147722861Smckusick else { 147822861Smckusick p->dims[i].dimsize = (expptr) autovar(1, tyint, PNULL); 147922861Smckusick p->dims[i].dimexpr = q; 148022861Smckusick } 148122861Smckusick if(p->nelt) 148222861Smckusick p->nelt = mkexpr(OPSTAR, p->nelt, 148322861Smckusick cpexpr(p->dims[i].dimsize) ); 148422861Smckusick } 148522861Smckusick } 148622861Smckusick 148722861Smckusick q = dims[nd-1].lb; 148822861Smckusick if(q == NULL) 148922861Smckusick q = ICON(1); 149022861Smckusick 149122861Smckusick for(i = nd-2 ; i>=0 ; --i) 149222861Smckusick { 149322861Smckusick t = dims[i].lb; 149422861Smckusick if(t == NULL) 149522861Smckusick t = ICON(1); 149622861Smckusick if(p->dims[i].dimsize) 149722861Smckusick q = mkexpr(OPPLUS, t, mkexpr(OPSTAR, cpexpr(p->dims[i].dimsize), q) ); 149822861Smckusick } 149922861Smckusick 150022861Smckusick if( ISCONST(q) ) 150122861Smckusick { 150222861Smckusick p->baseoffset = q; 150322861Smckusick p->basexpr = NULL; 150422861Smckusick } 150522861Smckusick else 150622861Smckusick { 150722861Smckusick p->baseoffset = (expptr) autovar(1, tyint, PNULL); 150822861Smckusick p->basexpr = q; 150922861Smckusick } 151022861Smckusick } 151122861Smckusick 151222861Smckusick 151322861Smckusick 151422861Smckusick /* 151522861Smckusick * Check the dimensions of q to ensure that they are appropriately defined. 151622861Smckusick */ 151722861Smckusick LOCAL chkdim(q) 151822861Smckusick register Namep q; 151922861Smckusick { 152022861Smckusick register struct Dimblock *p; 152122861Smckusick register int i; 152222861Smckusick expptr e; 152322861Smckusick 152422861Smckusick if (q == NULL) 152522861Smckusick return; 152622861Smckusick if (q->vclass != CLVAR) 152722861Smckusick return; 152822861Smckusick if (q->vdim == NULL) 152922861Smckusick return; 153022861Smckusick p = q->vdim; 153122861Smckusick for (i = 0; i < p->ndim; ++i) 153222861Smckusick { 153322861Smckusick #ifdef SDB 153422861Smckusick if (sdbflag) 153522861Smckusick { 153622861Smckusick if (e = p->dims[i].lb) 153722861Smckusick chkdime(e, q); 153822861Smckusick if (e = p->dims[i].ub) 153922861Smckusick chkdime(e, q); 154022861Smckusick } 154122861Smckusick else 154222861Smckusick #endif SDB 154322861Smckusick if (e = p->dims[i].dimexpr) 154422861Smckusick chkdime(e, q); 154522861Smckusick } 154622861Smckusick } 154722861Smckusick 154822861Smckusick 154922861Smckusick 155022861Smckusick /* 155122861Smckusick * The actual checking for chkdim() -- examines each expression. 155222861Smckusick */ 155322861Smckusick LOCAL chkdime(expr, q) 155422861Smckusick expptr expr; 155522861Smckusick Namep q; 155622861Smckusick { 155722861Smckusick register expptr e; 155822861Smckusick 155922861Smckusick e = fixtype(cpexpr(expr)); 156022861Smckusick if (!ISINT(e->exprblock.vtype)) 156122861Smckusick dclerr("non-integer dimension", q); 156222861Smckusick else if (!safedim(e)) 156322861Smckusick dclerr("undefined dimension", q); 156422861Smckusick frexpr(e); 156522861Smckusick return; 156622861Smckusick } 156722861Smckusick 156822861Smckusick 156922861Smckusick 157022861Smckusick /* 157122861Smckusick * A recursive routine to find undefined variables in dimension expressions. 157222861Smckusick */ 157322861Smckusick LOCAL safedim(e) 157422861Smckusick expptr e; 157522861Smckusick { 157622861Smckusick chainp cp; 157722861Smckusick 157822861Smckusick if (e == NULL) 157922861Smckusick return 1; 158022861Smckusick switch (e->tag) 158122861Smckusick { 158222861Smckusick case TEXPR: 158322861Smckusick if (e->exprblock.opcode == OPCALL || e->exprblock.opcode == OPCCALL) 158422861Smckusick return 0; 158522861Smckusick return safedim(e->exprblock.leftp) && safedim(e->exprblock.rightp); 158622861Smckusick case TADDR: 158722861Smckusick switch (e->addrblock.vstg) 158822861Smckusick { 158922861Smckusick case STGCOMMON: 159022861Smckusick case STGARG: 159122861Smckusick case STGCONST: 159222861Smckusick case STGEQUIV: 159322861Smckusick if (e->addrblock.isarray) 159422861Smckusick return 0; 159522861Smckusick return safedim(e->addrblock.memoffset); 159622861Smckusick default: 159722861Smckusick return 0; 159822861Smckusick } 159922861Smckusick case TCONST: 160022861Smckusick case TTEMP: 160122861Smckusick return 1; 160222861Smckusick } 160322861Smckusick return 0; 160422861Smckusick } 160522861Smckusick 160622861Smckusick 160722861Smckusick 160822861Smckusick LOCAL enlist(size, np, ep) 160922861Smckusick ftnint size; 161022861Smckusick Namep np; 161122861Smckusick struct Equivblock *ep; 161222861Smckusick { 161322861Smckusick register sizelist *sp; 161422861Smckusick register sizelist *t; 161522861Smckusick register varlist *p; 161622861Smckusick 161722861Smckusick sp = varsizes; 161822861Smckusick 161922861Smckusick if (sp == NULL) 162022861Smckusick { 162122861Smckusick sp = ALLOC(SizeList); 162222861Smckusick sp->size = size; 162322861Smckusick varsizes = sp; 162422861Smckusick } 162522861Smckusick else 162622861Smckusick { 162722861Smckusick while (sp->size != size) 162822861Smckusick { 162922861Smckusick if (sp->next != NULL && sp->next->size <= size) 163022861Smckusick sp = sp->next; 163122861Smckusick else 163222861Smckusick { 163322861Smckusick t = sp; 163422861Smckusick sp = ALLOC(SizeList); 163522861Smckusick sp->size = size; 163622861Smckusick sp->next = t->next; 163722861Smckusick t->next = sp; 163822861Smckusick } 163922861Smckusick } 164022861Smckusick } 164122861Smckusick 164222861Smckusick p = ALLOC(VarList); 164322861Smckusick p->next = sp->vars; 164422861Smckusick p->np = np; 164522861Smckusick p->ep = ep; 164622861Smckusick 164722861Smckusick sp->vars = p; 164822861Smckusick 164922861Smckusick return; 165022861Smckusick } 165122861Smckusick 165222861Smckusick 165322861Smckusick 165422861Smckusick outlocvars() 165522861Smckusick { 165622861Smckusick 165722861Smckusick register varlist *first, *last; 165822861Smckusick register varlist *vp, *t; 165922861Smckusick register sizelist *sp, *sp1; 166022861Smckusick register Namep np; 166122861Smckusick register struct Equivblock *ep; 166222861Smckusick register int i; 166322861Smckusick register int alt; 166422861Smckusick register int type; 166522861Smckusick char sname[100]; 166622861Smckusick char setbuff[100]; 166722861Smckusick 166822861Smckusick sp = varsizes; 166922861Smckusick if (sp == NULL) 167022861Smckusick return; 167122861Smckusick 167222861Smckusick vp = sp->vars; 167322861Smckusick if (vp->np != NULL) 167422861Smckusick { 167522861Smckusick np = vp->np; 167622861Smckusick sprintf(setbuff, "\t.set\tv.%d,v.%d\n", bsslabel, 167722861Smckusick np->vardesc.varno); 167822861Smckusick } 167922861Smckusick else 168022861Smckusick { 168122861Smckusick i = vp->ep - eqvclass; 168222861Smckusick sprintf(setbuff, "\t.set\tv.%d,q.%d\n", bsslabel, i + eqvstart); 168322861Smckusick } 168422861Smckusick 168522861Smckusick first = last = NULL; 168622861Smckusick alt = NO; 168722861Smckusick 168822861Smckusick while (sp != NULL) 168922861Smckusick { 169022861Smckusick vp = sp->vars; 169122861Smckusick while (vp != NULL) 169222861Smckusick { 169322861Smckusick t = vp->next; 169422861Smckusick if (alt == YES) 169522861Smckusick { 169622861Smckusick alt = NO; 169722861Smckusick vp->next = first; 169822861Smckusick first = vp; 169922861Smckusick } 170022861Smckusick else 170122861Smckusick { 170222861Smckusick alt = YES; 170322861Smckusick if (last != NULL) 170422861Smckusick last->next = vp; 170522861Smckusick else 170622861Smckusick first = vp; 170722861Smckusick vp->next = NULL; 170822861Smckusick last = vp; 170922861Smckusick } 171022861Smckusick vp = t; 171122861Smckusick } 171222861Smckusick sp1 = sp; 171322861Smckusick sp = sp->next; 171422861Smckusick free((char *) sp1); 171522861Smckusick } 171622861Smckusick 171722861Smckusick vp = first; 171822861Smckusick while(vp != NULL) 171922861Smckusick { 172022861Smckusick if (vp->np != NULL) 172122861Smckusick { 172222861Smckusick np = vp->np; 172322861Smckusick sprintf(sname, "v.%d", np->vardesc.varno); 172422861Smckusick if (np->init) 172522861Smckusick prlocdata(sname, np->varsize, np->vtype, np->initoffset, 172622861Smckusick &(np->inlcomm)); 172722861Smckusick else 172822861Smckusick { 172922861Smckusick pralign(typealign[np->vtype]); 173022861Smckusick fprintf(initfile, "%s:\n\t.space\t%d\n", sname, 173122861Smckusick np->varsize); 173222861Smckusick } 173322861Smckusick np->inlcomm = NO; 173422861Smckusick } 173522861Smckusick else 173622861Smckusick { 173722861Smckusick ep = vp->ep; 173822861Smckusick i = ep - eqvclass; 173922861Smckusick if (ep->eqvleng >= 8) 174022861Smckusick type = TYDREAL; 174122861Smckusick else if (ep->eqvleng >= 4) 174222861Smckusick type = TYLONG; 174322861Smckusick else if (ep->eqvleng >= 2) 174422861Smckusick type = TYSHORT; 174522861Smckusick else 174622861Smckusick type = TYCHAR; 174722861Smckusick sprintf(sname, "q.%d", i + eqvstart); 174822861Smckusick if (ep->init) 174922861Smckusick prlocdata(sname, ep->eqvleng, type, ep->initoffset, 175022861Smckusick &(ep->inlcomm)); 175122861Smckusick else 175222861Smckusick { 175322861Smckusick pralign(typealign[type]); 175422861Smckusick fprintf(initfile, "%s:\n\t.space\t%d\n", sname, ep->eqvleng); 175522861Smckusick } 175622861Smckusick ep->inlcomm = NO; 175722861Smckusick } 175822861Smckusick t = vp; 175922861Smckusick vp = vp->next; 176022861Smckusick free((char *) t); 176122861Smckusick } 176222861Smckusick fprintf(initfile, "%s\n", setbuff); 176322861Smckusick return; 176422861Smckusick } 1765