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];
696 n1 = new1(OXXX, Z, Z);
700 n1 = new1(OCONST, Z, Z);
710 if(0 && ewidth[TIND] > ewidth[TLONG]){
711 n1 = new1(OXXX, Z, Z);
716 n->type = types[TLONG];
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;
984 switch(n->type->etype)
989 if(n->fconst > i || n->fconst < -i)
1018 return -159; /* first uninteresting constant */
1022 * return log(n) if n is a power of 2 constant
1031 m = MASK(8*sizeof(uvlong));
1032 for(i=32; i; i>>=1) {
1049 if(typefd[n->type->etype])
1052 return log2(n->vconst);
1069 * try to cast a constant down
1070 * rather than cast a variable up
1075 relcon(Node *l, Node *r)
1083 if(!nilcast(r->left->type, r->type))
1085 switch(r->type->etype) {
1092 v = convvtox(l->vconst, r->type->etype);
1097 l->type = r->left->type;
1107 diag(Z, "bad in relindex: %O", o);
1126 if(n == Z || n->op != OLIST)
1129 for(n = n->left; n != Z; n = n->left) {
1148 diag(Z, "bad in bitno");
1153 typebitor(long a, long b)
1159 if((a & b) == BLONG)
1160 c |= BVLONG; /* long long => vlong */
1162 warn(Z, "once is enough: %Q", a & b);
1167 diag(Node *n, char *fmt, ...)
1173 vseprint(buf, buf+sizeof(buf), fmt, arg);
1175 Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1183 prtree(n, "diagnostic");
1187 Bprint(&diagbuf, "too many errors\n");
1193 warn(Node *n, char *fmt, ...)
1199 Bprint(&diagbuf, "warning: ");
1201 vseprint(buf, buf+sizeof(buf), fmt, arg);
1203 Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1207 prtree(n, "warning");
1212 yyerror(char *fmt, ...)
1218 * hack to intercept message from yaccpar
1220 if(strcmp(fmt, "syntax error") == 0) {
1221 yyerror("syntax error, last name: %s", symb);
1225 vseprint(buf, buf+sizeof(buf), fmt, arg);
1227 Bprint(&diagbuf, "%L %s\n", lineno, buf);
1230 Bprint(&diagbuf, "too many errors\n");
1236 fatal(Node *n, char *fmt, ...)
1242 vseprint(buf, buf+sizeof(buf), fmt, arg);
1244 Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1252 prtree(n, "diagnostic");
1258 ulong thash1 = 0x2edab8c9;
1259 ulong thash2 = 0x1dc74fb8;
1260 ulong thash3 = 0x1f241331;
1261 ulong thash[NALLTYPES];
1264 TXXX, 0x17527bbd, 0,
1265 TCHAR, 0x5cedd32b, 0,
1266 TUCHAR, 0x552c4454, 0,
1267 TSHORT, 0x63040b4b, 0,
1268 TUSHORT, 0x32a45878, 0,
1269 TINT, 0x4151d5bd, 0,
1270 TUINT, 0x5ae707d6, 0,
1271 TLONG, 0x5ef20f47, 0,
1272 TULONG, 0x36d8eb8f, 0,
1273 TVLONG, 0x6e5e9590, 0,
1274 TUVLONG, 0x75910105, 0,
1275 TFLOAT, 0x25fd7af1, 0,
1276 TDOUBLE, 0x7c40a1b2, 0,
1277 TIND, 0x1b832357, 0,
1278 TFUNC, 0x6babc9cb, 0,
1279 TARRAY, 0x7c50986d, 0,
1280 TVOID, 0x44112eff, 0,
1281 TSTRUCT, 0x7c2da3bf, 0,
1282 TUNION, 0x3eb25e98, 0,
1283 TENUM, 0x44b54f61, 0,
1284 TFILE, 0x19242ac3, 0,
1285 TOLD, 0x22b15988, 0,
1286 TDOT, 0x0204f6b3, 0,
1290 char* bnames[NALIGN];
1304 char* tnames[NALLTYPES];
1311 TUSHORT, 0, "USHORT",
1317 TUVLONG, 0, "UVLONG",
1319 TDOUBLE, 0, "DOUBLE",
1324 TSTRUCT, 0, "STRUCT",
1333 char* gnames[NGTYPES];
1337 GCONSTNT, 0, "CONST",
1338 GVOLATILE, 0, "VOLATILE",
1339 GVOLATILE|GCONSTNT, 0, "CONST-VOLATILE",
1343 char* qnames[NALLTYPES];
1350 TUSHORT, 0, "USHORT",
1356 TUVLONG, 0, "UVLONG",
1358 TDOUBLE, 0, "DOUBLE",
1363 TSTRUCT, 0, "STRUCT",
1368 TEXTERN, 0, "EXTERN",
1369 TSTATIC, 0, "STATIC",
1370 TTYPEDEF, 0, "TYPEDEF",
1371 TTYPESTR, 0, "TYPESTR",
1372 TREGISTER, 0, "REGISTER",
1373 TCONSTNT, 0, "CONSTNT",
1374 TVOLATILE, 0, "VOLATILE",
1375 TUNSIGNED, 0, "UNSIGNED",
1376 TSIGNED, 0, "SIGNED",
1382 char* cnames[NCTYPES];
1387 CEXTERN, 0, "EXTERN",
1389 CSTATIC, 0, "STATIC",
1391 CTYPEDEF, 0, "TYPEDEF",
1392 CTYPESTR, 0, "TYPESTR",
1400 char* onames[OEND+1];
1407 OANDAND, 0, "ANDAND",
1413 OASASHL, 0, "ASASHL",
1414 OASASHR, 0, "ASASHR",
1418 OASLDIV, 0, "ASLDIV",
1419 OASLMOD, 0, "ASLMOD",
1420 OASLMUL, 0, "ASLMUL",
1421 OASLSHR, 0, "ASLSHR",
1434 OCONTINUE, 0, "CONTINUE",
1437 ODOTDOT, 0, "DOTDOT",
1438 ODWHILE, 0, "DWHILE",
1450 OINDREG, 0, "INDREG",
1469 OPOSTDEC, 0, "POSTDEC",
1470 OPOSTINC, 0, "POSTINC",
1471 OPREDEC, 0, "PREDEC",
1472 OPREINC, 0, "PREINC",
1474 OREGISTER, 0, "REGISTER",
1475 ORETURN, 0, "RETURN",
1479 OSTRING, 0, "STRING",
1480 OLSTRING, 0, "LSTRING",
1481 OSTRUCT, 0, "STRUCT",
1483 OSWITCH, 0, "SWITCH",
1495 OREGPAIR, 0, "REGPAIR",
1501 /* OEQ, ONE, OLE, OLS, OLT, OLO, OGE, OHS, OGT, OHI */
1504 ONE, OEQ, OGT, OHI, OGE, OHS, OLT, OLO, OLE, OLS,
1508 OEQ, ONE, OGE, OHS, OGT, OHI, OLE, OLS, OLT, OLO,
1512 OEQ, ONE, OLS, OLS, OLO, OLO, OHS, OHS, OHI, OHI,
1518 TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TVLONG, TUVLONG, -1,
1523 TUCHAR, TUSHORT, TUINT, TULONG, TUVLONG, TIND, -1,
1526 char typesuv[NTYPE];
1529 TVLONG, TUVLONG, TSTRUCT, TUNION, -1,
1532 char typeilp[NTYPE];
1535 TINT, TUINT, TLONG, TULONG, TIND, -1
1538 char typechl[NTYPE];
1539 char typechlv[NTYPE];
1540 char typechlvp[NTYPE];
1543 TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, -1,
1546 char typechlp[NTYPE];
1547 int typechlpinit[] =
1549 TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TIND, -1,
1552 char typechlpfd[NTYPE];
1553 int typechlpfdinit[] =
1555 TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TFLOAT, TDOUBLE, TIND, -1,
1567 TSHORT, TUSHORT, -1,
1573 TINT, TUINT, TLONG, TULONG, -1,
1579 TVLONG, TUVLONG, -1,
1585 TFLOAT, TDOUBLE, -1,
1597 TSTRUCT, TUNION, -1,
1606 TUSHORT, BNUMBER, 0,
1612 TUVLONG, BNUMBER, 0,
1614 TDOUBLE, BNUMBER, 0,
1616 TSTRUCT, BSTRUCT, 0,
1627 TUSHORT, BNUMBER, 0,
1633 TUVLONG, BNUMBER, 0,
1635 TDOUBLE, BNUMBER, 0,
1643 TCHAR, BNUMBER|BIND|BVOID, 0,
1644 TUCHAR, BNUMBER|BIND|BVOID, 0,
1645 TSHORT, BNUMBER|BIND|BVOID, 0,
1646 TUSHORT, BNUMBER|BIND|BVOID, 0,
1647 TINT, BNUMBER|BIND|BVOID, 0,
1648 TUINT, BNUMBER|BIND|BVOID, 0,
1649 TLONG, BNUMBER|BIND|BVOID, 0,
1650 TULONG, BNUMBER|BIND|BVOID, 0,
1651 TVLONG, BNUMBER|BIND|BVOID, 0,
1652 TUVLONG, BNUMBER|BIND|BVOID, 0,
1653 TFLOAT, BNUMBER|BVOID, 0,
1654 TDOUBLE, BNUMBER|BVOID, 0,
1655 TIND, BINTEGER|BIND|BVOID, 0,
1657 TSTRUCT, BSTRUCT|BVOID, 0,
1658 TUNION, BUNION|BVOID, 0,
1665 TCHAR, BNUMBER|BIND, 0,
1666 TUCHAR, BNUMBER|BIND, 0,
1667 TSHORT, BNUMBER|BIND, 0,
1668 TUSHORT, BNUMBER|BIND, 0,
1669 TINT, BNUMBER|BIND, 0,
1670 TUINT, BNUMBER|BIND, 0,
1671 TLONG, BNUMBER|BIND, 0,
1672 TULONG, BNUMBER|BIND, 0,
1673 TVLONG, BNUMBER|BIND, 0,
1674 TUVLONG, BNUMBER|BIND, 0,
1676 TDOUBLE, BNUMBER, 0,
1687 TUSHORT, BNUMBER, 0,
1693 TUVLONG, BNUMBER, 0,
1695 TDOUBLE, BNUMBER, 0,
1696 TIND, BINTEGER|BIND, 0,
1706 TUSHORT, BNUMBER, 0,
1712 TUVLONG, BNUMBER, 0,
1714 TDOUBLE, BNUMBER, 0,
1722 TUCHAR, BINTEGER, 0,
1723 TSHORT, BINTEGER, 0,
1724 TUSHORT, BINTEGER, 0,
1728 TULONG, BINTEGER, 0,
1729 TVLONG, BINTEGER, 0,
1730 TUVLONG, BINTEGER, 0,
1740 TUSHORT, BNUMBER, 0,
1746 TUVLONG, BNUMBER, 0,
1748 TDOUBLE, BNUMBER, 0,
1775 BNUMBER|BIND|BSTRUCT|BUNION,
1778 char tab[NTYPE][NTYPE] =
1783 /*TCHAR*/ { 0, TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG,
1784 TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1786 /*TUCHAR*/ { 0, TUCHAR, TUCHAR, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
1787 TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1789 /*TSHORT*/ { 0, TSHORT, TUSHORT, TSHORT, TUSHORT, TINT, TUINT, TLONG,
1790 TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1792 /*TUSHORT*/ { 0, TUSHORT, TUSHORT, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
1793 TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1795 /*TINT*/ { 0, TINT, TUINT, TINT, TUINT, TINT, TUINT, TLONG,
1796 TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1798 /*TUINT*/ { 0, TUINT, TUINT, TUINT, TUINT, TUINT, TUINT, TULONG,
1799 TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1801 /*TLONG*/ { 0, TLONG, TULONG, TLONG, TULONG, TLONG, TULONG, TLONG,
1802 TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1804 /*TULONG*/ { 0, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG,
1805 TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1807 /*TVLONG*/ { 0, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG,
1808 TUVLONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1810 /*TUVLONG*/ { 0, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG,
1811 TUVLONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1813 /*TFLOAT*/ { 0, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT,
1814 TFLOAT, TFLOAT, TFLOAT, TFLOAT, TDOUBLE, TIND,
1816 /*TDOUBLE*/ { 0, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE,
1817 TDOUBLE, TDOUBLE, TDOUBLE, TFLOAT, TDOUBLE, TIND,
1819 /*TIND*/ { 0, TIND, TIND, TIND, TIND, TIND, TIND, TIND,
1820 TIND, TIND, TIND, TIND, TIND, TIND,
1825 urk(char *name, int max, int i)
1828 fprint(2, "bad tinit: %s %d>=%d\n", name, i, max);
1839 for(p=thashinit; p->code >= 0; p++) {
1840 urk("thash", nelem(thash), p->code);
1841 thash[p->code] = p->value;
1843 for(p=bnamesinit; p->code >= 0; p++) {
1844 urk("bnames", nelem(bnames), p->code);
1845 bnames[p->code] = p->s;
1847 for(p=tnamesinit; p->code >= 0; p++) {
1848 urk("tnames", nelem(tnames), p->code);
1849 tnames[p->code] = p->s;
1851 for(p=gnamesinit; p->code >= 0; p++) {
1852 urk("gnames", nelem(gnames), p->code);
1853 gnames[p->code] = p->s;
1855 for(p=qnamesinit; p->code >= 0; p++) {
1856 urk("qnames", nelem(qnames), p->code);
1857 qnames[p->code] = p->s;
1859 for(p=cnamesinit; p->code >= 0; p++) {
1860 urk("cnames", nelem(cnames), p->code);
1861 cnames[p->code] = p->s;
1863 for(p=onamesinit; p->code >= 0; p++) {
1864 urk("onames", nelem(onames), p->code);
1865 onames[p->code] = p->s;
1867 for(ip=typeiinit; *ip>=0; ip++) {
1868 urk("typei", nelem(typei), *ip);
1871 for(ip=typeuinit; *ip>=0; ip++) {
1872 urk("typeu", nelem(typeu), *ip);
1875 for(ip=typesuvinit; *ip>=0; ip++) {
1876 urk("typesuv", nelem(typesuv), *ip);
1879 for(ip=typeilpinit; *ip>=0; ip++) {
1880 urk("typeilp", nelem(typeilp), *ip);
1883 for(ip=typechlinit; *ip>=0; ip++) {
1884 urk("typechl", nelem(typechl), *ip);
1889 for(ip=typechlpinit; *ip>=0; ip++) {
1890 urk("typechlp", nelem(typechlp), *ip);
1894 for(ip=typechlpfdinit; *ip>=0; ip++) {
1895 urk("typechlpfd", nelem(typechlpfd), *ip);
1896 typechlpfd[*ip] = 1;
1898 for(ip=typecinit; *ip>=0; ip++) {
1899 urk("typec", nelem(typec), *ip);
1902 for(ip=typehinit; *ip>=0; ip++) {
1903 urk("typeh", nelem(typeh), *ip);
1906 for(ip=typeilinit; *ip>=0; ip++) {
1907 urk("typeil", nelem(typeil), *ip);
1910 for(ip=typevinit; *ip>=0; ip++) {
1911 urk("typev", nelem(typev), *ip);
1916 for(ip=typefdinit; *ip>=0; ip++) {
1917 urk("typefd", nelem(typefd), *ip);
1920 for(ip=typeafinit; *ip>=0; ip++) {
1921 urk("typeaf", nelem(typeaf), *ip);
1924 for(ip=typesuinit; *ip >= 0; ip++) {
1925 urk("typesu", nelem(typesu), *ip);
1928 for(p=tasigninit; p->code >= 0; p++) {
1929 urk("tasign", nelem(tasign), p->code);
1930 tasign[p->code] = p->value;
1932 for(p=tasaddinit; p->code >= 0; p++) {
1933 urk("tasadd", nelem(tasadd), p->code);
1934 tasadd[p->code] = p->value;
1936 for(p=tcastinit; p->code >= 0; p++) {
1937 urk("tcast", nelem(tcast), p->code);
1938 tcast[p->code] = p->value;
1940 for(p=taddinit; p->code >= 0; p++) {
1941 urk("tadd", nelem(tadd), p->code);
1942 tadd[p->code] = p->value;
1944 for(p=tsubinit; p->code >= 0; p++) {
1945 urk("tsub", nelem(tsub), p->code);
1946 tsub[p->code] = p->value;
1948 for(p=tmulinit; p->code >= 0; p++) {
1949 urk("tmul", nelem(tmul), p->code);
1950 tmul[p->code] = p->value;
1952 for(p=tandinit; p->code >= 0; p++) {
1953 urk("tand", nelem(tand), p->code);
1954 tand[p->code] = p->value;
1956 for(p=trelinit; p->code >= 0; p++) {
1957 urk("trel", nelem(trel), p->code);
1958 trel[p->code] = p->value;
1961 /* 32-bit defaults */
1962 typeword = typechlp;
1963 typeswitch = typechl;
1964 typecmplx = typesuv;
1968 * return 1 if it is impossible to jump into the middle of n.
1971 deadhead(Node *n, int caseok)
1978 if(!deadhead(n->left, caseok))
1999 return deadhead(n->right, 1);
2015 return deadhead(n->right->left, caseok) && deadhead(n->right->right, caseok);
2027 return deadhead(c->left, 0) && deadhead(c->right, 0);
2031 mixedasop(Type *l, Type *r)
2033 return !typefd[l->etype] && typefd[r->etype];