Annotation of 43BSD/lib/mip/fort.c, revision 1.1

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

unix.superglobalmegacorp.com

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