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