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