Annotation of researchv9/cmd/sun/mip/common, revision 1.1.1.1

1.1       root        1: /*     @(#)common 1.1 86/02/03 SMI     */
                      2: 
                      3: #ifdef FORT
                      4: #undef BUFSTDERR
                      5: #endif
                      6: #ifndef ONEPASS
                      7: #undef BUFSTDERR
                      8: #endif
                      9: # ifndef EXIT
                     10: # define EXIT exit
                     11: # endif
                     12: 
                     13: int nerrors = 0;  /* number of errors */
                     14: int errline = -1; /* where last error took place */
                     15: 
                     16: extern unsigned int offsz;
                     17: 
                     18: unsigned caloff(){
                     19:        register i;
                     20:        unsigned int temp;
                     21:        unsigned int off;
                     22:        temp = 1;
                     23:        i = 0;
                     24:        do {
                     25:                temp <<= 1;
                     26:                ++i;
                     27:                } while( temp > 0 );
                     28:        off = 1 << (i-1);
                     29:        return (off);
                     30:        }
                     31: 
                     32:        /* VARARGS1 */
                     33: uerror( s, a ) char *s; { /* nonfatal error message */
                     34:        /* the routine where is different for pass 1 and pass 2;
                     35:        /*  it tells where the error took place */
                     36: 
                     37:        fflush( stdout );
                     38:        ++nerrors;
                     39:        errline = lineno;
                     40:        where('u');
                     41:        fprintf( stderr, s, a );
                     42:        fprintf( stderr, "\n" );
                     43: #ifdef BUFSTDERR
                     44:        fflush(stderr);
                     45: #endif
                     46:        if( nerrors > 30 ) fatal( "too many errors");
                     47:        }
                     48: 
                     49:        /* VARARGS1 */
                     50: cerror( s, a, b, c ) char *s; { /* compiler error: die */
                     51:        fflush( stdout );
                     52:        where('c');
                     53:        if( nerrors && nerrors <= 30 ){ /* give the compiler the benefit of the doubt */
                     54:                fprintf( stderr, "cannot recover from earlier errors: goodbye!\n" );
                     55:                }
                     56:        else {
                     57:                fprintf( stderr, "compiler error: " );
                     58:                fprintf( stderr, s, a, b, c );
                     59:                fprintf( stderr, "\n" );
                     60:                }
                     61: #ifdef BUFSTDERR
                     62:        fflush(stderr);
                     63: #endif
                     64:        EXIT(1);
                     65:        }
                     66: 
                     67: fatal( s, a, b, c ) char *s; { /* non-compiler but fatal error: die */
                     68:        fflush( stdout );
                     69:        where('f');
                     70:        fprintf( stderr, "fatal error: " );
                     71:        fprintf( stderr, s, a, b, c );
                     72:        fprintf( stderr, "\n" );
                     73: #ifdef BUFSTDERR
                     74:        fflush(stderr);
                     75: #endif
                     76:        EXIT(1);
                     77:        }
                     78: int Wflag = 0; /* Non-zero means do not print warnings */
                     79: 
                     80:        /* VARARGS1 */
                     81: werror( s, a, b ) char *s; {  /* warning */
                     82:        if(Wflag) return;
                     83:        fflush( stdout );
                     84:        where('w');
                     85:        fprintf( stderr, "warning: " );
                     86:        fprintf( stderr, s, a, b );
                     87:        fprintf( stderr, "\n" );
                     88: #ifdef BUFSTDERR
                     89:        fflush(stderr);
                     90: #endif
                     91:        }
                     92: 
                     93: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
                     94: 
                     95: #ifdef TESTALLOC
                     96: /*
                     97:  * this enables us to test 
                     98:  * tree allocation without having
                     99:  * to construct bizarre test programs
                    100:  */
                    101: #undef TREESZ
                    102: #define TREESZ 16
                    103: #endif TESTALLOC
                    104: 
                    105: #define        MAXTSEG 64                              /* max # of tree segments */
                    106: static NODE    treespace[TREESZ];              /* initial tree space */
                    107: static NODE    *treeseg[MAXTSEG] = {treespace};/* table of seg pointers */
                    108: static NODE    **activeseg = &treeseg[0];      /* ptr to active seg slot */
                    109: static NODE    *node = treespace;              /* ptr to active segment */
                    110: static NODE    *nextfree = treespace;          /* ptr to next free node */
                    111: static int     nsegs = 1;                      /* # of allocated segments */
                    112: static int     recycling = 0;                  /* =1 if using old nodes */
                    113: 
                    114: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
                    115: 
                    116: static NODE *
                    117: tsegalloc()
                    118: {
                    119:        NODE *newseg;
                    120:        if ( activeseg == &treeseg[nsegs-1] ) {
                    121:                /*
                    122:                 * no unused segments; allocate a new one
                    123:                 */
                    124:                if (nsegs == MAXTSEG) {
                    125:                        cerror("out of tree space; try simplifying");
                    126:                        /*NOTREACHED*/
                    127:                }
                    128:                newseg = (NODE *)malloc(TREESZ*sizeof(NODE));
                    129:                *++activeseg = newseg;
                    130:                nsegs++;
                    131:        } else {
                    132:                /*
                    133:                 * segment already allocated; use it
                    134:                 */
                    135:                newseg = *++activeseg;
                    136:                if (newseg == NIL) {
                    137:                        cerror("tree space allocation");
                    138:                        /*NOTREACHED*/
                    139:                }
                    140:        }
                    141:        return newseg;
                    142: }
                    143: 
                    144: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
                    145: 
                    146: tinit()
                    147: {
                    148:        /* initialize tree space allocation */
                    149:        activeseg = &treeseg[0];        /* ptr to active seg slot */
                    150:        node = *activeseg;              /* ptr to active segment */
                    151:        nextfree = node;                /* ptr to next free node */
                    152:        recycling = 0;
                    153: }
                    154: 
                    155: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
                    156: 
                    157: #define TNEXT(p) (p == &node[TREESZ]? node : p+1)
                    158:  
                    159: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
                    160: 
                    161: NODE *
                    162: talloc()
                    163: {
                    164:        register NODE *p, *q;
                    165:        static NODE *lastfrag;
                    166: 
                    167:        if ( nextfree < &node[TREESZ] )
                    168:                return nextfree++;
                    169:        if ( !recycling ) {
                    170:                recycling = 1;
                    171:                lastfrag = node;
                    172:        }
                    173:        q = lastfrag;
                    174:        for( p = TNEXT(q); p != q; p = TNEXT(p) ) {
                    175:                if (p->tn.op == FREE) {
                    176:                        return lastfrag = p;
                    177:                }
                    178:        }
                    179:        /*
                    180:         * current tree space segment is full;
                    181:         * get a new one.
                    182:         */
                    183:        nextfree = node = tsegalloc();
                    184:        recycling = 0;
                    185:        return nextfree++;
                    186: }
                    187: 
                    188: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
                    189: 
                    190: tcheck()
                    191: {
                    192:        /*
                    193:         * ensure that all nodes have been freed.  Note that in the
                    194:         * C compiler, some nodes remain active until the end of the
                    195:         * current function, so this should not be called until then.
                    196:         * In the backend-only configuration (fort) this is called
                    197:         * on a statement-by-statement basis.
                    198:         */
                    199: 
                    200:        register NODE *p;
                    201:        register NODE *limit;
                    202:        NODE **seg;
                    203: 
                    204:        if( !nerrors ) {
                    205:                /*
                    206:                 * all segments below the top one must be scanned
                    207:                 * from beginning to end.  The top one need only
                    208:                 * be scanned up to the high-water mark (nextfree)
                    209:                 */
                    210:                for( seg = &treeseg[0]; seg < activeseg; seg++ ) {
                    211:                        limit = *seg + TREESZ;
                    212:                        for (p = *seg; p < limit; p++ ) {
                    213:                                if( p->in.op != FREE ) {
                    214:                                        cerror( "wasted space: %#x", p );
                    215:                                }
                    216:                        }
                    217:                }       
                    218:                limit = nextfree;
                    219:                for( p=node; p < limit; ++p ) {
                    220:                        if( p->in.op != FREE ) {
                    221:                                cerror( "wasted space: %#x", p );
                    222:                        }
                    223:                }
                    224:        }
                    225:        tinit();
                    226: #ifdef FLEXNAMES
                    227:        freetstr();
                    228: #endif
                    229: }
                    230: 
                    231: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
                    232: 
                    233: tfree(p)
                    234:        register NODE *p;
                    235: {
                    236:        if (p == NIL)
                    237:                return;
                    238: again:
                    239:        switch(optype(p->in.op)) {
                    240:        case UTYPE:
                    241:                tfree(p->in.left);
                    242:                /*fall through*/
                    243:        case LTYPE:
                    244:                p->in.op = FREE;
                    245:                return;
                    246:        case BITYPE:
                    247:                tfree(p->in.left);
                    248:                p->in.op = FREE;
                    249:                p = p->in.right;
                    250:                goto again;
                    251:        }
                    252: }
                    253: 
                    254: fwalk( t, f, down ) register NODE *t; int (*f)(); {
                    255: 
                    256:        int down1, down2;
                    257: 
                    258:        more:
                    259:        down1 = down2 = 0;
                    260: 
                    261:        (*f)( t, down, &down1, &down2 );
                    262: 
                    263:        switch( optype( t->in.op ) ){
                    264: 
                    265:        case BITYPE:
                    266:                fwalk( t->in.left, f, down1 );
                    267:                t = t->in.right;
                    268:                down = down2;
                    269:                goto more;
                    270: 
                    271:        case UTYPE:
                    272:                t = t->in.left;
                    273:                down = down1;
                    274:                goto more;
                    275: 
                    276:                }
                    277:        }
                    278: 
                    279: walkf( t, f )
                    280:        register NODE *t;
                    281:        int (*f)();
                    282: {
                    283:        switch(optype(t->in.op)) {
                    284:        case LTYPE:
                    285:                break;
                    286:        case UTYPE:
                    287:                walkf(t->in.left, f);
                    288:                break;
                    289:        default:
                    290:                walkf(t->in.left, f);
                    291:                walkf(t->in.right, f);
                    292:                break;
                    293:        }
                    294:        (*f)( t );
                    295: }
                    296: 
                    297: int dope[ DSIZE ];
                    298: char *opst[DSIZE];
                    299: 
                    300: struct dopest { int dopeop; char opst[8]; int dopeval; } indope[] = {
                    301: 
                    302:        NAME, "NAME", LTYPE,
                    303:        STRING, "STRING", LTYPE,
                    304:        REG, "REG", LTYPE,
                    305:        OREG, "OREG", LTYPE,
                    306:        ICON, "ICON", LTYPE,
                    307:        FCON, "FCON", LTYPE,
                    308:        FCCODES, "FCCODES", LTYPE,
                    309:        CCODES, "CCODES", LTYPE,
                    310:        UNARY MINUS, "U-", UTYPE,
                    311:        UNARY MUL, "U*", UTYPE,
                    312:        UNARY AND, "U&", UTYPE,
                    313:        UNARY CALL, "UCALL", UTYPE|CALLFLG,
                    314:        UNARY FORTCALL, "UFCALL", UTYPE|CALLFLG,
                    315:        NOT, "!", UTYPE|LOGFLG,
                    316:        COMPL, "~", UTYPE,
                    317:        FORCE, "FORCE", UTYPE,
                    318:        INIT, "INIT", UTYPE,
                    319:        SCONV, "SCONV", UTYPE,
                    320:        PCONV, "PCONV", UTYPE,
                    321:        PLUS, "+", BITYPE|FLOFLG|SIMPFLG|COMMFLG,
                    322:        ASG PLUS, "+=", BITYPE|ASGFLG|ASGOPFLG|FLOFLG|SIMPFLG|COMMFLG,
                    323:        MINUS, "-", BITYPE|FLOFLG|SIMPFLG,
                    324:        ASG MINUS, "-=", BITYPE|FLOFLG|SIMPFLG|ASGFLG|ASGOPFLG,
                    325:        MUL, "*", BITYPE|FLOFLG|MULFLG,
                    326:        ASG MUL, "*=", BITYPE|FLOFLG|MULFLG|ASGFLG|ASGOPFLG,
                    327:        AND, "&", BITYPE|SIMPFLG|COMMFLG,
                    328:        ASG AND, "&=", BITYPE|SIMPFLG|COMMFLG|ASGFLG|ASGOPFLG,
                    329:        QUEST, "?", BITYPE,
                    330:        COLON, ":", BITYPE,
                    331:        ANDAND, "&&", BITYPE|LOGFLG,
                    332:        OROR, "||", BITYPE|LOGFLG,
                    333:        CM, ",", BITYPE,
                    334:        COMOP, ",OP", BITYPE,
                    335:        ASSIGN, "=", BITYPE|ASGFLG,
                    336:        DIV, "/", BITYPE|FLOFLG|MULFLG|DIVFLG,
                    337:        ASG DIV, "/=", BITYPE|FLOFLG|MULFLG|DIVFLG|ASGFLG|ASGOPFLG,
                    338:        MOD, "%", BITYPE|DIVFLG,
                    339:        ASG MOD, "%=", BITYPE|DIVFLG|ASGFLG|ASGOPFLG,
                    340:        LS, "<<", BITYPE|SHFFLG,
                    341:        ASG LS, "<<=", BITYPE|SHFFLG|ASGFLG|ASGOPFLG,
                    342:        RS, ">>", BITYPE|SHFFLG,
                    343:        ASG RS, ">>=", BITYPE|SHFFLG|ASGFLG|ASGOPFLG,
                    344:        OR, "|", BITYPE|COMMFLG|SIMPFLG,
                    345:        ASG OR, "|=", BITYPE|COMMFLG|SIMPFLG|ASGFLG|ASGOPFLG,
                    346: #ifdef VAX
                    347:        ER, "^", BITYPE|COMMFLG|SIMPFLG,
                    348:        ASG ER, "^=", BITYPE|COMMFLG|SIMPFLG|ASGFLG|ASGOPFLG,
                    349: #else
                    350:        ER, "^", BITYPE|COMMFLG,
                    351:        ASG ER, "^=", BITYPE|COMMFLG|ASGFLG|ASGOPFLG,
                    352: #endif
                    353:        INCR, "++", BITYPE|ASGFLG,
                    354:        DECR, "--", BITYPE|ASGFLG,
                    355:        STREF, "->", BITYPE,
                    356:        CALL, "CALL", BITYPE|CALLFLG,
                    357:        FORTCALL, "FCALL", BITYPE|CALLFLG,
                    358:        EQ, "==", BITYPE|LOGFLG,
                    359:        NE, "!=", BITYPE|LOGFLG,
                    360:        LE, "<=", BITYPE|LOGFLG,
                    361:        LT, "<", BITYPE|LOGFLG,
                    362:        GE, ">", BITYPE|LOGFLG,
                    363:        GT, ">", BITYPE|LOGFLG,
                    364:        UGT, "UGT", BITYPE|LOGFLG,
                    365:        UGE, "UGE", BITYPE|LOGFLG,
                    366:        ULT, "ULT", BITYPE|LOGFLG,
                    367:        ULE, "ULE", BITYPE|LOGFLG,
                    368:        ARS, "A>>", BITYPE,
                    369:        TYPE, "TYPE", LTYPE,
                    370:        LB, "[", BITYPE,
                    371:        CBRANCH, "CBRANCH", BITYPE,
                    372:        FLD, "FLD", UTYPE,
                    373:        PMCONV, "PMCONV", BITYPE,
                    374:        PVCONV, "PVCONV", BITYPE,
                    375:        RETURN, "RETURN", BITYPE|ASGFLG|ASGOPFLG,
                    376:        CAST, "CAST", BITYPE|ASGFLG|ASGOPFLG,
                    377:        GOTO, "GOTO", UTYPE,
                    378:        STASG, "STASG", BITYPE|ASGFLG,
                    379:        STARG, "STARG", UTYPE,
                    380:        STCALL, "STCALL", BITYPE|CALLFLG,
                    381:        UNARY STCALL, "USTCALL", UTYPE|CALLFLG,
                    382:        CHK,  "CHK",  BITYPE,
                    383:        FABS, "FABS", UTYPE|INTRFLG,
                    384:        FCOS, "FCOS", UTYPE|INTRFLG,
                    385:        FSIN, "FSIN", UTYPE|INTRFLG,
                    386:        FTAN, "FTAN", UTYPE|INTRFLG,
                    387:        FACOS, "FACOS", UTYPE|INTRFLG,
                    388:        FASIN, "FASIN", UTYPE|INTRFLG,
                    389:        FATAN, "FATAN", UTYPE|INTRFLG,
                    390:        FCOSH, "FCOSH", UTYPE|INTRFLG,
                    391:        FSINH, "FSINH", UTYPE|INTRFLG,
                    392:        FTANH, "FTANH", UTYPE|INTRFLG,
                    393:        FEXP, "FEXP", UTYPE|INTRFLG,
                    394:        F10TOX, "F10TOX", UTYPE|INTRFLG,
                    395:        F2TOX, "F2TOX", UTYPE|INTRFLG,
                    396:        FLOGN, "FLOGN", UTYPE|INTRFLG,
                    397:        FLOG10, "FLOG10", UTYPE|INTRFLG,
                    398:        FLOG2, "FLOG2", UTYPE|INTRFLG,
                    399:        FSQR, "FSQR", UTYPE|INTRFLG,
                    400:        FSQRT, "FSQRT", UTYPE|INTRFLG,
                    401:        FAINT, "FAINT", UTYPE|INTRFLG,
                    402:        FANINT, "FANINT", UTYPE|INTRFLG,
                    403:        FNINT, "FNINT", UTYPE,
                    404:        -1,     "",     0
                    405: };
                    406: 
                    407: mkdope(){
                    408:        register struct dopest *q;
                    409: 
                    410:        for( q = indope; q->dopeop >= 0; ++q ){
                    411:                dope[q->dopeop] = q->dopeval;
                    412:                opst[q->dopeop] = q->opst;
                    413:        }
                    414: }
                    415: # ifndef BUG4
                    416: tprint( t )  TWORD t; { /* output a nice description of the type of t */
                    417: 
                    418:        static char * tnames[] = {
                    419:                "undef",
                    420:                "farg",
                    421:                "char",
                    422:                "short",
                    423:                "int",
                    424:                "long",
                    425:                "float",
                    426:                "double",
                    427:                "strty",
                    428:                "unionty",
                    429:                "enumty",
                    430:                "moety",
                    431:                "uchar",
                    432:                "ushort",
                    433:                "unsigned",
                    434:                "ulong",
                    435:                "?", "?"
                    436:                };
                    437: 
                    438:        for(;; t = DECREF(t) ){
                    439: 
                    440:                if( ISPTR(t) ) printf( "PTR " );
                    441:                else if( ISFTN(t) ) printf( "FTN " );
                    442:                else if( ISARY(t) ) printf( "ARY " );
                    443:                else {
                    444:                        printf( "%s", tnames[t] );
                    445:                        return;
                    446:                        }
                    447:                }
                    448:        }
                    449: # endif
                    450: 
                    451: #ifdef FLEXNAMES
                    452: #define        NTSTRBUF        40
                    453: #define        TSTRSZ          2048
                    454: char   itstrbuf[TSTRSZ];
                    455: char   *tstrbuf[NTSTRBUF] = { itstrbuf };
                    456: char   **curtstr = tstrbuf;
                    457: int    tstrused;
                    458: 
                    459: char *
                    460: tstr(cp)
                    461:        register char *cp;
                    462: {
                    463:        register int i = strlen(cp);
                    464:        register char *dp;
                    465:        
                    466:        if (tstrused + i >= TSTRSZ) {
                    467:                if (++curtstr >= &tstrbuf[NTSTRBUF])
                    468:                        cerror("out of temporary string space");
                    469:                tstrused = 0;
                    470:                if (*curtstr == 0) {
                    471:                        dp = (char *)malloc(TSTRSZ);
                    472:                        *curtstr = dp;
                    473:                }
                    474:        }
                    475:        strcpy(dp = *curtstr+tstrused, cp);
                    476:        tstrused += i + 1;
                    477:        return (dp);
                    478: }
                    479: #endif
                    480: 
                    481: #ifdef malloc
                    482: #undef malloc
                    483: #endif malloc
                    484: 
                    485: /*
                    486:  * NOTE: malloc is defined as malloc_with_care everywhere but here.
                    487:  */
                    488: char *
                    489: malloc_with_care(nbytes)
                    490: {
                    491:        char *p;
                    492: 
                    493:        p = (char*)malloc(nbytes);
                    494:        if (p == NULL) {
                    495:                fatal("memory allocation exceeded");
                    496:                exit(1);
                    497:        }
                    498:        return(p);
                    499: }

unix.superglobalmegacorp.com

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