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