BSD 4 development
[unix-history] / usr / src / cmd / mip / common
CommitLineData
59f26ee0
BJ
1#ifdef FORT
2#undef BUFSTDERR
3#endif
4#ifndef ONEPASS
5#undef BUFSTDERR
6#endif
7# ifndef EXIT
8# define EXIT exit
9# endif
10
11int nerrors = 0; /* number of errors */
12
13extern unsigned int offsz;
14
15unsigned caloff(){
16 register i;
17 unsigned int temp;
18 unsigned int off;
19 temp = 1;
20 i = 0;
21 do {
22 temp <<= 1;
23 ++i;
24 } while( temp > 0 );
25 off = 1 << (i-1);
26 return (off);
27 }
28
29NODE *lastfree; /* pointer to last free node; (for allocator) */
30
31 /* VARARGS1 */
32uerror( s, a ) char *s; { /* nonfatal error message */
33 /* the routine where is different for pass 1 and pass 2;
34 /* it tells where the error took place */
35
36 ++nerrors;
37 where('u');
38 fprintf( stderr, s, a );
39 fprintf( stderr, "\n" );
40#ifdef BUFSTDERR
41 fflush(stderr);
42#endif
43 if( nerrors > 30 ) cerror( "too many errors");
44 }
45
46 /* VARARGS1 */
47cerror( s, a, b, c ) char *s; { /* compiler error: die */
48 where('c');
49 if( nerrors && nerrors <= 30 ){ /* give the compiler the benefit of the doubt */
50 fprintf( stderr, "cannot recover from earlier errors: goodbye!\n" );
51 }
52 else {
53 fprintf( stderr, "compiler error: " );
54 fprintf( stderr, s, a, b, c );
55 fprintf( stderr, "\n" );
56 }
57#ifdef BUFSTDERR
58 fflush(stderr);
59#endif
60 EXIT(1);
61 }
62
63int Wflag = 0; /* Non-zero means do not print warnings */
64
65 /* VARARGS1 */
66werror( s, a, b ) char *s; { /* warning */
67 if(Wflag) return;
68 where('w');
69 fprintf( stderr, "warning: " );
70 fprintf( stderr, s, a, b );
71 fprintf( stderr, "\n" );
72#ifdef BUFSTDERR
73 fflush(stderr);
74#endif
75 }
76
77tinit(){ /* initialize expression tree search */
78
79 NODE *p;
80
81 for( p=node; p<= &node[TREESZ-1]; ++p ) p->in.op = FREE;
82 lastfree = node;
83
84 }
85
86# define TNEXT(p) (p== &node[TREESZ-1]?node:p+1)
87
88NODE *
89talloc(){
90 NODE *p, *q;
91
92 q = lastfree;
93 for( p = TNEXT(q); p!=q; p= TNEXT(p))
94 if( p->in.op ==FREE ) return(lastfree=p);
95
96 cerror( "out of tree space; simplify expression");
97 /* NOTREACHED */
98 }
99
100tcheck(){ /* ensure that all nodes have been freed */
101
102 NODE *p;
103
104 if( !nerrors )
105 for( p=node; p<= &node[TREESZ-1]; ++p )
106 if( p->in.op != FREE ) cerror( "wasted space: %o", p );
107 tinit();
108#ifdef FLEXNAMES
109 freetstr();
110#endif
111 }
112tfree( p ) NODE *p; {
113 /* free the tree p */
114 extern tfree1();
115
116 if( p->in.op != FREE ) walkf( p, tfree1 );
117
118 }
119
120tfree1(p) NODE *p; {
121 if( p == 0 ) cerror( "freeing blank tree!");
122 else p->in.op = FREE;
123 }
124
125fwalk( t, f, down ) register NODE *t; int (*f)(); {
126
127 int down1, down2;
128
129 more:
130 down1 = down2 = 0;
131
132 (*f)( t, down, &down1, &down2 );
133
134 switch( optype( t->in.op ) ){
135
136 case BITYPE:
137 fwalk( t->in.left, f, down1 );
138 t = t->in.right;
139 down = down2;
140 goto more;
141
142 case UTYPE:
143 t = t->in.left;
144 down = down1;
145 goto more;
146
147 }
148 }
149
150walkf( t, f ) register NODE *t; int (*f)(); {
151 register opty;
152
153 opty = optype(t->in.op);
154
155 if( opty != LTYPE ) walkf( t->in.left, f );
156 if( opty == BITYPE ) walkf( t->in.right, f );
157 (*f)( t );
158 }
159
160
161
162int dope[ DSIZE ];
163char *opst[DSIZE];
164
165struct dopest { int dopeop; char opst[8]; int dopeval; } indope[] = {
166
167 NAME, "NAME", LTYPE,
168 STRING, "STRING", LTYPE,
169 REG, "REG", LTYPE,
170 OREG, "OREG", LTYPE,
171 ICON, "ICON", LTYPE,
172 FCON, "FCON", LTYPE,
173 CCODES, "CCODES", LTYPE,
174 UNARY MINUS, "U-", UTYPE,
175 UNARY MUL, "U*", UTYPE,
176 UNARY AND, "U&", UTYPE,
177 UNARY CALL, "UCALL", UTYPE|CALLFLG,
178 UNARY FORTCALL, "UFCALL", UTYPE|CALLFLG,
179 NOT, "!", UTYPE|LOGFLG,
180 COMPL, "~", UTYPE,
181 FORCE, "FORCE", UTYPE,
182 INIT, "INIT", UTYPE,
183 SCONV, "SCONV", UTYPE,
184 PCONV, "PCONV", UTYPE,
185 PLUS, "+", BITYPE|FLOFLG|SIMPFLG|COMMFLG,
186 ASG PLUS, "+=", BITYPE|ASGFLG|ASGOPFLG|FLOFLG|SIMPFLG|COMMFLG,
187 MINUS, "-", BITYPE|FLOFLG|SIMPFLG,
188 ASG MINUS, "-=", BITYPE|FLOFLG|SIMPFLG|ASGFLG|ASGOPFLG,
189 MUL, "*", BITYPE|FLOFLG|MULFLG,
190 ASG MUL, "*=", BITYPE|FLOFLG|MULFLG|ASGFLG|ASGOPFLG,
191 AND, "&", BITYPE|SIMPFLG|COMMFLG,
192 ASG AND, "&=", BITYPE|SIMPFLG|COMMFLG|ASGFLG|ASGOPFLG,
193 QUEST, "?", BITYPE,
194 COLON, ":", BITYPE,
195 ANDAND, "&&", BITYPE|LOGFLG,
196 OROR, "||", BITYPE|LOGFLG,
197 CM, ",", BITYPE,
198 COMOP, ",OP", BITYPE,
199 ASSIGN, "=", BITYPE|ASGFLG,
200 DIV, "/", BITYPE|FLOFLG|MULFLG|DIVFLG,
201 ASG DIV, "/=", BITYPE|FLOFLG|MULFLG|DIVFLG|ASGFLG|ASGOPFLG,
202 MOD, "%", BITYPE|DIVFLG,
203 ASG MOD, "%=", BITYPE|DIVFLG|ASGFLG|ASGOPFLG,
204 LS, "<<", BITYPE|SHFFLG,
205 ASG LS, "<<=", BITYPE|SHFFLG|ASGFLG|ASGOPFLG,
206 RS, ">>", BITYPE|SHFFLG,
207 ASG RS, ">>=", BITYPE|SHFFLG|ASGFLG|ASGOPFLG,
208 OR, "|", BITYPE|COMMFLG|SIMPFLG,
209 ASG OR, "|=", BITYPE|COMMFLG|SIMPFLG|ASGFLG|ASGOPFLG,
210 ER, "^", BITYPE|COMMFLG|SIMPFLG,
211 ASG ER, "^=", BITYPE|COMMFLG|SIMPFLG|ASGFLG|ASGOPFLG,
212 INCR, "++", BITYPE|ASGFLG,
213 DECR, "--", BITYPE|ASGFLG,
214 STREF, "->", BITYPE,
215 CALL, "CALL", BITYPE|CALLFLG,
216 FORTCALL, "FCALL", BITYPE|CALLFLG,
217 EQ, "==", BITYPE|LOGFLG,
218 NE, "!=", BITYPE|LOGFLG,
219 LE, "<=", BITYPE|LOGFLG,
220 LT, "<", BITYPE|LOGFLG,
221 GE, ">", BITYPE|LOGFLG,
222 GT, ">", BITYPE|LOGFLG,
223 UGT, "UGT", BITYPE|LOGFLG,
224 UGE, "UGE", BITYPE|LOGFLG,
225 ULT, "ULT", BITYPE|LOGFLG,
226 ULE, "ULE", BITYPE|LOGFLG,
227 ARS, "A>>", BITYPE,
228 TYPE, "TYPE", LTYPE,
229 LB, "[", BITYPE,
230 CBRANCH, "CBRANCH", BITYPE,
231 FLD, "FLD", UTYPE,
232 PMCONV, "PMCONV", BITYPE,
233 PVCONV, "PVCONV", BITYPE,
234 RETURN, "RETURN", BITYPE|ASGFLG|ASGOPFLG,
235 CAST, "CAST", BITYPE|ASGFLG|ASGOPFLG,
236 GOTO, "GOTO", UTYPE,
237 STASG, "STASG", BITYPE|ASGFLG,
238 STARG, "STARG", UTYPE,
239 STCALL, "STCALL", BITYPE|CALLFLG,
240 UNARY STCALL, "USTCALL", UTYPE|CALLFLG,
241
242-1, 0
243};
244
245mkdope(){
246 register struct dopest *q;
247
248 for( q = indope; q->dopeop >= 0; ++q ){
249 dope[q->dopeop] = q->dopeval;
250 opst[q->dopeop] = q->opst;
251 }
252 }
253# ifndef BUG4
254tprint( t ) TWORD t; { /* output a nice description of the type of t */
255
256 static char * tnames[] = {
257 "undef",
258 "farg",
259 "char",
260 "short",
261 "int",
262 "long",
263 "float",
264 "double",
265 "strty",
266 "unionty",
267 "enumty",
268 "moety",
269 "uchar",
270 "ushort",
271 "unsigned",
272 "ulong",
273 "?", "?"
274 };
275
276 for(;; t = DECREF(t) ){
277
278 if( ISPTR(t) ) printf( "PTR " );
279 else if( ISFTN(t) ) printf( "FTN " );
280 else if( ISARY(t) ) printf( "ARY " );
281 else {
282 printf( "%s", tnames[t] );
283 return;
284 }
285 }
286 }
287# endif
288
289#ifdef FLEXNAMES
290#define NTSTRBUF 40
291#define TSTRSZ 2048
292char itstrbuf[TSTRSZ];
293char *tstrbuf[NTSTRBUF] = { itstrbuf };
294char **curtstr = tstrbuf;
295int tstrused;
296
297char *
298tstr(cp)
299 register char *cp;
300{
301 register int i = strlen(cp);
302 register char *dp;
303
304 if (tstrused + i >= TSTRSZ) {
305 if (++curtstr >= &tstrbuf[NTSTRBUF])
306 cerror("out of temporary string space");
307 tstrused = 0;
308 if (*curtstr == 0) {
309 dp = (char *)malloc(TSTRSZ);
310 if (dp == 0)
311 cerror("out of memory (tstr)");
312 *curtstr = dp;
313 }
314 }
315 strcpy(dp = *curtstr+tstrused, cp);
316 tstrused += i + 1;
317 return (dp);
318}
319#endif