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;
980 switch(n->type->etype)
985 if(n->fconst > i || n->fconst < -i)
1014 return -159; /* first uninteresting constant */
1018 * return log(n) if n is a power of 2 constant
1027 m = MASK(8*sizeof(uvlong));
1028 for(i=32; i; i>>=1) {
1045 if(typefd[n->type->etype])
1048 return log2(n->vconst);
1065 * try to cast a constant down
1066 * rather than cast a variable up
1071 relcon(Node *l, Node *r)
1079 if(!nilcast(r->left->type, r->type))
1081 switch(r->type->etype) {
1088 v = convvtox(l->vconst, r->type->etype);
1093 l->type = r->left->type;
1103 diag(Z, "bad in relindex: %O", o);
1122 if(n == Z || n->op != OLIST)
1125 for(n = n->left; n != Z; n = n->left) {
1144 diag(Z, "bad in bitno");
1149 typebitor(long a, long b)
1155 if((a & b) == BLONG)
1156 c |= BVLONG; /* long long => vlong */
1158 warn(Z, "once is enough: %Q", a & b);
1163 diag(Node *n, char *fmt, ...)
1169 vseprint(buf, buf+sizeof(buf), fmt, arg);
1171 Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1179 prtree(n, "diagnostic");
1183 Bprint(&diagbuf, "too many errors\n");
1189 warn(Node *n, char *fmt, ...)
1195 Bprint(&diagbuf, "warning: ");
1197 vseprint(buf, buf+sizeof(buf), fmt, arg);
1199 Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1203 prtree(n, "warning");
1208 yyerror(char *fmt, ...)
1214 * hack to intercept message from yaccpar
1216 if(strcmp(fmt, "syntax error") == 0) {
1217 yyerror("syntax error, last name: %s", symb);
1221 vseprint(buf, buf+sizeof(buf), fmt, arg);
1223 Bprint(&diagbuf, "%L %s\n", lineno, buf);
1226 Bprint(&diagbuf, "too many errors\n");
1232 fatal(Node *n, char *fmt, ...)
1238 vseprint(buf, buf+sizeof(buf), fmt, arg);
1240 Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1248 prtree(n, "diagnostic");
1254 ulong thash1 = 0x2edab8c9;
1255 ulong thash2 = 0x1dc74fb8;
1256 ulong thash3 = 0x1f241331;
1257 ulong thash[NALLTYPES];
1260 TXXX, 0x17527bbd, 0,
1261 TCHAR, 0x5cedd32b, 0,
1262 TUCHAR, 0x552c4454, 0,
1263 TSHORT, 0x63040b4b, 0,
1264 TUSHORT, 0x32a45878, 0,
1265 TINT, 0x4151d5bd, 0,
1266 TUINT, 0x5ae707d6, 0,
1267 TLONG, 0x5ef20f47, 0,
1268 TULONG, 0x36d8eb8f, 0,
1269 TVLONG, 0x6e5e9590, 0,
1270 TUVLONG, 0x75910105, 0,
1271 TFLOAT, 0x25fd7af1, 0,
1272 TDOUBLE, 0x7c40a1b2, 0,
1273 TIND, 0x1b832357, 0,
1274 TFUNC, 0x6babc9cb, 0,
1275 TARRAY, 0x7c50986d, 0,
1276 TVOID, 0x44112eff, 0,
1277 TSTRUCT, 0x7c2da3bf, 0,
1278 TUNION, 0x3eb25e98, 0,
1279 TENUM, 0x44b54f61, 0,
1280 TFILE, 0x19242ac3, 0,
1281 TOLD, 0x22b15988, 0,
1282 TDOT, 0x0204f6b3, 0,
1286 char* bnames[NALIGN];
1300 char* tnames[NALLTYPES];
1307 TUSHORT, 0, "USHORT",
1313 TUVLONG, 0, "UVLONG",
1315 TDOUBLE, 0, "DOUBLE",
1320 TSTRUCT, 0, "STRUCT",
1329 char* gnames[NGTYPES];
1333 GCONSTNT, 0, "CONST",
1334 GVOLATILE, 0, "VOLATILE",
1335 GVOLATILE|GCONSTNT, 0, "CONST-VOLATILE",
1339 char* qnames[NALLTYPES];
1346 TUSHORT, 0, "USHORT",
1352 TUVLONG, 0, "UVLONG",
1354 TDOUBLE, 0, "DOUBLE",
1359 TSTRUCT, 0, "STRUCT",
1364 TEXTERN, 0, "EXTERN",
1365 TSTATIC, 0, "STATIC",
1366 TTYPEDEF, 0, "TYPEDEF",
1367 TTYPESTR, 0, "TYPESTR",
1368 TREGISTER, 0, "REGISTER",
1369 TCONSTNT, 0, "CONSTNT",
1370 TVOLATILE, 0, "VOLATILE",
1371 TUNSIGNED, 0, "UNSIGNED",
1372 TSIGNED, 0, "SIGNED",
1378 char* cnames[NCTYPES];
1383 CEXTERN, 0, "EXTERN",
1385 CSTATIC, 0, "STATIC",
1387 CTYPEDEF, 0, "TYPEDEF",
1388 CTYPESTR, 0, "TYPESTR",
1396 char* onames[OEND+1];
1403 OANDAND, 0, "ANDAND",
1409 OASASHL, 0, "ASASHL",
1410 OASASHR, 0, "ASASHR",
1414 OASLDIV, 0, "ASLDIV",
1415 OASLMOD, 0, "ASLMOD",
1416 OASLMUL, 0, "ASLMUL",
1417 OASLSHR, 0, "ASLSHR",
1430 OCONTINUE, 0, "CONTINUE",
1433 ODOTDOT, 0, "DOTDOT",
1434 ODWHILE, 0, "DWHILE",
1446 OINDREG, 0, "INDREG",
1465 OPOSTDEC, 0, "POSTDEC",
1466 OPOSTINC, 0, "POSTINC",
1467 OPREDEC, 0, "PREDEC",
1468 OPREINC, 0, "PREINC",
1470 OREGISTER, 0, "REGISTER",
1471 ORETURN, 0, "RETURN",
1475 OSTRING, 0, "STRING",
1476 OLSTRING, 0, "LSTRING",
1477 OSTRUCT, 0, "STRUCT",
1479 OSWITCH, 0, "SWITCH",
1491 OREGPAIR, 0, "REGPAIR",
1497 /* OEQ, ONE, OLE, OLS, OLT, OLO, OGE, OHS, OGT, OHI */
1500 ONE, OEQ, OGT, OHI, OGE, OHS, OLT, OLO, OLE, OLS,
1504 OEQ, ONE, OGE, OHS, OGT, OHI, OLE, OLS, OLT, OLO,
1508 OEQ, ONE, OLS, OLS, OLO, OLO, OHS, OHS, OHI, OHI,
1514 TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TVLONG, TUVLONG, -1,
1519 TUCHAR, TUSHORT, TUINT, TULONG, TUVLONG, TIND, -1,
1522 char typesuv[NTYPE];
1525 TVLONG, TUVLONG, TSTRUCT, TUNION, -1,
1528 char typeilp[NTYPE];
1531 TINT, TUINT, TLONG, TULONG, TIND, -1
1534 char typechl[NTYPE];
1535 char typechlv[NTYPE];
1536 char typechlvp[NTYPE];
1539 TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, -1,
1542 char typechlp[NTYPE];
1543 int typechlpinit[] =
1545 TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TIND, -1,
1548 char typechlpfd[NTYPE];
1549 int typechlpfdinit[] =
1551 TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TFLOAT, TDOUBLE, TIND, -1,
1563 TSHORT, TUSHORT, -1,
1569 TINT, TUINT, TLONG, TULONG, -1,
1575 TVLONG, TUVLONG, -1,
1581 TFLOAT, TDOUBLE, -1,
1593 TSTRUCT, TUNION, -1,
1602 TUSHORT, BNUMBER, 0,
1608 TUVLONG, BNUMBER, 0,
1610 TDOUBLE, BNUMBER, 0,
1612 TSTRUCT, BSTRUCT, 0,
1623 TUSHORT, BNUMBER, 0,
1629 TUVLONG, BNUMBER, 0,
1631 TDOUBLE, BNUMBER, 0,
1639 TCHAR, BNUMBER|BIND|BVOID, 0,
1640 TUCHAR, BNUMBER|BIND|BVOID, 0,
1641 TSHORT, BNUMBER|BIND|BVOID, 0,
1642 TUSHORT, BNUMBER|BIND|BVOID, 0,
1643 TINT, BNUMBER|BIND|BVOID, 0,
1644 TUINT, BNUMBER|BIND|BVOID, 0,
1645 TLONG, BNUMBER|BIND|BVOID, 0,
1646 TULONG, BNUMBER|BIND|BVOID, 0,
1647 TVLONG, BNUMBER|BIND|BVOID, 0,
1648 TUVLONG, BNUMBER|BIND|BVOID, 0,
1649 TFLOAT, BNUMBER|BVOID, 0,
1650 TDOUBLE, BNUMBER|BVOID, 0,
1651 TIND, BINTEGER|BIND|BVOID, 0,
1653 TSTRUCT, BSTRUCT|BVOID, 0,
1654 TUNION, BUNION|BVOID, 0,
1661 TCHAR, BNUMBER|BIND, 0,
1662 TUCHAR, BNUMBER|BIND, 0,
1663 TSHORT, BNUMBER|BIND, 0,
1664 TUSHORT, BNUMBER|BIND, 0,
1665 TINT, BNUMBER|BIND, 0,
1666 TUINT, BNUMBER|BIND, 0,
1667 TLONG, BNUMBER|BIND, 0,
1668 TULONG, BNUMBER|BIND, 0,
1669 TVLONG, BNUMBER|BIND, 0,
1670 TUVLONG, BNUMBER|BIND, 0,
1672 TDOUBLE, BNUMBER, 0,
1683 TUSHORT, BNUMBER, 0,
1689 TUVLONG, BNUMBER, 0,
1691 TDOUBLE, BNUMBER, 0,
1692 TIND, BINTEGER|BIND, 0,
1702 TUSHORT, BNUMBER, 0,
1708 TUVLONG, BNUMBER, 0,
1710 TDOUBLE, BNUMBER, 0,
1718 TUCHAR, BINTEGER, 0,
1719 TSHORT, BINTEGER, 0,
1720 TUSHORT, BINTEGER, 0,
1724 TULONG, BINTEGER, 0,
1725 TVLONG, BINTEGER, 0,
1726 TUVLONG, BINTEGER, 0,
1736 TUSHORT, BNUMBER, 0,
1742 TUVLONG, BNUMBER, 0,
1744 TDOUBLE, BNUMBER, 0,
1771 BNUMBER|BIND|BSTRUCT|BUNION,
1774 char tab[NTYPE][NTYPE] =
1779 /*TCHAR*/ { 0, TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG,
1780 TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1782 /*TUCHAR*/ { 0, TUCHAR, TUCHAR, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
1783 TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1785 /*TSHORT*/ { 0, TSHORT, TUSHORT, TSHORT, TUSHORT, TINT, TUINT, TLONG,
1786 TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1788 /*TUSHORT*/ { 0, TUSHORT, TUSHORT, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
1789 TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1791 /*TINT*/ { 0, TINT, TUINT, TINT, TUINT, TINT, TUINT, TLONG,
1792 TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1794 /*TUINT*/ { 0, TUINT, TUINT, TUINT, TUINT, TUINT, TUINT, TULONG,
1795 TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1797 /*TLONG*/ { 0, TLONG, TULONG, TLONG, TULONG, TLONG, TULONG, TLONG,
1798 TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1800 /*TULONG*/ { 0, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG,
1801 TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1803 /*TVLONG*/ { 0, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG,
1804 TUVLONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1806 /*TUVLONG*/ { 0, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG,
1807 TUVLONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1809 /*TFLOAT*/ { 0, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT,
1810 TFLOAT, TFLOAT, TFLOAT, TFLOAT, TDOUBLE, TIND,
1812 /*TDOUBLE*/ { 0, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE,
1813 TDOUBLE, TDOUBLE, TDOUBLE, TFLOAT, TDOUBLE, TIND,
1815 /*TIND*/ { 0, TIND, TIND, TIND, TIND, TIND, TIND, TIND,
1816 TIND, TIND, TIND, TIND, TIND, TIND,
1821 urk(char *name, int max, int i)
1824 fprint(2, "bad tinit: %s %d>=%d\n", name, i, max);
1835 for(p=thashinit; p->code >= 0; p++) {
1836 urk("thash", nelem(thash), p->code);
1837 thash[p->code] = p->value;
1839 for(p=bnamesinit; p->code >= 0; p++) {
1840 urk("bnames", nelem(bnames), p->code);
1841 bnames[p->code] = p->s;
1843 for(p=tnamesinit; p->code >= 0; p++) {
1844 urk("tnames", nelem(tnames), p->code);
1845 tnames[p->code] = p->s;
1847 for(p=gnamesinit; p->code >= 0; p++) {
1848 urk("gnames", nelem(gnames), p->code);
1849 gnames[p->code] = p->s;
1851 for(p=qnamesinit; p->code >= 0; p++) {
1852 urk("qnames", nelem(qnames), p->code);
1853 qnames[p->code] = p->s;
1855 for(p=cnamesinit; p->code >= 0; p++) {
1856 urk("cnames", nelem(cnames), p->code);
1857 cnames[p->code] = p->s;
1859 for(p=onamesinit; p->code >= 0; p++) {
1860 urk("onames", nelem(onames), p->code);
1861 onames[p->code] = p->s;
1863 for(ip=typeiinit; *ip>=0; ip++) {
1864 urk("typei", nelem(typei), *ip);
1867 for(ip=typeuinit; *ip>=0; ip++) {
1868 urk("typeu", nelem(typeu), *ip);
1871 for(ip=typesuvinit; *ip>=0; ip++) {
1872 urk("typesuv", nelem(typesuv), *ip);
1875 for(ip=typeilpinit; *ip>=0; ip++) {
1876 urk("typeilp", nelem(typeilp), *ip);
1879 for(ip=typechlinit; *ip>=0; ip++) {
1880 urk("typechl", nelem(typechl), *ip);
1885 for(ip=typechlpinit; *ip>=0; ip++) {
1886 urk("typechlp", nelem(typechlp), *ip);
1890 for(ip=typechlpfdinit; *ip>=0; ip++) {
1891 urk("typechlpfd", nelem(typechlpfd), *ip);
1892 typechlpfd[*ip] = 1;
1894 for(ip=typecinit; *ip>=0; ip++) {
1895 urk("typec", nelem(typec), *ip);
1898 for(ip=typehinit; *ip>=0; ip++) {
1899 urk("typeh", nelem(typeh), *ip);
1902 for(ip=typeilinit; *ip>=0; ip++) {
1903 urk("typeil", nelem(typeil), *ip);
1906 for(ip=typevinit; *ip>=0; ip++) {
1907 urk("typev", nelem(typev), *ip);
1912 for(ip=typefdinit; *ip>=0; ip++) {
1913 urk("typefd", nelem(typefd), *ip);
1916 for(ip=typeafinit; *ip>=0; ip++) {
1917 urk("typeaf", nelem(typeaf), *ip);
1920 for(ip=typesuinit; *ip >= 0; ip++) {
1921 urk("typesu", nelem(typesu), *ip);
1924 for(p=tasigninit; p->code >= 0; p++) {
1925 urk("tasign", nelem(tasign), p->code);
1926 tasign[p->code] = p->value;
1928 for(p=tasaddinit; p->code >= 0; p++) {
1929 urk("tasadd", nelem(tasadd), p->code);
1930 tasadd[p->code] = p->value;
1932 for(p=tcastinit; p->code >= 0; p++) {
1933 urk("tcast", nelem(tcast), p->code);
1934 tcast[p->code] = p->value;
1936 for(p=taddinit; p->code >= 0; p++) {
1937 urk("tadd", nelem(tadd), p->code);
1938 tadd[p->code] = p->value;
1940 for(p=tsubinit; p->code >= 0; p++) {
1941 urk("tsub", nelem(tsub), p->code);
1942 tsub[p->code] = p->value;
1944 for(p=tmulinit; p->code >= 0; p++) {
1945 urk("tmul", nelem(tmul), p->code);
1946 tmul[p->code] = p->value;
1948 for(p=tandinit; p->code >= 0; p++) {
1949 urk("tand", nelem(tand), p->code);
1950 tand[p->code] = p->value;
1952 for(p=trelinit; p->code >= 0; p++) {
1953 urk("trel", nelem(trel), p->code);
1954 trel[p->code] = p->value;
1957 /* 32-bit defaults */
1958 typeword = typechlp;
1959 typeswitch = typechl;
1960 typecmplx = typesuv;
1964 * return 1 if it is impossible to jump into the middle of n.
1967 deadhead(Node *n, int caseok)
1974 if(!deadhead(n->left, caseok))
1995 return deadhead(n->right, 1);
2011 return deadhead(n->right->left, caseok) && deadhead(n->right->right, caseok);
2023 return deadhead(c->left, 0) && deadhead(c->right, 0);
2027 mixedasop(Type *l, Type *r)
2029 return !typefd[l->etype] && typefd[r->etype];