4 new(int t, Node *l, Node *r)
13 n->lineno = l->lineno;
15 n->lineno = r->lineno;
23 new1(int o, Node *l, Node *r)
33 prtree(Node *n, char *s)
36 print(" == %s ==\n", s);
42 prtree1(Node *n, int d, int f)
54 prtree1(n->left, d, 0);
55 prtree1(n->right, d, 1);
65 print(" %ld", n->xoffset);
70 print(" %ld(R%d)", n->xoffset, n->reg);
76 print(" %ld+R%d", n->xoffset, n->reg);
78 print(" R%d", n->reg);
83 print(" \"%s\"", n->cstring);
88 print(" \"%S\"", n->rstring);
98 if(typefd[n->type->etype])
99 print(" \"%.8e\"", n->fconst);
101 print(" \"%lld\"", n->vconst);
106 print(" <%d>", n->addable);
108 print(" %T", n->type);
110 print(" (%d)", n->complex);
111 print(" %L\n", n->lineno);
113 prtree1(n->left, d, 1);
115 prtree1(n->right, d, 1);
123 t = alloc(sizeof(*t));
128 t->width = ewidth[et];
147 garbt(Type *t, long b)
153 t1->garb = simpleg(b);
169 case BVOLATILE|BCONSTNT:
170 return GCONSTNT|GVOLATILE;
185 case BAUTO|BREGISTER:
189 case BEXTERN|BREGISTER:
198 diag(Z, "illegal combination of classes %Q", b);
206 b &= ~BCLASS & ~BGARB;
212 case BCHAR|BUNSIGNED:
213 return types[TUCHAR];
218 case BSHORT|BINT|BSIGNED:
219 return types[TSHORT];
221 case BUNSIGNED|BSHORT:
222 case BUNSIGNED|BSHORT|BINT:
223 return types[TUSHORT];
238 case BLONG|BINT|BSIGNED:
241 case BUNSIGNED|BLONG:
242 case BUNSIGNED|BLONG|BINT:
243 return types[TULONG];
246 case BVLONG|BLONG|BINT:
247 case BVLONG|BLONG|BSIGNED:
248 case BVLONG|BLONG|BINT|BSIGNED:
249 return types[TVLONG];
251 case BVLONG|BLONG|BUNSIGNED:
252 case BVLONG|BLONG|BINT|BUNSIGNED:
253 return types[TUVLONG];
256 return types[TFLOAT];
261 return types[TDOUBLE];
267 diag(Z, "illegal combination of types %Q", b);
272 stcompat(Node *n, Type *t1, Type *t2, long ttab[])
286 if(b == BSTRUCT || b == BUNION)
287 if(!sametype(t1, t2))
290 if(b == BIND && i == TIND)
291 if(!sametype(t1, t2))
299 tcompat(Node *n, Type *t1, Type *t2, long ttab[])
302 if(stcompat(n, t1, t2, ttab)) {
304 diag(n, "incompatible type: \"%T\" for op \"%O\"",
307 diag(n, "incompatible types: \"%T\" and \"%T\" for op \"%O\"",
315 makedot(Node *n, Type *t, long o)
320 n1 = new(OXXX, Z, Z);
326 n->addable = n1->left->addable;
329 n->addable = n->left->addable;
330 if(n->addable == 0) {
331 n1 = new1(OCONST, Z, Z);
333 n1->type = types[TLONG];
344 n1 = new1(OCONST, Z, Z);
347 t->width = types[TIND]->width;
350 n2 = new1(OADDR, n->left, Z);
353 n1 = new1(OADD, n1, n2);
362 dotsearch(Sym *s, Type *t, Node *n, long *off)
371 for(t1 = t; t1 != T; t1 = t1->down)
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)) {
395 * look it up in unnamed substructures
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);
410 diag(n, "ambiguous structure element: %s", s->name);
415 dotoffset(Type *st, Type *lt, Node *n)
423 * first try matching at the top level
424 * for matching tag names
428 for(t=lt->link; t!=T; t=t->down)
439 * second try matching at the top level
442 for(t=lt->link; t!=T; t=t->down)
444 if(sametype(st, t)) {
453 * last try matching sub-levels
455 for(t=lt->link; t!=T; t=t->down)
457 if(typesu[t->etype]) {
458 o1 = dotoffset(st, t, n);
468 diag(n, "ambiguous unnamed structure element");
473 * look into tree for floating point constant expressions
476 allfloat(Node *n, int flag)
480 if(n->type->etype != TDOUBLE)
485 n->type = types[TFLOAT];
487 case OADD: /* no need to get more exotic than this */
491 if(!allfloat(n->right, flag))
494 if(!allfloat(n->left, flag))
497 n->type = types[TFLOAT];
505 constas(Node *n, Type *il, Type *ir)
514 if(l->garb & GCONSTNT) {
515 warn(n, "assignment to a constant type (%T)", il);
521 if(l->etype != TIND || r->etype != TIND)
527 if(r->garb & GCONSTNT)
528 if(!(l->garb & GCONSTNT)) {
529 warn(n, "assignment of a constant pointer type (%T)", ir);
536 typeext1(Type *st, Node *l)
538 if(st->etype == TFLOAT && allfloat(l, 0))
543 typeext(Type *st, Node *l)
552 if(st->etype == TIND && vconst(l) == 0) {
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
566 if(typesu[st->etype] && typesu[lt->etype]) {
567 o = dotoffset(st, lt, l);
569 n1 = new1(OXXX, Z, Z);
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);
585 n1 = new1(OXXX, Z, Z);
587 n2 = new1(OCONST, Z, Z);
599 * a cast that generates no code
603 nocast(Type *t1, Type *t2)
622 * a cast that has a noop semantic
623 * (small to large, convert)
626 nilcast(Type *t1, Type *t2)
640 if(typefd[et1] && typefd[et2]) {
641 if(ewidth[et1] < ewidth[et2])
645 if(typechlp[et1] && typechlp[et2]) {
646 if(ewidth[et1] < ewidth[et2])
654 * "the usual arithmetic conversions are performed"
657 arith(Node *n, int f)
683 /* convert up to at least int */
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)
694 n->type = types[ewidth[TIND] <= ewidth[TLONG]? TLONG: TVLONG];
695 if(1 && ewidth[TIND] > ewidth[TLONG]){
696 n1 = new1(OXXX, Z, Z);
701 n->type = types[TLONG];
704 n1 = new1(OXXX, Z, Z);
708 n1 = new1(OCONST, Z, Z);
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;
727 w = n->type->link->width;
732 n1 = new1(OCONST, Z, Z);
735 n->left = new1(OMUL, n->left, n1);
736 n->left->type = n->type;
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;
748 w = n->type->link->width;
753 n1 = new1(OCONST, Z, Z);
756 n->right = new1(OMUL, n->right, n1);
757 n->right->type = n->type;
763 diag(n, "pointer addition not fully declared: %T", n->type->link);
767 * try to rewrite shift & mask
770 simplifyshift(Node *n)
773 int o, s1, s2, c1, c2;
775 if(!typechlp[n->type->etype])
790 if(n->right->op != OCONST)
792 if(n->left->op != OAND)
794 if(n->left->right->op != OCONST)
796 switch(n->left->left->op) {
809 if(n->left->left->right->op != OCONST)
812 c1 = n->right->vconst;
813 c2 = n->left->left->right->vconst;
814 c3 = n->left->right->vconst;
818 print("%.3o %ld %ld %d #%.lux\n",
819 (s1<<3)|s2, c1, c2, topbit(c3), c3);
824 case 000: /* (((e <<u c2) & c3) <<u c1) */
831 case 002: /* (((e >>s c2) & c3) <<u c1) */
832 if(topbit(c3) >= (32-c2))
834 case 001: /* (((e >>u c2) & c3) <<u c1) */
848 case 022: /* (((e >>s c2) & c3) >>s c1) */
851 case 012: /* (((e >>s c2) & c3) >>u c1) */
852 if(topbit(c3) >= (32-c2))
855 case 021: /* (((e >>u c2) & c3) >>s c1) */
856 if(topbit(c3) >= 31 && c2 <= 0)
859 case 011: /* (((e >>u c2) & c3) >>u c1) */
868 case 020: /* (((e <<u c2) & c3) >>s c1) */
871 case 010: /* (((e <<u c2) & c3) >>u c1) */
885 rewrite0: /* get rid of both shifts */
886 if(debug['<'])prtree(n, "rewrite0");
888 n->left = n->left->left;
889 n->right->vconst = c3;
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;
898 rewrite2: /* get rid of upper shift */
899 if(debug['<'])prtree(n, "rewrite2");
901 n->right->vconst = c3;
902 n->left->right->vconst = c1;
986 switch(n->type->etype)
991 if(n->fconst > i || n->fconst < -i)
1020 return -159; /* first uninteresting constant */
1024 * return log(n) if n is a power of 2 constant
1033 m = MASK(8*sizeof(uvlong));
1034 for(i=32; i; i>>=1) {
1051 if(typefd[n->type->etype])
1054 return log2(n->vconst);
1071 * try to cast a constant down
1072 * rather than cast a variable up
1077 relcon(Node *l, Node *r)
1085 if(!nilcast(r->left->type, r->type))
1087 switch(r->type->etype) {
1094 v = convvtox(l->vconst, r->type->etype);
1099 l->type = r->left->type;
1109 diag(Z, "bad in relindex: %O", o);
1128 if(n == Z || n->op != OLIST)
1131 for(n = n->left; n != Z; n = n->left) {
1150 diag(Z, "bad in bitno");
1155 typebitor(long a, long b)
1161 if((a & b) == BLONG)
1162 c |= BVLONG; /* long long => vlong */
1164 warn(Z, "once is enough: %Q", a & b);
1169 diag(Node *n, char *fmt, ...)
1175 vseprint(buf, buf+sizeof(buf), fmt, arg);
1177 Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1185 prtree(n, "diagnostic");
1189 Bprint(&diagbuf, "too many errors\n");
1195 warn(Node *n, char *fmt, ...)
1201 Bprint(&diagbuf, "warning: ");
1203 vseprint(buf, buf+sizeof(buf), fmt, arg);
1205 Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1209 prtree(n, "warning");
1214 yyerror(char *fmt, ...)
1220 * hack to intercept message from yaccpar
1222 if(strcmp(fmt, "syntax error") == 0) {
1223 yyerror("syntax error, last name: %s", symb);
1227 vseprint(buf, buf+sizeof(buf), fmt, arg);
1229 Bprint(&diagbuf, "%L %s\n", lineno, buf);
1232 Bprint(&diagbuf, "too many errors\n");
1238 fatal(Node *n, char *fmt, ...)
1244 vseprint(buf, buf+sizeof(buf), fmt, arg);
1246 Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1254 prtree(n, "diagnostic");
1260 ulong thash1 = 0x2edab8c9;
1261 ulong thash2 = 0x1dc74fb8;
1262 ulong thash3 = 0x1f241331;
1263 ulong thash[NALLTYPES];
1266 TXXX, 0x17527bbd, 0,
1267 TCHAR, 0x5cedd32b, 0,
1268 TUCHAR, 0x552c4454, 0,
1269 TSHORT, 0x63040b4b, 0,
1270 TUSHORT, 0x32a45878, 0,
1271 TINT, 0x4151d5bd, 0,
1272 TUINT, 0x5ae707d6, 0,
1273 TLONG, 0x5ef20f47, 0,
1274 TULONG, 0x36d8eb8f, 0,
1275 TVLONG, 0x6e5e9590, 0,
1276 TUVLONG, 0x75910105, 0,
1277 TFLOAT, 0x25fd7af1, 0,
1278 TDOUBLE, 0x7c40a1b2, 0,
1279 TIND, 0x1b832357, 0,
1280 TFUNC, 0x6babc9cb, 0,
1281 TARRAY, 0x7c50986d, 0,
1282 TVOID, 0x44112eff, 0,
1283 TSTRUCT, 0x7c2da3bf, 0,
1284 TUNION, 0x3eb25e98, 0,
1285 TENUM, 0x44b54f61, 0,
1286 TFILE, 0x19242ac3, 0,
1287 TOLD, 0x22b15988, 0,
1288 TDOT, 0x0204f6b3, 0,
1292 char* bnames[NALIGN];
1306 char* tnames[NALLTYPES];
1313 TUSHORT, 0, "USHORT",
1319 TUVLONG, 0, "UVLONG",
1321 TDOUBLE, 0, "DOUBLE",
1326 TSTRUCT, 0, "STRUCT",
1335 char* gnames[NGTYPES];
1339 GCONSTNT, 0, "CONST",
1340 GVOLATILE, 0, "VOLATILE",
1341 GVOLATILE|GCONSTNT, 0, "CONST-VOLATILE",
1345 char* qnames[NALLTYPES];
1352 TUSHORT, 0, "USHORT",
1358 TUVLONG, 0, "UVLONG",
1360 TDOUBLE, 0, "DOUBLE",
1365 TSTRUCT, 0, "STRUCT",
1370 TEXTERN, 0, "EXTERN",
1371 TSTATIC, 0, "STATIC",
1372 TTYPEDEF, 0, "TYPEDEF",
1373 TTYPESTR, 0, "TYPESTR",
1374 TREGISTER, 0, "REGISTER",
1375 TCONSTNT, 0, "CONSTNT",
1376 TVOLATILE, 0, "VOLATILE",
1377 TUNSIGNED, 0, "UNSIGNED",
1378 TSIGNED, 0, "SIGNED",
1384 char* cnames[NCTYPES];
1389 CEXTERN, 0, "EXTERN",
1391 CSTATIC, 0, "STATIC",
1393 CTYPEDEF, 0, "TYPEDEF",
1394 CTYPESTR, 0, "TYPESTR",
1402 char* onames[OEND+1];
1409 OANDAND, 0, "ANDAND",
1415 OASASHL, 0, "ASASHL",
1416 OASASHR, 0, "ASASHR",
1420 OASLDIV, 0, "ASLDIV",
1421 OASLMOD, 0, "ASLMOD",
1422 OASLMUL, 0, "ASLMUL",
1423 OASLSHR, 0, "ASLSHR",
1436 OCONTINUE, 0, "CONTINUE",
1439 ODOTDOT, 0, "DOTDOT",
1440 ODWHILE, 0, "DWHILE",
1452 OINDREG, 0, "INDREG",
1471 OPOSTDEC, 0, "POSTDEC",
1472 OPOSTINC, 0, "POSTINC",
1473 OPREDEC, 0, "PREDEC",
1474 OPREINC, 0, "PREINC",
1476 OREGISTER, 0, "REGISTER",
1477 ORETURN, 0, "RETURN",
1481 OSTRING, 0, "STRING",
1482 OLSTRING, 0, "LSTRING",
1483 OSTRUCT, 0, "STRUCT",
1485 OSWITCH, 0, "SWITCH",
1497 OREGPAIR, 0, "REGPAIR",
1503 /* OEQ, ONE, OLE, OLS, OLT, OLO, OGE, OHS, OGT, OHI */
1506 ONE, OEQ, OGT, OHI, OGE, OHS, OLT, OLO, OLE, OLS,
1510 OEQ, ONE, OGE, OHS, OGT, OHI, OLE, OLS, OLT, OLO,
1514 OEQ, ONE, OLS, OLS, OLO, OLO, OHS, OHS, OHI, OHI,
1520 TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TVLONG, TUVLONG, -1,
1525 TUCHAR, TUSHORT, TUINT, TULONG, TUVLONG, TIND, -1,
1528 char typesuv[NTYPE];
1531 TVLONG, TUVLONG, TSTRUCT, TUNION, -1,
1534 char typeilp[NTYPE];
1537 TINT, TUINT, TLONG, TULONG, TIND, -1
1540 char typechl[NTYPE];
1541 char typechlv[NTYPE];
1542 char typechlvp[NTYPE];
1545 TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, -1,
1548 char typechlp[NTYPE];
1549 int typechlpinit[] =
1551 TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TIND, -1,
1554 char typechlpfd[NTYPE];
1555 int typechlpfdinit[] =
1557 TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TFLOAT, TDOUBLE, TIND, -1,
1569 TSHORT, TUSHORT, -1,
1575 TINT, TUINT, TLONG, TULONG, -1,
1581 TVLONG, TUVLONG, -1,
1587 TFLOAT, TDOUBLE, -1,
1599 TSTRUCT, TUNION, -1,
1608 TUSHORT, BNUMBER, 0,
1614 TUVLONG, BNUMBER, 0,
1616 TDOUBLE, BNUMBER, 0,
1618 TSTRUCT, BSTRUCT, 0,
1629 TUSHORT, BNUMBER, 0,
1635 TUVLONG, BNUMBER, 0,
1637 TDOUBLE, BNUMBER, 0,
1645 TCHAR, BNUMBER|BIND|BVOID, 0,
1646 TUCHAR, BNUMBER|BIND|BVOID, 0,
1647 TSHORT, BNUMBER|BIND|BVOID, 0,
1648 TUSHORT, BNUMBER|BIND|BVOID, 0,
1649 TINT, BNUMBER|BIND|BVOID, 0,
1650 TUINT, BNUMBER|BIND|BVOID, 0,
1651 TLONG, BNUMBER|BIND|BVOID, 0,
1652 TULONG, BNUMBER|BIND|BVOID, 0,
1653 TVLONG, BNUMBER|BIND|BVOID, 0,
1654 TUVLONG, BNUMBER|BIND|BVOID, 0,
1655 TFLOAT, BNUMBER|BVOID, 0,
1656 TDOUBLE, BNUMBER|BVOID, 0,
1657 TIND, BINTEGER|BIND|BVOID, 0,
1659 TSTRUCT, BSTRUCT|BVOID, 0,
1660 TUNION, BUNION|BVOID, 0,
1667 TCHAR, BNUMBER|BIND, 0,
1668 TUCHAR, BNUMBER|BIND, 0,
1669 TSHORT, BNUMBER|BIND, 0,
1670 TUSHORT, BNUMBER|BIND, 0,
1671 TINT, BNUMBER|BIND, 0,
1672 TUINT, BNUMBER|BIND, 0,
1673 TLONG, BNUMBER|BIND, 0,
1674 TULONG, BNUMBER|BIND, 0,
1675 TVLONG, BNUMBER|BIND, 0,
1676 TUVLONG, BNUMBER|BIND, 0,
1678 TDOUBLE, BNUMBER, 0,
1689 TUSHORT, BNUMBER, 0,
1695 TUVLONG, BNUMBER, 0,
1697 TDOUBLE, BNUMBER, 0,
1698 TIND, BINTEGER|BIND, 0,
1708 TUSHORT, BNUMBER, 0,
1714 TUVLONG, BNUMBER, 0,
1716 TDOUBLE, BNUMBER, 0,
1724 TUCHAR, BINTEGER, 0,
1725 TSHORT, BINTEGER, 0,
1726 TUSHORT, BINTEGER, 0,
1730 TULONG, BINTEGER, 0,
1731 TVLONG, BINTEGER, 0,
1732 TUVLONG, BINTEGER, 0,
1742 TUSHORT, BNUMBER, 0,
1748 TUVLONG, BNUMBER, 0,
1750 TDOUBLE, BNUMBER, 0,
1777 BNUMBER|BIND|BSTRUCT|BUNION,
1780 char tab[NTYPE][NTYPE] =
1785 /*TCHAR*/ { 0, TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG,
1786 TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1788 /*TUCHAR*/ { 0, TUCHAR, TUCHAR, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
1789 TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1791 /*TSHORT*/ { 0, TSHORT, TUSHORT, TSHORT, TUSHORT, TINT, TUINT, TLONG,
1792 TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1794 /*TUSHORT*/ { 0, TUSHORT, TUSHORT, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
1795 TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1797 /*TINT*/ { 0, TINT, TUINT, TINT, TUINT, TINT, TUINT, TLONG,
1798 TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1800 /*TUINT*/ { 0, TUINT, TUINT, TUINT, TUINT, TUINT, TUINT, TULONG,
1801 TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1803 /*TLONG*/ { 0, TLONG, TULONG, TLONG, TULONG, TLONG, TULONG, TLONG,
1804 TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1806 /*TULONG*/ { 0, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG,
1807 TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1809 /*TVLONG*/ { 0, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG,
1810 TUVLONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1812 /*TUVLONG*/ { 0, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG,
1813 TUVLONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1815 /*TFLOAT*/ { 0, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT,
1816 TFLOAT, TFLOAT, TFLOAT, TFLOAT, TDOUBLE, TIND,
1818 /*TDOUBLE*/ { 0, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE,
1819 TDOUBLE, TDOUBLE, TDOUBLE, TFLOAT, TDOUBLE, TIND,
1821 /*TIND*/ { 0, TIND, TIND, TIND, TIND, TIND, TIND, TIND,
1822 TIND, TIND, TIND, TIND, TIND, TIND,
1827 urk(char *name, int max, int i)
1830 fprint(2, "bad tinit: %s %d>=%d\n", name, i, max);
1841 for(p=thashinit; p->code >= 0; p++) {
1842 urk("thash", nelem(thash), p->code);
1843 thash[p->code] = p->value;
1845 for(p=bnamesinit; p->code >= 0; p++) {
1846 urk("bnames", nelem(bnames), p->code);
1847 bnames[p->code] = p->s;
1849 for(p=tnamesinit; p->code >= 0; p++) {
1850 urk("tnames", nelem(tnames), p->code);
1851 tnames[p->code] = p->s;
1853 for(p=gnamesinit; p->code >= 0; p++) {
1854 urk("gnames", nelem(gnames), p->code);
1855 gnames[p->code] = p->s;
1857 for(p=qnamesinit; p->code >= 0; p++) {
1858 urk("qnames", nelem(qnames), p->code);
1859 qnames[p->code] = p->s;
1861 for(p=cnamesinit; p->code >= 0; p++) {
1862 urk("cnames", nelem(cnames), p->code);
1863 cnames[p->code] = p->s;
1865 for(p=onamesinit; p->code >= 0; p++) {
1866 urk("onames", nelem(onames), p->code);
1867 onames[p->code] = p->s;
1869 for(ip=typeiinit; *ip>=0; ip++) {
1870 urk("typei", nelem(typei), *ip);
1873 for(ip=typeuinit; *ip>=0; ip++) {
1874 urk("typeu", nelem(typeu), *ip);
1877 for(ip=typesuvinit; *ip>=0; ip++) {
1878 urk("typesuv", nelem(typesuv), *ip);
1881 for(ip=typeilpinit; *ip>=0; ip++) {
1882 urk("typeilp", nelem(typeilp), *ip);
1885 for(ip=typechlinit; *ip>=0; ip++) {
1886 urk("typechl", nelem(typechl), *ip);
1891 for(ip=typechlpinit; *ip>=0; ip++) {
1892 urk("typechlp", nelem(typechlp), *ip);
1896 for(ip=typechlpfdinit; *ip>=0; ip++) {
1897 urk("typechlpfd", nelem(typechlpfd), *ip);
1898 typechlpfd[*ip] = 1;
1900 for(ip=typecinit; *ip>=0; ip++) {
1901 urk("typec", nelem(typec), *ip);
1904 for(ip=typehinit; *ip>=0; ip++) {
1905 urk("typeh", nelem(typeh), *ip);
1908 for(ip=typeilinit; *ip>=0; ip++) {
1909 urk("typeil", nelem(typeil), *ip);
1912 for(ip=typevinit; *ip>=0; ip++) {
1913 urk("typev", nelem(typev), *ip);
1918 for(ip=typefdinit; *ip>=0; ip++) {
1919 urk("typefd", nelem(typefd), *ip);
1922 for(ip=typeafinit; *ip>=0; ip++) {
1923 urk("typeaf", nelem(typeaf), *ip);
1926 for(ip=typesuinit; *ip >= 0; ip++) {
1927 urk("typesu", nelem(typesu), *ip);
1930 for(p=tasigninit; p->code >= 0; p++) {
1931 urk("tasign", nelem(tasign), p->code);
1932 tasign[p->code] = p->value;
1934 for(p=tasaddinit; p->code >= 0; p++) {
1935 urk("tasadd", nelem(tasadd), p->code);
1936 tasadd[p->code] = p->value;
1938 for(p=tcastinit; p->code >= 0; p++) {
1939 urk("tcast", nelem(tcast), p->code);
1940 tcast[p->code] = p->value;
1942 for(p=taddinit; p->code >= 0; p++) {
1943 urk("tadd", nelem(tadd), p->code);
1944 tadd[p->code] = p->value;
1946 for(p=tsubinit; p->code >= 0; p++) {
1947 urk("tsub", nelem(tsub), p->code);
1948 tsub[p->code] = p->value;
1950 for(p=tmulinit; p->code >= 0; p++) {
1951 urk("tmul", nelem(tmul), p->code);
1952 tmul[p->code] = p->value;
1954 for(p=tandinit; p->code >= 0; p++) {
1955 urk("tand", nelem(tand), p->code);
1956 tand[p->code] = p->value;
1958 for(p=trelinit; p->code >= 0; p++) {
1959 urk("trel", nelem(trel), p->code);
1960 trel[p->code] = p->value;
1963 /* 32-bit defaults */
1964 typeword = typechlp;
1965 typeswitch = typechl;
1966 typecmplx = typesuv;
1970 * return 1 if it is impossible to jump into the middle of n.
1973 deadhead(Node *n, int caseok)
1980 if(!deadhead(n->left, caseok))
2001 return deadhead(n->right, 1);
2017 return deadhead(n->right->left, caseok) && deadhead(n->right->right, caseok);
2029 return deadhead(c->left, 0) && deadhead(c->right, 0);
2033 mixedasop(Type *l, Type *r)
2035 return !typefd[l->etype] && typefd[r->etype];