|
|
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 int n; { ! 93: register int 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: baseoff = lread(); ! 153: SETOFF( baseoff, ALSTACK ); /* align the base offset*/ ! 154: tmpoff = baseoff ; ! 155: maxtreg = VAL(x); ! 156: if( ftnno != REST(x) ){ ! 157: /* beginning of function */ ! 158: maxoff = baseoff; ! 159: ftnno = REST(x); ! 160: maxtemp = 0; ! 161: } ! 162: else { ! 163: if( baseoff > maxoff ) maxoff = baseoff; ! 164: /* maxoff at end of ftn is max of autos and temps ! 165: over all blocks in the function */ ! 166: } ! 167: setregs(); ! 168: continue; ! 169: ! 170: case FRBRAC: ! 171: SETOFF( maxoff, ALSTACK ); ! 172: eobl2(); ! 173: continue; ! 174: ! 175: case FEOF: ! 176: return( nerrors ); ! 177: ! 178: case FSWITCH: ! 179: uerror( "switch not yet done" ); ! 180: for( x=VAL(x); x>0; --x ) lread(); ! 181: continue; ! 182: ! 183: case ICON: ! 184: p = talloc(); ! 185: p->in.op = ICON; ! 186: p->in.type = FIXINT(REST(x)); ! 187: p->tn.rval = 0; ! 188: p->tn.lval = lread(); ! 189: if( VAL(x) ){ ! 190: #ifndef FLEXNAMES ! 191: lcread( p->in.name, 2 ); ! 192: #else ! 193: p->in.name = lnread(); ! 194: #endif ! 195: } ! 196: #ifndef FLEXNAMES ! 197: else p->in.name[0] = '\0'; ! 198: #else ! 199: else p->in.name = ""; ! 200: #endif ! 201: ! 202: bump: ! 203: p->in.su = 0; ! 204: p->in.rall = NOPREF; ! 205: *fsp++ = p; ! 206: if( fsp >= &fstack[NSTACKSZ] ) uerror( "expression depth exceeded" ); ! 207: continue; ! 208: ! 209: case NAME: ! 210: p = talloc(); ! 211: p->in.op = NAME; ! 212: p->in.type = FIXINT(REST(x)); ! 213: p->tn.rval = 0; ! 214: if( VAL(x) ) p->tn.lval = lread(); ! 215: else p->tn.lval = 0; ! 216: #ifndef FLEXNAMES ! 217: lcread( p->in.name, 2 ); ! 218: #else ! 219: p->in.name = lnread(); ! 220: #endif ! 221: goto bump; ! 222: ! 223: case OREG: ! 224: p = talloc(); ! 225: p->in.op = OREG; ! 226: p->in.type = FIXINT(REST(x)); ! 227: p->tn.rval = VAL(x); ! 228: rbusy( p->tn.rval, PTR | p->in.type ); ! 229: p->tn.lval = lread(); ! 230: #ifndef FLEXNAMES ! 231: lcread( p->in.name, 2 ); ! 232: #else ! 233: p->in.name = lnread(); ! 234: #endif ! 235: goto bump; ! 236: ! 237: case REG: ! 238: p = talloc(); ! 239: p->in.op = REG; ! 240: p->in.type = FIXINT(REST(x)); ! 241: p->tn.rval = VAL(x); ! 242: rbusy( p->tn.rval, p->in.type ); ! 243: p->tn.lval = 0; ! 244: #ifndef FLEXNAMES ! 245: p->in.name[0] = '\0'; ! 246: #else ! 247: p->in.name = ""; ! 248: #endif ! 249: goto bump; ! 250: ! 251: case FEXPR: ! 252: lineno = REST(x); ! 253: if( VAL(x) ) lcread( filename, VAL(x) ); ! 254: if( fsp == fstack ) continue; /* filename only */ ! 255: if( --fsp != fstack ) uerror( "expression poorly formed" ); ! 256: if( lflag ) lineid( lineno, filename ); ! 257: tmpoff = baseoff; ! 258: p = fstack[0]; ! 259: if( edebug ) fwalk( p, eprint, 0 ); ! 260: # ifdef MYREADER ! 261: MYREADER(p); ! 262: # endif ! 263: ! 264: nrecur = 0; ! 265: delay( p ); ! 266: reclaim( p, RNULL, 0 ); ! 267: ! 268: allchk(); ! 269: tcheck(); ! 270: continue; ! 271: ! 272: case FLABEL: ! 273: if( VAL(x) ){ ! 274: tlabel(); ! 275: } ! 276: else { ! 277: label( (int) REST(x) ); ! 278: } ! 279: continue; ! 280: ! 281: case GOTO: ! 282: if( VAL(x) ) { ! 283: cbgen( 0, (int) REST(x), 'I' ); /* unconditional branch */ ! 284: continue; ! 285: } ! 286: /* otherwise, treat as unary */ ! 287: goto def; ! 288: ! 289: case STASG: ! 290: case STARG: ! 291: case STCALL: ! 292: case UNARY STCALL: ! 293: /* ! 294: * size and alignment come from next long words ! 295: */ ! 296: p = talloc(); ! 297: p -> stn.stsize = lread(); ! 298: p -> stn.stalign = lread(); ! 299: goto defa; ! 300: default: ! 301: def: ! 302: p = talloc(); ! 303: defa: ! 304: p->in.op = FOP(x); ! 305: p->in.type = FIXINT(REST(x)); ! 306: ! 307: switch( optype( p->in.op ) ){ ! 308: ! 309: case BITYPE: ! 310: p->in.right = *--fsp; ! 311: p->in.left = *--fsp; ! 312: goto bump; ! 313: ! 314: case UTYPE: ! 315: p->in.left = *--fsp; ! 316: p->tn.rval = 0; ! 317: goto bump; ! 318: ! 319: case LTYPE: ! 320: uerror( "illegal leaf node: %d", p->in.op ); ! 321: exit( 1 ); ! 322: } ! 323: } ! 324: } ! 325: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.