Annotation of 43BSD/usr.bin/f77/src/f77pass1/equiv.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: static char *sccsid[] = "@(#)equiv.c   5.1 (Berkeley) 6/7/85";
                      9: #endif not lint
                     10: 
                     11: /*
                     12:  * equiv.c
                     13:  *
                     14:  * Routines related to equivalence class processing, f77 compiler, 4.2 BSD.
                     15:  *
                     16:  * University of Utah CS Dept modification history:
                     17:  * 
                     18:  * Revision 3.2  85/01/14  00:14:12  donn
                     19:  * Fixed bug in eqvcommon that was causing the calculations of multilevel
                     20:  * equivalences to be screwed up.
                     21:  * 
                     22:  * Revision 3.1  84/10/13  01:16:08  donn
                     23:  * Installed Jerry Berkman's version; added UofU comment header.
                     24:  * 
                     25:  */
                     26: 
                     27: 
                     28: #include "defs.h"
                     29: 
                     30: #ifdef SDB
                     31: #      include <a.out.h>
                     32: #      ifndef N_SO
                     33: #              include <stab.h>
                     34: #      endif
                     35: #endif
                     36: 
                     37: /* called at end of declarations section to process chains
                     38:    created by EQUIVALENCE statements
                     39:  */
                     40: 
                     41: doequiv()
                     42: {
                     43: register int i;
                     44: int inequiv, comno, ovarno;
                     45: ftnint comoffset, offset, leng;
                     46: register struct Equivblock *p;
                     47: register struct Eqvchain *q;
                     48: struct Primblock *itemp;
                     49: register Namep np;
                     50: expptr offp, suboffset();
                     51: int ns, nsubs();
                     52: chainp cp;
                     53: char *memname();
                     54: int doeqverr = 0;
                     55: 
                     56: for(i = 0 ; i < nequiv ; ++i)
                     57:        {
                     58:        p = &eqvclass[i];
                     59:        p->eqvbottom = p->eqvtop = 0;
                     60:        comno = -1;
                     61: 
                     62:        for(q = p->equivs ; q ; q = q->eqvnextp)
                     63:                {
                     64:                offset = 0;
                     65:                itemp = q->eqvitem.eqvlhs;
                     66:                if( itemp == NULL ) fatal("error processing equivalence");
                     67:                equivdcl = YES;
                     68:                vardcl(np = itemp->namep);
                     69:                equivdcl = NO;
                     70:                if(itemp->argsp || itemp->fcharp)
                     71:                        {
                     72:                        if(np->vdim!=NULL && np->vdim->ndim>1 &&
                     73:                           nsubs(itemp->argsp)==1 )
                     74:                                {
                     75:                                if(! ftn66flag)
                     76:                                        warn("1-dim subscript in EQUIVALENCE");
                     77:                                cp = NULL;
                     78:                                ns = np->vdim->ndim;
                     79:                                while(--ns > 0)
                     80:                                        cp = mkchain( ICON(1), cp);
                     81:                                itemp->argsp->listp->nextp = cp;
                     82:                                }
                     83: 
                     84:                        offp = suboffset(itemp);
                     85:                        if(ISICON(offp))
                     86:                                offset = offp->constblock.const.ci;
                     87:                        else    {
                     88:                                dclerr("illegal subscript in equivalence ",
                     89:                                        np);
                     90:                                np = NULL;
                     91:                                doeqverr = 1;
                     92:                                }
                     93:                        frexpr(offp);
                     94:                        }
                     95:                frexpr(itemp);
                     96: 
                     97:                if(np && (leng = iarrlen(np))<0)
                     98:                        {
                     99:                        dclerr("argument in equivalence", np);
                    100:                        np = NULL;
                    101:                        doeqverr =1;
                    102:                        }
                    103: 
                    104:                if(np) switch(np->vstg)
                    105:                        {
                    106:                        case STGUNKNOWN:
                    107:                        case STGBSS:
                    108:                        case STGEQUIV:
                    109:                                break;
                    110: 
                    111:                        case STGCOMMON:
                    112:                                comno = np->vardesc.varno;
                    113:                                comoffset = np->voffset + offset;
                    114:                                break;
                    115: 
                    116:                        default:
                    117:                                dclerr("bad storage class in equivalence", np);
                    118:                                np = NULL;
                    119:                                doeqverr = 1;
                    120:                                break;
                    121:                        }
                    122: 
                    123:                if(np)
                    124:                        {
                    125:                        q->eqvoffset = offset;
                    126:                        p->eqvbottom = lmin(p->eqvbottom, -offset);
                    127:                        p->eqvtop = lmax(p->eqvtop, leng-offset);
                    128:                        }
                    129:                q->eqvitem.eqvname = np;
                    130:                }
                    131: 
                    132:        if(comno >= 0)
                    133:                eqvcommon(p, comno, comoffset);
                    134:        else  for(q = p->equivs ; q ; q = q->eqvnextp)
                    135:                {
                    136:                if(np = q->eqvitem.eqvname)
                    137:                        {
                    138:                        inequiv = NO;
                    139:                        if(np->vstg==STGEQUIV)
                    140:                                if( (ovarno = np->vardesc.varno) == i)
                    141:                                        {
                    142:                                        if(np->voffset + q->eqvoffset != 0)
                    143:                                                dclerr("inconsistent equivalence", np);
                    144:                                                doeqverr = 1;
                    145:                                        }
                    146:                                else    {
                    147:                                        offset = np->voffset;
                    148:                                        inequiv = YES;
                    149:                                        }
                    150: 
                    151:                        np->vstg = STGEQUIV;
                    152:                        np->vardesc.varno = i;
                    153:                        np->voffset = - q->eqvoffset;
                    154: 
                    155:                        if(inequiv)
                    156:                                eqveqv(i, ovarno, q->eqvoffset + offset);
                    157:                        }
                    158:                }
                    159:        }
                    160: 
                    161: if( !doeqverr )
                    162:   for(i = 0 ; i < nequiv ; ++i)
                    163:        {
                    164:        p = & eqvclass[i];
                    165:        if(p->eqvbottom!=0 || p->eqvtop!=0)     /* a live chain */
                    166:                {
                    167:                for(q = p->equivs ; q; q = q->eqvnextp)
                    168:                        {
                    169:                        np = q->eqvitem.eqvname;
                    170:                        np->voffset -= p->eqvbottom;
                    171:                        if(np->voffset % typealign[np->vtype] != 0)
                    172:                                dclerr("bad alignment forced by equivalence", np);
                    173:                        }
                    174:                p->eqvtop -= p->eqvbottom;
                    175:                p->eqvbottom = 0;
                    176:                }
                    177:        freqchain(p);
                    178:        }
                    179: }
                    180: 
                    181: 
                    182: 
                    183: 
                    184: 
                    185: /* put equivalence chain p at common block comno + comoffset */
                    186: 
                    187: LOCAL eqvcommon(p, comno, comoffset)
                    188: struct Equivblock *p;
                    189: int comno;
                    190: ftnint comoffset;
                    191: {
                    192: int ovarno;
                    193: ftnint k, offq;
                    194: register Namep np;
                    195: register struct Eqvchain *q;
                    196: 
                    197: if(comoffset + p->eqvbottom < 0)
                    198:        {
                    199:        errstr("attempt to extend common %s backward",
                    200:                nounder(XL, extsymtab[comno].extname) );
                    201:        freqchain(p);
                    202:        return;
                    203:        }
                    204: 
                    205: if( (k = comoffset + p->eqvtop) > extsymtab[comno].extleng)
                    206:        extsymtab[comno].extleng = k;
                    207: 
                    208: #ifdef SDB
                    209: if(sdbflag)
                    210:        prstab( varstr(XL,extsymtab[comno].extname), N_BCOMM,0,0);
                    211: #endif
                    212: 
                    213: for(q = p->equivs ; q ; q = q->eqvnextp)
                    214:        if(np = q->eqvitem.eqvname)
                    215:                {
                    216:                switch(np->vstg)
                    217:                        {
                    218:                        case STGUNKNOWN:
                    219:                        case STGBSS:
                    220:                                np->vstg = STGCOMMON;
                    221:                                np->vardesc.varno = comno;
                    222:                                np->voffset = comoffset - q->eqvoffset;
                    223: #ifdef SDB
                    224:                                if(sdbflag)
                    225:                                        {
                    226:                                        namestab(np);
                    227:                                        }
                    228: #endif
                    229:                                break;
                    230: 
                    231:                        case STGEQUIV:
                    232:                                ovarno = np->vardesc.varno;
                    233:                                offq = comoffset - q->eqvoffset - np->voffset;
                    234:                                np->vstg = STGCOMMON;
                    235:                                np->vardesc.varno = comno;
                    236:                                np->voffset = comoffset + q->eqvoffset;
                    237:                                if(ovarno != (p - eqvclass))
                    238:                                        eqvcommon(&eqvclass[ovarno], comno, offq);
                    239: #ifdef SDB
                    240:                                if(sdbflag)
                    241:                                        {
                    242:                                        namestab(np);
                    243:                                        }
                    244: #endif
                    245:                                break;
                    246: 
                    247:                        case STGCOMMON:
                    248:                                if(comno != np->vardesc.varno ||
                    249:                                   comoffset != np->voffset+q->eqvoffset)
                    250:                                        dclerr("inconsistent common usage", np);
                    251:                                break;
                    252: 
                    253: 
                    254:                        default:
                    255:                                badstg("eqvcommon", np->vstg);
                    256:                        }
                    257:                }
                    258: 
                    259: #ifdef SDB
                    260: if(sdbflag)
                    261:        prstab( varstr(XL,extsymtab[comno].extname), N_ECOMM,0,0);
                    262: #endif
                    263: 
                    264: freqchain(p);
                    265: p->eqvbottom = p->eqvtop = 0;
                    266: }
                    267: 
                    268: 
                    269: /* put all items on ovarno chain on front of nvarno chain
                    270:  * adjust offsets of ovarno elements and top and bottom of nvarno chain
                    271:  */
                    272: 
                    273: LOCAL eqveqv(nvarno, ovarno, delta)
                    274: int ovarno, nvarno;
                    275: ftnint delta;
                    276: {
                    277: register struct Equivblock *p0, *p;
                    278: register Namep np;
                    279: struct Eqvchain *q, *q1;
                    280: 
                    281: p0 = eqvclass + nvarno;
                    282: p = eqvclass + ovarno;
                    283: p0->eqvbottom = lmin(p0->eqvbottom, p->eqvbottom - delta);
                    284: p0->eqvtop = lmax(p0->eqvtop, p->eqvtop - delta);
                    285: p->eqvbottom = p->eqvtop = 0;
                    286: 
                    287: for(q = p->equivs ; q ; q = q1)
                    288:        {
                    289:        q1 = q->eqvnextp;
                    290:        if( (np = q->eqvitem.eqvname) && np->vardesc.varno==ovarno)
                    291:                {
                    292:                q->eqvnextp = p0->equivs;
                    293:                p0->equivs = q;
                    294:                q->eqvoffset -= delta;
                    295:                np->vardesc.varno = nvarno;
                    296:                np->voffset -= delta;
                    297:                }
                    298:        else    free( (charptr) q);
                    299:        }
                    300: p->equivs = NULL;
                    301: }
                    302: 
                    303: 
                    304: 
                    305: 
                    306: LOCAL freqchain(p)
                    307: register struct Equivblock *p;
                    308: {
                    309: register struct Eqvchain *q, *oq;
                    310: 
                    311: for(q = p->equivs ; q ; q = oq)
                    312:        {
                    313:        oq = q->eqvnextp;
                    314:        free( (charptr) q);
                    315:        }
                    316: p->equivs = NULL;
                    317: }
                    318: 
                    319: 
                    320: 
                    321: 
                    322: 
                    323: LOCAL nsubs(p)
                    324: register struct Listblock *p;
                    325: {
                    326: register int n;
                    327: register chainp q;
                    328: 
                    329: n = 0;
                    330: if(p)
                    331:        for(q = p->listp ; q ; q = q->nextp)
                    332:                ++n;
                    333: 
                    334: return(n);
                    335: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.