Annotation of researchv8dc/cmd/f77/equiv.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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