Annotation of researchv9/jerq/sgs/ld/expr1.c, revision 1.1

1.1     ! root        1: static char ID[] = "@(#) expr1.c: 1.3 3/13/83";
        !             2: #include "system.h"
        !             3: 
        !             4: #include <stdio.h>
        !             5: #include "structs.h"
        !             6: #include "extrns.h"
        !             7: #include "sgsmacros.h"
        !             8: #include "y.tab.h"
        !             9: #include "ldmacros.h"
        !            10: 
        !            11: static int expsect;
        !            12: /*eject*/
        !            13: long
        !            14: eval(p)
        !            15: ENODE *p;
        !            16: {
        !            17: 
        !            18: /*
        !            19:  * Evaluate an expression node, returning the (long) value of the
        !            20:  * expression.
        !            21:  *
        !            22:  * The extern variable "cur_dot" is used when processing exprs
        !            23:  * inside of an output section specification, and is set to
        !            24:  * -1L after allocation, when all sections have been relocated.
        !            25:  */
        !            26: 
        !            27:        long val1, val2;
        !            28:        SYMTAB *symp;
        !            29:        OUTSECT *s;
        !            30: 
        !            31:        switch (p->gnode.exop) {
        !            32:        case INT:
        !            33:                return( p->vnode.exvalue );
        !            34:        case DOT:
        !            35:                /*
        !            36:                 * Assign to DOT, if not a misuse of the assignment
        !            37:                 */
        !            38:                if( p->nnode.exsymptr == 0L ) {
        !            39:                        if( cur_dot == -1L ) {
        !            40:                                lderror(1, curexp->evexpr.aiinlnno, curexp->evexpr.aiinflnm,
        !            41:                                        "misuse of DOT symbol in assignment instruction");
        !            42:                                return (0L);
        !            43:                                }
        !            44:                        return(cur_dot);
        !            45:                        }
        !            46:                else {
        !            47:                        /*
        !            48:                         * Use of dot in assign to symbol
        !            49:                         */
        !            50:                        symp = getsym(p->nnode.exsymptr);
        !            51:                        s = (OUTSECT *) symp->smscnptr;
        !            52:                        val1 = symp->sment.n_value + s->oshdr.s_paddr;
        !            53:                        if ( expsect == 0 )
        !            54:                                expsect = s->ossecnum;
        !            55:                        PUTSYM(symp, 0);
        !            56:                        return (val1);
        !            57:                        }
        !            58:        case NAME:
        !            59:                symp = getsym(p->nnode.exsymptr);
        !            60:                val1 = symp->smnewval;
        !            61:                if (symp->sment.n_scnum > 0) {
        !            62:                        if(expsect == 0)
        !            63:                                expsect = symp->sment.n_scnum;
        !            64:                        else
        !            65:                                expsect = -1;
        !            66:                        }
        !            67:                else if( symp->sment.n_scnum == 0 )
        !            68:                        lderror(1, curexp->evexpr.aiinlnno, curexp->evexpr.aiinflnm,
        !            69:                                "undefined symbol in expression");
        !            70:                PUTSYM(symp, 0);
        !            71:                return (val1);
        !            72:        case ALIGN:
        !            73:                if( cur_dot == -1L ) {
        !            74:                        lderror(1, curexp->evexpr.aiinlnno, curexp->evexpr.aiinflnm,
        !            75:                                "ALIGN illegal in this context");
        !            76:                return(0L);
        !            77:                }
        !            78:                val2 = eval(p->gnode.exleft);
        !            79:                val1 = (cur_dot + val2 - 1) & (~(val2-1));
        !            80:                return(val1);
        !            81: 
        !            82:        case PHY:
        !            83:                /*
        !            84:                 * If (cur_dot != -1L) here, then eval() was
        !            85:                 * called from pboslist(), which is processing
        !            86:                 * the output section list.  Moreover, we have
        !            87:                 * an assignment to DOT, because eval() is not
        !            88:                 * called otherwise.  The statement is
        !            89:                 *      . = ... PHY(...) ...
        !            90:                 * which is invalid.
        !            91:                 */
        !            92:                if( cur_dot != -1L ) {
        !            93:                        lderror(1, curexp->evexpr.aiinlnno,
        !            94:                                curexp->evexpr.aiinflnm,
        !            95:                                "illegal assignment of physical address to DOT");
        !            96:                        return (0L);
        !            97:                        }
        !            98:                expsect = -1;
        !            99:                switch( p->gnode.exleft->gnode.exop ) {
        !           100:                case NAME:
        !           101:                        symp = getsym(p->gnode.exleft->nnode.exsymptr);
        !           102:                        val1 = symp->smnewval;
        !           103:                        if ( symp->smscnptr == NULL ) {
        !           104:                                switch ( symp->sment.n_scnum ) {
        !           105:                                case -1 :       /* absolute */
        !           106:                                        lderror(1, curexp->evexpr.aiinlnno, curexp->evexpr.aiinflnm,
        !           107:                                                "phy of absolute symbol %s is illegal",
        !           108:                                                SYMNAME(symp->sment));
        !           109:                                        break;
        !           110:                                case 0 :        /* undefined */
        !           111:                                        lderror(1, curexp->evexpr.aiinlnno, curexp->evexpr.aiinflnm,
        !           112:                                                "symbol %s is undefined",
        !           113:                                                SYMNAME(symp->sment));
        !           114:                                        break;
        !           115:                                }
        !           116:                                }
        !           117:                        PUTSYM(symp, 0);
        !           118:                        return ( val1 );
        !           119:                case DOT:
        !           120:                        if( p->gnode.exleft->nnode.exsymptr == 0L ) {
        !           121:                                lderror(1,curexp->evexpr.aiinlnno,
        !           122:                                        curexp->evexpr.aiinflnm,
        !           123:                                        "internal error: no symtab entry for DOT");
        !           124:                                return (0L);
        !           125:                                }
        !           126:                        symp = getsym(p->gnode.exleft->nnode.exsymptr);
        !           127:                        val1 = symp->sment.n_value;
        !           128:                        val1 += ((OUTSECT *) symp->smscnptr)->oshdr.s_paddr;
        !           129: 
        !           130:                        PUTSYM(symp, 0);
        !           131:                        return ( val1 );
        !           132:                default:
        !           133:                        lderror(1, curexp->evexpr.aiinlnno, curexp->evexpr.aiinflnm,
        !           134:                                "operand of PHY must be a name");
        !           135:                        return(0L);
        !           136:                }
        !           137: 
        !           138: 
        !           139:        case UMINUS:    val1 = eval(p->gnode.exleft);
        !           140:                        return(-val1);
        !           141:        case NOT:       val1 = eval(p->gnode.exleft);
        !           142:                        return(!val1);
        !           143:        case BNOT:      val1 = eval(p->gnode.exleft);
        !           144:                        return(~val1);
        !           145:        case AND:       val1 = eval(p->gnode.exleft);
        !           146:                        val2 = eval(p->gnode.exright);
        !           147:                        return(val1 & val2);
        !           148:        case ANDAND:    val1 = eval(p->gnode.exleft);
        !           149:                        val2 = eval(p->gnode.exright);
        !           150:                        return(val1 && val2);
        !           151:        case DIV:       val1 = eval(p->gnode.exleft);
        !           152:                        val2 = eval(p->gnode.exright);
        !           153:                        return(val1 / val2);
        !           154:        case EQEQ:      val1 = eval(p->gnode.exleft);
        !           155:                        val2 = eval(p->gnode.exright);
        !           156:                        return(val1 == val2);
        !           157:        case GE:        val1 = eval(p->gnode.exleft);
        !           158:                        val2 = eval(p->gnode.exright);
        !           159:                        return(val1 >= val2);
        !           160:        case GT:        val1 = eval(p->gnode.exleft);
        !           161:                        val2 = eval(p->gnode.exright);
        !           162:                        return(val1 > val2);
        !           163:        case LE:        val1 = eval(p->gnode.exleft);
        !           164:                        val2 = eval(p->gnode.exright);
        !           165:                        return(val1 <= val2);
        !           166:        case LSHIFT:    val1 = eval(p->gnode.exleft);
        !           167:                        val2 = eval(p->gnode.exright);
        !           168:                        return(val1 << val2);
        !           169:        case LT:        val1 = eval(p->gnode.exleft);
        !           170:                        val2 = eval(p->gnode.exright);
        !           171:                        return(val1 < val2);
        !           172:        case MINUS:     val1 = eval(p->gnode.exleft);
        !           173:                        val2 = eval(p->gnode.exright);
        !           174:                        return(val1 - val2);
        !           175:        case MULT:      val1 = eval(p->gnode.exleft);
        !           176:                        val2 = eval(p->gnode.exright);
        !           177:                        return(val1 * val2);
        !           178:        case NE:        val1 = eval(p->gnode.exleft);
        !           179:                        val2 = eval(p->gnode.exright);
        !           180:                        return(val1 != val2);
        !           181:        case OR:        val1 = eval(p->gnode.exleft);
        !           182:                        val2 = eval(p->gnode.exright);
        !           183:                        return(val1 | val2);
        !           184:        case OROR:      val1 = eval(p->gnode.exleft);
        !           185:                        val2 = eval(p->gnode.exright);
        !           186:                        return(val1 || val2);
        !           187:        case PC:        val1 = eval(p->gnode.exleft);
        !           188:                        val2 = eval(p->gnode.exright);
        !           189:                        return(val1 % val2);
        !           190:        case PLUS:      val1 = eval(p->gnode.exleft);
        !           191:                        val2 = eval(p->gnode.exright);
        !           192:                        return(val1 + val2);
        !           193:        case RSHIFT:    val1 = eval(p->gnode.exleft);
        !           194:                        val2 = eval(p->gnode.exright);
        !           195:                        return(val1 >> val2);
        !           196: 
        !           197:        default:
        !           198:                lderror(1, curexp->evexpr.aiinlnno, curexp->evexpr.aiinflnm,
        !           199:                        "illegal operator in expression");
        !           200:                return(0L);
        !           201:        }
        !           202: }
        !           203: /*eject*/
        !           204: pexlist()
        !           205: {
        !           206: 
        !           207: /*
        !           208:  * After allocation, process the "expression list"
        !           209:  * to define any user-specified symbols.
        !           210:  */
        !           211: 
        !           212: #if !ONEPROC
        !           213:        ACTITEM a;
        !           214: #endif
        !           215: 
        !           216:        cur_dot = -1L;
        !           217:        curexp = (ACTITEM *) explist.head;
        !           218: 
        !           219:        while( curexp ) {
        !           220: 
        !           221:                pexitem();
        !           222: 
        !           223:                clrexp( curexp );
        !           224: 
        !           225:                curexp = curexp->evexpr.ainext;
        !           226: 
        !           227:                }
        !           228: 
        !           229: #if DEBUG
        !           230:        if( dflag > 2 )
        !           231:                fprintf( stderr, "\nEXPLIST data structures:" );
        !           232: #endif
        !           233: #if !ONEPROC
        !           234:        while( expcnt-- ) {
        !           235: 
        !           236:                fread( &a, 1, sizeof(ACTITEM), trnfdes );
        !           237:                a.evexpr.aiinflnm = (char *) ((int) a.evexpr.aiinflnm + (int) strbase);
        !           238: 
        !           239: #if DEBUG
        !           240:                if( dflag > 2 )
        !           241:                        fprintf( stderr, "\n\t%04x AIEVEXPR (%s) %d %04x\n\t\tROOT:",
        !           242:                                a.evexpr.ainext, a.evexpr.aiinflnm,
        !           243:                                a.evexpr.aiinlnno, a.evexpr.aiexptr );
        !           244: #endif
        !           245: 
        !           246:                curexp = ldexp( &a );
        !           247: 
        !           248:                pexitem();
        !           249: 
        !           250:                clrexp( curexp );
        !           251: 
        !           252:                }
        !           253: #endif
        !           254: }
        !           255: /*eject*/
        !           256: pexitem()
        !           257: {
        !           258: 
        !           259: /*
        !           260:  * Process one assignment instruction
        !           261:  */
        !           262: 
        !           263:        long val;
        !           264:        register SYMTAB *sp;
        !           265:        register OUTSECT *oscn;
        !           266: 
        !           267:        expsect = 0;
        !           268:        val = eval(curexp->evexpr.aiexptr->gnode.exright);
        !           269:        sp = getsym(curexp->evexpr.aiexptr->gnode.exleft->nnode.exsymptr);
        !           270: 
        !           271: /*
        !           272:  * If the section number of the symbol we
        !           273:  * are assigning a value is not zero ( = undefined),
        !           274:  * the user is redefining the value of the symbol.
        !           275:  */
        !           276: 
        !           277:        if( sp->sment.n_scnum )
        !           278:                if( sp->smscnptr )
        !           279:                        lderror(0, curexp->evexpr.aiinlnno, curexp->evexpr.aiinflnm,
        !           280:                                "symbol %s from file %s being redefined",
        !           281:                                SYMNAME(sp->sment), sp->smscnptr->isfilptr->flname);
        !           282:                else
        !           283:                        lderror(0, curexp->evexpr.aiinlnno, curexp->evexpr.aiinflnm,
        !           284:                                "absolute symbol %s being redefined",
        !           285:                                SYMNAME(sp->sment));
        !           286: 
        !           287:        if( expsect == 0 )
        !           288:                sp->sment.n_scnum = -1;         /* absolute symbol */
        !           289:        else
        !           290:                sp->sment.n_scnum = expsect;
        !           291: 
        !           292:        if( (oscn = findoscn(sp->sment.n_scnum)) != NULL )
        !           293:                sp->smnewvirt = val - oscn->oshdr.s_paddr + oscn->oshdr.s_vaddr;
        !           294:        else
        !           295:                sp->smnewvirt = val;
        !           296:        sp->smnewval = val;
        !           297:        sp->sment.n_sclass = C_EXT;
        !           298:        PUTSYM(sp, 1);
        !           299: 
        !           300: }
        !           301: /*eject*/
        !           302: #if !ONEPROC
        !           303: ACTITEM *
        !           304: ldexp(a)
        !           305: ACTITEM *a;
        !           306: {
        !           307: 
        !           308: /*
        !           309:  * Load an assignment instruction from the "transfer file" generated
        !           310:  * by PASS 1, into memory
        !           311:  *
        !           312:  * "a" is the action item which heads the expression tree
        !           313:  *
        !           314:  * Return a pointer to a separate copy of this action item
        !           315:  */
        !           316: 
        !           317:        register ACTITEM *aptr;
        !           318:        register ENODE   *eptr;
        !           319:        ENODE *ldlimb();
        !           320: 
        !           321:        aptr = (ACTITEM *) myalloc(sizeof(ACTITEM));
        !           322:        *aptr = *a;
        !           323: 
        !           324:        eptr = (ENODE *) myalloc(sizeof(ENODE));
        !           325:        fread( eptr, 1, sizeof(ENODE), trnfdes );
        !           326: 
        !           327: #if DEBUG
        !           328:        if( dflag > 2 )
        !           329:                fprintf( stderr, "\t%d %04x %04x", (unsigned) eptr->gnode.exop,
        !           330:                        eptr->gnode.exleft, eptr->gnode.exright );
        !           331: #endif
        !           332: 
        !           333:        if( eptr->gnode.exleft )
        !           334:                eptr->gnode.exleft = ldlimb();
        !           335:        if( eptr->gnode.exright )
        !           336:                eptr->gnode.exright = ldlimb();
        !           337: 
        !           338:        aptr->evexpr.ainext = NULL;
        !           339:        aptr->evexpr.aiexptr = eptr;
        !           340: 
        !           341:        return( aptr );
        !           342: }
        !           343: /*eject*/
        !           344: ENODE *
        !           345: ldlimb()
        !           346: {
        !           347: 
        !           348: /*
        !           349:  * Load a non-root node of an expression tree into memory
        !           350:  */
        !           351: 
        !           352:        register ENODE *eptr;
        !           353:        SYMENT sym;
        !           354: 
        !           355:        eptr = (ENODE *) myalloc(sizeof(ENODE));
        !           356:        fread( eptr, 1, sizeof(ENODE), trnfdes );
        !           357: 
        !           358:        switch( (unsigned) eptr->gnode.exop ) {
        !           359:        case INT:
        !           360: #if DEBUG
        !           361:                if( dflag > 2 )
        !           362:                        fprintf( stderr, "\n\t\t\tINT %08lx", eptr->vnode.exvalue );
        !           363: #endif
        !           364:                break;
        !           365:        case DOT:
        !           366: #if DEBUG
        !           367:                if( dflag > 2 )
        !           368:                        fprintf( stderr, "\n\t\t\tDOT ()" );
        !           369: #endif
        !           370:                break;
        !           371:        case NAME:
        !           372: #if DEBUG
        !           373:                if( dflag > 2 )
        !           374:                        fprintf( stderr, "\n\t\t\tNAME (%s)",
        !           375:                                eptr->pnnode.symbol );
        !           376: #endif
        !           377:                zero( (char *) &sym, SYMESZ );
        !           378: #if FLEXNAMES
        !           379:                if (strlen(eptr->pnnode.symbol) > 8) {
        !           380:                        sym.n_zeroes = 0L;
        !           381:                        sym.n_nptr = eptr->pnnode.symbol;
        !           382:                        }
        !           383:                else
        !           384: #endif
        !           385:                        copy( sym.n_name, eptr->pnnode.symbol, 8);
        !           386:                sym.n_type = T_INT;
        !           387:                sym.n_sclass = C_EXT;
        !           388:                eptr->nnode.exsymptr = putsym( makesym(&sym), 1 );
        !           389:                break;
        !           390:        default:
        !           391: #if DEBUG
        !           392:                if( dflag > 2 )
        !           393:                        fprintf( stderr, "\n\t\t\t%d %04x %04x", (unsigned) eptr->gnode.exop,
        !           394:                                eptr->gnode.exleft, eptr->gnode.exright );
        !           395: #endif
        !           396:                if( eptr->gnode.exleft )
        !           397:                        eptr->gnode.exleft = ldlimb();
        !           398:                if( eptr->gnode.exright )
        !           399:                        eptr->gnode.exright = ldlimb();
        !           400:                break;
        !           401:        }
        !           402: 
        !           403:        return( eptr );
        !           404: }
        !           405: /*eject*/
        !           406: #endif
        !           407: clrexp(a)
        !           408: ACTITEM *a;
        !           409: {
        !           410: 
        !           411: /*
        !           412:  * Free up all memory assigned to the assignment instruction pointed
        !           413:  * to by "a"
        !           414:  */
        !           415:        ENODE *eptr;
        !           416: 
        !           417:        eptr = a->evexpr.aiexptr;
        !           418: 
        !           419:        switch( (unsigned) eptr->gnode.exop ) {
        !           420:        case INT:
        !           421:        case DOT:
        !           422:        case NAME:
        !           423:                break;
        !           424:        default:
        !           425:                if( eptr->gnode.exleft )
        !           426:                        clrlimb(eptr->gnode.exleft);
        !           427:                if( eptr->gnode.exright )
        !           428:                        clrlimb(eptr->gnode.exright);
        !           429:                break;
        !           430:        }
        !           431: 
        !           432:        free( eptr );
        !           433:        free( a );
        !           434: }
        !           435: 
        !           436: 
        !           437: 
        !           438: 
        !           439: clrlimb(eptr)
        !           440: ENODE *eptr;
        !           441: {
        !           442: 
        !           443: /*
        !           444:  * Free up a non-root node of an expression tree
        !           445:  */
        !           446: 
        !           447:        switch( (unsigned) eptr->gnode.exop ) {
        !           448:        case INT:
        !           449:        case DOT:
        !           450:        case NAME:
        !           451:                break;
        !           452:        default:
        !           453:                if( eptr->gnode.exleft )
        !           454:                        clrlimb(eptr->gnode.exleft);
        !           455:                if( eptr->gnode.exright )
        !           456:                        clrlimb(eptr->gnode.exright);
        !           457:                break;
        !           458:        }
        !           459: 
        !           460:        free( eptr );
        !           461: }

unix.superglobalmegacorp.com

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