|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.