13e12c5d1SDavid du Colombier #include "cc.h"
23e12c5d1SDavid du Colombier
33e12c5d1SDavid du Colombier Node*
new(int t,Node * l,Node * r)43e12c5d1SDavid du Colombier new(int t, Node *l, Node *r)
53e12c5d1SDavid du Colombier {
63e12c5d1SDavid du Colombier Node *n;
73e12c5d1SDavid du Colombier
87dd7cddfSDavid du Colombier n = alloc(sizeof(*n));
93e12c5d1SDavid du Colombier n->op = t;
103e12c5d1SDavid du Colombier n->left = l;
113e12c5d1SDavid du Colombier n->right = r;
12b85a8364SDavid du Colombier if(l && t != OGOTO)
13b85a8364SDavid du Colombier n->lineno = l->lineno;
14b85a8364SDavid du Colombier else if(r)
15b85a8364SDavid du Colombier n->lineno = r->lineno;
16b85a8364SDavid du Colombier else
173e12c5d1SDavid du Colombier n->lineno = lineno;
183e12c5d1SDavid du Colombier newflag = 1;
193e12c5d1SDavid du Colombier return n;
203e12c5d1SDavid du Colombier }
213e12c5d1SDavid du Colombier
223e12c5d1SDavid du Colombier Node*
new1(int o,Node * l,Node * r)233e12c5d1SDavid du Colombier new1(int o, Node *l, Node *r)
243e12c5d1SDavid du Colombier {
253e12c5d1SDavid du Colombier Node *n;
263e12c5d1SDavid du Colombier
273e12c5d1SDavid du Colombier n = new(o, l, r);
283e12c5d1SDavid du Colombier n->lineno = nearln;
293e12c5d1SDavid du Colombier return n;
303e12c5d1SDavid du Colombier }
313e12c5d1SDavid du Colombier
323e12c5d1SDavid du Colombier void
prtree(Node * n,char * s)333e12c5d1SDavid du Colombier prtree(Node *n, char *s)
343e12c5d1SDavid du Colombier {
353e12c5d1SDavid du Colombier
363e12c5d1SDavid du Colombier print(" == %s ==\n", s);
373e12c5d1SDavid du Colombier prtree1(n, 0, 0);
383e12c5d1SDavid du Colombier print("\n");
393e12c5d1SDavid du Colombier }
403e12c5d1SDavid du Colombier
413e12c5d1SDavid du Colombier void
prtree1(Node * n,int d,int f)423e12c5d1SDavid du Colombier prtree1(Node *n, int d, int f)
433e12c5d1SDavid du Colombier {
443e12c5d1SDavid du Colombier int i;
453e12c5d1SDavid du Colombier
463e12c5d1SDavid du Colombier if(f)
473e12c5d1SDavid du Colombier for(i=0; i<d; i++)
483e12c5d1SDavid du Colombier print(" ");
493e12c5d1SDavid du Colombier if(n == Z) {
503e12c5d1SDavid du Colombier print("Z\n");
513e12c5d1SDavid du Colombier return;
523e12c5d1SDavid du Colombier }
533e12c5d1SDavid du Colombier if(n->op == OLIST) {
543e12c5d1SDavid du Colombier prtree1(n->left, d, 0);
553e12c5d1SDavid du Colombier prtree1(n->right, d, 1);
563e12c5d1SDavid du Colombier return;
573e12c5d1SDavid du Colombier }
583e12c5d1SDavid du Colombier d++;
593e12c5d1SDavid du Colombier print("%O", n->op);
603e12c5d1SDavid du Colombier i = 3;
613e12c5d1SDavid du Colombier switch(n->op)
623e12c5d1SDavid du Colombier {
633e12c5d1SDavid du Colombier case ONAME:
64219b2ee8SDavid du Colombier print(" \"%F\"", n);
65219b2ee8SDavid du Colombier print(" %ld", n->xoffset);
663e12c5d1SDavid du Colombier i = 0;
673e12c5d1SDavid du Colombier break;
683e12c5d1SDavid du Colombier
693e12c5d1SDavid du Colombier case OINDREG:
70219b2ee8SDavid du Colombier print(" %ld(R%d)", n->xoffset, n->reg);
713e12c5d1SDavid du Colombier i = 0;
723e12c5d1SDavid du Colombier break;
733e12c5d1SDavid du Colombier
743e12c5d1SDavid du Colombier case OREGISTER:
75219b2ee8SDavid du Colombier if(n->xoffset)
76219b2ee8SDavid du Colombier print(" %ld+R%d", n->xoffset, n->reg);
773e12c5d1SDavid du Colombier else
783e12c5d1SDavid du Colombier print(" R%d", n->reg);
793e12c5d1SDavid du Colombier i = 0;
803e12c5d1SDavid du Colombier break;
813e12c5d1SDavid du Colombier
823e12c5d1SDavid du Colombier case OSTRING:
83219b2ee8SDavid du Colombier print(" \"%s\"", n->cstring);
843e12c5d1SDavid du Colombier i = 0;
853e12c5d1SDavid du Colombier break;
863e12c5d1SDavid du Colombier
873e12c5d1SDavid du Colombier case OLSTRING:
88*82726826SDavid du Colombier if(sizeof(TRune) == sizeof(Rune))
89*82726826SDavid du Colombier print(" \"%S\"", (Rune*)n->rstring);
90*82726826SDavid du Colombier else
91*82726826SDavid du Colombier print(" \"...\"");
923e12c5d1SDavid du Colombier i = 0;
933e12c5d1SDavid du Colombier break;
943e12c5d1SDavid du Colombier
953e12c5d1SDavid du Colombier case ODOT:
96219b2ee8SDavid du Colombier case OELEM:
97219b2ee8SDavid du Colombier print(" \"%F\"", n);
983e12c5d1SDavid du Colombier break;
993e12c5d1SDavid du Colombier
1003e12c5d1SDavid du Colombier case OCONST:
101219b2ee8SDavid du Colombier if(typefd[n->type->etype])
102219b2ee8SDavid du Colombier print(" \"%.8e\"", n->fconst);
1033e12c5d1SDavid du Colombier else
104219b2ee8SDavid du Colombier print(" \"%lld\"", n->vconst);
1053e12c5d1SDavid du Colombier i = 0;
1063e12c5d1SDavid du Colombier break;
1073e12c5d1SDavid du Colombier }
1083e12c5d1SDavid du Colombier if(n->addable != 0)
1093e12c5d1SDavid du Colombier print(" <%d>", n->addable);
1103e12c5d1SDavid du Colombier if(n->type != T)
1113e12c5d1SDavid du Colombier print(" %T", n->type);
1123e12c5d1SDavid du Colombier if(n->complex != 0)
1133e12c5d1SDavid du Colombier print(" (%d)", n->complex);
114b85a8364SDavid du Colombier print(" %L\n", n->lineno);
1153e12c5d1SDavid du Colombier if(i & 2)
1163e12c5d1SDavid du Colombier prtree1(n->left, d, 1);
1173e12c5d1SDavid du Colombier if(i & 1)
1183e12c5d1SDavid du Colombier prtree1(n->right, d, 1);
1193e12c5d1SDavid du Colombier }
1203e12c5d1SDavid du Colombier
1213e12c5d1SDavid du Colombier Type*
typ(int et,Type * d)1223e12c5d1SDavid du Colombier typ(int et, Type *d)
1233e12c5d1SDavid du Colombier {
1243e12c5d1SDavid du Colombier Type *t;
1253e12c5d1SDavid du Colombier
1267dd7cddfSDavid du Colombier t = alloc(sizeof(*t));
1273e12c5d1SDavid du Colombier t->etype = et;
1283e12c5d1SDavid du Colombier t->link = d;
1293e12c5d1SDavid du Colombier t->down = T;
1303e12c5d1SDavid du Colombier t->sym = S;
1313e12c5d1SDavid du Colombier t->width = ewidth[et];
1323e12c5d1SDavid du Colombier t->offset = 0;
1333e12c5d1SDavid du Colombier t->shift = 0;
1343e12c5d1SDavid du Colombier t->nbits = 0;
1357dd7cddfSDavid du Colombier t->garb = 0;
1363e12c5d1SDavid du Colombier return t;
1373e12c5d1SDavid du Colombier }
1383e12c5d1SDavid du Colombier
1397dd7cddfSDavid du Colombier Type*
copytyp(Type * t)14080ee5cbfSDavid du Colombier copytyp(Type *t)
14180ee5cbfSDavid du Colombier {
14280ee5cbfSDavid du Colombier Type *nt;
14380ee5cbfSDavid du Colombier
14480ee5cbfSDavid du Colombier nt = typ(TXXX, T);
14580ee5cbfSDavid du Colombier *nt = *t;
14680ee5cbfSDavid du Colombier return nt;
14780ee5cbfSDavid du Colombier }
14880ee5cbfSDavid du Colombier
14980ee5cbfSDavid du Colombier Type*
garbt(Type * t,long b)1507dd7cddfSDavid du Colombier garbt(Type *t, long b)
1517dd7cddfSDavid du Colombier {
1527dd7cddfSDavid du Colombier Type *t1;
1537dd7cddfSDavid du Colombier
1547dd7cddfSDavid du Colombier if(b & BGARB) {
15580ee5cbfSDavid du Colombier t1 = copytyp(t);
1567dd7cddfSDavid du Colombier t1->garb = simpleg(b);
1577dd7cddfSDavid du Colombier return t1;
1587dd7cddfSDavid du Colombier }
1597dd7cddfSDavid du Colombier return t;
1607dd7cddfSDavid du Colombier }
1617dd7cddfSDavid du Colombier
1627dd7cddfSDavid du Colombier int
simpleg(long b)1637dd7cddfSDavid du Colombier simpleg(long b)
1647dd7cddfSDavid du Colombier {
1657dd7cddfSDavid du Colombier
1667dd7cddfSDavid du Colombier b &= BGARB;
1677dd7cddfSDavid du Colombier switch(b) {
1687dd7cddfSDavid du Colombier case BCONSTNT:
1697dd7cddfSDavid du Colombier return GCONSTNT;
1707dd7cddfSDavid du Colombier case BVOLATILE:
1717dd7cddfSDavid du Colombier return GVOLATILE;
1727dd7cddfSDavid du Colombier case BVOLATILE|BCONSTNT:
1737dd7cddfSDavid du Colombier return GCONSTNT|GVOLATILE;
1747dd7cddfSDavid du Colombier }
1757dd7cddfSDavid du Colombier return GXXX;
1767dd7cddfSDavid du Colombier }
1777dd7cddfSDavid du Colombier
1783e12c5d1SDavid du Colombier int
simplec(long b)1793e12c5d1SDavid du Colombier simplec(long b)
1803e12c5d1SDavid du Colombier {
1813e12c5d1SDavid du Colombier
1823e12c5d1SDavid du Colombier b &= BCLASS;
1833e12c5d1SDavid du Colombier switch(b) {
1843e12c5d1SDavid du Colombier case 0:
1853e12c5d1SDavid du Colombier case BREGISTER:
1863e12c5d1SDavid du Colombier return CXXX;
1873e12c5d1SDavid du Colombier case BAUTO:
1883e12c5d1SDavid du Colombier case BAUTO|BREGISTER:
1893e12c5d1SDavid du Colombier return CAUTO;
1903e12c5d1SDavid du Colombier case BEXTERN:
1913e12c5d1SDavid du Colombier return CEXTERN;
1923e12c5d1SDavid du Colombier case BEXTERN|BREGISTER:
1933e12c5d1SDavid du Colombier return CEXREG;
1943e12c5d1SDavid du Colombier case BSTATIC:
1953e12c5d1SDavid du Colombier return CSTATIC;
1963e12c5d1SDavid du Colombier case BTYPEDEF:
1973e12c5d1SDavid du Colombier return CTYPEDEF;
19880ee5cbfSDavid du Colombier case BTYPESTR:
19980ee5cbfSDavid du Colombier return CTYPESTR;
2003e12c5d1SDavid du Colombier }
2013e12c5d1SDavid du Colombier diag(Z, "illegal combination of classes %Q", b);
2023e12c5d1SDavid du Colombier return CXXX;
2033e12c5d1SDavid du Colombier }
2043e12c5d1SDavid du Colombier
2053e12c5d1SDavid du Colombier Type*
simplet(long b)2063e12c5d1SDavid du Colombier simplet(long b)
2073e12c5d1SDavid du Colombier {
2083e12c5d1SDavid du Colombier
2097dd7cddfSDavid du Colombier b &= ~BCLASS & ~BGARB;
2103e12c5d1SDavid du Colombier switch(b) {
2113e12c5d1SDavid du Colombier case BCHAR:
2123e12c5d1SDavid du Colombier case BCHAR|BSIGNED:
2133e12c5d1SDavid du Colombier return types[TCHAR];
2143e12c5d1SDavid du Colombier
2153e12c5d1SDavid du Colombier case BCHAR|BUNSIGNED:
2163e12c5d1SDavid du Colombier return types[TUCHAR];
2173e12c5d1SDavid du Colombier
2183e12c5d1SDavid du Colombier case BSHORT:
2193e12c5d1SDavid du Colombier case BSHORT|BINT:
2203e12c5d1SDavid du Colombier case BSHORT|BSIGNED:
2213e12c5d1SDavid du Colombier case BSHORT|BINT|BSIGNED:
2223e12c5d1SDavid du Colombier return types[TSHORT];
2233e12c5d1SDavid du Colombier
2243e12c5d1SDavid du Colombier case BUNSIGNED|BSHORT:
2253e12c5d1SDavid du Colombier case BUNSIGNED|BSHORT|BINT:
2263e12c5d1SDavid du Colombier return types[TUSHORT];
2273e12c5d1SDavid du Colombier
2283e12c5d1SDavid du Colombier case 0:
2293e12c5d1SDavid du Colombier case BINT:
2303e12c5d1SDavid du Colombier case BINT|BSIGNED:
2313e12c5d1SDavid du Colombier case BSIGNED:
2327dd7cddfSDavid du Colombier return types[TINT];
2333e12c5d1SDavid du Colombier
2343e12c5d1SDavid du Colombier case BUNSIGNED:
2353e12c5d1SDavid du Colombier case BUNSIGNED|BINT:
2367dd7cddfSDavid du Colombier return types[TUINT];
2373e12c5d1SDavid du Colombier
2383e12c5d1SDavid du Colombier case BLONG:
2393e12c5d1SDavid du Colombier case BLONG|BINT:
2403e12c5d1SDavid du Colombier case BLONG|BSIGNED:
2413e12c5d1SDavid du Colombier case BLONG|BINT|BSIGNED:
2423e12c5d1SDavid du Colombier return types[TLONG];
2433e12c5d1SDavid du Colombier
2443e12c5d1SDavid du Colombier case BUNSIGNED|BLONG:
2453e12c5d1SDavid du Colombier case BUNSIGNED|BLONG|BINT:
2463e12c5d1SDavid du Colombier return types[TULONG];
2473e12c5d1SDavid du Colombier
2483e12c5d1SDavid du Colombier case BVLONG|BLONG:
2493e12c5d1SDavid du Colombier case BVLONG|BLONG|BINT:
2503e12c5d1SDavid du Colombier case BVLONG|BLONG|BSIGNED:
2513e12c5d1SDavid du Colombier case BVLONG|BLONG|BINT|BSIGNED:
2523e12c5d1SDavid du Colombier return types[TVLONG];
2533e12c5d1SDavid du Colombier
254219b2ee8SDavid du Colombier case BVLONG|BLONG|BUNSIGNED:
255219b2ee8SDavid du Colombier case BVLONG|BLONG|BINT|BUNSIGNED:
256219b2ee8SDavid du Colombier return types[TUVLONG];
257219b2ee8SDavid du Colombier
2583e12c5d1SDavid du Colombier case BFLOAT:
2593e12c5d1SDavid du Colombier return types[TFLOAT];
2603e12c5d1SDavid du Colombier
2613e12c5d1SDavid du Colombier case BDOUBLE:
2623e12c5d1SDavid du Colombier case BDOUBLE|BLONG:
2633e12c5d1SDavid du Colombier case BFLOAT|BLONG:
2643e12c5d1SDavid du Colombier return types[TDOUBLE];
2653e12c5d1SDavid du Colombier
2663e12c5d1SDavid du Colombier case BVOID:
2673e12c5d1SDavid du Colombier return types[TVOID];
2683e12c5d1SDavid du Colombier }
2693e12c5d1SDavid du Colombier
2703e12c5d1SDavid du Colombier diag(Z, "illegal combination of types %Q", b);
2717dd7cddfSDavid du Colombier return types[TINT];
2723e12c5d1SDavid du Colombier }
2733e12c5d1SDavid du Colombier
2743e12c5d1SDavid du Colombier int
stcompat(Node * n,Type * t1,Type * t2,long ttab[])2753e12c5d1SDavid du Colombier stcompat(Node *n, Type *t1, Type *t2, long ttab[])
2763e12c5d1SDavid du Colombier {
2777dd7cddfSDavid du Colombier int i;
2787dd7cddfSDavid du Colombier ulong b;
2793e12c5d1SDavid du Colombier
2803e12c5d1SDavid du Colombier i = 0;
2813e12c5d1SDavid du Colombier if(t2 != T)
2823e12c5d1SDavid du Colombier i = t2->etype;
2833e12c5d1SDavid du Colombier b = 1L << i;
2843e12c5d1SDavid du Colombier i = 0;
2853e12c5d1SDavid du Colombier if(t1 != T)
2863e12c5d1SDavid du Colombier i = t1->etype;
2873e12c5d1SDavid du Colombier if(b & ttab[i]) {
2883e12c5d1SDavid du Colombier if(ttab == tasign)
2893e12c5d1SDavid du Colombier if(b == BSTRUCT || b == BUNION)
2903e12c5d1SDavid du Colombier if(!sametype(t1, t2))
2913e12c5d1SDavid du Colombier return 1;
2923e12c5d1SDavid du Colombier if(n->op != OCAST)
2933e12c5d1SDavid du Colombier if(b == BIND && i == TIND)
2943e12c5d1SDavid du Colombier if(!sametype(t1, t2))
2953e12c5d1SDavid du Colombier return 1;
2963e12c5d1SDavid du Colombier return 0;
2973e12c5d1SDavid du Colombier }
2983e12c5d1SDavid du Colombier return 1;
2993e12c5d1SDavid du Colombier }
3003e12c5d1SDavid du Colombier
3013e12c5d1SDavid du Colombier int
tcompat(Node * n,Type * t1,Type * t2,long ttab[])3023e12c5d1SDavid du Colombier tcompat(Node *n, Type *t1, Type *t2, long ttab[])
3033e12c5d1SDavid du Colombier {
3043e12c5d1SDavid du Colombier
3053e12c5d1SDavid du Colombier if(stcompat(n, t1, t2, ttab)) {
3063e12c5d1SDavid du Colombier if(t1 == T)
3073e12c5d1SDavid du Colombier diag(n, "incompatible type: \"%T\" for op \"%O\"",
3083e12c5d1SDavid du Colombier t2, n->op);
3093e12c5d1SDavid du Colombier else
3103e12c5d1SDavid du Colombier diag(n, "incompatible types: \"%T\" and \"%T\" for op \"%O\"",
3113e12c5d1SDavid du Colombier t1, t2, n->op);
3123e12c5d1SDavid du Colombier return 1;
3133e12c5d1SDavid du Colombier }
3143e12c5d1SDavid du Colombier return 0;
3153e12c5d1SDavid du Colombier }
3163e12c5d1SDavid du Colombier
3173e12c5d1SDavid du Colombier void
makedot(Node * n,Type * t,long o)3183e12c5d1SDavid du Colombier makedot(Node *n, Type *t, long o)
3193e12c5d1SDavid du Colombier {
3203e12c5d1SDavid du Colombier Node *n1, *n2;
3213e12c5d1SDavid du Colombier
3223e12c5d1SDavid du Colombier if(t->nbits) {
3233e12c5d1SDavid du Colombier n1 = new(OXXX, Z, Z);
3243e12c5d1SDavid du Colombier *n1 = *n;
3253e12c5d1SDavid du Colombier n->op = OBIT;
3263e12c5d1SDavid du Colombier n->left = n1;
3273e12c5d1SDavid du Colombier n->right = Z;
3283e12c5d1SDavid du Colombier n->type = t;
3293e12c5d1SDavid du Colombier n->addable = n1->left->addable;
3303e12c5d1SDavid du Colombier n = n1;
3313e12c5d1SDavid du Colombier }
3323e12c5d1SDavid du Colombier n->addable = n->left->addable;
3333e12c5d1SDavid du Colombier if(n->addable == 0) {
3343e12c5d1SDavid du Colombier n1 = new1(OCONST, Z, Z);
335219b2ee8SDavid du Colombier n1->vconst = o;
3363e12c5d1SDavid du Colombier n1->type = types[TLONG];
3373e12c5d1SDavid du Colombier n->right = n1;
3383e12c5d1SDavid du Colombier n->type = t;
3393e12c5d1SDavid du Colombier return;
3403e12c5d1SDavid du Colombier }
3413e12c5d1SDavid du Colombier n->left->type = t;
3423e12c5d1SDavid du Colombier if(o == 0) {
3433e12c5d1SDavid du Colombier *n = *n->left;
3443e12c5d1SDavid du Colombier return;
3453e12c5d1SDavid du Colombier }
3463e12c5d1SDavid du Colombier n->type = t;
3473e12c5d1SDavid du Colombier n1 = new1(OCONST, Z, Z);
348219b2ee8SDavid du Colombier n1->vconst = o;
3493e12c5d1SDavid du Colombier t = typ(TIND, t);
3503e12c5d1SDavid du Colombier t->width = types[TIND]->width;
3513e12c5d1SDavid du Colombier n1->type = t;
3523e12c5d1SDavid du Colombier
3533e12c5d1SDavid du Colombier n2 = new1(OADDR, n->left, Z);
3543e12c5d1SDavid du Colombier n2->type = t;
3553e12c5d1SDavid du Colombier
3563e12c5d1SDavid du Colombier n1 = new1(OADD, n1, n2);
3573e12c5d1SDavid du Colombier n1->type = t;
3583e12c5d1SDavid du Colombier
3593e12c5d1SDavid du Colombier n->op = OIND;
3603e12c5d1SDavid du Colombier n->left = n1;
3613e12c5d1SDavid du Colombier n->right = Z;
3623e12c5d1SDavid du Colombier }
3633e12c5d1SDavid du Colombier
3643e12c5d1SDavid du Colombier Type*
dotsearch(Sym * s,Type * t,Node * n,long * off)36580ee5cbfSDavid du Colombier dotsearch(Sym *s, Type *t, Node *n, long *off)
3663e12c5d1SDavid du Colombier {
36780ee5cbfSDavid du Colombier Type *t1, *xt, *rt;
3683e12c5d1SDavid du Colombier
3693e12c5d1SDavid du Colombier xt = T;
3703e12c5d1SDavid du Colombier
3713e12c5d1SDavid du Colombier /*
3723e12c5d1SDavid du Colombier * look it up by name
3733e12c5d1SDavid du Colombier */
3743e12c5d1SDavid du Colombier for(t1 = t; t1 != T; t1 = t1->down)
3753e12c5d1SDavid du Colombier if(t1->sym == s) {
3763e12c5d1SDavid du Colombier if(xt != T)
3773e12c5d1SDavid du Colombier goto ambig;
3783e12c5d1SDavid du Colombier xt = t1;
3793e12c5d1SDavid du Colombier }
3803e12c5d1SDavid du Colombier
3813e12c5d1SDavid du Colombier /*
3823e12c5d1SDavid du Colombier * look it up by type
3833e12c5d1SDavid du Colombier */
38480ee5cbfSDavid du Colombier if(s->class == CTYPEDEF || s->class == CTYPESTR)
3853e12c5d1SDavid du Colombier for(t1 = t; t1 != T; t1 = t1->down)
3863e12c5d1SDavid du Colombier if(t1->sym == S && typesu[t1->etype])
3873e12c5d1SDavid du Colombier if(sametype(s->type, t1)) {
3883e12c5d1SDavid du Colombier if(xt != T)
3893e12c5d1SDavid du Colombier goto ambig;
3903e12c5d1SDavid du Colombier xt = t1;
3913e12c5d1SDavid du Colombier }
39280ee5cbfSDavid du Colombier if(xt != T) {
39380ee5cbfSDavid du Colombier *off = xt->offset;
3943e12c5d1SDavid du Colombier return xt;
39580ee5cbfSDavid du Colombier }
3963e12c5d1SDavid du Colombier
3973e12c5d1SDavid du Colombier /*
3983e12c5d1SDavid du Colombier * look it up in unnamed substructures
3993e12c5d1SDavid du Colombier */
4003e12c5d1SDavid du Colombier for(t1 = t; t1 != T; t1 = t1->down)
40180ee5cbfSDavid du Colombier if(t1->sym == S && typesu[t1->etype]){
40280ee5cbfSDavid du Colombier rt = dotsearch(s, t1->link, n, off);
40380ee5cbfSDavid du Colombier if(rt != T) {
4043e12c5d1SDavid du Colombier if(xt != T)
4053e12c5d1SDavid du Colombier goto ambig;
40680ee5cbfSDavid du Colombier xt = rt;
40780ee5cbfSDavid du Colombier *off += t1->offset;
40880ee5cbfSDavid du Colombier }
4093e12c5d1SDavid du Colombier }
4103e12c5d1SDavid du Colombier return xt;
4113e12c5d1SDavid du Colombier
4123e12c5d1SDavid du Colombier ambig:
4133e12c5d1SDavid du Colombier diag(n, "ambiguous structure element: %s", s->name);
4143e12c5d1SDavid du Colombier return xt;
4153e12c5d1SDavid du Colombier }
4163e12c5d1SDavid du Colombier
4173e12c5d1SDavid du Colombier long
dotoffset(Type * st,Type * lt,Node * n)4183e12c5d1SDavid du Colombier dotoffset(Type *st, Type *lt, Node *n)
4193e12c5d1SDavid du Colombier {
4203e12c5d1SDavid du Colombier Type *t;
4213e12c5d1SDavid du Colombier Sym *g;
4223e12c5d1SDavid du Colombier long o, o1;
4233e12c5d1SDavid du Colombier
4243e12c5d1SDavid du Colombier o = -1;
4253e12c5d1SDavid du Colombier /*
4263e12c5d1SDavid du Colombier * first try matching at the top level
4273e12c5d1SDavid du Colombier * for matching tag names
4283e12c5d1SDavid du Colombier */
4293e12c5d1SDavid du Colombier g = st->tag;
4303e12c5d1SDavid du Colombier if(g != S)
4313e12c5d1SDavid du Colombier for(t=lt->link; t!=T; t=t->down)
4323e12c5d1SDavid du Colombier if(t->sym == S)
4333e12c5d1SDavid du Colombier if(g == t->tag) {
4343e12c5d1SDavid du Colombier if(o >= 0)
4353e12c5d1SDavid du Colombier goto ambig;
4363e12c5d1SDavid du Colombier o = t->offset;
4373e12c5d1SDavid du Colombier }
4383e12c5d1SDavid du Colombier if(o >= 0)
4393e12c5d1SDavid du Colombier return o;
4403e12c5d1SDavid du Colombier
4413e12c5d1SDavid du Colombier /*
4423e12c5d1SDavid du Colombier * second try matching at the top level
4433e12c5d1SDavid du Colombier * for similar types
4443e12c5d1SDavid du Colombier */
4453e12c5d1SDavid du Colombier for(t=lt->link; t!=T; t=t->down)
4463e12c5d1SDavid du Colombier if(t->sym == S)
4473e12c5d1SDavid du Colombier if(sametype(st, t)) {
4483e12c5d1SDavid du Colombier if(o >= 0)
4493e12c5d1SDavid du Colombier goto ambig;
4503e12c5d1SDavid du Colombier o = t->offset;
4513e12c5d1SDavid du Colombier }
4523e12c5d1SDavid du Colombier if(o >= 0)
4533e12c5d1SDavid du Colombier return o;
4543e12c5d1SDavid du Colombier
4553e12c5d1SDavid du Colombier /*
4563e12c5d1SDavid du Colombier * last try matching sub-levels
4573e12c5d1SDavid du Colombier */
4583e12c5d1SDavid du Colombier for(t=lt->link; t!=T; t=t->down)
4593e12c5d1SDavid du Colombier if(t->sym == S)
4603e12c5d1SDavid du Colombier if(typesu[t->etype]) {
4613e12c5d1SDavid du Colombier o1 = dotoffset(st, t, n);
4623e12c5d1SDavid du Colombier if(o1 >= 0) {
4633e12c5d1SDavid du Colombier if(o >= 0)
4643e12c5d1SDavid du Colombier goto ambig;
4653e12c5d1SDavid du Colombier o = o1 + t->offset;
4663e12c5d1SDavid du Colombier }
4673e12c5d1SDavid du Colombier }
4683e12c5d1SDavid du Colombier return o;
4693e12c5d1SDavid du Colombier
4703e12c5d1SDavid du Colombier ambig:
4713e12c5d1SDavid du Colombier diag(n, "ambiguous unnamed structure element");
4723e12c5d1SDavid du Colombier return o;
4733e12c5d1SDavid du Colombier }
4743e12c5d1SDavid du Colombier
475219b2ee8SDavid du Colombier /*
476219b2ee8SDavid du Colombier * look into tree for floating point constant expressions
477219b2ee8SDavid du Colombier */
478219b2ee8SDavid du Colombier int
allfloat(Node * n,int flag)479219b2ee8SDavid du Colombier allfloat(Node *n, int flag)
480219b2ee8SDavid du Colombier {
481219b2ee8SDavid du Colombier
482219b2ee8SDavid du Colombier if(n != Z) {
483219b2ee8SDavid du Colombier if(n->type->etype != TDOUBLE)
484219b2ee8SDavid du Colombier return 1;
485219b2ee8SDavid du Colombier switch(n->op) {
486219b2ee8SDavid du Colombier case OCONST:
487219b2ee8SDavid du Colombier if(flag)
488219b2ee8SDavid du Colombier n->type = types[TFLOAT];
489219b2ee8SDavid du Colombier return 1;
490219b2ee8SDavid du Colombier case OADD: /* no need to get more exotic than this */
491219b2ee8SDavid du Colombier case OSUB:
492219b2ee8SDavid du Colombier case OMUL:
493219b2ee8SDavid du Colombier case ODIV:
494219b2ee8SDavid du Colombier if(!allfloat(n->right, flag))
495219b2ee8SDavid du Colombier break;
496219b2ee8SDavid du Colombier case OCAST:
497219b2ee8SDavid du Colombier if(!allfloat(n->left, flag))
498219b2ee8SDavid du Colombier break;
499219b2ee8SDavid du Colombier if(flag)
500219b2ee8SDavid du Colombier n->type = types[TFLOAT];
501219b2ee8SDavid du Colombier return 1;
502219b2ee8SDavid du Colombier }
503219b2ee8SDavid du Colombier }
504219b2ee8SDavid du Colombier return 0;
505219b2ee8SDavid du Colombier }
506219b2ee8SDavid du Colombier
507219b2ee8SDavid du Colombier void
constas(Node * n,Type * il,Type * ir)5087dd7cddfSDavid du Colombier constas(Node *n, Type *il, Type *ir)
5097dd7cddfSDavid du Colombier {
5107dd7cddfSDavid du Colombier Type *l, *r;
5117dd7cddfSDavid du Colombier
5127dd7cddfSDavid du Colombier l = il;
5137dd7cddfSDavid du Colombier r = ir;
5147dd7cddfSDavid du Colombier
5157dd7cddfSDavid du Colombier if(l == T)
5167dd7cddfSDavid du Colombier return;
5177dd7cddfSDavid du Colombier if(l->garb & GCONSTNT) {
5187dd7cddfSDavid du Colombier warn(n, "assignment to a constant type (%T)", il);
5197dd7cddfSDavid du Colombier return;
5207dd7cddfSDavid du Colombier }
5217dd7cddfSDavid du Colombier if(r == T)
5227dd7cddfSDavid du Colombier return;
5237dd7cddfSDavid du Colombier for(;;) {
5247dd7cddfSDavid du Colombier if(l->etype != TIND || r->etype != TIND)
5257dd7cddfSDavid du Colombier break;
5267dd7cddfSDavid du Colombier l = l->link;
5277dd7cddfSDavid du Colombier r = r->link;
5287dd7cddfSDavid du Colombier if(l == T || r == T)
5297dd7cddfSDavid du Colombier break;
5307dd7cddfSDavid du Colombier if(r->garb & GCONSTNT)
5317dd7cddfSDavid du Colombier if(!(l->garb & GCONSTNT)) {
5327dd7cddfSDavid du Colombier warn(n, "assignment of a constant pointer type (%T)", ir);
5337dd7cddfSDavid du Colombier break;
5347dd7cddfSDavid du Colombier }
5357dd7cddfSDavid du Colombier }
5367dd7cddfSDavid du Colombier }
5377dd7cddfSDavid du Colombier
5387dd7cddfSDavid du Colombier void
typeext1(Type * st,Node * l)539219b2ee8SDavid du Colombier typeext1(Type *st, Node *l)
540219b2ee8SDavid du Colombier {
541219b2ee8SDavid du Colombier if(st->etype == TFLOAT && allfloat(l, 0))
542219b2ee8SDavid du Colombier allfloat(l, 1);
543219b2ee8SDavid du Colombier }
544219b2ee8SDavid du Colombier
5453e12c5d1SDavid du Colombier void
typeext(Type * st,Node * l)5463e12c5d1SDavid du Colombier typeext(Type *st, Node *l)
5473e12c5d1SDavid du Colombier {
5483e12c5d1SDavid du Colombier Type *lt;
5493e12c5d1SDavid du Colombier Node *n1, *n2;
5503e12c5d1SDavid du Colombier long o;
5513e12c5d1SDavid du Colombier
5523e12c5d1SDavid du Colombier lt = l->type;
5533e12c5d1SDavid du Colombier if(lt == T)
5543e12c5d1SDavid du Colombier return;
5553e12c5d1SDavid du Colombier if(st->etype == TIND && vconst(l) == 0) {
5563e12c5d1SDavid du Colombier l->type = st;
557219b2ee8SDavid du Colombier l->vconst = 0;
5583e12c5d1SDavid du Colombier return;
5593e12c5d1SDavid du Colombier }
560219b2ee8SDavid du Colombier typeext1(st, l);
5613e12c5d1SDavid du Colombier
5623e12c5d1SDavid du Colombier /*
5633e12c5d1SDavid du Colombier * extension of C
5643e12c5d1SDavid du Colombier * if assign of struct containing unnamed sub-struct
5653e12c5d1SDavid du Colombier * to type of sub-struct, insert the DOT.
5663e12c5d1SDavid du Colombier * if assign of *struct containing unnamed substruct
5673e12c5d1SDavid du Colombier * to type of *sub-struct, insert the add-offset
5683e12c5d1SDavid du Colombier */
5693e12c5d1SDavid du Colombier if(typesu[st->etype] && typesu[lt->etype]) {
5703e12c5d1SDavid du Colombier o = dotoffset(st, lt, l);
5713e12c5d1SDavid du Colombier if(o >= 0) {
5723e12c5d1SDavid du Colombier n1 = new1(OXXX, Z, Z);
5733e12c5d1SDavid du Colombier *n1 = *l;
5743e12c5d1SDavid du Colombier l->op = ODOT;
5753e12c5d1SDavid du Colombier l->left = n1;
5763e12c5d1SDavid du Colombier l->right = Z;
5773e12c5d1SDavid du Colombier makedot(l, st, o);
5783e12c5d1SDavid du Colombier }
5793e12c5d1SDavid du Colombier return;
5803e12c5d1SDavid du Colombier }
5813e12c5d1SDavid du Colombier if(st->etype == TIND && typesu[st->link->etype])
5823e12c5d1SDavid du Colombier if(lt->etype == TIND && typesu[lt->link->etype]) {
5833e12c5d1SDavid du Colombier o = dotoffset(st->link, lt->link, l);
5843e12c5d1SDavid du Colombier if(o >= 0) {
5853e12c5d1SDavid du Colombier l->type = st;
5863e12c5d1SDavid du Colombier if(o == 0)
5873e12c5d1SDavid du Colombier return;
5883e12c5d1SDavid du Colombier n1 = new1(OXXX, Z, Z);
5893e12c5d1SDavid du Colombier *n1 = *l;
5903e12c5d1SDavid du Colombier n2 = new1(OCONST, Z, Z);
591219b2ee8SDavid du Colombier n2->vconst = o;
5923e12c5d1SDavid du Colombier n2->type = st;
5933e12c5d1SDavid du Colombier l->op = OADD;
5943e12c5d1SDavid du Colombier l->left = n1;
5953e12c5d1SDavid du Colombier l->right = n2;
5963e12c5d1SDavid du Colombier }
5973e12c5d1SDavid du Colombier return;
5983e12c5d1SDavid du Colombier }
5993e12c5d1SDavid du Colombier }
6003e12c5d1SDavid du Colombier
6013e12c5d1SDavid du Colombier /*
6023e12c5d1SDavid du Colombier * a cast that generates no code
6033e12c5d1SDavid du Colombier * (same size move)
6043e12c5d1SDavid du Colombier */
6053e12c5d1SDavid du Colombier int
nocast(Type * t1,Type * t2)6063e12c5d1SDavid du Colombier nocast(Type *t1, Type *t2)
6073e12c5d1SDavid du Colombier {
6083e12c5d1SDavid du Colombier int i, b;
6093e12c5d1SDavid du Colombier
6103e12c5d1SDavid du Colombier if(t1->nbits)
6113e12c5d1SDavid du Colombier return 0;
6123e12c5d1SDavid du Colombier i = 0;
6133e12c5d1SDavid du Colombier if(t2 != T)
6143e12c5d1SDavid du Colombier i = t2->etype;
6153e12c5d1SDavid du Colombier b = 1<<i;
6163e12c5d1SDavid du Colombier i = 0;
6173e12c5d1SDavid du Colombier if(t1 != T)
6183e12c5d1SDavid du Colombier i = t1->etype;
6193e12c5d1SDavid du Colombier if(b & ncast[i])
6203e12c5d1SDavid du Colombier return 1;
6213e12c5d1SDavid du Colombier return 0;
6223e12c5d1SDavid du Colombier }
6233e12c5d1SDavid du Colombier
6243e12c5d1SDavid du Colombier /*
6253e12c5d1SDavid du Colombier * a cast that has a noop semantic
6263e12c5d1SDavid du Colombier * (small to large, convert)
6273e12c5d1SDavid du Colombier */
6283e12c5d1SDavid du Colombier int
nilcast(Type * t1,Type * t2)6293e12c5d1SDavid du Colombier nilcast(Type *t1, Type *t2)
6303e12c5d1SDavid du Colombier {
6317dd7cddfSDavid du Colombier int et1, et2;
6323e12c5d1SDavid du Colombier
6337dd7cddfSDavid du Colombier if(t1 == T)
6347dd7cddfSDavid du Colombier return 0;
6353e12c5d1SDavid du Colombier if(t1->nbits)
6363e12c5d1SDavid du Colombier return 0;
6377dd7cddfSDavid du Colombier if(t2 == T)
6387dd7cddfSDavid du Colombier return 0;
6397dd7cddfSDavid du Colombier et1 = t1->etype;
6407dd7cddfSDavid du Colombier et2 = t2->etype;
6417dd7cddfSDavid du Colombier if(et1 == et2)
6423e12c5d1SDavid du Colombier return 1;
6437dd7cddfSDavid du Colombier if(typefd[et1] && typefd[et2]) {
6447dd7cddfSDavid du Colombier if(ewidth[et1] < ewidth[et2])
6457dd7cddfSDavid du Colombier return 1;
6467dd7cddfSDavid du Colombier return 0;
6477dd7cddfSDavid du Colombier }
6487dd7cddfSDavid du Colombier if(typechlp[et1] && typechlp[et2]) {
6497dd7cddfSDavid du Colombier if(ewidth[et1] < ewidth[et2])
6507dd7cddfSDavid du Colombier return 1;
6517dd7cddfSDavid du Colombier return 0;
6527dd7cddfSDavid du Colombier }
6533e12c5d1SDavid du Colombier return 0;
6543e12c5d1SDavid du Colombier }
6553e12c5d1SDavid du Colombier
6563e12c5d1SDavid du Colombier /*
6573e12c5d1SDavid du Colombier * "the usual arithmetic conversions are performed"
6583e12c5d1SDavid du Colombier */
6593e12c5d1SDavid du Colombier void
arith(Node * n,int f)6603e12c5d1SDavid du Colombier arith(Node *n, int f)
6613e12c5d1SDavid du Colombier {
6623e12c5d1SDavid du Colombier Type *t1, *t2;
6633e12c5d1SDavid du Colombier int i, j, k;
6643e12c5d1SDavid du Colombier Node *n1;
6653e12c5d1SDavid du Colombier long w;
6663e12c5d1SDavid du Colombier
6673e12c5d1SDavid du Colombier t1 = n->left->type;
6683e12c5d1SDavid du Colombier if(n->right == Z)
6693e12c5d1SDavid du Colombier t2 = t1;
6703e12c5d1SDavid du Colombier else
6713e12c5d1SDavid du Colombier t2 = n->right->type;
6723e12c5d1SDavid du Colombier i = TXXX;
6733e12c5d1SDavid du Colombier if(t1 != T)
6743e12c5d1SDavid du Colombier i = t1->etype;
6753e12c5d1SDavid du Colombier j = TXXX;
6763e12c5d1SDavid du Colombier if(t2 != T)
6773e12c5d1SDavid du Colombier j = t2->etype;
6783e12c5d1SDavid du Colombier k = tab[i][j];
6793e12c5d1SDavid du Colombier if(k == TIND) {
6803e12c5d1SDavid du Colombier if(i == TIND)
6813e12c5d1SDavid du Colombier n->type = t1;
6823e12c5d1SDavid du Colombier else
6833e12c5d1SDavid du Colombier if(j == TIND)
6843e12c5d1SDavid du Colombier n->type = t2;
6853e12c5d1SDavid du Colombier } else {
6863e12c5d1SDavid du Colombier /* convert up to at least int */
6873e12c5d1SDavid du Colombier if(f == 1)
6887dd7cddfSDavid du Colombier while(k < TINT)
6893e12c5d1SDavid du Colombier k += 2;
6903e12c5d1SDavid du Colombier n->type = types[k];
6913e12c5d1SDavid du Colombier }
6923e12c5d1SDavid du Colombier if(n->op == OSUB)
6933e12c5d1SDavid du Colombier if(i == TIND && j == TIND) {
6943e12c5d1SDavid du Colombier w = n->right->type->link->width;
6952cca75a1SDavid du Colombier if(w < 1 || n->left->type->link == T || n->left->type->link->width < 1)
6963e12c5d1SDavid du Colombier goto bad;
6977bd483b0SDavid du Colombier n->type = types[ewidth[TIND] <= ewidth[TLONG]? TLONG: TVLONG];
6987bd483b0SDavid du Colombier if(1 && ewidth[TIND] > ewidth[TLONG]){
6997bd483b0SDavid du Colombier n1 = new1(OXXX, Z, Z);
7007bd483b0SDavid du Colombier *n1 = *n;
7017bd483b0SDavid du Colombier n->op = OCAST;
7027bd483b0SDavid du Colombier n->left = n1;
7037bd483b0SDavid du Colombier n->right = Z;
7047bd483b0SDavid du Colombier n->type = types[TLONG];
7057bd483b0SDavid du Colombier }
7063e12c5d1SDavid du Colombier if(w > 1) {
7073e12c5d1SDavid du Colombier n1 = new1(OXXX, Z, Z);
7083e12c5d1SDavid du Colombier *n1 = *n;
7093e12c5d1SDavid du Colombier n->op = ODIV;
7103e12c5d1SDavid du Colombier n->left = n1;
7113e12c5d1SDavid du Colombier n1 = new1(OCONST, Z, Z);
71280ee5cbfSDavid du Colombier n1->vconst = w;
7133e12c5d1SDavid du Colombier n1->type = n->type;
7143e12c5d1SDavid du Colombier n->right = n1;
71580ee5cbfSDavid du Colombier w = vlog(n1);
71680ee5cbfSDavid du Colombier if(w >= 0) {
71780ee5cbfSDavid du Colombier n->op = OASHR;
71880ee5cbfSDavid du Colombier n1->vconst = w;
71980ee5cbfSDavid du Colombier }
7203e12c5d1SDavid du Colombier }
7213e12c5d1SDavid du Colombier return;
7223e12c5d1SDavid du Colombier }
7233e12c5d1SDavid du Colombier if(!sametype(n->type, n->left->type)) {
7243e12c5d1SDavid du Colombier n->left = new1(OCAST, n->left, Z);
7253e12c5d1SDavid du Colombier n->left->type = n->type;
7263e12c5d1SDavid du Colombier if(n->type->etype == TIND) {
7273e12c5d1SDavid du Colombier w = n->type->link->width;
7287dd7cddfSDavid du Colombier if(w < 1) {
7297dd7cddfSDavid du Colombier snap(n->type->link);
7307dd7cddfSDavid du Colombier w = n->type->link->width;
7313e12c5d1SDavid du Colombier if(w < 1)
7323e12c5d1SDavid du Colombier goto bad;
7337dd7cddfSDavid du Colombier }
7343e12c5d1SDavid du Colombier if(w > 1) {
7353e12c5d1SDavid du Colombier n1 = new1(OCONST, Z, Z);
736219b2ee8SDavid du Colombier n1->vconst = w;
7373e12c5d1SDavid du Colombier n1->type = n->type;
7383e12c5d1SDavid du Colombier n->left = new1(OMUL, n->left, n1);
7393e12c5d1SDavid du Colombier n->left->type = n->type;
7403e12c5d1SDavid du Colombier }
7413e12c5d1SDavid du Colombier }
7423e12c5d1SDavid du Colombier }
7433e12c5d1SDavid du Colombier if(n->right != Z)
7443e12c5d1SDavid du Colombier if(!sametype(n->type, n->right->type)) {
7453e12c5d1SDavid du Colombier n->right = new1(OCAST, n->right, Z);
7463e12c5d1SDavid du Colombier n->right->type = n->type;
7473e12c5d1SDavid du Colombier if(n->type->etype == TIND) {
7483e12c5d1SDavid du Colombier w = n->type->link->width;
7497dd7cddfSDavid du Colombier if(w < 1) {
7507dd7cddfSDavid du Colombier snap(n->type->link);
7517dd7cddfSDavid du Colombier w = n->type->link->width;
7523e12c5d1SDavid du Colombier if(w < 1)
7533e12c5d1SDavid du Colombier goto bad;
7547dd7cddfSDavid du Colombier }
7553e12c5d1SDavid du Colombier if(w != 1) {
7563e12c5d1SDavid du Colombier n1 = new1(OCONST, Z, Z);
757219b2ee8SDavid du Colombier n1->vconst = w;
7583e12c5d1SDavid du Colombier n1->type = n->type;
7593e12c5d1SDavid du Colombier n->right = new1(OMUL, n->right, n1);
7603e12c5d1SDavid du Colombier n->right->type = n->type;
7613e12c5d1SDavid du Colombier }
7623e12c5d1SDavid du Colombier }
7633e12c5d1SDavid du Colombier }
7643e12c5d1SDavid du Colombier return;
7653e12c5d1SDavid du Colombier bad:
7667dd7cddfSDavid du Colombier diag(n, "pointer addition not fully declared: %T", n->type->link);
7673e12c5d1SDavid du Colombier }
7683e12c5d1SDavid du Colombier
769375daca8SDavid du Colombier /*
770375daca8SDavid du Colombier * try to rewrite shift & mask
771375daca8SDavid du Colombier */
772375daca8SDavid du Colombier void
simplifyshift(Node * n)773375daca8SDavid du Colombier simplifyshift(Node *n)
774375daca8SDavid du Colombier {
775375daca8SDavid du Colombier ulong c3;
776375daca8SDavid du Colombier int o, s1, s2, c1, c2;
777375daca8SDavid du Colombier
778375daca8SDavid du Colombier if(!typechlp[n->type->etype])
779375daca8SDavid du Colombier return;
780375daca8SDavid du Colombier switch(n->op) {
781375daca8SDavid du Colombier default:
782375daca8SDavid du Colombier return;
783375daca8SDavid du Colombier case OASHL:
784375daca8SDavid du Colombier s1 = 0;
785375daca8SDavid du Colombier break;
786375daca8SDavid du Colombier case OLSHR:
787375daca8SDavid du Colombier s1 = 1;
788375daca8SDavid du Colombier break;
789375daca8SDavid du Colombier case OASHR:
790375daca8SDavid du Colombier s1 = 2;
791375daca8SDavid du Colombier break;
792375daca8SDavid du Colombier }
793375daca8SDavid du Colombier if(n->right->op != OCONST)
794375daca8SDavid du Colombier return;
795375daca8SDavid du Colombier if(n->left->op != OAND)
796375daca8SDavid du Colombier return;
797375daca8SDavid du Colombier if(n->left->right->op != OCONST)
798375daca8SDavid du Colombier return;
799375daca8SDavid du Colombier switch(n->left->left->op) {
800375daca8SDavid du Colombier default:
801375daca8SDavid du Colombier return;
802375daca8SDavid du Colombier case OASHL:
803375daca8SDavid du Colombier s2 = 0;
804375daca8SDavid du Colombier break;
805375daca8SDavid du Colombier case OLSHR:
806375daca8SDavid du Colombier s2 = 1;
807375daca8SDavid du Colombier break;
808375daca8SDavid du Colombier case OASHR:
809375daca8SDavid du Colombier s2 = 2;
810375daca8SDavid du Colombier break;
811375daca8SDavid du Colombier }
812375daca8SDavid du Colombier if(n->left->left->right->op != OCONST)
813375daca8SDavid du Colombier return;
814375daca8SDavid du Colombier
815375daca8SDavid du Colombier c1 = n->right->vconst;
816375daca8SDavid du Colombier c2 = n->left->left->right->vconst;
817375daca8SDavid du Colombier c3 = n->left->right->vconst;
818375daca8SDavid du Colombier
819375daca8SDavid du Colombier /*
820375daca8SDavid du Colombier if(debug['h'])
821375daca8SDavid du Colombier print("%.3o %ld %ld %d #%.lux\n",
822375daca8SDavid du Colombier (s1<<3)|s2, c1, c2, topbit(c3), c3);
823375daca8SDavid du Colombier */
824375daca8SDavid du Colombier
825375daca8SDavid du Colombier o = n->op;
826375daca8SDavid du Colombier switch((s1<<3)|s2) {
827375daca8SDavid du Colombier case 000: /* (((e <<u c2) & c3) <<u c1) */
828375daca8SDavid du Colombier c3 >>= c2;
829375daca8SDavid du Colombier c1 += c2;
830375daca8SDavid du Colombier if(c1 >= 32)
831375daca8SDavid du Colombier break;
832375daca8SDavid du Colombier goto rewrite1;
833375daca8SDavid du Colombier
834375daca8SDavid du Colombier case 002: /* (((e >>s c2) & c3) <<u c1) */
835375daca8SDavid du Colombier if(topbit(c3) >= (32-c2))
836375daca8SDavid du Colombier break;
837375daca8SDavid du Colombier case 001: /* (((e >>u c2) & c3) <<u c1) */
838375daca8SDavid du Colombier if(c1 > c2) {
839375daca8SDavid du Colombier c3 <<= c2;
840375daca8SDavid du Colombier c1 -= c2;
841375daca8SDavid du Colombier o = OASHL;
842375daca8SDavid du Colombier goto rewrite1;
843375daca8SDavid du Colombier }
844375daca8SDavid du Colombier c3 <<= c1;
845375daca8SDavid du Colombier if(c1 == c2)
846375daca8SDavid du Colombier goto rewrite0;
847375daca8SDavid du Colombier c1 = c2-c1;
848375daca8SDavid du Colombier o = OLSHR;
849375daca8SDavid du Colombier goto rewrite2;
850375daca8SDavid du Colombier
851375daca8SDavid du Colombier case 022: /* (((e >>s c2) & c3) >>s c1) */
852375daca8SDavid du Colombier if(c2 <= 0)
853375daca8SDavid du Colombier break;
854375daca8SDavid du Colombier case 012: /* (((e >>s c2) & c3) >>u c1) */
855375daca8SDavid du Colombier if(topbit(c3) >= (32-c2))
856375daca8SDavid du Colombier break;
857375daca8SDavid du Colombier goto s11;
858375daca8SDavid du Colombier case 021: /* (((e >>u c2) & c3) >>s c1) */
859375daca8SDavid du Colombier if(topbit(c3) >= 31 && c2 <= 0)
860375daca8SDavid du Colombier break;
861375daca8SDavid du Colombier goto s11;
862375daca8SDavid du Colombier case 011: /* (((e >>u c2) & c3) >>u c1) */
863375daca8SDavid du Colombier s11:
864375daca8SDavid du Colombier c3 <<= c2;
865375daca8SDavid du Colombier c1 += c2;
866375daca8SDavid du Colombier if(c1 >= 32)
867375daca8SDavid du Colombier break;
868375daca8SDavid du Colombier o = OLSHR;
869375daca8SDavid du Colombier goto rewrite1;
870375daca8SDavid du Colombier
871375daca8SDavid du Colombier case 020: /* (((e <<u c2) & c3) >>s c1) */
872375daca8SDavid du Colombier if(topbit(c3) >= 31)
873375daca8SDavid du Colombier break;
874375daca8SDavid du Colombier case 010: /* (((e <<u c2) & c3) >>u c1) */
875375daca8SDavid du Colombier c3 >>= c1;
876375daca8SDavid du Colombier if(c1 == c2)
877375daca8SDavid du Colombier goto rewrite0;
878375daca8SDavid du Colombier if(c1 > c2) {
879375daca8SDavid du Colombier c1 -= c2;
880375daca8SDavid du Colombier goto rewrite2;
881375daca8SDavid du Colombier }
882375daca8SDavid du Colombier c1 = c2 - c1;
883375daca8SDavid du Colombier o = OASHL;
884375daca8SDavid du Colombier goto rewrite2;
885375daca8SDavid du Colombier }
886375daca8SDavid du Colombier return;
887375daca8SDavid du Colombier
888375daca8SDavid du Colombier rewrite0: /* get rid of both shifts */
889375daca8SDavid du Colombier if(debug['<'])prtree(n, "rewrite0");
890375daca8SDavid du Colombier *n = *n->left;
891375daca8SDavid du Colombier n->left = n->left->left;
892375daca8SDavid du Colombier n->right->vconst = c3;
893375daca8SDavid du Colombier return;
894375daca8SDavid du Colombier rewrite1: /* get rid of lower shift */
895375daca8SDavid du Colombier if(debug['<'])prtree(n, "rewrite1");
896375daca8SDavid du Colombier n->left->left = n->left->left->left;
897375daca8SDavid du Colombier n->left->right->vconst = c3;
898375daca8SDavid du Colombier n->right->vconst = c1;
899375daca8SDavid du Colombier n->op = o;
900375daca8SDavid du Colombier return;
901375daca8SDavid du Colombier rewrite2: /* get rid of upper shift */
902375daca8SDavid du Colombier if(debug['<'])prtree(n, "rewrite2");
903375daca8SDavid du Colombier *n = *n->left;
904375daca8SDavid du Colombier n->right->vconst = c3;
905375daca8SDavid du Colombier n->left->right->vconst = c1;
906375daca8SDavid du Colombier n->left->op = o;
907375daca8SDavid du Colombier }
908375daca8SDavid du Colombier
9093e12c5d1SDavid du Colombier int
side(Node * n)9103e12c5d1SDavid du Colombier side(Node *n)
9113e12c5d1SDavid du Colombier {
9123e12c5d1SDavid du Colombier
9133e12c5d1SDavid du Colombier loop:
9143e12c5d1SDavid du Colombier if(n != Z)
9153e12c5d1SDavid du Colombier switch(n->op) {
9163e12c5d1SDavid du Colombier case OCAST:
9173e12c5d1SDavid du Colombier case ONOT:
9183e12c5d1SDavid du Colombier case OADDR:
9193e12c5d1SDavid du Colombier case OIND:
9203e12c5d1SDavid du Colombier n = n->left;
9213e12c5d1SDavid du Colombier goto loop;
9223e12c5d1SDavid du Colombier
9233e12c5d1SDavid du Colombier case OCOND:
9243e12c5d1SDavid du Colombier if(side(n->left))
9253e12c5d1SDavid du Colombier break;
9263e12c5d1SDavid du Colombier n = n->right;
9273e12c5d1SDavid du Colombier
9283e12c5d1SDavid du Colombier case OEQ:
9293e12c5d1SDavid du Colombier case ONE:
9303e12c5d1SDavid du Colombier case OLT:
9313e12c5d1SDavid du Colombier case OGE:
9323e12c5d1SDavid du Colombier case OGT:
9333e12c5d1SDavid du Colombier case OLE:
9343e12c5d1SDavid du Colombier case OADD:
9353e12c5d1SDavid du Colombier case OSUB:
9363e12c5d1SDavid du Colombier case OMUL:
9373e12c5d1SDavid du Colombier case OLMUL:
9383e12c5d1SDavid du Colombier case ODIV:
9393e12c5d1SDavid du Colombier case OLDIV:
9403e12c5d1SDavid du Colombier case OLSHR:
9413e12c5d1SDavid du Colombier case OASHL:
9423e12c5d1SDavid du Colombier case OASHR:
9433e12c5d1SDavid du Colombier case OAND:
9443e12c5d1SDavid du Colombier case OOR:
9453e12c5d1SDavid du Colombier case OXOR:
9463e12c5d1SDavid du Colombier case OMOD:
9473e12c5d1SDavid du Colombier case OLMOD:
9483e12c5d1SDavid du Colombier case OANDAND:
9493e12c5d1SDavid du Colombier case OOROR:
9503e12c5d1SDavid du Colombier case OCOMMA:
9513e12c5d1SDavid du Colombier case ODOT:
9523e12c5d1SDavid du Colombier if(side(n->left))
9533e12c5d1SDavid du Colombier break;
9543e12c5d1SDavid du Colombier n = n->right;
9553e12c5d1SDavid du Colombier goto loop;
9563e12c5d1SDavid du Colombier
9577dd7cddfSDavid du Colombier case OSIGN:
9583e12c5d1SDavid du Colombier case OSIZE:
9593e12c5d1SDavid du Colombier case OCONST:
9603e12c5d1SDavid du Colombier case OSTRING:
9613e12c5d1SDavid du Colombier case OLSTRING:
9623e12c5d1SDavid du Colombier case ONAME:
9633e12c5d1SDavid du Colombier return 0;
9643e12c5d1SDavid du Colombier }
9653e12c5d1SDavid du Colombier return 1;
9663e12c5d1SDavid du Colombier }
9673e12c5d1SDavid du Colombier
9683e12c5d1SDavid du Colombier int
vconst(Node * n)9693e12c5d1SDavid du Colombier vconst(Node *n)
9703e12c5d1SDavid du Colombier {
9713e12c5d1SDavid du Colombier int i;
9723e12c5d1SDavid du Colombier
9733e12c5d1SDavid du Colombier if(n == Z)
9743e12c5d1SDavid du Colombier goto no;
9753e12c5d1SDavid du Colombier if(n->op != OCONST)
9763e12c5d1SDavid du Colombier goto no;
9773e12c5d1SDavid du Colombier if(n->type == T)
9783e12c5d1SDavid du Colombier goto no;
9793e12c5d1SDavid du Colombier switch(n->type->etype)
9803e12c5d1SDavid du Colombier {
9813e12c5d1SDavid du Colombier case TFLOAT:
9823e12c5d1SDavid du Colombier case TDOUBLE:
9833e12c5d1SDavid du Colombier i = 100;
984219b2ee8SDavid du Colombier if(n->fconst > i || n->fconst < -i)
9853e12c5d1SDavid du Colombier goto no;
986219b2ee8SDavid du Colombier i = n->fconst;
987219b2ee8SDavid du Colombier if(i != n->fconst)
988219b2ee8SDavid du Colombier goto no;
989219b2ee8SDavid du Colombier return i;
990219b2ee8SDavid du Colombier
991219b2ee8SDavid du Colombier case TVLONG:
992219b2ee8SDavid du Colombier case TUVLONG:
993219b2ee8SDavid du Colombier i = n->vconst;
994219b2ee8SDavid du Colombier if(i != n->vconst)
9953e12c5d1SDavid du Colombier goto no;
9963e12c5d1SDavid du Colombier return i;
9973e12c5d1SDavid du Colombier
9983e12c5d1SDavid du Colombier case TCHAR:
9993e12c5d1SDavid du Colombier case TUCHAR:
10003e12c5d1SDavid du Colombier case TSHORT:
10013e12c5d1SDavid du Colombier case TUSHORT:
10027dd7cddfSDavid du Colombier case TINT:
10037dd7cddfSDavid du Colombier case TUINT:
10043e12c5d1SDavid du Colombier case TLONG:
10053e12c5d1SDavid du Colombier case TULONG:
10063e12c5d1SDavid du Colombier case TIND:
1007219b2ee8SDavid du Colombier i = n->vconst;
1008219b2ee8SDavid du Colombier if(i != n->vconst)
10093e12c5d1SDavid du Colombier goto no;
10103e12c5d1SDavid du Colombier return i;
10113e12c5d1SDavid du Colombier }
10123e12c5d1SDavid du Colombier no:
10133e12c5d1SDavid du Colombier return -159; /* first uninteresting constant */
10143e12c5d1SDavid du Colombier }
10153e12c5d1SDavid du Colombier
10163e12c5d1SDavid du Colombier /*
10177dd7cddfSDavid du Colombier * return log(n) if n is a power of 2 constant
10187dd7cddfSDavid du Colombier */
10197dd7cddfSDavid du Colombier int
log2(uvlong v)1020282e677fSDavid du Colombier log2(uvlong v)
10217dd7cddfSDavid du Colombier {
10227dd7cddfSDavid du Colombier int s, i;
1023282e677fSDavid du Colombier uvlong m;
10247dd7cddfSDavid du Colombier
10257dd7cddfSDavid du Colombier s = 0;
10267dd7cddfSDavid du Colombier m = MASK(8*sizeof(uvlong));
10277dd7cddfSDavid du Colombier for(i=32; i; i>>=1) {
10287dd7cddfSDavid du Colombier m >>= i;
10297dd7cddfSDavid du Colombier if(!(v & m)) {
10307dd7cddfSDavid du Colombier v >>= i;
10317dd7cddfSDavid du Colombier s += i;
10327dd7cddfSDavid du Colombier }
10337dd7cddfSDavid du Colombier }
10347dd7cddfSDavid du Colombier if(v == 1)
10357dd7cddfSDavid du Colombier return s;
1036282e677fSDavid du Colombier return -1;
1037282e677fSDavid du Colombier }
1038282e677fSDavid du Colombier
1039282e677fSDavid du Colombier int
vlog(Node * n)1040282e677fSDavid du Colombier vlog(Node *n)
1041282e677fSDavid du Colombier {
1042282e677fSDavid du Colombier if(n->op != OCONST)
1043282e677fSDavid du Colombier goto bad;
1044282e677fSDavid du Colombier if(typefd[n->type->etype])
1045282e677fSDavid du Colombier goto bad;
1046282e677fSDavid du Colombier
1047282e677fSDavid du Colombier return log2(n->vconst);
10487dd7cddfSDavid du Colombier
10497dd7cddfSDavid du Colombier bad:
10507dd7cddfSDavid du Colombier return -1;
10517dd7cddfSDavid du Colombier }
10527dd7cddfSDavid du Colombier
10537dd7cddfSDavid du Colombier int
topbit(ulong v)10547dd7cddfSDavid du Colombier topbit(ulong v)
10557dd7cddfSDavid du Colombier {
10567dd7cddfSDavid du Colombier int i;
10577dd7cddfSDavid du Colombier
10587dd7cddfSDavid du Colombier for(i = -1; v; i++)
10597dd7cddfSDavid du Colombier v >>= 1;
10607dd7cddfSDavid du Colombier return i;
10617dd7cddfSDavid du Colombier }
10627dd7cddfSDavid du Colombier
10637dd7cddfSDavid du Colombier /*
10643e12c5d1SDavid du Colombier * try to cast a constant down
10653e12c5d1SDavid du Colombier * rather than cast a variable up
10663e12c5d1SDavid du Colombier * example:
10673e12c5d1SDavid du Colombier * if(c == 'a')
10683e12c5d1SDavid du Colombier */
10693e12c5d1SDavid du Colombier void
relcon(Node * l,Node * r)10703e12c5d1SDavid du Colombier relcon(Node *l, Node *r)
10713e12c5d1SDavid du Colombier {
1072219b2ee8SDavid du Colombier vlong v;
10733e12c5d1SDavid du Colombier
10743e12c5d1SDavid du Colombier if(l->op != OCONST)
10753e12c5d1SDavid du Colombier return;
10763e12c5d1SDavid du Colombier if(r->op != OCAST)
10773e12c5d1SDavid du Colombier return;
10783e12c5d1SDavid du Colombier if(!nilcast(r->left->type, r->type))
10793e12c5d1SDavid du Colombier return;
10803e12c5d1SDavid du Colombier switch(r->type->etype) {
10813e12c5d1SDavid du Colombier default:
10823e12c5d1SDavid du Colombier return;
10833e12c5d1SDavid du Colombier case TCHAR:
10843e12c5d1SDavid du Colombier case TUCHAR:
10853e12c5d1SDavid du Colombier case TSHORT:
10863e12c5d1SDavid du Colombier case TUSHORT:
1087219b2ee8SDavid du Colombier v = convvtox(l->vconst, r->type->etype);
1088219b2ee8SDavid du Colombier if(v != l->vconst)
10893e12c5d1SDavid du Colombier return;
10903e12c5d1SDavid du Colombier break;
10913e12c5d1SDavid du Colombier }
10923e12c5d1SDavid du Colombier l->type = r->left->type;
10933e12c5d1SDavid du Colombier *r = *r->left;
10943e12c5d1SDavid du Colombier }
10953e12c5d1SDavid du Colombier
10963e12c5d1SDavid du Colombier int
relindex(int o)10973e12c5d1SDavid du Colombier relindex(int o)
10983e12c5d1SDavid du Colombier {
10993e12c5d1SDavid du Colombier
11003e12c5d1SDavid du Colombier switch(o) {
11013e12c5d1SDavid du Colombier default:
11023e12c5d1SDavid du Colombier diag(Z, "bad in relindex: %O", o);
11033e12c5d1SDavid du Colombier case OEQ: return 0;
11043e12c5d1SDavid du Colombier case ONE: return 1;
11053e12c5d1SDavid du Colombier case OLE: return 2;
11063e12c5d1SDavid du Colombier case OLS: return 3;
11073e12c5d1SDavid du Colombier case OLT: return 4;
11083e12c5d1SDavid du Colombier case OLO: return 5;
11093e12c5d1SDavid du Colombier case OGE: return 6;
11103e12c5d1SDavid du Colombier case OHS: return 7;
11113e12c5d1SDavid du Colombier case OGT: return 8;
11123e12c5d1SDavid du Colombier case OHI: return 9;
11133e12c5d1SDavid du Colombier }
11143e12c5d1SDavid du Colombier }
11153e12c5d1SDavid du Colombier
11163e12c5d1SDavid du Colombier Node*
invert(Node * n)11173e12c5d1SDavid du Colombier invert(Node *n)
11183e12c5d1SDavid du Colombier {
11193e12c5d1SDavid du Colombier Node *i;
11203e12c5d1SDavid du Colombier
11213e12c5d1SDavid du Colombier if(n == Z || n->op != OLIST)
11223e12c5d1SDavid du Colombier return n;
11233e12c5d1SDavid du Colombier i = n;
11243e12c5d1SDavid du Colombier for(n = n->left; n != Z; n = n->left) {
11253e12c5d1SDavid du Colombier if(n->op != OLIST)
11263e12c5d1SDavid du Colombier break;
11273e12c5d1SDavid du Colombier i->left = n->right;
11283e12c5d1SDavid du Colombier n->right = i;
11293e12c5d1SDavid du Colombier i = n;
11303e12c5d1SDavid du Colombier }
11313e12c5d1SDavid du Colombier i->left = n;
11323e12c5d1SDavid du Colombier return i;
11333e12c5d1SDavid du Colombier }
11343e12c5d1SDavid du Colombier
11353e12c5d1SDavid du Colombier int
bitno(long b)11363e12c5d1SDavid du Colombier bitno(long b)
11373e12c5d1SDavid du Colombier {
11383e12c5d1SDavid du Colombier int i;
11393e12c5d1SDavid du Colombier
11403e12c5d1SDavid du Colombier for(i=0; i<32; i++)
11413e12c5d1SDavid du Colombier if(b & (1L<<i))
11423e12c5d1SDavid du Colombier return i;
11433e12c5d1SDavid du Colombier diag(Z, "bad in bitno");
11443e12c5d1SDavid du Colombier return 0;
11453e12c5d1SDavid du Colombier }
11463e12c5d1SDavid du Colombier
11477dd7cddfSDavid du Colombier long
typebitor(long a,long b)11487dd7cddfSDavid du Colombier typebitor(long a, long b)
11497dd7cddfSDavid du Colombier {
11507dd7cddfSDavid du Colombier long c;
11517dd7cddfSDavid du Colombier
11527dd7cddfSDavid du Colombier c = a | b;
11537dd7cddfSDavid du Colombier if(a & b)
11547dd7cddfSDavid du Colombier if((a & b) == BLONG)
11557dd7cddfSDavid du Colombier c |= BVLONG; /* long long => vlong */
11567dd7cddfSDavid du Colombier else
11577dd7cddfSDavid du Colombier warn(Z, "once is enough: %Q", a & b);
11587dd7cddfSDavid du Colombier return c;
11597dd7cddfSDavid du Colombier }
11607dd7cddfSDavid du Colombier
11613e12c5d1SDavid du Colombier void
diag(Node * n,char * fmt,...)11627dd7cddfSDavid du Colombier diag(Node *n, char *fmt, ...)
11633e12c5d1SDavid du Colombier {
11643e12c5d1SDavid du Colombier char buf[STRINGSZ];
11657dd7cddfSDavid du Colombier va_list arg;
11663e12c5d1SDavid du Colombier
11677dd7cddfSDavid du Colombier va_start(arg, fmt);
11689a747e4fSDavid du Colombier vseprint(buf, buf+sizeof(buf), fmt, arg);
11697dd7cddfSDavid du Colombier va_end(arg);
117018027f8cSDavid du Colombier Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
11713e12c5d1SDavid du Colombier
117218027f8cSDavid du Colombier if(debug['X']){
117318027f8cSDavid du Colombier Bflush(&diagbuf);
11743e12c5d1SDavid du Colombier abort();
117518027f8cSDavid du Colombier }
11763e12c5d1SDavid du Colombier if(n != Z)
11773e12c5d1SDavid du Colombier if(debug['v'])
11783e12c5d1SDavid du Colombier prtree(n, "diagnostic");
11793e12c5d1SDavid du Colombier
11803e12c5d1SDavid du Colombier nerrors++;
11813e12c5d1SDavid du Colombier if(nerrors > 10) {
118218027f8cSDavid du Colombier Bprint(&diagbuf, "too many errors\n");
11833e12c5d1SDavid du Colombier errorexit();
11843e12c5d1SDavid du Colombier }
11853e12c5d1SDavid du Colombier }
11863e12c5d1SDavid du Colombier
11873e12c5d1SDavid du Colombier void
warn(Node * n,char * fmt,...)11887dd7cddfSDavid du Colombier warn(Node *n, char *fmt, ...)
11893e12c5d1SDavid du Colombier {
11903e12c5d1SDavid du Colombier char buf[STRINGSZ];
11917dd7cddfSDavid du Colombier va_list arg;
11923e12c5d1SDavid du Colombier
1193178702b1SDavid du Colombier if(debug['w'] || debug['W']) {
11947dd7cddfSDavid du Colombier va_start(arg, fmt);
11959a747e4fSDavid du Colombier vseprint(buf, buf+sizeof(buf), fmt, arg);
11967dd7cddfSDavid du Colombier va_end(arg);
1197178702b1SDavid du Colombier if(debug['W']) {
1198178702b1SDavid du Colombier diag(n, "%s", buf);
1199178702b1SDavid du Colombier return;
1200178702b1SDavid du Colombier }
1201178702b1SDavid du Colombier Bprint(&diagbuf, "warning: %L %s\n", (n==Z)? nearln: n->lineno, buf);
12023e12c5d1SDavid du Colombier
12033e12c5d1SDavid du Colombier if(n != Z)
12043e12c5d1SDavid du Colombier if(debug['v'])
12053e12c5d1SDavid du Colombier prtree(n, "warning");
12063e12c5d1SDavid du Colombier }
12073e12c5d1SDavid du Colombier }
12083e12c5d1SDavid du Colombier
12093e12c5d1SDavid du Colombier void
yyerror(char * fmt,...)12107dd7cddfSDavid du Colombier yyerror(char *fmt, ...)
12113e12c5d1SDavid du Colombier {
12123e12c5d1SDavid du Colombier char buf[STRINGSZ];
12137dd7cddfSDavid du Colombier va_list arg;
12143e12c5d1SDavid du Colombier
12153e12c5d1SDavid du Colombier /*
12163e12c5d1SDavid du Colombier * hack to intercept message from yaccpar
12173e12c5d1SDavid du Colombier */
12187dd7cddfSDavid du Colombier if(strcmp(fmt, "syntax error") == 0) {
12193e12c5d1SDavid du Colombier yyerror("syntax error, last name: %s", symb);
12203e12c5d1SDavid du Colombier return;
12213e12c5d1SDavid du Colombier }
12227dd7cddfSDavid du Colombier va_start(arg, fmt);
12239a747e4fSDavid du Colombier vseprint(buf, buf+sizeof(buf), fmt, arg);
12247dd7cddfSDavid du Colombier va_end(arg);
122518027f8cSDavid du Colombier Bprint(&diagbuf, "%L %s\n", lineno, buf);
12263e12c5d1SDavid du Colombier nerrors++;
12273e12c5d1SDavid du Colombier if(nerrors > 10) {
122818027f8cSDavid du Colombier Bprint(&diagbuf, "too many errors\n");
12293e12c5d1SDavid du Colombier errorexit();
12303e12c5d1SDavid du Colombier }
12313e12c5d1SDavid du Colombier }
12323e12c5d1SDavid du Colombier
1233375daca8SDavid du Colombier void
fatal(Node * n,char * fmt,...)1234375daca8SDavid du Colombier fatal(Node *n, char *fmt, ...)
1235375daca8SDavid du Colombier {
1236375daca8SDavid du Colombier char buf[STRINGSZ];
1237375daca8SDavid du Colombier va_list arg;
1238375daca8SDavid du Colombier
1239375daca8SDavid du Colombier va_start(arg, fmt);
1240375daca8SDavid du Colombier vseprint(buf, buf+sizeof(buf), fmt, arg);
1241375daca8SDavid du Colombier va_end(arg);
124218027f8cSDavid du Colombier Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1243375daca8SDavid du Colombier
124418027f8cSDavid du Colombier if(debug['X']){
124518027f8cSDavid du Colombier Bflush(&diagbuf);
1246375daca8SDavid du Colombier abort();
124718027f8cSDavid du Colombier }
1248375daca8SDavid du Colombier if(n != Z)
1249375daca8SDavid du Colombier if(debug['v'])
1250375daca8SDavid du Colombier prtree(n, "diagnostic");
1251375daca8SDavid du Colombier
1252375daca8SDavid du Colombier nerrors++;
1253375daca8SDavid du Colombier errorexit();
1254375daca8SDavid du Colombier }
1255375daca8SDavid du Colombier
12567dd7cddfSDavid du Colombier ulong thash1 = 0x2edab8c9;
12577dd7cddfSDavid du Colombier ulong thash2 = 0x1dc74fb8;
12587dd7cddfSDavid du Colombier ulong thash3 = 0x1f241331;
12597dd7cddfSDavid du Colombier ulong thash[NALLTYPES];
12607dd7cddfSDavid du Colombier Init thashinit[] =
12613e12c5d1SDavid du Colombier {
12627dd7cddfSDavid du Colombier TXXX, 0x17527bbd, 0,
12637dd7cddfSDavid du Colombier TCHAR, 0x5cedd32b, 0,
12647dd7cddfSDavid du Colombier TUCHAR, 0x552c4454, 0,
12657dd7cddfSDavid du Colombier TSHORT, 0x63040b4b, 0,
12667dd7cddfSDavid du Colombier TUSHORT, 0x32a45878, 0,
12677dd7cddfSDavid du Colombier TINT, 0x4151d5bd, 0,
12687dd7cddfSDavid du Colombier TUINT, 0x5ae707d6, 0,
12697dd7cddfSDavid du Colombier TLONG, 0x5ef20f47, 0,
12707dd7cddfSDavid du Colombier TULONG, 0x36d8eb8f, 0,
12717dd7cddfSDavid du Colombier TVLONG, 0x6e5e9590, 0,
12727dd7cddfSDavid du Colombier TUVLONG, 0x75910105, 0,
12737dd7cddfSDavid du Colombier TFLOAT, 0x25fd7af1, 0,
12747dd7cddfSDavid du Colombier TDOUBLE, 0x7c40a1b2, 0,
12757dd7cddfSDavid du Colombier TIND, 0x1b832357, 0,
12767dd7cddfSDavid du Colombier TFUNC, 0x6babc9cb, 0,
12777dd7cddfSDavid du Colombier TARRAY, 0x7c50986d, 0,
12787dd7cddfSDavid du Colombier TVOID, 0x44112eff, 0,
12797dd7cddfSDavid du Colombier TSTRUCT, 0x7c2da3bf, 0,
12807dd7cddfSDavid du Colombier TUNION, 0x3eb25e98, 0,
12817dd7cddfSDavid du Colombier TENUM, 0x44b54f61, 0,
12827dd7cddfSDavid du Colombier TFILE, 0x19242ac3, 0,
12837dd7cddfSDavid du Colombier TOLD, 0x22b15988, 0,
12847dd7cddfSDavid du Colombier TDOT, 0x0204f6b3, 0,
12857dd7cddfSDavid du Colombier -1, 0, 0,
12863e12c5d1SDavid du Colombier };
12877dd7cddfSDavid du Colombier
12887dd7cddfSDavid du Colombier char* bnames[NALIGN];
12897dd7cddfSDavid du Colombier Init bnamesinit[] =
12903e12c5d1SDavid du Colombier {
12917dd7cddfSDavid du Colombier Axxx, 0, "Axxx",
12927dd7cddfSDavid du Colombier Ael1, 0, "el1",
12937dd7cddfSDavid du Colombier Ael2, 0, "el2",
12947dd7cddfSDavid du Colombier Asu2, 0, "su2",
12957dd7cddfSDavid du Colombier Aarg0, 0, "arg0",
12967dd7cddfSDavid du Colombier Aarg1, 0, "arg1",
12977dd7cddfSDavid du Colombier Aarg2, 0, "arg2",
12987dd7cddfSDavid du Colombier Aaut3, 0, "aut3",
12997dd7cddfSDavid du Colombier -1, 0, 0,
13003e12c5d1SDavid du Colombier };
13017dd7cddfSDavid du Colombier
13027dd7cddfSDavid du Colombier char* tnames[NALLTYPES];
13037dd7cddfSDavid du Colombier Init tnamesinit[] =
13043e12c5d1SDavid du Colombier {
13057dd7cddfSDavid du Colombier TXXX, 0, "TXXX",
13067dd7cddfSDavid du Colombier TCHAR, 0, "CHAR",
13077dd7cddfSDavid du Colombier TUCHAR, 0, "UCHAR",
13087dd7cddfSDavid du Colombier TSHORT, 0, "SHORT",
13097dd7cddfSDavid du Colombier TUSHORT, 0, "USHORT",
13107dd7cddfSDavid du Colombier TINT, 0, "INT",
13117dd7cddfSDavid du Colombier TUINT, 0, "UINT",
13127dd7cddfSDavid du Colombier TLONG, 0, "LONG",
13137dd7cddfSDavid du Colombier TULONG, 0, "ULONG",
13147dd7cddfSDavid du Colombier TVLONG, 0, "VLONG",
13157dd7cddfSDavid du Colombier TUVLONG, 0, "UVLONG",
13167dd7cddfSDavid du Colombier TFLOAT, 0, "FLOAT",
13177dd7cddfSDavid du Colombier TDOUBLE, 0, "DOUBLE",
13187dd7cddfSDavid du Colombier TIND, 0, "IND",
13197dd7cddfSDavid du Colombier TFUNC, 0, "FUNC",
13207dd7cddfSDavid du Colombier TARRAY, 0, "ARRAY",
13217dd7cddfSDavid du Colombier TVOID, 0, "VOID",
13227dd7cddfSDavid du Colombier TSTRUCT, 0, "STRUCT",
13237dd7cddfSDavid du Colombier TUNION, 0, "UNION",
13247dd7cddfSDavid du Colombier TENUM, 0, "ENUM",
13257dd7cddfSDavid du Colombier TFILE, 0, "FILE",
13267dd7cddfSDavid du Colombier TOLD, 0, "OLD",
13277dd7cddfSDavid du Colombier TDOT, 0, "DOT",
13287dd7cddfSDavid du Colombier -1, 0, 0,
13293e12c5d1SDavid du Colombier };
13307dd7cddfSDavid du Colombier
13317dd7cddfSDavid du Colombier char* gnames[NGTYPES];
13327dd7cddfSDavid du Colombier Init gnamesinit[] =
13333e12c5d1SDavid du Colombier {
13347dd7cddfSDavid du Colombier GXXX, 0, "GXXX",
13357dd7cddfSDavid du Colombier GCONSTNT, 0, "CONST",
13367dd7cddfSDavid du Colombier GVOLATILE, 0, "VOLATILE",
13377dd7cddfSDavid du Colombier GVOLATILE|GCONSTNT, 0, "CONST-VOLATILE",
13387dd7cddfSDavid du Colombier -1, 0, 0,
13397dd7cddfSDavid du Colombier };
13407dd7cddfSDavid du Colombier
13417dd7cddfSDavid du Colombier char* qnames[NALLTYPES];
13427dd7cddfSDavid du Colombier Init qnamesinit[] =
13437dd7cddfSDavid du Colombier {
13447dd7cddfSDavid du Colombier TXXX, 0, "TXXX",
13457dd7cddfSDavid du Colombier TCHAR, 0, "CHAR",
13467dd7cddfSDavid du Colombier TUCHAR, 0, "UCHAR",
13477dd7cddfSDavid du Colombier TSHORT, 0, "SHORT",
13487dd7cddfSDavid du Colombier TUSHORT, 0, "USHORT",
13497dd7cddfSDavid du Colombier TINT, 0, "INT",
13507dd7cddfSDavid du Colombier TUINT, 0, "UINT",
13517dd7cddfSDavid du Colombier TLONG, 0, "LONG",
13527dd7cddfSDavid du Colombier TULONG, 0, "ULONG",
13537dd7cddfSDavid du Colombier TVLONG, 0, "VLONG",
13547dd7cddfSDavid du Colombier TUVLONG, 0, "UVLONG",
13557dd7cddfSDavid du Colombier TFLOAT, 0, "FLOAT",
13567dd7cddfSDavid du Colombier TDOUBLE, 0, "DOUBLE",
13577dd7cddfSDavid du Colombier TIND, 0, "IND",
13587dd7cddfSDavid du Colombier TFUNC, 0, "FUNC",
13597dd7cddfSDavid du Colombier TARRAY, 0, "ARRAY",
13607dd7cddfSDavid du Colombier TVOID, 0, "VOID",
13617dd7cddfSDavid du Colombier TSTRUCT, 0, "STRUCT",
13627dd7cddfSDavid du Colombier TUNION, 0, "UNION",
13637dd7cddfSDavid du Colombier TENUM, 0, "ENUM",
13647dd7cddfSDavid du Colombier
13657dd7cddfSDavid du Colombier TAUTO, 0, "AUTO",
13667dd7cddfSDavid du Colombier TEXTERN, 0, "EXTERN",
13677dd7cddfSDavid du Colombier TSTATIC, 0, "STATIC",
13687dd7cddfSDavid du Colombier TTYPEDEF, 0, "TYPEDEF",
136980ee5cbfSDavid du Colombier TTYPESTR, 0, "TYPESTR",
13707dd7cddfSDavid du Colombier TREGISTER, 0, "REGISTER",
13717dd7cddfSDavid du Colombier TCONSTNT, 0, "CONSTNT",
13727dd7cddfSDavid du Colombier TVOLATILE, 0, "VOLATILE",
13737dd7cddfSDavid du Colombier TUNSIGNED, 0, "UNSIGNED",
13747dd7cddfSDavid du Colombier TSIGNED, 0, "SIGNED",
13757dd7cddfSDavid du Colombier TDOT, 0, "DOT",
13767dd7cddfSDavid du Colombier TFILE, 0, "FILE",
13777dd7cddfSDavid du Colombier TOLD, 0, "OLD",
13787dd7cddfSDavid du Colombier -1, 0, 0,
13797dd7cddfSDavid du Colombier };
13807dd7cddfSDavid du Colombier char* cnames[NCTYPES];
13817dd7cddfSDavid du Colombier Init cnamesinit[] =
13827dd7cddfSDavid du Colombier {
13837dd7cddfSDavid du Colombier CXXX, 0, "CXXX",
13847dd7cddfSDavid du Colombier CAUTO, 0, "AUTO",
13857dd7cddfSDavid du Colombier CEXTERN, 0, "EXTERN",
13867dd7cddfSDavid du Colombier CGLOBL, 0, "GLOBL",
13877dd7cddfSDavid du Colombier CSTATIC, 0, "STATIC",
13887dd7cddfSDavid du Colombier CLOCAL, 0, "LOCAL",
13897dd7cddfSDavid du Colombier CTYPEDEF, 0, "TYPEDEF",
139080ee5cbfSDavid du Colombier CTYPESTR, 0, "TYPESTR",
13917dd7cddfSDavid du Colombier CPARAM, 0, "PARAM",
13927dd7cddfSDavid du Colombier CSELEM, 0, "SELEM",
13937dd7cddfSDavid du Colombier CLABEL, 0, "LABEL",
13947dd7cddfSDavid du Colombier CEXREG, 0, "EXREG",
13957dd7cddfSDavid du Colombier -1, 0, 0,
13967dd7cddfSDavid du Colombier };
13977dd7cddfSDavid du Colombier
13987dd7cddfSDavid du Colombier char* onames[OEND+1];
13997dd7cddfSDavid du Colombier Init onamesinit[] =
14007dd7cddfSDavid du Colombier {
14017dd7cddfSDavid du Colombier OXXX, 0, "OXXX",
14027dd7cddfSDavid du Colombier OADD, 0, "ADD",
14037dd7cddfSDavid du Colombier OADDR, 0, "ADDR",
14047dd7cddfSDavid du Colombier OAND, 0, "AND",
14057dd7cddfSDavid du Colombier OANDAND, 0, "ANDAND",
14067dd7cddfSDavid du Colombier OARRAY, 0, "ARRAY",
14077dd7cddfSDavid du Colombier OAS, 0, "AS",
14087dd7cddfSDavid du Colombier OASI, 0, "ASI",
14097dd7cddfSDavid du Colombier OASADD, 0, "ASADD",
14107dd7cddfSDavid du Colombier OASAND, 0, "ASAND",
14117dd7cddfSDavid du Colombier OASASHL, 0, "ASASHL",
14127dd7cddfSDavid du Colombier OASASHR, 0, "ASASHR",
14137dd7cddfSDavid du Colombier OASDIV, 0, "ASDIV",
14147dd7cddfSDavid du Colombier OASHL, 0, "ASHL",
14157dd7cddfSDavid du Colombier OASHR, 0, "ASHR",
14167dd7cddfSDavid du Colombier OASLDIV, 0, "ASLDIV",
14177dd7cddfSDavid du Colombier OASLMOD, 0, "ASLMOD",
14187dd7cddfSDavid du Colombier OASLMUL, 0, "ASLMUL",
14197dd7cddfSDavid du Colombier OASLSHR, 0, "ASLSHR",
14207dd7cddfSDavid du Colombier OASMOD, 0, "ASMOD",
14217dd7cddfSDavid du Colombier OASMUL, 0, "ASMUL",
14227dd7cddfSDavid du Colombier OASOR, 0, "ASOR",
14237dd7cddfSDavid du Colombier OASSUB, 0, "ASSUB",
14247dd7cddfSDavid du Colombier OASXOR, 0, "ASXOR",
14257dd7cddfSDavid du Colombier OBIT, 0, "BIT",
14267dd7cddfSDavid du Colombier OBREAK, 0, "BREAK",
14277dd7cddfSDavid du Colombier OCASE, 0, "CASE",
14287dd7cddfSDavid du Colombier OCAST, 0, "CAST",
14297dd7cddfSDavid du Colombier OCOMMA, 0, "COMMA",
14307dd7cddfSDavid du Colombier OCOND, 0, "COND",
14317dd7cddfSDavid du Colombier OCONST, 0, "CONST",
14327dd7cddfSDavid du Colombier OCONTINUE, 0, "CONTINUE",
14337dd7cddfSDavid du Colombier ODIV, 0, "DIV",
14347dd7cddfSDavid du Colombier ODOT, 0, "DOT",
14357dd7cddfSDavid du Colombier ODOTDOT, 0, "DOTDOT",
14367dd7cddfSDavid du Colombier ODWHILE, 0, "DWHILE",
14377dd7cddfSDavid du Colombier OENUM, 0, "ENUM",
14387dd7cddfSDavid du Colombier OEQ, 0, "EQ",
14397dd7cddfSDavid du Colombier OFOR, 0, "FOR",
14407dd7cddfSDavid du Colombier OFUNC, 0, "FUNC",
14417dd7cddfSDavid du Colombier OGE, 0, "GE",
14427dd7cddfSDavid du Colombier OGOTO, 0, "GOTO",
14437dd7cddfSDavid du Colombier OGT, 0, "GT",
14447dd7cddfSDavid du Colombier OHI, 0, "HI",
14457dd7cddfSDavid du Colombier OHS, 0, "HS",
14467dd7cddfSDavid du Colombier OIF, 0, "IF",
14477dd7cddfSDavid du Colombier OIND, 0, "IND",
14487dd7cddfSDavid du Colombier OINDREG, 0, "INDREG",
14497dd7cddfSDavid du Colombier OINIT, 0, "INIT",
14507dd7cddfSDavid du Colombier OLABEL, 0, "LABEL",
14517dd7cddfSDavid du Colombier OLDIV, 0, "LDIV",
14527dd7cddfSDavid du Colombier OLE, 0, "LE",
14537dd7cddfSDavid du Colombier OLIST, 0, "LIST",
14547dd7cddfSDavid du Colombier OLMOD, 0, "LMOD",
14557dd7cddfSDavid du Colombier OLMUL, 0, "LMUL",
14567dd7cddfSDavid du Colombier OLO, 0, "LO",
14577dd7cddfSDavid du Colombier OLS, 0, "LS",
14587dd7cddfSDavid du Colombier OLSHR, 0, "LSHR",
14597dd7cddfSDavid du Colombier OLT, 0, "LT",
14607dd7cddfSDavid du Colombier OMOD, 0, "MOD",
14617dd7cddfSDavid du Colombier OMUL, 0, "MUL",
14627dd7cddfSDavid du Colombier ONAME, 0, "NAME",
14637dd7cddfSDavid du Colombier ONE, 0, "NE",
14647dd7cddfSDavid du Colombier ONOT, 0, "NOT",
14657dd7cddfSDavid du Colombier OOR, 0, "OR",
14667dd7cddfSDavid du Colombier OOROR, 0, "OROR",
14677dd7cddfSDavid du Colombier OPOSTDEC, 0, "POSTDEC",
14687dd7cddfSDavid du Colombier OPOSTINC, 0, "POSTINC",
14697dd7cddfSDavid du Colombier OPREDEC, 0, "PREDEC",
14707dd7cddfSDavid du Colombier OPREINC, 0, "PREINC",
14717dd7cddfSDavid du Colombier OPROTO, 0, "PROTO",
14727dd7cddfSDavid du Colombier OREGISTER, 0, "REGISTER",
14737dd7cddfSDavid du Colombier ORETURN, 0, "RETURN",
14747dd7cddfSDavid du Colombier OSET, 0, "SET",
14757dd7cddfSDavid du Colombier OSIGN, 0, "SIGN",
14767dd7cddfSDavid du Colombier OSIZE, 0, "SIZE",
14777dd7cddfSDavid du Colombier OSTRING, 0, "STRING",
14787dd7cddfSDavid du Colombier OLSTRING, 0, "LSTRING",
14797dd7cddfSDavid du Colombier OSTRUCT, 0, "STRUCT",
14807dd7cddfSDavid du Colombier OSUB, 0, "SUB",
14817dd7cddfSDavid du Colombier OSWITCH, 0, "SWITCH",
14827dd7cddfSDavid du Colombier OUNION, 0, "UNION",
14837dd7cddfSDavid du Colombier OUSED, 0, "USED",
14847dd7cddfSDavid du Colombier OWHILE, 0, "WHILE",
14857dd7cddfSDavid du Colombier OXOR, 0, "XOR",
148680ee5cbfSDavid du Colombier OPOS, 0, "POS",
14877dd7cddfSDavid du Colombier ONEG, 0, "NEG",
14887dd7cddfSDavid du Colombier OCOM, 0, "COM",
14897dd7cddfSDavid du Colombier OELEM, 0, "ELEM",
14907dd7cddfSDavid du Colombier OTST, 0, "TST",
14917dd7cddfSDavid du Colombier OINDEX, 0, "INDEX",
14927dd7cddfSDavid du Colombier OFAS, 0, "FAS",
1493da51d93aSDavid du Colombier OREGPAIR, 0, "REGPAIR",
1494d40255d8SDavid du Colombier OEXREG, 0, "EXREG",
14957dd7cddfSDavid du Colombier OEND, 0, "END",
14967dd7cddfSDavid du Colombier -1, 0, 0,
14973e12c5d1SDavid du Colombier };
14983e12c5d1SDavid du Colombier
149922a127bbSDavid du Colombier /* OEQ, ONE, OLE, OLS, OLT, OLO, OGE, OHS, OGT, OHI */
15003e12c5d1SDavid du Colombier char comrel[12] =
15013e12c5d1SDavid du Colombier {
15023e12c5d1SDavid du Colombier ONE, OEQ, OGT, OHI, OGE, OHS, OLT, OLO, OLE, OLS,
15033e12c5d1SDavid du Colombier };
15043e12c5d1SDavid du Colombier char invrel[12] =
15053e12c5d1SDavid du Colombier {
15063e12c5d1SDavid du Colombier OEQ, ONE, OGE, OHS, OGT, OHI, OLE, OLS, OLT, OLO,
15073e12c5d1SDavid du Colombier };
15083e12c5d1SDavid du Colombier char logrel[12] =
15093e12c5d1SDavid du Colombier {
15103e12c5d1SDavid du Colombier OEQ, ONE, OLS, OLS, OLO, OLO, OHS, OHS, OHI, OHI,
15113e12c5d1SDavid du Colombier };
15123e12c5d1SDavid du Colombier
15137dd7cddfSDavid du Colombier char typei[NTYPE];
15147dd7cddfSDavid du Colombier int typeiinit[] =
15157dd7cddfSDavid du Colombier {
15167dd7cddfSDavid du Colombier TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TVLONG, TUVLONG, -1,
15177dd7cddfSDavid du Colombier };
15187dd7cddfSDavid du Colombier char typeu[NTYPE];
15197dd7cddfSDavid du Colombier int typeuinit[] =
15207dd7cddfSDavid du Colombier {
15217dd7cddfSDavid du Colombier TUCHAR, TUSHORT, TUINT, TULONG, TUVLONG, TIND, -1,
15227dd7cddfSDavid du Colombier };
1523219b2ee8SDavid du Colombier
15247dd7cddfSDavid du Colombier char typesuv[NTYPE];
15257dd7cddfSDavid du Colombier int typesuvinit[] =
15267dd7cddfSDavid du Colombier {
15277dd7cddfSDavid du Colombier TVLONG, TUVLONG, TSTRUCT, TUNION, -1,
15287dd7cddfSDavid du Colombier };
15293e12c5d1SDavid du Colombier
15307dd7cddfSDavid du Colombier char typeilp[NTYPE];
15317dd7cddfSDavid du Colombier int typeilpinit[] =
15327dd7cddfSDavid du Colombier {
15337dd7cddfSDavid du Colombier TINT, TUINT, TLONG, TULONG, TIND, -1
15347dd7cddfSDavid du Colombier };
1535219b2ee8SDavid du Colombier
15367dd7cddfSDavid du Colombier char typechl[NTYPE];
1537da51d93aSDavid du Colombier char typechlv[NTYPE];
153822a127bbSDavid du Colombier char typechlvp[NTYPE];
15397dd7cddfSDavid du Colombier int typechlinit[] =
15403e12c5d1SDavid du Colombier {
15417dd7cddfSDavid du Colombier TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, -1,
15423e12c5d1SDavid du Colombier };
15437dd7cddfSDavid du Colombier
15447dd7cddfSDavid du Colombier char typechlp[NTYPE];
15457dd7cddfSDavid du Colombier int typechlpinit[] =
15463e12c5d1SDavid du Colombier {
15477dd7cddfSDavid du Colombier TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TIND, -1,
15483e12c5d1SDavid du Colombier };
15497dd7cddfSDavid du Colombier
15507dd7cddfSDavid du Colombier char typechlpfd[NTYPE];
15517dd7cddfSDavid du Colombier int typechlpfdinit[] =
15523e12c5d1SDavid du Colombier {
15537dd7cddfSDavid du Colombier TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TFLOAT, TDOUBLE, TIND, -1,
15543e12c5d1SDavid du Colombier };
15557dd7cddfSDavid du Colombier
15567dd7cddfSDavid du Colombier char typec[NTYPE];
15577dd7cddfSDavid du Colombier int typecinit[] =
15583e12c5d1SDavid du Colombier {
15597dd7cddfSDavid du Colombier TCHAR, TUCHAR, -1
15603e12c5d1SDavid du Colombier };
15617dd7cddfSDavid du Colombier
15627dd7cddfSDavid du Colombier char typeh[NTYPE];
15637dd7cddfSDavid du Colombier int typehinit[] =
15643e12c5d1SDavid du Colombier {
15657dd7cddfSDavid du Colombier TSHORT, TUSHORT, -1,
15663e12c5d1SDavid du Colombier };
15677dd7cddfSDavid du Colombier
15687dd7cddfSDavid du Colombier char typeil[NTYPE];
15697dd7cddfSDavid du Colombier int typeilinit[] =
15703e12c5d1SDavid du Colombier {
15717dd7cddfSDavid du Colombier TINT, TUINT, TLONG, TULONG, -1,
15723e12c5d1SDavid du Colombier };
15737dd7cddfSDavid du Colombier
15747dd7cddfSDavid du Colombier char typev[NTYPE];
15757dd7cddfSDavid du Colombier int typevinit[] =
15763e12c5d1SDavid du Colombier {
15777dd7cddfSDavid du Colombier TVLONG, TUVLONG, -1,
15783e12c5d1SDavid du Colombier };
15797dd7cddfSDavid du Colombier
15807dd7cddfSDavid du Colombier char typefd[NTYPE];
15817dd7cddfSDavid du Colombier int typefdinit[] =
15823e12c5d1SDavid du Colombier {
15837dd7cddfSDavid du Colombier TFLOAT, TDOUBLE, -1,
15843e12c5d1SDavid du Colombier };
15857dd7cddfSDavid du Colombier
15867dd7cddfSDavid du Colombier char typeaf[NTYPE];
15877dd7cddfSDavid du Colombier int typeafinit[] =
15883e12c5d1SDavid du Colombier {
15897dd7cddfSDavid du Colombier TFUNC, TARRAY, -1,
15903e12c5d1SDavid du Colombier };
15917dd7cddfSDavid du Colombier
15927dd7cddfSDavid du Colombier char typesu[NTYPE];
15937dd7cddfSDavid du Colombier int typesuinit[] =
15947dd7cddfSDavid du Colombier {
15957dd7cddfSDavid du Colombier TSTRUCT, TUNION, -1,
15967dd7cddfSDavid du Colombier };
15977dd7cddfSDavid du Colombier
15987dd7cddfSDavid du Colombier long tasign[NTYPE];
15997dd7cddfSDavid du Colombier Init tasigninit[] =
16007dd7cddfSDavid du Colombier {
16017dd7cddfSDavid du Colombier TCHAR, BNUMBER, 0,
16027dd7cddfSDavid du Colombier TUCHAR, BNUMBER, 0,
16037dd7cddfSDavid du Colombier TSHORT, BNUMBER, 0,
16047dd7cddfSDavid du Colombier TUSHORT, BNUMBER, 0,
16057dd7cddfSDavid du Colombier TINT, BNUMBER, 0,
16067dd7cddfSDavid du Colombier TUINT, BNUMBER, 0,
16077dd7cddfSDavid du Colombier TLONG, BNUMBER, 0,
16087dd7cddfSDavid du Colombier TULONG, BNUMBER, 0,
16097dd7cddfSDavid du Colombier TVLONG, BNUMBER, 0,
16107dd7cddfSDavid du Colombier TUVLONG, BNUMBER, 0,
16117dd7cddfSDavid du Colombier TFLOAT, BNUMBER, 0,
16127dd7cddfSDavid du Colombier TDOUBLE, BNUMBER, 0,
16137dd7cddfSDavid du Colombier TIND, BIND, 0,
16147dd7cddfSDavid du Colombier TSTRUCT, BSTRUCT, 0,
16157dd7cddfSDavid du Colombier TUNION, BUNION, 0,
16167dd7cddfSDavid du Colombier -1, 0, 0,
16177dd7cddfSDavid du Colombier };
16187dd7cddfSDavid du Colombier
16197dd7cddfSDavid du Colombier long tasadd[NTYPE];
16207dd7cddfSDavid du Colombier Init tasaddinit[] =
16217dd7cddfSDavid du Colombier {
16227dd7cddfSDavid du Colombier TCHAR, BNUMBER, 0,
16237dd7cddfSDavid du Colombier TUCHAR, BNUMBER, 0,
16247dd7cddfSDavid du Colombier TSHORT, BNUMBER, 0,
16257dd7cddfSDavid du Colombier TUSHORT, BNUMBER, 0,
16267dd7cddfSDavid du Colombier TINT, BNUMBER, 0,
16277dd7cddfSDavid du Colombier TUINT, BNUMBER, 0,
16287dd7cddfSDavid du Colombier TLONG, BNUMBER, 0,
16297dd7cddfSDavid du Colombier TULONG, BNUMBER, 0,
16307dd7cddfSDavid du Colombier TVLONG, BNUMBER, 0,
16317dd7cddfSDavid du Colombier TUVLONG, BNUMBER, 0,
16327dd7cddfSDavid du Colombier TFLOAT, BNUMBER, 0,
16337dd7cddfSDavid du Colombier TDOUBLE, BNUMBER, 0,
16347dd7cddfSDavid du Colombier TIND, BINTEGER, 0,
16357dd7cddfSDavid du Colombier -1, 0, 0,
16367dd7cddfSDavid du Colombier };
16377dd7cddfSDavid du Colombier
16387dd7cddfSDavid du Colombier long tcast[NTYPE];
16397dd7cddfSDavid du Colombier Init tcastinit[] =
16407dd7cddfSDavid du Colombier {
16417dd7cddfSDavid du Colombier TCHAR, BNUMBER|BIND|BVOID, 0,
16427dd7cddfSDavid du Colombier TUCHAR, BNUMBER|BIND|BVOID, 0,
16437dd7cddfSDavid du Colombier TSHORT, BNUMBER|BIND|BVOID, 0,
16447dd7cddfSDavid du Colombier TUSHORT, BNUMBER|BIND|BVOID, 0,
16457dd7cddfSDavid du Colombier TINT, BNUMBER|BIND|BVOID, 0,
16467dd7cddfSDavid du Colombier TUINT, BNUMBER|BIND|BVOID, 0,
16477dd7cddfSDavid du Colombier TLONG, BNUMBER|BIND|BVOID, 0,
16487dd7cddfSDavid du Colombier TULONG, BNUMBER|BIND|BVOID, 0,
16497dd7cddfSDavid du Colombier TVLONG, BNUMBER|BIND|BVOID, 0,
16507dd7cddfSDavid du Colombier TUVLONG, BNUMBER|BIND|BVOID, 0,
16517dd7cddfSDavid du Colombier TFLOAT, BNUMBER|BVOID, 0,
16527dd7cddfSDavid du Colombier TDOUBLE, BNUMBER|BVOID, 0,
16537dd7cddfSDavid du Colombier TIND, BINTEGER|BIND|BVOID, 0,
16547dd7cddfSDavid du Colombier TVOID, BVOID, 0,
16557dd7cddfSDavid du Colombier TSTRUCT, BSTRUCT|BVOID, 0,
16567dd7cddfSDavid du Colombier TUNION, BUNION|BVOID, 0,
16577dd7cddfSDavid du Colombier -1, 0, 0,
16587dd7cddfSDavid du Colombier };
16597dd7cddfSDavid du Colombier
16607dd7cddfSDavid du Colombier long tadd[NTYPE];
16617dd7cddfSDavid du Colombier Init taddinit[] =
16627dd7cddfSDavid du Colombier {
16637dd7cddfSDavid du Colombier TCHAR, BNUMBER|BIND, 0,
16647dd7cddfSDavid du Colombier TUCHAR, BNUMBER|BIND, 0,
16657dd7cddfSDavid du Colombier TSHORT, BNUMBER|BIND, 0,
16667dd7cddfSDavid du Colombier TUSHORT, BNUMBER|BIND, 0,
16677dd7cddfSDavid du Colombier TINT, BNUMBER|BIND, 0,
16687dd7cddfSDavid du Colombier TUINT, BNUMBER|BIND, 0,
16697dd7cddfSDavid du Colombier TLONG, BNUMBER|BIND, 0,
16707dd7cddfSDavid du Colombier TULONG, BNUMBER|BIND, 0,
16717dd7cddfSDavid du Colombier TVLONG, BNUMBER|BIND, 0,
16727dd7cddfSDavid du Colombier TUVLONG, BNUMBER|BIND, 0,
16737dd7cddfSDavid du Colombier TFLOAT, BNUMBER, 0,
16747dd7cddfSDavid du Colombier TDOUBLE, BNUMBER, 0,
16757dd7cddfSDavid du Colombier TIND, BINTEGER, 0,
16767dd7cddfSDavid du Colombier -1, 0, 0,
16777dd7cddfSDavid du Colombier };
16787dd7cddfSDavid du Colombier
16797dd7cddfSDavid du Colombier long tsub[NTYPE];
16807dd7cddfSDavid du Colombier Init tsubinit[] =
16817dd7cddfSDavid du Colombier {
16827dd7cddfSDavid du Colombier TCHAR, BNUMBER, 0,
16837dd7cddfSDavid du Colombier TUCHAR, BNUMBER, 0,
16847dd7cddfSDavid du Colombier TSHORT, BNUMBER, 0,
16857dd7cddfSDavid du Colombier TUSHORT, BNUMBER, 0,
16867dd7cddfSDavid du Colombier TINT, BNUMBER, 0,
16877dd7cddfSDavid du Colombier TUINT, BNUMBER, 0,
16887dd7cddfSDavid du Colombier TLONG, BNUMBER, 0,
16897dd7cddfSDavid du Colombier TULONG, BNUMBER, 0,
16907dd7cddfSDavid du Colombier TVLONG, BNUMBER, 0,
16917dd7cddfSDavid du Colombier TUVLONG, BNUMBER, 0,
16927dd7cddfSDavid du Colombier TFLOAT, BNUMBER, 0,
16937dd7cddfSDavid du Colombier TDOUBLE, BNUMBER, 0,
16947dd7cddfSDavid du Colombier TIND, BINTEGER|BIND, 0,
16957dd7cddfSDavid du Colombier -1, 0, 0,
16967dd7cddfSDavid du Colombier };
16977dd7cddfSDavid du Colombier
16987dd7cddfSDavid du Colombier long tmul[NTYPE];
16997dd7cddfSDavid du Colombier Init tmulinit[] =
17007dd7cddfSDavid du Colombier {
17017dd7cddfSDavid du Colombier TCHAR, BNUMBER, 0,
17027dd7cddfSDavid du Colombier TUCHAR, BNUMBER, 0,
17037dd7cddfSDavid du Colombier TSHORT, BNUMBER, 0,
17047dd7cddfSDavid du Colombier TUSHORT, BNUMBER, 0,
17057dd7cddfSDavid du Colombier TINT, BNUMBER, 0,
17067dd7cddfSDavid du Colombier TUINT, BNUMBER, 0,
17077dd7cddfSDavid du Colombier TLONG, BNUMBER, 0,
17087dd7cddfSDavid du Colombier TULONG, BNUMBER, 0,
17097dd7cddfSDavid du Colombier TVLONG, BNUMBER, 0,
17107dd7cddfSDavid du Colombier TUVLONG, BNUMBER, 0,
17117dd7cddfSDavid du Colombier TFLOAT, BNUMBER, 0,
17127dd7cddfSDavid du Colombier TDOUBLE, BNUMBER, 0,
17137dd7cddfSDavid du Colombier -1, 0, 0,
17147dd7cddfSDavid du Colombier };
17157dd7cddfSDavid du Colombier
17167dd7cddfSDavid du Colombier long tand[NTYPE];
17177dd7cddfSDavid du Colombier Init tandinit[] =
17187dd7cddfSDavid du Colombier {
17197dd7cddfSDavid du Colombier TCHAR, BINTEGER, 0,
17207dd7cddfSDavid du Colombier TUCHAR, BINTEGER, 0,
17217dd7cddfSDavid du Colombier TSHORT, BINTEGER, 0,
17227dd7cddfSDavid du Colombier TUSHORT, BINTEGER, 0,
17237dd7cddfSDavid du Colombier TINT, BNUMBER, 0,
17247dd7cddfSDavid du Colombier TUINT, BNUMBER, 0,
17257dd7cddfSDavid du Colombier TLONG, BINTEGER, 0,
17267dd7cddfSDavid du Colombier TULONG, BINTEGER, 0,
17277dd7cddfSDavid du Colombier TVLONG, BINTEGER, 0,
17287dd7cddfSDavid du Colombier TUVLONG, BINTEGER, 0,
17297dd7cddfSDavid du Colombier -1, 0, 0,
17307dd7cddfSDavid du Colombier };
17317dd7cddfSDavid du Colombier
17327dd7cddfSDavid du Colombier long trel[NTYPE];
17337dd7cddfSDavid du Colombier Init trelinit[] =
17347dd7cddfSDavid du Colombier {
17357dd7cddfSDavid du Colombier TCHAR, BNUMBER, 0,
17367dd7cddfSDavid du Colombier TUCHAR, BNUMBER, 0,
17377dd7cddfSDavid du Colombier TSHORT, BNUMBER, 0,
17387dd7cddfSDavid du Colombier TUSHORT, BNUMBER, 0,
17397dd7cddfSDavid du Colombier TINT, BNUMBER, 0,
17407dd7cddfSDavid du Colombier TUINT, BNUMBER, 0,
17417dd7cddfSDavid du Colombier TLONG, BNUMBER, 0,
17427dd7cddfSDavid du Colombier TULONG, BNUMBER, 0,
17437dd7cddfSDavid du Colombier TVLONG, BNUMBER, 0,
17447dd7cddfSDavid du Colombier TUVLONG, BNUMBER, 0,
17457dd7cddfSDavid du Colombier TFLOAT, BNUMBER, 0,
17467dd7cddfSDavid du Colombier TDOUBLE, BNUMBER, 0,
17477dd7cddfSDavid du Colombier TIND, BIND, 0,
17487dd7cddfSDavid du Colombier -1, 0, 0,
17497dd7cddfSDavid du Colombier };
17507dd7cddfSDavid du Colombier
17513e12c5d1SDavid du Colombier long tfunct[1] =
17523e12c5d1SDavid du Colombier {
17537dd7cddfSDavid du Colombier BFUNC,
17543e12c5d1SDavid du Colombier };
17557dd7cddfSDavid du Colombier
17563e12c5d1SDavid du Colombier long tindir[1] =
17573e12c5d1SDavid du Colombier {
17587dd7cddfSDavid du Colombier BIND,
17593e12c5d1SDavid du Colombier };
17607dd7cddfSDavid du Colombier
17613e12c5d1SDavid du Colombier long tdot[1] =
17623e12c5d1SDavid du Colombier {
17637dd7cddfSDavid du Colombier BSTRUCT|BUNION,
17643e12c5d1SDavid du Colombier };
17657dd7cddfSDavid du Colombier
17663e12c5d1SDavid du Colombier long tnot[1] =
17673e12c5d1SDavid du Colombier {
17687dd7cddfSDavid du Colombier BNUMBER|BIND,
17693e12c5d1SDavid du Colombier };
17707dd7cddfSDavid du Colombier
17713e12c5d1SDavid du Colombier long targ[1] =
17723e12c5d1SDavid du Colombier {
17737dd7cddfSDavid du Colombier BNUMBER|BIND|BSTRUCT|BUNION,
17743e12c5d1SDavid du Colombier };
17753e12c5d1SDavid du Colombier
17763e12c5d1SDavid du Colombier char tab[NTYPE][NTYPE] =
17773e12c5d1SDavid du Colombier {
17787dd7cddfSDavid du Colombier /*TXXX*/ { 0,
17797dd7cddfSDavid du Colombier },
17807dd7cddfSDavid du Colombier
17817dd7cddfSDavid du Colombier /*TCHAR*/ { 0, TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG,
17827dd7cddfSDavid du Colombier TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17837dd7cddfSDavid du Colombier },
17847dd7cddfSDavid du Colombier /*TUCHAR*/ { 0, TUCHAR, TUCHAR, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
17857dd7cddfSDavid du Colombier TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17867dd7cddfSDavid du Colombier },
17877dd7cddfSDavid du Colombier /*TSHORT*/ { 0, TSHORT, TUSHORT, TSHORT, TUSHORT, TINT, TUINT, TLONG,
17887dd7cddfSDavid du Colombier TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17897dd7cddfSDavid du Colombier },
17907dd7cddfSDavid du Colombier /*TUSHORT*/ { 0, TUSHORT, TUSHORT, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
17917dd7cddfSDavid du Colombier TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17927dd7cddfSDavid du Colombier },
17937dd7cddfSDavid du Colombier /*TINT*/ { 0, TINT, TUINT, TINT, TUINT, TINT, TUINT, TLONG,
17947dd7cddfSDavid du Colombier TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17957dd7cddfSDavid du Colombier },
17967dd7cddfSDavid du Colombier /*TUINT*/ { 0, TUINT, TUINT, TUINT, TUINT, TUINT, TUINT, TULONG,
17977dd7cddfSDavid du Colombier TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17987dd7cddfSDavid du Colombier },
17997dd7cddfSDavid du Colombier /*TLONG*/ { 0, TLONG, TULONG, TLONG, TULONG, TLONG, TULONG, TLONG,
18007dd7cddfSDavid du Colombier TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
18017dd7cddfSDavid du Colombier },
18027dd7cddfSDavid du Colombier /*TULONG*/ { 0, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG,
18037dd7cddfSDavid du Colombier TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
18047dd7cddfSDavid du Colombier },
18057dd7cddfSDavid du Colombier /*TVLONG*/ { 0, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG,
18067dd7cddfSDavid du Colombier TUVLONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
18077dd7cddfSDavid du Colombier },
18087dd7cddfSDavid du Colombier /*TUVLONG*/ { 0, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG,
18097dd7cddfSDavid du Colombier TUVLONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
18107dd7cddfSDavid du Colombier },
18117dd7cddfSDavid du Colombier /*TFLOAT*/ { 0, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT,
18127dd7cddfSDavid du Colombier TFLOAT, TFLOAT, TFLOAT, TFLOAT, TDOUBLE, TIND,
18137dd7cddfSDavid du Colombier },
18147dd7cddfSDavid du Colombier /*TDOUBLE*/ { 0, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE,
18157dd7cddfSDavid du Colombier TDOUBLE, TDOUBLE, TDOUBLE, TFLOAT, TDOUBLE, TIND,
18167dd7cddfSDavid du Colombier },
18177dd7cddfSDavid du Colombier /*TIND*/ { 0, TIND, TIND, TIND, TIND, TIND, TIND, TIND,
18187dd7cddfSDavid du Colombier TIND, TIND, TIND, TIND, TIND, TIND,
18197dd7cddfSDavid du Colombier },
18203e12c5d1SDavid du Colombier };
18217dd7cddfSDavid du Colombier
18227dd7cddfSDavid du Colombier void
urk(char * name,int max,int i)18237dd7cddfSDavid du Colombier urk(char *name, int max, int i)
18247dd7cddfSDavid du Colombier {
18257dd7cddfSDavid du Colombier if(i >= max) {
18267dd7cddfSDavid du Colombier fprint(2, "bad tinit: %s %d>=%d\n", name, i, max);
18277dd7cddfSDavid du Colombier exits("init");
18287dd7cddfSDavid du Colombier }
18297dd7cddfSDavid du Colombier }
18307dd7cddfSDavid du Colombier
18317dd7cddfSDavid du Colombier void
tinit(void)18327dd7cddfSDavid du Colombier tinit(void)
18337dd7cddfSDavid du Colombier {
18344ac975e2SDavid du Colombier int *ip;
18357dd7cddfSDavid du Colombier Init *p;
18367dd7cddfSDavid du Colombier
18377dd7cddfSDavid du Colombier for(p=thashinit; p->code >= 0; p++) {
18387dd7cddfSDavid du Colombier urk("thash", nelem(thash), p->code);
18397dd7cddfSDavid du Colombier thash[p->code] = p->value;
18407dd7cddfSDavid du Colombier }
18417dd7cddfSDavid du Colombier for(p=bnamesinit; p->code >= 0; p++) {
18427dd7cddfSDavid du Colombier urk("bnames", nelem(bnames), p->code);
18437dd7cddfSDavid du Colombier bnames[p->code] = p->s;
18447dd7cddfSDavid du Colombier }
18457dd7cddfSDavid du Colombier for(p=tnamesinit; p->code >= 0; p++) {
18467dd7cddfSDavid du Colombier urk("tnames", nelem(tnames), p->code);
18477dd7cddfSDavid du Colombier tnames[p->code] = p->s;
18487dd7cddfSDavid du Colombier }
18497dd7cddfSDavid du Colombier for(p=gnamesinit; p->code >= 0; p++) {
18507dd7cddfSDavid du Colombier urk("gnames", nelem(gnames), p->code);
18517dd7cddfSDavid du Colombier gnames[p->code] = p->s;
18527dd7cddfSDavid du Colombier }
18537dd7cddfSDavid du Colombier for(p=qnamesinit; p->code >= 0; p++) {
18547dd7cddfSDavid du Colombier urk("qnames", nelem(qnames), p->code);
18557dd7cddfSDavid du Colombier qnames[p->code] = p->s;
18567dd7cddfSDavid du Colombier }
18577dd7cddfSDavid du Colombier for(p=cnamesinit; p->code >= 0; p++) {
18587dd7cddfSDavid du Colombier urk("cnames", nelem(cnames), p->code);
18597dd7cddfSDavid du Colombier cnames[p->code] = p->s;
18607dd7cddfSDavid du Colombier }
18617dd7cddfSDavid du Colombier for(p=onamesinit; p->code >= 0; p++) {
18627dd7cddfSDavid du Colombier urk("onames", nelem(onames), p->code);
18637dd7cddfSDavid du Colombier onames[p->code] = p->s;
18647dd7cddfSDavid du Colombier }
18654ac975e2SDavid du Colombier for(ip=typeiinit; *ip>=0; ip++) {
18664ac975e2SDavid du Colombier urk("typei", nelem(typei), *ip);
18674ac975e2SDavid du Colombier typei[*ip] = 1;
18687dd7cddfSDavid du Colombier }
18694ac975e2SDavid du Colombier for(ip=typeuinit; *ip>=0; ip++) {
18704ac975e2SDavid du Colombier urk("typeu", nelem(typeu), *ip);
18714ac975e2SDavid du Colombier typeu[*ip] = 1;
18727dd7cddfSDavid du Colombier }
18734ac975e2SDavid du Colombier for(ip=typesuvinit; *ip>=0; ip++) {
18744ac975e2SDavid du Colombier urk("typesuv", nelem(typesuv), *ip);
18754ac975e2SDavid du Colombier typesuv[*ip] = 1;
18767dd7cddfSDavid du Colombier }
18774ac975e2SDavid du Colombier for(ip=typeilpinit; *ip>=0; ip++) {
18784ac975e2SDavid du Colombier urk("typeilp", nelem(typeilp), *ip);
18794ac975e2SDavid du Colombier typeilp[*ip] = 1;
18807dd7cddfSDavid du Colombier }
18814ac975e2SDavid du Colombier for(ip=typechlinit; *ip>=0; ip++) {
18824ac975e2SDavid du Colombier urk("typechl", nelem(typechl), *ip);
18834ac975e2SDavid du Colombier typechl[*ip] = 1;
18844ac975e2SDavid du Colombier typechlv[*ip] = 1;
18854ac975e2SDavid du Colombier typechlvp[*ip] = 1;
18867dd7cddfSDavid du Colombier }
18874ac975e2SDavid du Colombier for(ip=typechlpinit; *ip>=0; ip++) {
18884ac975e2SDavid du Colombier urk("typechlp", nelem(typechlp), *ip);
18894ac975e2SDavid du Colombier typechlp[*ip] = 1;
18904ac975e2SDavid du Colombier typechlvp[*ip] = 1;
18917dd7cddfSDavid du Colombier }
18924ac975e2SDavid du Colombier for(ip=typechlpfdinit; *ip>=0; ip++) {
18934ac975e2SDavid du Colombier urk("typechlpfd", nelem(typechlpfd), *ip);
18944ac975e2SDavid du Colombier typechlpfd[*ip] = 1;
18957dd7cddfSDavid du Colombier }
18964ac975e2SDavid du Colombier for(ip=typecinit; *ip>=0; ip++) {
18974ac975e2SDavid du Colombier urk("typec", nelem(typec), *ip);
18984ac975e2SDavid du Colombier typec[*ip] = 1;
18997dd7cddfSDavid du Colombier }
19004ac975e2SDavid du Colombier for(ip=typehinit; *ip>=0; ip++) {
19014ac975e2SDavid du Colombier urk("typeh", nelem(typeh), *ip);
19024ac975e2SDavid du Colombier typeh[*ip] = 1;
19037dd7cddfSDavid du Colombier }
19044ac975e2SDavid du Colombier for(ip=typeilinit; *ip>=0; ip++) {
19054ac975e2SDavid du Colombier urk("typeil", nelem(typeil), *ip);
19064ac975e2SDavid du Colombier typeil[*ip] = 1;
19077dd7cddfSDavid du Colombier }
19084ac975e2SDavid du Colombier for(ip=typevinit; *ip>=0; ip++) {
19094ac975e2SDavid du Colombier urk("typev", nelem(typev), *ip);
19104ac975e2SDavid du Colombier typev[*ip] = 1;
19114ac975e2SDavid du Colombier typechlv[*ip] = 1;
19124ac975e2SDavid du Colombier typechlvp[*ip] = 1;
19137dd7cddfSDavid du Colombier }
19144ac975e2SDavid du Colombier for(ip=typefdinit; *ip>=0; ip++) {
19154ac975e2SDavid du Colombier urk("typefd", nelem(typefd), *ip);
19164ac975e2SDavid du Colombier typefd[*ip] = 1;
19177dd7cddfSDavid du Colombier }
19184ac975e2SDavid du Colombier for(ip=typeafinit; *ip>=0; ip++) {
19194ac975e2SDavid du Colombier urk("typeaf", nelem(typeaf), *ip);
19204ac975e2SDavid du Colombier typeaf[*ip] = 1;
19217dd7cddfSDavid du Colombier }
19224ac975e2SDavid du Colombier for(ip=typesuinit; *ip >= 0; ip++) {
19234ac975e2SDavid du Colombier urk("typesu", nelem(typesu), *ip);
19244ac975e2SDavid du Colombier typesu[*ip] = 1;
19257dd7cddfSDavid du Colombier }
19267dd7cddfSDavid du Colombier for(p=tasigninit; p->code >= 0; p++) {
19277dd7cddfSDavid du Colombier urk("tasign", nelem(tasign), p->code);
19287dd7cddfSDavid du Colombier tasign[p->code] = p->value;
19297dd7cddfSDavid du Colombier }
19307dd7cddfSDavid du Colombier for(p=tasaddinit; p->code >= 0; p++) {
19317dd7cddfSDavid du Colombier urk("tasadd", nelem(tasadd), p->code);
19327dd7cddfSDavid du Colombier tasadd[p->code] = p->value;
19337dd7cddfSDavid du Colombier }
19347dd7cddfSDavid du Colombier for(p=tcastinit; p->code >= 0; p++) {
19357dd7cddfSDavid du Colombier urk("tcast", nelem(tcast), p->code);
19367dd7cddfSDavid du Colombier tcast[p->code] = p->value;
19377dd7cddfSDavid du Colombier }
19387dd7cddfSDavid du Colombier for(p=taddinit; p->code >= 0; p++) {
19397dd7cddfSDavid du Colombier urk("tadd", nelem(tadd), p->code);
19407dd7cddfSDavid du Colombier tadd[p->code] = p->value;
19417dd7cddfSDavid du Colombier }
19427dd7cddfSDavid du Colombier for(p=tsubinit; p->code >= 0; p++) {
19437dd7cddfSDavid du Colombier urk("tsub", nelem(tsub), p->code);
19447dd7cddfSDavid du Colombier tsub[p->code] = p->value;
19457dd7cddfSDavid du Colombier }
19467dd7cddfSDavid du Colombier for(p=tmulinit; p->code >= 0; p++) {
19477dd7cddfSDavid du Colombier urk("tmul", nelem(tmul), p->code);
19487dd7cddfSDavid du Colombier tmul[p->code] = p->value;
19497dd7cddfSDavid du Colombier }
19507dd7cddfSDavid du Colombier for(p=tandinit; p->code >= 0; p++) {
19517dd7cddfSDavid du Colombier urk("tand", nelem(tand), p->code);
19527dd7cddfSDavid du Colombier tand[p->code] = p->value;
19537dd7cddfSDavid du Colombier }
19547dd7cddfSDavid du Colombier for(p=trelinit; p->code >= 0; p++) {
19557dd7cddfSDavid du Colombier urk("trel", nelem(trel), p->code);
19567dd7cddfSDavid du Colombier trel[p->code] = p->value;
19577dd7cddfSDavid du Colombier }
19584ac975e2SDavid du Colombier
19594ac975e2SDavid du Colombier /* 32-bit defaults */
19604ac975e2SDavid du Colombier typeword = typechlp;
19613a276d32SDavid du Colombier typeswitch = typechl;
19624ac975e2SDavid du Colombier typecmplx = typesuv;
19637dd7cddfSDavid du Colombier }
19649a747e4fSDavid du Colombier
19654ac975e2SDavid du Colombier /*
19664ac975e2SDavid du Colombier * return 1 if it is impossible to jump into the middle of n.
19674ac975e2SDavid du Colombier */
19689a747e4fSDavid du Colombier static int
deadhead(Node * n,int caseok)19699a747e4fSDavid du Colombier deadhead(Node *n, int caseok)
19709a747e4fSDavid du Colombier {
19719a747e4fSDavid du Colombier loop:
19729a747e4fSDavid du Colombier if(n == Z)
19739a747e4fSDavid du Colombier return 1;
19749a747e4fSDavid du Colombier switch(n->op) {
19759a747e4fSDavid du Colombier case OLIST:
19769a747e4fSDavid du Colombier if(!deadhead(n->left, caseok))
19779a747e4fSDavid du Colombier return 0;
19789a747e4fSDavid du Colombier rloop:
19799a747e4fSDavid du Colombier n = n->right;
19809a747e4fSDavid du Colombier goto loop;
19819a747e4fSDavid du Colombier
19829a747e4fSDavid du Colombier case ORETURN:
19839a747e4fSDavid du Colombier break;
19849a747e4fSDavid du Colombier
19859a747e4fSDavid du Colombier case OLABEL:
19869a747e4fSDavid du Colombier return 0;
19879a747e4fSDavid du Colombier
19889a747e4fSDavid du Colombier case OGOTO:
19899a747e4fSDavid du Colombier break;
19909a747e4fSDavid du Colombier
19919a747e4fSDavid du Colombier case OCASE:
19929a747e4fSDavid du Colombier if(!caseok)
19939a747e4fSDavid du Colombier return 0;
19949a747e4fSDavid du Colombier goto rloop;
19959a747e4fSDavid du Colombier
19969a747e4fSDavid du Colombier case OSWITCH:
19979a747e4fSDavid du Colombier return deadhead(n->right, 1);
19989a747e4fSDavid du Colombier
19999a747e4fSDavid du Colombier case OWHILE:
20009a747e4fSDavid du Colombier case ODWHILE:
20019a747e4fSDavid du Colombier goto rloop;
20029a747e4fSDavid du Colombier
20039a747e4fSDavid du Colombier case OFOR:
20049a747e4fSDavid du Colombier goto rloop;
20059a747e4fSDavid du Colombier
20069a747e4fSDavid du Colombier case OCONTINUE:
20079a747e4fSDavid du Colombier break;
20089a747e4fSDavid du Colombier
20099a747e4fSDavid du Colombier case OBREAK:
20109a747e4fSDavid du Colombier break;
20119a747e4fSDavid du Colombier
20129a747e4fSDavid du Colombier case OIF:
20139a747e4fSDavid du Colombier return deadhead(n->right->left, caseok) && deadhead(n->right->right, caseok);
20149a747e4fSDavid du Colombier
20159a747e4fSDavid du Colombier case OSET:
20169a747e4fSDavid du Colombier case OUSED:
20179a747e4fSDavid du Colombier break;
20189a747e4fSDavid du Colombier }
20199a747e4fSDavid du Colombier return 1;
20209a747e4fSDavid du Colombier }
20219a747e4fSDavid du Colombier
20229a747e4fSDavid du Colombier int
deadheads(Node * c)20239a747e4fSDavid du Colombier deadheads(Node *c)
20249a747e4fSDavid du Colombier {
20259a747e4fSDavid du Colombier return deadhead(c->left, 0) && deadhead(c->right, 0);
20269a747e4fSDavid du Colombier }
2027ce941d97SDavid du Colombier
2028ce941d97SDavid du Colombier int
mixedasop(Type * l,Type * r)2029ce941d97SDavid du Colombier mixedasop(Type *l, Type *r)
2030ce941d97SDavid du Colombier {
2031ce941d97SDavid du Colombier return !typefd[l->etype] && typefd[r->etype];
2032ce941d97SDavid du Colombier }
2033