Annotation of researchv9/cmd/sun/mip/fort.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)fort.c 1.1 86/02/03 SMI";
                      3: #endif
                      4: 
                      5: # define FORT
                      6: /* this forces larger trees, etc. */
                      7: # include "cpass2.h"
                      8: # include "fort.h"
                      9: 
                     10: /*     masks for unpacking longs */
                     11: 
                     12: # ifndef FOP
                     13: # define FOP(x) (int)((x)&0377)
                     14: # endif
                     15: 
                     16: # ifndef VAL
                     17: # define VAL(x) (int)(((x)>>8)&0377)
                     18: # endif
                     19: 
                     20: # ifndef REST
                     21: # define REST(x) (((x)>>16)&0177777)
                     22: # endif
                     23: 
                     24: FILE * lrd;  /* for default reading routines */
                     25: 
                     26: # ifndef NOLNREAD
                     27: #ifdef FLEXNAMES
                     28: char *
                     29: lnread()
                     30: {
                     31:        char buf[BUFSIZ];
                     32:        register char *cp = buf;
                     33:        register char *limit = &buf[BUFSIZ];
                     34: 
                     35:        for (;;) {
                     36:                if (fread(cp, sizeof (long), 1, lrd) !=  1)
                     37:                        cerror("intermediate file read error");
                     38:                cp += sizeof (long);
                     39:                if (cp[-1] == 0)
                     40:                        break;
                     41:                if (cp >= limit)
                     42:                        cerror("lnread overran string buffer");
                     43:        }
                     44:        return (tstr(buf));
                     45: }
                     46: #endif FLEXNAMES
                     47: # endif NOLNREAD
                     48: 
                     49: # ifndef NOLREAD
                     50: long lread(){
                     51:        static long x;
                     52:        if( fread( (char *) &x, 4, 1, lrd ) <= 0 ) cerror( "intermediate file read error" );
                     53:        return( x );
                     54:        }
                     55: # endif
                     56: 
                     57: # ifndef NOLOPEN
                     58: lopen( s ) char *s; {
                     59:        /* if null, opens the standard input */
                     60:        if( *s ){
                     61:                lrd = fopen( s, "r" );
                     62:                if( lrd == NULL ) cerror( "cannot open intermediate file %s", s );
                     63:                }
                     64:        else  lrd = stdin;
                     65:        }
                     66: # endif
                     67: 
                     68: # ifndef NOLCREAD
                     69: lcread( cp, n ) char *cp; {
                     70:        if( n > 0 ){
                     71:                if( fread( cp, 4, n, lrd ) != n ) cerror( "intermediate file read error" );
                     72:                }
                     73:        }
                     74: # endif
                     75: 
                     76: # ifndef NOLCCOPY
                     77: lccopy( n ) register n; {
                     78:        register i;
                     79:        static char fbuf[32*4];
                     80:        if( n > 0 ){
                     81:                while ( n > 32){
                     82:                        if ( fread( fbuf, 4, 32, lrd ) !=  32)
                     83:                                cerror( "intermediate file read error" );
                     84:                        if ( fwrite( fbuf, 4, 32, stdout ) != 32 ) 
                     85:                                cerror( "output file error" );
                     86:                        n -= 32;
                     87:                        }
                     88:                if( fread( fbuf, 4, n, lrd ) != n )
                     89:                        cerror( "intermediate file read error" );
                     90:                for( i=4*n; fbuf[i-1] == '\0' && i>0; --i ) { /* VOID */ }
                     91:                if( i ) {
                     92:                        if( fwrite( fbuf, 1, i, stdout ) != i ) cerror( "output file error" );
                     93:                        }
                     94:                }
                     95:        }
                     96: # endif
                     97: 
                     98: /*     new opcode definitions */
                     99: 
                    100: # define FORTOPS 200
                    101: # define FTEXT 200
                    102: # define FEXPR 201
                    103: # define FSWITCH 202
                    104: # define FLBRAC 203
                    105: # define FRBRAC 204
                    106: # define FEOF 205
                    107: # define FARIF 206
                    108: # define LABEL 207
                    109: 
                    110: /*     code generator flags */
                    111: 
                    112: # define ENTRY_FLAG 0x1
                    113: # define CHECK_FLAG 0x2
                    114: 
                    115: /*     stack for reading nodes in postfix form */
                    116: 
                    117: # define NSTACKSZ 250
                    118: 
                    119: NODE * fstack[NSTACKSZ];
                    120: NODE ** fsp;  /* points to next free position on the stack */
                    121: 
                    122: unsigned int offsz;
                    123: unsigned int caloff();
                    124: mainp2( argc, argv ) char *argv[]; {
                    125:        int files;
                    126:        register long x;
                    127:        register NODE *p;
                    128:        int flags;
                    129: 
                    130:        offsz = caloff();
                    131:        files = p2init( argc, argv );
                    132:        tinit();
                    133: 
                    134:                
                    135:        if( files ){
                    136:                while( files < argc && argv[files][0] == '-' ) {
                    137:                        ++files;
                    138:                        }
                    139:                if( files > argc ) return( nerrors );
                    140:                lopen( argv[files] );
                    141:                }
                    142:        else lopen( "" );
                    143: 
                    144:        fsp = fstack;
                    145: 
                    146:        for(;;){
                    147:                /* read nodes, and go to work... */
                    148:                x = lread();
                    149: 
                    150:        if( xdebug ) fprintf( stderr, "op=%d, val = %d, rest = 0%o\n", FOP(x), VAL(x), (int)REST(x) );
                    151:                switch( (int)FOP(x) ){  /* switch on opcode */
                    152: 
                    153:                case 0:
                    154:                        fprintf( stderr, "null opcode ignored\n" );
                    155:                        continue;
                    156:                case FTEXT:
                    157:                        lccopy( VAL(x) );
                    158:                        putchar('\n');
                    159:                        continue;
                    160: 
                    161:                case FLBRAC:
                    162:                        flags = VAL(x);
                    163:                        ftnno = REST(x);
                    164:                        maxtreg = lread();
                    165:                        tmpoff = baseoff = lread();
                    166:                        if (tmpoff%ALSTACK)
                    167:                            cerror("intermediate file-stack misalignment");
                    168:                        /* enable/disable range checking */
                    169:                        if( flags & CHECK_FLAG ){
                    170:                                chk_ovfl = 1;
                    171:                        } else {
                    172:                                chk_ovfl = 0;
                    173:                        }
                    174:                        if( flags & ENTRY_FLAG ){
                    175:                                /* beginning of function */
                    176:                                maxoff = baseoff;
                    177:                                maxtemp = 0;
                    178:                                saveregs();
                    179:                                }
                    180:                        else {
                    181:                                if( baseoff > maxoff ) maxoff = baseoff;
                    182:                                /* maxoff at end of ftn is max of autos and temps 
                    183:                                   over all blocks in the function */
                    184:                                }
                    185:                        setregs();
                    186:                        continue;
                    187: 
                    188:                case FRBRAC:
                    189:                        SETOFF( maxoff, ALSTACK );
                    190:                        eobl2();
                    191:                        continue;
                    192: 
                    193:                case FEOF:
                    194:                        return( nerrors );
                    195: 
                    196:                case FSWITCH:
                    197:                        uerror( "switch not yet done" );
                    198:                        for( x=VAL(x); x>0; --x ) lread();
                    199:                        continue;
                    200: 
                    201:                case FCON:      /* floating point constant */
                    202:                        p = talloc();
                    203:                        p->in.op = FCON;
                    204:                        p->fpn.type = REST(x);
                    205:                        lcread( (char*)&p->fpn.dval, 2 );
                    206:                        goto bump;
                    207: 
                    208:                case ICON:
                    209:                        p = talloc();
                    210:                        p->in.op = ICON;
                    211:                        p->in.type = REST(x);
                    212:                        p->tn.rval = 0;
                    213:                        p->tn.lval = lread();
                    214:                        if( VAL(x) ){
                    215: #ifndef FLEXNAMES
                    216:                                lcread( p->in.name, 2 );
                    217: #else
                    218:                                p->in.name = lnread();
                    219: #endif
                    220:                                }
                    221: #ifndef FLEXNAMES
                    222:                        else p->in.name[0] = '\0';
                    223: #else
                    224:                        else p->in.name = "";
                    225: #endif
                    226: 
                    227:                bump:
                    228: /*                     p->in.su = 0; */
                    229:                        p->in.rall = NOPREF;
                    230:                        *fsp++ = p;
                    231:                        if( fsp >= &fstack[NSTACKSZ] ) uerror( "expression depth exceeded" );
                    232:                        continue;
                    233: 
                    234:                case NAME:
                    235:                        p = talloc();
                    236:                        p->in.op = NAME;
                    237:                        p->in.type = REST(x);
                    238:                        p->tn.rval = 0;
                    239:                        if( VAL(x) ) p->tn.lval = lread();
                    240:                        else p->tn.lval = 0;
                    241: #ifndef FLEXNAMES
                    242:                        lcread( p->in.name, 2 );
                    243: #else
                    244:                        p->in.name = lnread();
                    245: #endif
                    246:                        goto bump;
                    247: 
                    248:                case OREG:
                    249:                        p = talloc();
                    250:                        p->in.op = OREG;
                    251:                        p->in.type = REST(x);
                    252:                        p->tn.rval = VAL(x);
                    253:                        p->tn.lval = lread();
                    254: #ifndef FLEXNAMES
                    255:                        lcread( p->in.name, 2 );
                    256: #else
                    257:                        p->in.name = lnread();
                    258: #endif
                    259:                        goto bump;
                    260: 
                    261:                case REG:
                    262:                        p = talloc();
                    263:                        p->in.op = REG;
                    264:                        p->in.type = REST(x);
                    265:                        p->tn.rval = VAL(x);
                    266:                        rbusy( p->tn.rval, p->in.type );
                    267:                        p->tn.lval = 0;
                    268: #ifndef FLEXNAMES
                    269:                        p->in.name[0] = '\0';
                    270: #else
                    271:                        p->in.name = "";
                    272: #endif
                    273:                        goto bump;
                    274: 
                    275:                case FEXPR:
                    276:                        lineno = REST(x);
                    277:                        if( VAL(x) ) lcread( filename, VAL(x) );
                    278:                        if( fsp == fstack ) continue;  /* filename only */
                    279:                        if( --fsp != fstack ) uerror( "expression poorly formed" );
                    280:                        if( lflag ) lineid( lineno, filename );
                    281:                        tmpoff = baseoff;
                    282:                        p = fstack[0];
                    283:                        if( edebug ) fwalk( p, eprint, 0 );
                    284: # ifdef MYREADER
                    285:                        MYREADER(p);
                    286: # endif
                    287: 
                    288:                        nrecur = 0;
                    289:                        delay( p );
                    290:                        reclaim( p, RNULL, 0 );
                    291: 
                    292:                        allchk();
                    293:                        tcheck();
                    294:                        continue;
                    295: 
                    296:                case LABEL:
                    297:                        if( VAL(x) ){
                    298:                                tlabel();
                    299:                                }
                    300:                        else {
                    301:                                label( (int) REST(x) );
                    302:                                }
                    303:                        continue;
                    304: 
                    305:                case GOTO:
                    306:                        if( VAL(x) ) {
                    307:                                branch( (int) REST(x) );
                    308:                                continue;
                    309:                                }
                    310:                        /* otherwise, treat as unary */
                    311:                        goto def;
                    312: 
                    313:                case EQ:
                    314:                case NE:
                    315:                case LT:
                    316:                case LE:
                    317:                case GT:
                    318:                case GE:
                    319:                case ULT:
                    320:                case ULE:
                    321:                case UGT:
                    322:                case UGE:
                    323:                        p = talloc();
                    324:                        p->bn.op = FOP(x);
                    325:                        p->bn.type = REST(x);
                    326:                        p->bn.reversed = 0;
                    327:                        p->in.right = *--fsp;
                    328:                        p->in.left = *--fsp;
                    329:                        goto bump;
                    330: 
                    331:                case STASG:
                    332:                case STARG:
                    333:                case STCALL:
                    334:                case UNARY STCALL:
                    335:                            /*
                    336:                             * size and alignment come from next long words
                    337:                             */
                    338:                        p = talloc();
                    339:                        p -> stn.stsize = lread();
                    340:                        p -> stn.stalign = lread();
                    341:                        goto defa;
                    342:                default:
                    343:                def:
                    344:                        p = talloc();
                    345:                defa:
                    346:                        p->in.op = FOP(x);
                    347:                        p->in.type = REST(x);
                    348: 
                    349:                        switch( optype( p->in.op ) ){
                    350: 
                    351:                        case BITYPE:
                    352:                                p->in.right = *--fsp;
                    353:                                p->in.left = *--fsp;
                    354:                                goto bump;
                    355: 
                    356:                        case UTYPE:
                    357:                                p->in.left = *--fsp;
                    358:                                p->tn.rval = 0;
                    359:                                goto bump;
                    360: 
                    361:                        case LTYPE:
                    362:                                uerror( "illegal leaf node: %d", p->in.op );
                    363:                                exit( 1 );
                    364:                                }
                    365:                        }
                    366:                }
                    367:        }

unix.superglobalmegacorp.com

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