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: }