]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/cc/sub.c
have compiler error out if read fails
[plan9front.git] / sys / src / cmd / cc / sub.c
1 #include        "cc.h"
2
3 Node*
4 new(int t, Node *l, Node *r)
5 {
6         Node *n;
7
8         n = alloc(sizeof(*n));
9         n->op = t;
10         n->left = l;
11         n->right = r;
12         if(l && t != OGOTO)
13                 n->lineno = l->lineno;
14         else if(r)
15                 n->lineno = r->lineno;
16         else
17                 n->lineno = lineno;
18         newflag = 1;
19         return n;
20 }
21
22 Node*
23 new1(int o, Node *l, Node *r)
24 {
25         Node *n;
26
27         n = new(o, l, r);
28         n->lineno = nearln;
29         return n;
30 }
31
32 void
33 prtree(Node *n, char *s)
34 {
35
36         print(" == %s ==\n", s);
37         prtree1(n, 0, 0);
38         print("\n");
39 }
40
41 void
42 prtree1(Node *n, int d, int f)
43 {
44         int i;
45
46         if(f)
47         for(i=0; i<d; i++)
48                 print("   ");
49         if(n == Z) {
50                 print("Z\n");
51                 return;
52         }
53         if(n->op == OLIST) {
54                 prtree1(n->left, d, 0);
55                 prtree1(n->right, d, 1);
56                 return;
57         }
58         d++;
59         print("%O", n->op);
60         i = 3;
61         switch(n->op)
62         {
63         case ONAME:
64                 print(" \"%F\"", n);
65                 print(" %ld", n->xoffset);
66                 i = 0;
67                 break;
68
69         case OINDREG:
70                 print(" %ld(R%d)", n->xoffset, n->reg);
71                 i = 0;
72                 break;
73
74         case OREGISTER:
75                 if(n->xoffset)
76                         print(" %ld+R%d", n->xoffset, n->reg);
77                 else
78                         print(" R%d", n->reg);
79                 i = 0;
80                 break;
81
82         case OSTRING:
83                 print(" \"%s\"", n->cstring);
84                 i = 0;
85                 break;
86
87         case OLSTRING:
88                 print(" \"%S\"", n->rstring);
89                 i = 0;
90                 break;
91
92         case ODOT:
93         case OELEM:
94                 print(" \"%F\"", n);
95                 break;
96
97         case OCONST:
98                 if(typefd[n->type->etype])
99                         print(" \"%.8e\"", n->fconst);
100                 else
101                         print(" \"%lld\"", n->vconst);
102                 i = 0;
103                 break;
104         }
105         if(n->addable != 0)
106                 print(" <%d>", n->addable);
107         if(n->type != T)
108                 print(" %T", n->type);
109         if(n->complex != 0)
110                 print(" (%d)", n->complex);
111         print(" %L\n", n->lineno);
112         if(i & 2)
113                 prtree1(n->left, d, 1);
114         if(i & 1)
115                 prtree1(n->right, d, 1);
116 }
117
118 Type*
119 typ(int et, Type *d)
120 {
121         Type *t;
122
123         t = alloc(sizeof(*t));
124         t->etype = et;
125         t->link = d;
126         t->down = T;
127         t->sym = S;
128         t->width = ewidth[et];
129         t->offset = 0;
130         t->shift = 0;
131         t->nbits = 0;
132         t->garb = 0;
133         return t;
134 }
135
136 Type*
137 copytyp(Type *t)
138 {
139         Type *nt;
140
141         nt = typ(TXXX, T);
142         *nt = *t;
143         return nt;
144 }
145
146 Type*
147 garbt(Type *t, long b)
148 {
149         Type *t1;
150
151         if(b & BGARB) {
152                 t1 = copytyp(t);
153                 t1->garb = simpleg(b);
154                 return t1;
155         }
156         return t;
157 }
158
159 int
160 simpleg(long b)
161 {
162
163         b &= BGARB;
164         switch(b) {
165         case BCONSTNT:
166                 return GCONSTNT;
167         case BVOLATILE:
168                 return GVOLATILE;
169         case BVOLATILE|BCONSTNT:
170                 return GCONSTNT|GVOLATILE;
171         }
172         return GXXX;
173 }
174
175 int
176 simplec(long b)
177 {
178
179         b &= BCLASS;
180         switch(b) {
181         case 0:
182         case BREGISTER:
183                 return CXXX;
184         case BAUTO:
185         case BAUTO|BREGISTER:
186                 return CAUTO;
187         case BEXTERN:
188                 return CEXTERN;
189         case BEXTERN|BREGISTER:
190                 return CEXREG;
191         case BSTATIC:
192                 return CSTATIC;
193         case BTYPEDEF:
194                 return CTYPEDEF;
195         case BTYPESTR:
196                 return CTYPESTR;
197         }
198         diag(Z, "illegal combination of classes %Q", b);
199         return CXXX;
200 }
201
202 Type*
203 simplet(long b)
204 {
205
206         b &= ~BCLASS & ~BGARB;
207         switch(b) {
208         case BCHAR:
209         case BCHAR|BSIGNED:
210                 return types[TCHAR];
211
212         case BCHAR|BUNSIGNED:
213                 return types[TUCHAR];
214
215         case BSHORT:
216         case BSHORT|BINT:
217         case BSHORT|BSIGNED:
218         case BSHORT|BINT|BSIGNED:
219                 return types[TSHORT];
220
221         case BUNSIGNED|BSHORT:
222         case BUNSIGNED|BSHORT|BINT:
223                 return types[TUSHORT];
224
225         case 0:
226         case BINT:
227         case BINT|BSIGNED:
228         case BSIGNED:
229                 return types[TINT];
230
231         case BUNSIGNED:
232         case BUNSIGNED|BINT:
233                 return types[TUINT];
234
235         case BLONG:
236         case BLONG|BINT:
237         case BLONG|BSIGNED:
238         case BLONG|BINT|BSIGNED:
239                 return types[TLONG];
240
241         case BUNSIGNED|BLONG:
242         case BUNSIGNED|BLONG|BINT:
243                 return types[TULONG];
244
245         case BVLONG|BLONG:
246         case BVLONG|BLONG|BINT:
247         case BVLONG|BLONG|BSIGNED:
248         case BVLONG|BLONG|BINT|BSIGNED:
249                 return types[TVLONG];
250
251         case BVLONG|BLONG|BUNSIGNED:
252         case BVLONG|BLONG|BINT|BUNSIGNED:
253                 return types[TUVLONG];
254
255         case BFLOAT:
256                 return types[TFLOAT];
257
258         case BDOUBLE:
259         case BDOUBLE|BLONG:
260         case BFLOAT|BLONG:
261                 return types[TDOUBLE];
262
263         case BVOID:
264                 return types[TVOID];
265         }
266
267         diag(Z, "illegal combination of types %Q", b);
268         return types[TINT];
269 }
270
271 int
272 stcompat(Node *n, Type *t1, Type *t2, long ttab[])
273 {
274         int i;
275         ulong b;
276
277         i = 0;
278         if(t2 != T)
279                 i = t2->etype;
280         b = 1L << i;
281         i = 0;
282         if(t1 != T)
283                 i = t1->etype;
284         if(b & ttab[i]) {
285                 if(ttab == tasign)
286                         if(b == BSTRUCT || b == BUNION)
287                                 if(!sametype(t1, t2))
288                                         return 1;
289                 if(n->op != OCAST)
290                         if(b == BIND && i == TIND)
291                                 if(!sametype(t1, t2))
292                                         return 1;
293                 return 0;
294         }
295         return 1;
296 }
297
298 int
299 tcompat(Node *n, Type *t1, Type *t2, long ttab[])
300 {
301
302         if(stcompat(n, t1, t2, ttab)) {
303                 if(t1 == T)
304                         diag(n, "incompatible type: \"%T\" for op \"%O\"",
305                                 t2, n->op);
306                 else
307                         diag(n, "incompatible types: \"%T\" and \"%T\" for op \"%O\"",
308                                 t1, t2, n->op);
309                 return 1;
310         }
311         return 0;
312 }
313
314 void
315 makedot(Node *n, Type *t, long o)
316 {
317         Node *n1, *n2;
318
319         if(t->nbits) {
320                 n1 = new(OXXX, Z, Z);
321                 *n1 = *n;
322                 n->op = OBIT;
323                 n->left = n1;
324                 n->right = Z;
325                 n->type = t;
326                 n->addable = n1->left->addable;
327                 n = n1;
328         }
329         n->addable = n->left->addable;
330         if(n->addable == 0) {
331                 n1 = new1(OCONST, Z, Z);
332                 n1->vconst = o;
333                 n1->type = types[TLONG];
334                 n->right = n1;
335                 n->type = t;
336                 return;
337         }
338         n->left->type = t;
339         if(o == 0) {
340                 *n = *n->left;
341                 return;
342         }
343         n->type = t;
344         n1 = new1(OCONST, Z, Z);
345         n1->vconst = o;
346         t = typ(TIND, t);
347         t->width = types[TIND]->width;
348         n1->type = t;
349
350         n2 = new1(OADDR, n->left, Z);
351         n2->type = t;
352
353         n1 = new1(OADD, n1, n2);
354         n1->type = t;
355
356         n->op = OIND;
357         n->left = n1;
358         n->right = Z;
359 }
360
361 Type*
362 dotsearch(Sym *s, Type *t, Node *n, long *off)
363 {
364         Type *t1, *xt, *rt;
365
366         xt = T;
367
368         /*
369          * look it up by name
370          */
371         for(t1 = t; t1 != T; t1 = t1->down)
372                 if(t1->sym == s) {
373                         if(xt != T)
374                                 goto ambig;
375                         xt = t1;
376                 }
377
378         /*
379          * look it up by type
380          */
381         if(s->class == CTYPEDEF || s->class == CTYPESTR)
382                 for(t1 = t; t1 != T; t1 = t1->down)
383                         if(t1->sym == S && typesu[t1->etype])
384                                 if(sametype(s->type, t1)) {
385                                         if(xt != T)
386                                                 goto ambig;
387                                         xt = t1;
388                                 }
389         if(xt != T) {
390                 *off = xt->offset;
391                 return xt;
392         }
393
394         /*
395          * look it up in unnamed substructures
396          */
397         for(t1 = t; t1 != T; t1 = t1->down)
398                 if(t1->sym == S && typesu[t1->etype]){
399                         rt = dotsearch(s, t1->link, n, off);
400                         if(rt != T) {
401                                 if(xt != T)
402                                         goto ambig;
403                                 xt = rt;
404                                 *off += t1->offset;
405                         }
406                 }
407         return xt;
408
409 ambig:
410         diag(n, "ambiguous structure element: %s", s->name);
411         return xt;
412 }
413
414 long
415 dotoffset(Type *st, Type *lt, Node *n)
416 {
417         Type *t;
418         Sym *g;
419         long o, o1;
420
421         o = -1;
422         /*
423          * first try matching at the top level
424          * for matching tag names
425          */
426         g = st->tag;
427         if(g != S)
428                 for(t=lt->link; t!=T; t=t->down)
429                         if(t->sym == S)
430                                 if(g == t->tag) {
431                                         if(o >= 0)
432                                                 goto ambig;
433                                         o = t->offset;
434                                 }
435         if(o >= 0)
436                 return o;
437
438         /*
439          * second try matching at the top level
440          * for similar types
441          */
442         for(t=lt->link; t!=T; t=t->down)
443                 if(t->sym == S)
444                         if(sametype(st, t)) {
445                                 if(o >= 0)
446                                         goto ambig;
447                                 o = t->offset;
448                         }
449         if(o >= 0)
450                 return o;
451
452         /*
453          * last try matching sub-levels
454          */
455         for(t=lt->link; t!=T; t=t->down)
456                 if(t->sym == S)
457                 if(typesu[t->etype]) {
458                         o1 = dotoffset(st, t, n);
459                         if(o1 >= 0) {
460                                 if(o >= 0)
461                                         goto ambig;
462                                 o = o1 + t->offset;
463                         }
464                 }
465         return o;
466
467 ambig:
468         diag(n, "ambiguous unnamed structure element");
469         return o;
470 }
471
472 /*
473  * look into tree for floating point constant expressions
474  */
475 int
476 allfloat(Node *n, int flag)
477 {
478
479         if(n != Z) {
480                 if(n->type->etype != TDOUBLE)
481                         return 1;
482                 switch(n->op) {
483                 case OCONST:
484                         if(flag)
485                                 n->type = types[TFLOAT];
486                         return 1;
487                 case OADD:      /* no need to get more exotic than this */
488                 case OSUB:
489                 case OMUL:
490                 case ODIV:
491                         if(!allfloat(n->right, flag))
492                                 break;
493                 case OCAST:
494                         if(!allfloat(n->left, flag))
495                                 break;
496                         if(flag)
497                                 n->type = types[TFLOAT];
498                         return 1;
499                 }
500         }
501         return 0;
502 }
503
504 void
505 constas(Node *n, Type *il, Type *ir)
506 {
507         Type *l, *r;
508
509         l = il;
510         r = ir;
511
512         if(l == T)
513                 return;
514         if(l->garb & GCONSTNT) {
515                 warn(n, "assignment to a constant type (%T)", il);
516                 return;
517         }
518         if(r == T)
519                 return;
520         for(;;) {
521                 if(l->etype != TIND || r->etype != TIND)
522                         break;
523                 l = l->link;
524                 r = r->link;
525                 if(l == T || r == T)
526                         break;
527                 if(r->garb & GCONSTNT)
528                         if(!(l->garb & GCONSTNT)) {
529                                 warn(n, "assignment of a constant pointer type (%T)", ir);
530                                 break;
531                         }
532         }
533 }
534
535 void
536 typeext1(Type *st, Node *l)
537 {
538         if(st->etype == TFLOAT && allfloat(l, 0))
539                 allfloat(l, 1);
540 }
541
542 void
543 typeext(Type *st, Node *l)
544 {
545         Type *lt;
546         Node *n1, *n2;
547         long o;
548
549         lt = l->type;
550         if(lt == T)
551                 return;
552         if(st->etype == TIND && vconst(l) == 0) {
553                 l->type = st;
554                 l->vconst = 0;
555                 return;
556         }
557         typeext1(st, l);
558
559         /*
560          * extension of C
561          * if assign of struct containing unnamed sub-struct
562          * to type of sub-struct, insert the DOT.
563          * if assign of *struct containing unnamed substruct
564          * to type of *sub-struct, insert the add-offset
565          */
566         if(typesu[st->etype] && typesu[lt->etype]) {
567                 o = dotoffset(st, lt, l);
568                 if(o >= 0) {
569                         n1 = new1(OXXX, Z, Z);
570                         *n1 = *l;
571                         l->op = ODOT;
572                         l->left = n1;
573                         l->right = Z;
574                         makedot(l, st, o);
575                 }
576                 return;
577         }
578         if(st->etype == TIND && typesu[st->link->etype])
579         if(lt->etype == TIND && typesu[lt->link->etype]) {
580                 o = dotoffset(st->link, lt->link, l);
581                 if(o >= 0) {
582                         l->type = st;
583                         if(o == 0)
584                                 return;
585                         n1 = new1(OXXX, Z, Z);
586                         *n1 = *l;
587                         n2 = new1(OCONST, Z, Z);
588                         n2->vconst = o;
589                         n2->type = st;
590                         l->op = OADD;
591                         l->left = n1;
592                         l->right = n2;
593                 }
594                 return;
595         }
596 }
597
598 /*
599  * a cast that generates no code
600  * (same size move)
601  */
602 int
603 nocast(Type *t1, Type *t2)
604 {
605         int i, b;
606
607         if(t1->nbits)
608                 return 0;
609         i = 0;
610         if(t2 != T)
611                 i = t2->etype;
612         b = 1<<i;
613         i = 0;
614         if(t1 != T)
615                 i = t1->etype;
616         if(b & ncast[i])
617                 return 1;
618         return 0;
619 }
620
621 /*
622  * a cast that has a noop semantic
623  * (small to large, convert)
624  */
625 int
626 nilcast(Type *t1, Type *t2)
627 {
628         int et1, et2;
629
630         if(t1 == T)
631                 return 0;
632         if(t1->nbits)
633                 return 0;
634         if(t2 == T)
635                 return 0;
636         et1 = t1->etype;
637         et2 = t2->etype;
638         if(et1 == et2)
639                 return 1;
640         if(typefd[et1] && typefd[et2]) {
641                 if(ewidth[et1] < ewidth[et2])
642                         return 1;
643                 return 0;
644         }
645         if(typechlp[et1] && typechlp[et2]) {
646                 if(ewidth[et1] < ewidth[et2])
647                         return 1;
648                 return 0;
649         }
650         return 0;
651 }
652
653 /*
654  * "the usual arithmetic conversions are performed"
655  */
656 void
657 arith(Node *n, int f)
658 {
659         Type *t1, *t2;
660         int i, j, k;
661         Node *n1;
662         long w;
663
664         t1 = n->left->type;
665         if(n->right == Z)
666                 t2 = t1;
667         else
668                 t2 = n->right->type;
669         i = TXXX;
670         if(t1 != T)
671                 i = t1->etype;
672         j = TXXX;
673         if(t2 != T)
674                 j = t2->etype;
675         k = tab[i][j];
676         if(k == TIND) {
677                 if(i == TIND)
678                         n->type = t1;
679                 else
680                 if(j == TIND)
681                         n->type = t2;
682         } else {
683                 /* convert up to at least int */
684                 if(f == 1)
685                 while(k < TINT)
686                         k += 2;
687                 n->type = types[k];
688         }
689         if(n->op == OSUB)
690         if(i == TIND && j == TIND) {
691                 w = n->right->type->link->width;
692                 if(w < 1 || n->left->type->link == T || n->left->type->link->width < 1)
693                         goto bad;
694                 n->type = types[ewidth[TIND] <= ewidth[TLONG]? TLONG: TVLONG];
695                 if(1 && ewidth[TIND] > ewidth[TLONG]){
696                         n1 = new1(OXXX, Z, Z);
697                         *n1 = *n;
698                         n->op = OCAST;
699                         n->left = n1;
700                         n->right = Z;
701                         n->type = types[TLONG];
702                 }
703                 if(w > 1) {
704                         n1 = new1(OXXX, Z, Z);
705                         *n1 = *n;
706                         n->op = ODIV;
707                         n->left = n1;
708                         n1 = new1(OCONST, Z, Z);
709                         n1->vconst = w;
710                         n1->type = n->type;
711                         n->right = n1;
712                         w = vlog(n1);
713                         if(w >= 0) {
714                                 n->op = OASHR;
715                                 n1->vconst = w;
716                         }
717                 }
718                 return;
719         }
720         if(!sametype(n->type, n->left->type)) {
721                 n->left = new1(OCAST, n->left, Z);
722                 n->left->type = n->type;
723                 if(n->type->etype == TIND) {
724                         w = n->type->link->width;
725                         if(w < 1) {
726                                 snap(n->type->link);
727                                 w = n->type->link->width;
728                                 if(w < 1)
729                                         goto bad;
730                         }
731                         if(w > 1) {
732                                 n1 = new1(OCONST, Z, Z);
733                                 n1->vconst = w;
734                                 n1->type = n->type;
735                                 n->left = new1(OMUL, n->left, n1);
736                                 n->left->type = n->type;
737                         }
738                 }
739         }
740         if(n->right != Z)
741         if(!sametype(n->type, n->right->type)) {
742                 n->right = new1(OCAST, n->right, Z);
743                 n->right->type = n->type;
744                 if(n->type->etype == TIND) {
745                         w = n->type->link->width;
746                         if(w < 1) {
747                                 snap(n->type->link);
748                                 w = n->type->link->width;
749                                 if(w < 1)
750                                         goto bad;
751                         }
752                         if(w != 1) {
753                                 n1 = new1(OCONST, Z, Z);
754                                 n1->vconst = w;
755                                 n1->type = n->type;
756                                 n->right = new1(OMUL, n->right, n1);
757                                 n->right->type = n->type;
758                         }
759                 }
760         }
761         return;
762 bad:
763         diag(n, "pointer addition not fully declared: %T", n->type->link);
764 }
765
766 /*
767  * try to rewrite shift & mask
768  */
769 void
770 simplifyshift(Node *n)
771 {
772         ulong c3;
773         int o, s1, s2, c1, c2;
774
775         if(!typechlp[n->type->etype])
776                 return;
777         switch(n->op) {
778         default:
779                 return;
780         case OASHL:
781                 s1 = 0;
782                 break;
783         case OLSHR:
784                 s1 = 1;
785                 break;
786         case OASHR:
787                 s1 = 2;
788                 break;
789         }
790         if(n->right->op != OCONST)
791                 return;
792         if(n->left->op != OAND)
793                 return;
794         if(n->left->right->op != OCONST)
795                 return;
796         switch(n->left->left->op) {
797         default:
798                 return;
799         case OASHL:
800                 s2 = 0;
801                 break;
802         case OLSHR:
803                 s2 = 1;
804                 break;
805         case OASHR:
806                 s2 = 2;
807                 break;
808         }
809         if(n->left->left->right->op != OCONST)
810                 return;
811
812         c1 = n->right->vconst;
813         c2 = n->left->left->right->vconst;
814         c3 = n->left->right->vconst;
815
816 /*
817         if(debug['h'])
818                 print("%.3o %ld %ld %d #%.lux\n",
819                         (s1<<3)|s2, c1, c2, topbit(c3), c3);
820 */
821
822         o = n->op;
823         switch((s1<<3)|s2) {
824         case 000:       /* (((e <<u c2) & c3) <<u c1) */
825                 c3 >>= c2;
826                 c1 += c2;
827                 if(c1 >= 32)
828                         break;
829                 goto rewrite1;
830
831         case 002:       /* (((e >>s c2) & c3) <<u c1) */
832                 if(topbit(c3) >= (32-c2))
833                         break;
834         case 001:       /* (((e >>u c2) & c3) <<u c1) */
835                 if(c1 > c2) {
836                         c3 <<= c2;
837                         c1 -= c2;
838                         o = OASHL;
839                         goto rewrite1;
840                 }
841                 c3 <<= c1;
842                 if(c1 == c2)
843                         goto rewrite0;
844                 c1 = c2-c1;
845                 o = OLSHR;
846                 goto rewrite2;
847
848         case 022:       /* (((e >>s c2) & c3) >>s c1) */
849                 if(c2 <= 0)
850                         break;
851         case 012:       /* (((e >>s c2) & c3) >>u c1) */
852                 if(topbit(c3) >= (32-c2))
853                         break;
854                 goto s11;
855         case 021:       /* (((e >>u c2) & c3) >>s c1) */
856                 if(topbit(c3) >= 31 && c2 <= 0)
857                         break;
858                 goto s11;
859         case 011:       /* (((e >>u c2) & c3) >>u c1) */
860         s11:
861                 c3 <<= c2;
862                 c1 += c2;
863                 if(c1 >= 32)
864                         break;
865                 o = OLSHR;
866                 goto rewrite1;
867
868         case 020:       /* (((e <<u c2) & c3) >>s c1) */
869                 if(topbit(c3) >= 31)
870                         break;
871         case 010:       /* (((e <<u c2) & c3) >>u c1) */
872                 c3 >>= c1;
873                 if(c1 == c2)
874                         goto rewrite0;
875                 if(c1 > c2) {
876                         c1 -= c2;
877                         goto rewrite2;
878                 }
879                 c1 = c2 - c1;
880                 o = OASHL;
881                 goto rewrite2;
882         }
883         return;
884
885 rewrite0:       /* get rid of both shifts */
886 if(debug['<'])prtree(n, "rewrite0");
887         *n = *n->left;
888         n->left = n->left->left;
889         n->right->vconst = c3;
890         return;
891 rewrite1:       /* get rid of lower shift */
892 if(debug['<'])prtree(n, "rewrite1");
893         n->left->left = n->left->left->left;
894         n->left->right->vconst = c3;
895         n->right->vconst = c1;
896         n->op = o;
897         return;
898 rewrite2:       /* get rid of upper shift */
899 if(debug['<'])prtree(n, "rewrite2");
900         *n = *n->left;
901         n->right->vconst = c3;
902         n->left->right->vconst = c1;
903         n->left->op = o;
904 }
905
906 int
907 side(Node *n)
908 {
909
910 loop:
911         if(n != Z)
912         switch(n->op) {
913         case OCAST:
914         case ONOT:
915         case OADDR:
916         case OIND:
917                 n = n->left;
918                 goto loop;
919
920         case OCOND:
921                 if(side(n->left))
922                         break;
923                 n = n->right;
924
925         case OEQ:
926         case ONE:
927         case OLT:
928         case OGE:
929         case OGT:
930         case OLE:
931         case OADD:
932         case OSUB:
933         case OMUL:
934         case OLMUL:
935         case ODIV:
936         case OLDIV:
937         case OLSHR:
938         case OASHL:
939         case OASHR:
940         case OAND:
941         case OOR:
942         case OXOR:
943         case OMOD:
944         case OLMOD:
945         case OANDAND:
946         case OOROR:
947         case OCOMMA:
948         case ODOT:
949                 if(side(n->left))
950                         break;
951                 n = n->right;
952                 goto loop;
953
954         case OSIGN:
955         case OSIZE:
956         case OCONST:
957         case OSTRING:
958         case OLSTRING:
959         case ONAME:
960                 return 0;
961         }
962         return 1;
963 }
964
965 int
966 vconst(Node *n)
967 {
968         int i;
969
970         if(n == Z)
971                 goto no;
972         if(n->op != OCONST)
973                 goto no;
974         if(n->type == T)
975                 goto no;
976         switch(n->type->etype)
977         {
978         case TFLOAT:
979         case TDOUBLE:
980                 i = 100;
981                 if(n->fconst > i || n->fconst < -i)
982                         goto no;
983                 i = n->fconst;
984                 if(i != n->fconst)
985                         goto no;
986                 return i;
987
988         case TVLONG:
989         case TUVLONG:
990                 i = n->vconst;
991                 if(i != n->vconst)
992                         goto no;
993                 return i;
994
995         case TCHAR:
996         case TUCHAR:
997         case TSHORT:
998         case TUSHORT:
999         case TINT:
1000         case TUINT:
1001         case TLONG:
1002         case TULONG:
1003         case TIND:
1004                 i = n->vconst;
1005                 if(i != n->vconst)
1006                         goto no;
1007                 return i;
1008         }
1009 no:
1010         return -159;    /* first uninteresting constant */
1011 }
1012
1013 /*
1014  * return log(n) if n is a power of 2 constant
1015  */
1016 int
1017 log2(uvlong v)
1018 {
1019         int s, i;
1020         uvlong m;
1021
1022         s = 0;
1023         m = MASK(8*sizeof(uvlong));
1024         for(i=32; i; i>>=1) {
1025                 m >>= i;
1026                 if(!(v & m)) {
1027                         v >>= i;
1028                         s += i;
1029                 }
1030         }
1031         if(v == 1)
1032                 return s;
1033         return -1;
1034 }
1035
1036 int
1037 vlog(Node *n)
1038 {
1039         if(n->op != OCONST)
1040                 goto bad;
1041         if(typefd[n->type->etype])
1042                 goto bad;
1043
1044         return log2(n->vconst);
1045
1046 bad:
1047         return -1;
1048 }
1049
1050 int
1051 topbit(ulong v)
1052 {
1053         int i;
1054
1055         for(i = -1; v; i++)
1056                 v >>= 1;
1057         return i;
1058 }
1059
1060 /*
1061  * try to cast a constant down
1062  * rather than cast a variable up
1063  * example:
1064  *      if(c == 'a')
1065  */
1066 void
1067 relcon(Node *l, Node *r)
1068 {
1069         vlong v;
1070
1071         if(l->op != OCONST)
1072                 return;
1073         if(r->op != OCAST)
1074                 return;
1075         if(!nilcast(r->left->type, r->type))
1076                 return;
1077         switch(r->type->etype) {
1078         default:
1079                 return;
1080         case TCHAR:
1081         case TUCHAR:
1082         case TSHORT:
1083         case TUSHORT:
1084                 v = convvtox(l->vconst, r->type->etype);
1085                 if(v != l->vconst)
1086                         return;
1087                 break;
1088         }
1089         l->type = r->left->type;
1090         *r = *r->left;
1091 }
1092
1093 int
1094 relindex(int o)
1095 {
1096
1097         switch(o) {
1098         default:
1099                 diag(Z, "bad in relindex: %O", o);
1100         case OEQ: return 0;
1101         case ONE: return 1;
1102         case OLE: return 2;
1103         case OLS: return 3;
1104         case OLT: return 4;
1105         case OLO: return 5;
1106         case OGE: return 6;
1107         case OHS: return 7;
1108         case OGT: return 8;
1109         case OHI: return 9;
1110         }
1111 }
1112
1113 Node*
1114 invert(Node *n)
1115 {
1116         Node *i;
1117
1118         if(n == Z || n->op != OLIST)
1119                 return n;
1120         i = n;
1121         for(n = n->left; n != Z; n = n->left) {
1122                 if(n->op != OLIST)
1123                         break;
1124                 i->left = n->right;
1125                 n->right = i;
1126                 i = n;
1127         }
1128         i->left = n;
1129         return i;
1130 }
1131
1132 int
1133 bitno(long b)
1134 {
1135         int i;
1136
1137         for(i=0; i<32; i++)
1138                 if(b & (1L<<i))
1139                         return i;
1140         diag(Z, "bad in bitno");
1141         return 0;
1142 }
1143
1144 long
1145 typebitor(long a, long b)
1146 {
1147         long c;
1148
1149         c = a | b;
1150         if(a & b)
1151                 if((a & b) == BLONG)
1152                         c |= BVLONG;            /* long long => vlong */
1153                 else
1154                         warn(Z, "once is enough: %Q", a & b);
1155         return c;
1156 }
1157
1158 void
1159 diag(Node *n, char *fmt, ...)
1160 {
1161         char buf[STRINGSZ];
1162         va_list arg;
1163
1164         va_start(arg, fmt);
1165         vseprint(buf, buf+sizeof(buf), fmt, arg);
1166         va_end(arg);
1167         Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1168
1169         if(debug['X']){
1170                 Bflush(&diagbuf);
1171                 abort();
1172         }
1173         if(n != Z)
1174         if(debug['v'])
1175                 prtree(n, "diagnostic");
1176
1177         nerrors++;
1178         if(nerrors > 10) {
1179                 Bprint(&diagbuf, "too many errors\n");
1180                 errorexit();
1181         }
1182 }
1183
1184 void
1185 warn(Node *n, char *fmt, ...)
1186 {
1187         char buf[STRINGSZ];
1188         va_list arg;
1189
1190         if(debug['w']) {
1191                 Bprint(&diagbuf, "warning: ");
1192                 va_start(arg, fmt);
1193                 vseprint(buf, buf+sizeof(buf), fmt, arg);
1194                 va_end(arg);
1195                 Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1196
1197                 if(n != Z)
1198                 if(debug['v'])
1199                         prtree(n, "warning");
1200         }
1201 }
1202
1203 void
1204 yyerror(char *fmt, ...)
1205 {
1206         char buf[STRINGSZ];
1207         va_list arg;
1208
1209         /*
1210          * hack to intercept message from yaccpar
1211          */
1212         if(strcmp(fmt, "syntax error") == 0) {
1213                 yyerror("syntax error, last name: %s", symb);
1214                 return;
1215         }
1216         va_start(arg, fmt);
1217         vseprint(buf, buf+sizeof(buf), fmt, arg);
1218         va_end(arg);
1219         Bprint(&diagbuf, "%L %s\n", lineno, buf);
1220         nerrors++;
1221         if(nerrors > 10) {
1222                 Bprint(&diagbuf, "too many errors\n");
1223                 errorexit();
1224         }
1225 }
1226
1227 void
1228 fatal(Node *n, char *fmt, ...)
1229 {
1230         char buf[STRINGSZ];
1231         va_list arg;
1232
1233         va_start(arg, fmt);
1234         vseprint(buf, buf+sizeof(buf), fmt, arg);
1235         va_end(arg);
1236         Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1237
1238         if(debug['X']){
1239                 Bflush(&diagbuf);
1240                 abort();
1241         }
1242         if(n != Z)
1243         if(debug['v'])
1244                 prtree(n, "diagnostic");
1245
1246         nerrors++;
1247         errorexit();
1248 }
1249
1250 ulong   thash1  = 0x2edab8c9;
1251 ulong   thash2  = 0x1dc74fb8;
1252 ulong   thash3  = 0x1f241331;
1253 ulong   thash[NALLTYPES];
1254 Init    thashinit[] =
1255 {
1256         TXXX,           0x17527bbd,     0,
1257         TCHAR,          0x5cedd32b,     0,
1258         TUCHAR,         0x552c4454,     0,
1259         TSHORT,         0x63040b4b,     0,
1260         TUSHORT,        0x32a45878,     0,
1261         TINT,           0x4151d5bd,     0,
1262         TUINT,          0x5ae707d6,     0,
1263         TLONG,          0x5ef20f47,     0,
1264         TULONG,         0x36d8eb8f,     0,
1265         TVLONG,         0x6e5e9590,     0,
1266         TUVLONG,        0x75910105,     0,
1267         TFLOAT,         0x25fd7af1,     0,
1268         TDOUBLE,        0x7c40a1b2,     0,
1269         TIND,           0x1b832357,     0,
1270         TFUNC,          0x6babc9cb,     0,
1271         TARRAY,         0x7c50986d,     0,
1272         TVOID,          0x44112eff,     0,
1273         TSTRUCT,        0x7c2da3bf,     0,
1274         TUNION,         0x3eb25e98,     0,
1275         TENUM,          0x44b54f61,     0,
1276         TFILE,          0x19242ac3,     0,
1277         TOLD,           0x22b15988,     0,
1278         TDOT,           0x0204f6b3,     0,
1279         -1,             0,              0,
1280 };
1281
1282 char*   bnames[NALIGN];
1283 Init    bnamesinit[] =
1284 {
1285         Axxx,   0,      "Axxx",
1286         Ael1,   0,      "el1",
1287         Ael2,   0,      "el2",
1288         Asu2,   0,      "su2",
1289         Aarg0,  0,      "arg0",
1290         Aarg1,  0,      "arg1",
1291         Aarg2,  0,      "arg2",
1292         Aaut3,  0,      "aut3",
1293         -1,     0,      0,
1294 };
1295
1296 char*   tnames[NALLTYPES];
1297 Init    tnamesinit[] =
1298 {
1299         TXXX,           0,      "TXXX",
1300         TCHAR,          0,      "CHAR",
1301         TUCHAR,         0,      "UCHAR",
1302         TSHORT,         0,      "SHORT",
1303         TUSHORT,        0,      "USHORT",
1304         TINT,           0,      "INT",
1305         TUINT,          0,      "UINT",
1306         TLONG,          0,      "LONG",
1307         TULONG,         0,      "ULONG",
1308         TVLONG,         0,      "VLONG",
1309         TUVLONG,        0,      "UVLONG",
1310         TFLOAT,         0,      "FLOAT",
1311         TDOUBLE,        0,      "DOUBLE",
1312         TIND,           0,      "IND",
1313         TFUNC,          0,      "FUNC",
1314         TARRAY,         0,      "ARRAY",
1315         TVOID,          0,      "VOID",
1316         TSTRUCT,        0,      "STRUCT",
1317         TUNION,         0,      "UNION",
1318         TENUM,          0,      "ENUM",
1319         TFILE,          0,      "FILE",
1320         TOLD,           0,      "OLD",
1321         TDOT,           0,      "DOT",
1322         -1,             0,      0,
1323 };
1324
1325 char*   gnames[NGTYPES];
1326 Init    gnamesinit[] =
1327 {
1328         GXXX,                   0,      "GXXX",
1329         GCONSTNT,               0,      "CONST",
1330         GVOLATILE,              0,      "VOLATILE",
1331         GVOLATILE|GCONSTNT,     0,      "CONST-VOLATILE",
1332         -1,                     0,      0,
1333 };
1334
1335 char*   qnames[NALLTYPES];
1336 Init    qnamesinit[] =
1337 {
1338         TXXX,           0,      "TXXX",
1339         TCHAR,          0,      "CHAR",
1340         TUCHAR,         0,      "UCHAR",
1341         TSHORT,         0,      "SHORT",
1342         TUSHORT,        0,      "USHORT",
1343         TINT,           0,      "INT",
1344         TUINT,          0,      "UINT",
1345         TLONG,          0,      "LONG",
1346         TULONG,         0,      "ULONG",
1347         TVLONG,         0,      "VLONG",
1348         TUVLONG,        0,      "UVLONG",
1349         TFLOAT,         0,      "FLOAT",
1350         TDOUBLE,        0,      "DOUBLE",
1351         TIND,           0,      "IND",
1352         TFUNC,          0,      "FUNC",
1353         TARRAY,         0,      "ARRAY",
1354         TVOID,          0,      "VOID",
1355         TSTRUCT,        0,      "STRUCT",
1356         TUNION,         0,      "UNION",
1357         TENUM,          0,      "ENUM",
1358
1359         TAUTO,          0,      "AUTO",
1360         TEXTERN,        0,      "EXTERN",
1361         TSTATIC,        0,      "STATIC",
1362         TTYPEDEF,       0,      "TYPEDEF",
1363         TTYPESTR,       0,      "TYPESTR",
1364         TREGISTER,      0,      "REGISTER",
1365         TCONSTNT,       0,      "CONSTNT",
1366         TVOLATILE,      0,      "VOLATILE",
1367         TUNSIGNED,      0,      "UNSIGNED",
1368         TSIGNED,        0,      "SIGNED",
1369         TDOT,           0,      "DOT",
1370         TFILE,          0,      "FILE",
1371         TOLD,           0,      "OLD",
1372         -1,             0,      0,
1373 };
1374 char*   cnames[NCTYPES];
1375 Init    cnamesinit[] =
1376 {
1377         CXXX,           0,      "CXXX",
1378         CAUTO,          0,      "AUTO",
1379         CEXTERN,        0,      "EXTERN",
1380         CGLOBL,         0,      "GLOBL",
1381         CSTATIC,        0,      "STATIC",
1382         CLOCAL,         0,      "LOCAL",
1383         CTYPEDEF,       0,      "TYPEDEF",
1384         CTYPESTR,       0,      "TYPESTR",
1385         CPARAM,         0,      "PARAM",
1386         CSELEM,         0,      "SELEM",
1387         CLABEL,         0,      "LABEL",
1388         CEXREG,         0,      "EXREG",
1389         -1,             0,      0,
1390 };
1391
1392 char*   onames[OEND+1];
1393 Init    onamesinit[] =
1394 {
1395         OXXX,           0,      "OXXX",
1396         OADD,           0,      "ADD",
1397         OADDR,          0,      "ADDR",
1398         OAND,           0,      "AND",
1399         OANDAND,        0,      "ANDAND",
1400         OARRAY,         0,      "ARRAY",
1401         OAS,            0,      "AS",
1402         OASI,           0,      "ASI",
1403         OASADD,         0,      "ASADD",
1404         OASAND,         0,      "ASAND",
1405         OASASHL,        0,      "ASASHL",
1406         OASASHR,        0,      "ASASHR",
1407         OASDIV,         0,      "ASDIV",
1408         OASHL,          0,      "ASHL",
1409         OASHR,          0,      "ASHR",
1410         OASLDIV,        0,      "ASLDIV",
1411         OASLMOD,        0,      "ASLMOD",
1412         OASLMUL,        0,      "ASLMUL",
1413         OASLSHR,        0,      "ASLSHR",
1414         OASMOD,         0,      "ASMOD",
1415         OASMUL,         0,      "ASMUL",
1416         OASOR,          0,      "ASOR",
1417         OASSUB,         0,      "ASSUB",
1418         OASXOR,         0,      "ASXOR",
1419         OBIT,           0,      "BIT",
1420         OBREAK,         0,      "BREAK",
1421         OCASE,          0,      "CASE",
1422         OCAST,          0,      "CAST",
1423         OCOMMA,         0,      "COMMA",
1424         OCOND,          0,      "COND",
1425         OCONST,         0,      "CONST",
1426         OCONTINUE,      0,      "CONTINUE",
1427         ODIV,           0,      "DIV",
1428         ODOT,           0,      "DOT",
1429         ODOTDOT,        0,      "DOTDOT",
1430         ODWHILE,        0,      "DWHILE",
1431         OENUM,          0,      "ENUM",
1432         OEQ,            0,      "EQ",
1433         OFOR,           0,      "FOR",
1434         OFUNC,          0,      "FUNC",
1435         OGE,            0,      "GE",
1436         OGOTO,          0,      "GOTO",
1437         OGT,            0,      "GT",
1438         OHI,            0,      "HI",
1439         OHS,            0,      "HS",
1440         OIF,            0,      "IF",
1441         OIND,           0,      "IND",
1442         OINDREG,        0,      "INDREG",
1443         OINIT,          0,      "INIT",
1444         OLABEL,         0,      "LABEL",
1445         OLDIV,          0,      "LDIV",
1446         OLE,            0,      "LE",
1447         OLIST,          0,      "LIST",
1448         OLMOD,          0,      "LMOD",
1449         OLMUL,          0,      "LMUL",
1450         OLO,            0,      "LO",
1451         OLS,            0,      "LS",
1452         OLSHR,          0,      "LSHR",
1453         OLT,            0,      "LT",
1454         OMOD,           0,      "MOD",
1455         OMUL,           0,      "MUL",
1456         ONAME,          0,      "NAME",
1457         ONE,            0,      "NE",
1458         ONOT,           0,      "NOT",
1459         OOR,            0,      "OR",
1460         OOROR,          0,      "OROR",
1461         OPOSTDEC,       0,      "POSTDEC",
1462         OPOSTINC,       0,      "POSTINC",
1463         OPREDEC,        0,      "PREDEC",
1464         OPREINC,        0,      "PREINC",
1465         OPROTO,         0,      "PROTO",
1466         OREGISTER,      0,      "REGISTER",
1467         ORETURN,        0,      "RETURN",
1468         OSET,           0,      "SET",
1469         OSIGN,          0,      "SIGN",
1470         OSIZE,          0,      "SIZE",
1471         OSTRING,        0,      "STRING",
1472         OLSTRING,       0,      "LSTRING",
1473         OSTRUCT,        0,      "STRUCT",
1474         OSUB,           0,      "SUB",
1475         OSWITCH,        0,      "SWITCH",
1476         OUNION,         0,      "UNION",
1477         OUSED,          0,      "USED",
1478         OWHILE,         0,      "WHILE",
1479         OXOR,           0,      "XOR",
1480         OPOS,           0,      "POS",
1481         ONEG,           0,      "NEG",
1482         OCOM,           0,      "COM",
1483         OELEM,          0,      "ELEM",
1484         OTST,           0,      "TST",
1485         OINDEX,         0,      "INDEX",
1486         OFAS,           0,      "FAS",
1487         OREGPAIR,       0,      "REGPAIR",
1488         OEND,           0,      "END",
1489         -1,             0,      0,
1490 };
1491
1492 /*      OEQ, ONE, OLE, OLS, OLT, OLO, OGE, OHS, OGT, OHI */
1493 char    comrel[12] =
1494 {
1495         ONE, OEQ, OGT, OHI, OGE, OHS, OLT, OLO, OLE, OLS,
1496 };
1497 char    invrel[12] =
1498 {
1499         OEQ, ONE, OGE, OHS, OGT, OHI, OLE, OLS, OLT, OLO,
1500 };
1501 char    logrel[12] =
1502 {
1503         OEQ, ONE, OLS, OLS, OLO, OLO, OHS, OHS, OHI, OHI,
1504 };
1505
1506 char    typei[NTYPE];
1507 int     typeiinit[] =
1508 {
1509         TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TVLONG, TUVLONG, -1,
1510 };
1511 char    typeu[NTYPE];
1512 int     typeuinit[] =
1513 {
1514         TUCHAR, TUSHORT, TUINT, TULONG, TUVLONG, TIND, -1,
1515 };
1516
1517 char    typesuv[NTYPE];
1518 int     typesuvinit[] =
1519 {
1520         TVLONG, TUVLONG, TSTRUCT, TUNION, -1,
1521 };
1522
1523 char    typeilp[NTYPE];
1524 int     typeilpinit[] =
1525 {
1526         TINT, TUINT, TLONG, TULONG, TIND, -1
1527 };
1528
1529 char    typechl[NTYPE];
1530 char    typechlv[NTYPE];
1531 char typechlvp[NTYPE];
1532 int     typechlinit[] =
1533 {
1534         TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, -1,
1535 };
1536
1537 char    typechlp[NTYPE];
1538 int     typechlpinit[] =
1539 {
1540         TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TIND, -1,
1541 };
1542
1543 char    typechlpfd[NTYPE];
1544 int     typechlpfdinit[] =
1545 {
1546         TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TFLOAT, TDOUBLE, TIND, -1,
1547 };
1548
1549 char    typec[NTYPE];
1550 int     typecinit[] =
1551 {
1552         TCHAR, TUCHAR, -1
1553 };
1554
1555 char    typeh[NTYPE];
1556 int     typehinit[] =
1557 {
1558         TSHORT, TUSHORT, -1,
1559 };
1560
1561 char    typeil[NTYPE];
1562 int     typeilinit[] =
1563 {
1564         TINT, TUINT, TLONG, TULONG, -1,
1565 };
1566
1567 char    typev[NTYPE];
1568 int     typevinit[] =
1569 {
1570         TVLONG, TUVLONG, -1,
1571 };
1572
1573 char    typefd[NTYPE];
1574 int     typefdinit[] =
1575 {
1576         TFLOAT, TDOUBLE, -1,
1577 };
1578
1579 char    typeaf[NTYPE];
1580 int     typeafinit[] =
1581 {
1582         TFUNC, TARRAY, -1,
1583 };
1584
1585 char    typesu[NTYPE];
1586 int     typesuinit[] =
1587 {
1588         TSTRUCT, TUNION, -1,
1589 };
1590
1591 long    tasign[NTYPE];
1592 Init    tasigninit[] =
1593 {
1594         TCHAR,          BNUMBER,        0,
1595         TUCHAR,         BNUMBER,        0,
1596         TSHORT,         BNUMBER,        0,
1597         TUSHORT,        BNUMBER,        0,
1598         TINT,           BNUMBER,        0,
1599         TUINT,          BNUMBER,        0,
1600         TLONG,          BNUMBER,        0,
1601         TULONG,         BNUMBER,        0,
1602         TVLONG,         BNUMBER,        0,
1603         TUVLONG,        BNUMBER,        0,
1604         TFLOAT,         BNUMBER,        0,
1605         TDOUBLE,        BNUMBER,        0,
1606         TIND,           BIND,           0,
1607         TSTRUCT,        BSTRUCT,        0,
1608         TUNION,         BUNION,         0,
1609         -1,             0,              0,
1610 };
1611
1612 long    tasadd[NTYPE];
1613 Init    tasaddinit[] =
1614 {
1615         TCHAR,          BNUMBER,        0,
1616         TUCHAR,         BNUMBER,        0,
1617         TSHORT,         BNUMBER,        0,
1618         TUSHORT,        BNUMBER,        0,
1619         TINT,           BNUMBER,        0,
1620         TUINT,          BNUMBER,        0,
1621         TLONG,          BNUMBER,        0,
1622         TULONG,         BNUMBER,        0,
1623         TVLONG,         BNUMBER,        0,
1624         TUVLONG,        BNUMBER,        0,
1625         TFLOAT,         BNUMBER,        0,
1626         TDOUBLE,        BNUMBER,        0,
1627         TIND,           BINTEGER,       0,
1628         -1,             0,              0,
1629 };
1630
1631 long    tcast[NTYPE];
1632 Init    tcastinit[] =
1633 {
1634         TCHAR,          BNUMBER|BIND|BVOID,     0,
1635         TUCHAR,         BNUMBER|BIND|BVOID,     0,
1636         TSHORT,         BNUMBER|BIND|BVOID,     0,
1637         TUSHORT,        BNUMBER|BIND|BVOID,     0,
1638         TINT,           BNUMBER|BIND|BVOID,     0,
1639         TUINT,          BNUMBER|BIND|BVOID,     0,
1640         TLONG,          BNUMBER|BIND|BVOID,     0,
1641         TULONG,         BNUMBER|BIND|BVOID,     0,
1642         TVLONG,         BNUMBER|BIND|BVOID,     0,
1643         TUVLONG,        BNUMBER|BIND|BVOID,     0,
1644         TFLOAT,         BNUMBER|BVOID,          0,
1645         TDOUBLE,        BNUMBER|BVOID,          0,
1646         TIND,           BINTEGER|BIND|BVOID,    0,
1647         TVOID,          BVOID,                  0,
1648         TSTRUCT,        BSTRUCT|BVOID,          0,
1649         TUNION,         BUNION|BVOID,           0,
1650         -1,             0,                      0,
1651 };
1652
1653 long    tadd[NTYPE];
1654 Init    taddinit[] =
1655 {
1656         TCHAR,          BNUMBER|BIND,   0,
1657         TUCHAR,         BNUMBER|BIND,   0,
1658         TSHORT,         BNUMBER|BIND,   0,
1659         TUSHORT,        BNUMBER|BIND,   0,
1660         TINT,           BNUMBER|BIND,   0,
1661         TUINT,          BNUMBER|BIND,   0,
1662         TLONG,          BNUMBER|BIND,   0,
1663         TULONG,         BNUMBER|BIND,   0,
1664         TVLONG,         BNUMBER|BIND,   0,
1665         TUVLONG,        BNUMBER|BIND,   0,
1666         TFLOAT,         BNUMBER,        0,
1667         TDOUBLE,        BNUMBER,        0,
1668         TIND,           BINTEGER,       0,
1669         -1,             0,              0,
1670 };
1671
1672 long    tsub[NTYPE];
1673 Init    tsubinit[] =
1674 {
1675         TCHAR,          BNUMBER,        0,
1676         TUCHAR,         BNUMBER,        0,
1677         TSHORT,         BNUMBER,        0,
1678         TUSHORT,        BNUMBER,        0,
1679         TINT,           BNUMBER,        0,
1680         TUINT,          BNUMBER,        0,
1681         TLONG,          BNUMBER,        0,
1682         TULONG,         BNUMBER,        0,
1683         TVLONG,         BNUMBER,        0,
1684         TUVLONG,        BNUMBER,        0,
1685         TFLOAT,         BNUMBER,        0,
1686         TDOUBLE,        BNUMBER,        0,
1687         TIND,           BINTEGER|BIND,  0,
1688         -1,             0,              0,
1689 };
1690
1691 long    tmul[NTYPE];
1692 Init    tmulinit[] =
1693 {
1694         TCHAR,          BNUMBER,        0,
1695         TUCHAR,         BNUMBER,        0,
1696         TSHORT,         BNUMBER,        0,
1697         TUSHORT,        BNUMBER,        0,
1698         TINT,           BNUMBER,        0,
1699         TUINT,          BNUMBER,        0,
1700         TLONG,          BNUMBER,        0,
1701         TULONG,         BNUMBER,        0,
1702         TVLONG,         BNUMBER,        0,
1703         TUVLONG,        BNUMBER,        0,
1704         TFLOAT,         BNUMBER,        0,
1705         TDOUBLE,        BNUMBER,        0,
1706         -1,             0,              0,
1707 };
1708
1709 long    tand[NTYPE];
1710 Init    tandinit[] =
1711 {
1712         TCHAR,          BINTEGER,       0,
1713         TUCHAR,         BINTEGER,       0,
1714         TSHORT,         BINTEGER,       0,
1715         TUSHORT,        BINTEGER,       0,
1716         TINT,           BNUMBER,        0,
1717         TUINT,          BNUMBER,        0,
1718         TLONG,          BINTEGER,       0,
1719         TULONG,         BINTEGER,       0,
1720         TVLONG,         BINTEGER,       0,
1721         TUVLONG,        BINTEGER,       0,
1722         -1,             0,              0,
1723 };
1724
1725 long    trel[NTYPE];
1726 Init    trelinit[] =
1727 {
1728         TCHAR,          BNUMBER,        0,
1729         TUCHAR,         BNUMBER,        0,
1730         TSHORT,         BNUMBER,        0,
1731         TUSHORT,        BNUMBER,        0,
1732         TINT,           BNUMBER,        0,
1733         TUINT,          BNUMBER,        0,
1734         TLONG,          BNUMBER,        0,
1735         TULONG,         BNUMBER,        0,
1736         TVLONG,         BNUMBER,        0,
1737         TUVLONG,        BNUMBER,        0,
1738         TFLOAT,         BNUMBER,        0,
1739         TDOUBLE,        BNUMBER,        0,
1740         TIND,           BIND,           0,
1741         -1,             0,              0,
1742 };
1743
1744 long    tfunct[1] =
1745 {
1746         BFUNC,
1747 };
1748
1749 long    tindir[1] =
1750 {
1751         BIND,
1752 };
1753
1754 long    tdot[1] =
1755 {
1756         BSTRUCT|BUNION,
1757 };
1758
1759 long    tnot[1] =
1760 {
1761         BNUMBER|BIND,
1762 };
1763
1764 long    targ[1] =
1765 {
1766         BNUMBER|BIND|BSTRUCT|BUNION,
1767 };
1768
1769 char    tab[NTYPE][NTYPE] =
1770 {
1771 /*TXXX*/        { 0,
1772                 },
1773
1774 /*TCHAR*/       { 0,    TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG,
1775                         TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1776                 },
1777 /*TUCHAR*/      { 0,    TUCHAR, TUCHAR, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
1778                         TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1779                 },
1780 /*TSHORT*/      { 0,    TSHORT, TUSHORT, TSHORT, TUSHORT, TINT, TUINT, TLONG,
1781                         TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1782                 },
1783 /*TUSHORT*/     { 0,    TUSHORT, TUSHORT, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
1784                         TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1785                 },
1786 /*TINT*/        { 0,    TINT, TUINT, TINT, TUINT, TINT, TUINT, TLONG,
1787                         TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1788                 },
1789 /*TUINT*/       { 0,    TUINT, TUINT, TUINT, TUINT, TUINT, TUINT, TULONG,
1790                         TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1791                 },
1792 /*TLONG*/       { 0,    TLONG, TULONG, TLONG, TULONG, TLONG, TULONG, TLONG,
1793                         TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1794                 },
1795 /*TULONG*/      { 0,    TULONG, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG,
1796                         TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1797                 },
1798 /*TVLONG*/      { 0,    TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG,
1799                         TUVLONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1800                 },
1801 /*TUVLONG*/     { 0,    TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG,
1802                         TUVLONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1803                 },
1804 /*TFLOAT*/      { 0,    TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT,
1805                         TFLOAT, TFLOAT, TFLOAT, TFLOAT, TDOUBLE, TIND,
1806                 },
1807 /*TDOUBLE*/     { 0,    TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE,
1808                         TDOUBLE, TDOUBLE, TDOUBLE, TFLOAT, TDOUBLE, TIND,
1809                 },
1810 /*TIND*/        { 0,    TIND, TIND, TIND, TIND, TIND, TIND, TIND,
1811                          TIND, TIND, TIND, TIND, TIND, TIND,
1812                 },
1813 };
1814
1815 void
1816 urk(char *name, int max, int i)
1817 {
1818         if(i >= max) {
1819                 fprint(2, "bad tinit: %s %d>=%d\n", name, i, max);
1820                 exits("init");
1821         }
1822 }
1823
1824 void
1825 tinit(void)
1826 {
1827         int *ip;
1828         Init *p;
1829
1830         for(p=thashinit; p->code >= 0; p++) {
1831                 urk("thash", nelem(thash), p->code);
1832                 thash[p->code] = p->value;
1833         }
1834         for(p=bnamesinit; p->code >= 0; p++) {
1835                 urk("bnames", nelem(bnames), p->code);
1836                 bnames[p->code] = p->s;
1837         }
1838         for(p=tnamesinit; p->code >= 0; p++) {
1839                 urk("tnames", nelem(tnames), p->code);
1840                 tnames[p->code] = p->s;
1841         }
1842         for(p=gnamesinit; p->code >= 0; p++) {
1843                 urk("gnames", nelem(gnames), p->code);
1844                 gnames[p->code] = p->s;
1845         }
1846         for(p=qnamesinit; p->code >= 0; p++) {
1847                 urk("qnames", nelem(qnames), p->code);
1848                 qnames[p->code] = p->s;
1849         }
1850         for(p=cnamesinit; p->code >= 0; p++) {
1851                 urk("cnames", nelem(cnames), p->code);
1852                 cnames[p->code] = p->s;
1853         }
1854         for(p=onamesinit; p->code >= 0; p++) {
1855                 urk("onames", nelem(onames), p->code);
1856                 onames[p->code] = p->s;
1857         }
1858         for(ip=typeiinit; *ip>=0; ip++) {
1859                 urk("typei", nelem(typei), *ip);
1860                 typei[*ip] = 1;
1861         }
1862         for(ip=typeuinit; *ip>=0; ip++) {
1863                 urk("typeu", nelem(typeu), *ip);
1864                 typeu[*ip] = 1;
1865         }
1866         for(ip=typesuvinit; *ip>=0; ip++) {
1867                 urk("typesuv", nelem(typesuv), *ip);
1868                 typesuv[*ip] = 1;
1869         }
1870         for(ip=typeilpinit; *ip>=0; ip++) {
1871                 urk("typeilp", nelem(typeilp), *ip);
1872                 typeilp[*ip] = 1;
1873         }
1874         for(ip=typechlinit; *ip>=0; ip++) {
1875                 urk("typechl", nelem(typechl), *ip);
1876                 typechl[*ip] = 1;
1877                 typechlv[*ip] = 1;
1878                 typechlvp[*ip] = 1;
1879         }
1880         for(ip=typechlpinit; *ip>=0; ip++) {
1881                 urk("typechlp", nelem(typechlp), *ip);
1882                 typechlp[*ip] = 1;
1883                 typechlvp[*ip] = 1;
1884         }
1885         for(ip=typechlpfdinit; *ip>=0; ip++) {
1886                 urk("typechlpfd", nelem(typechlpfd), *ip);
1887                 typechlpfd[*ip] = 1;
1888         }
1889         for(ip=typecinit; *ip>=0; ip++) {
1890                 urk("typec", nelem(typec), *ip);
1891                 typec[*ip] = 1;
1892         }
1893         for(ip=typehinit; *ip>=0; ip++) {
1894                 urk("typeh", nelem(typeh), *ip);
1895                 typeh[*ip] = 1;
1896         }
1897         for(ip=typeilinit; *ip>=0; ip++) {
1898                 urk("typeil", nelem(typeil), *ip);
1899                 typeil[*ip] = 1;
1900         }
1901         for(ip=typevinit; *ip>=0; ip++) {
1902                 urk("typev", nelem(typev), *ip);
1903                 typev[*ip] = 1;
1904                 typechlv[*ip] = 1;
1905                 typechlvp[*ip] = 1;
1906         }
1907         for(ip=typefdinit; *ip>=0; ip++) {
1908                 urk("typefd", nelem(typefd), *ip);
1909                 typefd[*ip] = 1;
1910         }
1911         for(ip=typeafinit; *ip>=0; ip++) {
1912                 urk("typeaf", nelem(typeaf), *ip);
1913                 typeaf[*ip] = 1;
1914         }
1915         for(ip=typesuinit; *ip >= 0; ip++) {
1916                 urk("typesu", nelem(typesu), *ip);
1917                 typesu[*ip] = 1;
1918         }
1919         for(p=tasigninit; p->code >= 0; p++) {
1920                 urk("tasign", nelem(tasign), p->code);
1921                 tasign[p->code] = p->value;
1922         }
1923         for(p=tasaddinit; p->code >= 0; p++) {
1924                 urk("tasadd", nelem(tasadd), p->code);
1925                 tasadd[p->code] = p->value;
1926         }
1927         for(p=tcastinit; p->code >= 0; p++) {
1928                 urk("tcast", nelem(tcast), p->code);
1929                 tcast[p->code] = p->value;
1930         }
1931         for(p=taddinit; p->code >= 0; p++) {
1932                 urk("tadd", nelem(tadd), p->code);
1933                 tadd[p->code] = p->value;
1934         }
1935         for(p=tsubinit; p->code >= 0; p++) {
1936                 urk("tsub", nelem(tsub), p->code);
1937                 tsub[p->code] = p->value;
1938         }
1939         for(p=tmulinit; p->code >= 0; p++) {
1940                 urk("tmul", nelem(tmul), p->code);
1941                 tmul[p->code] = p->value;
1942         }
1943         for(p=tandinit; p->code >= 0; p++) {
1944                 urk("tand", nelem(tand), p->code);
1945                 tand[p->code] = p->value;
1946         }
1947         for(p=trelinit; p->code >= 0; p++) {
1948                 urk("trel", nelem(trel), p->code);
1949                 trel[p->code] = p->value;
1950         }
1951         
1952         /* 32-bit defaults */
1953         typeword = typechlp;
1954         typecmplx = typesuv;
1955 }
1956
1957 /*
1958  * return 1 if it is impossible to jump into the middle of n.
1959  */
1960 static int
1961 deadhead(Node *n, int caseok)
1962 {
1963 loop:
1964         if(n == Z)
1965                 return 1;
1966         switch(n->op) {
1967         case OLIST:
1968                 if(!deadhead(n->left, caseok))
1969                         return 0;
1970         rloop:
1971                 n = n->right;
1972                 goto loop;
1973
1974         case ORETURN:
1975                 break;
1976
1977         case OLABEL:
1978                 return 0;
1979
1980         case OGOTO:
1981                 break;
1982
1983         case OCASE:
1984                 if(!caseok)
1985                         return 0;
1986                 goto rloop;
1987
1988         case OSWITCH:
1989                 return deadhead(n->right, 1);
1990
1991         case OWHILE:
1992         case ODWHILE:
1993                 goto rloop;
1994
1995         case OFOR:
1996                 goto rloop;
1997
1998         case OCONTINUE:
1999                 break;
2000
2001         case OBREAK:
2002                 break;
2003
2004         case OIF:
2005                 return deadhead(n->right->left, caseok) && deadhead(n->right->right, caseok);
2006
2007         case OSET:
2008         case OUSED:
2009                 break;
2010         }
2011         return 1;
2012 }
2013
2014 int
2015 deadheads(Node *c)
2016 {
2017         return deadhead(c->left, 0) && deadhead(c->right, 0);
2018 }
2019
2020 int
2021 mixedasop(Type *l, Type *r)
2022 {
2023         return !typefd[l->etype] && typefd[r->etype];
2024 }