13e12c5d1SDavid du Colombier #include "cc.h" 23e12c5d1SDavid du Colombier 33e12c5d1SDavid du Colombier Node* 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; 123e12c5d1SDavid du Colombier n->lineno = lineno; 133e12c5d1SDavid du Colombier newflag = 1; 143e12c5d1SDavid du Colombier return n; 153e12c5d1SDavid du Colombier } 163e12c5d1SDavid du Colombier 173e12c5d1SDavid du Colombier Node* 183e12c5d1SDavid du Colombier new1(int o, Node *l, Node *r) 193e12c5d1SDavid du Colombier { 203e12c5d1SDavid du Colombier Node *n; 213e12c5d1SDavid du Colombier 223e12c5d1SDavid du Colombier n = new(o, l, r); 233e12c5d1SDavid du Colombier n->lineno = nearln; 243e12c5d1SDavid du Colombier return n; 253e12c5d1SDavid du Colombier } 263e12c5d1SDavid du Colombier 273e12c5d1SDavid du Colombier void 283e12c5d1SDavid du Colombier prtree(Node *n, char *s) 293e12c5d1SDavid du Colombier { 303e12c5d1SDavid du Colombier 313e12c5d1SDavid du Colombier print(" == %s ==\n", s); 323e12c5d1SDavid du Colombier prtree1(n, 0, 0); 333e12c5d1SDavid du Colombier print("\n"); 343e12c5d1SDavid du Colombier } 353e12c5d1SDavid du Colombier 363e12c5d1SDavid du Colombier void 373e12c5d1SDavid du Colombier prtree1(Node *n, int d, int f) 383e12c5d1SDavid du Colombier { 393e12c5d1SDavid du Colombier int i; 403e12c5d1SDavid du Colombier 413e12c5d1SDavid du Colombier if(f) 423e12c5d1SDavid du Colombier for(i=0; i<d; i++) 433e12c5d1SDavid du Colombier print(" "); 443e12c5d1SDavid du Colombier if(n == Z) { 453e12c5d1SDavid du Colombier print("Z\n"); 463e12c5d1SDavid du Colombier return; 473e12c5d1SDavid du Colombier } 483e12c5d1SDavid du Colombier if(n->op == OLIST) { 493e12c5d1SDavid du Colombier prtree1(n->left, d, 0); 503e12c5d1SDavid du Colombier prtree1(n->right, d, 1); 513e12c5d1SDavid du Colombier return; 523e12c5d1SDavid du Colombier } 533e12c5d1SDavid du Colombier d++; 543e12c5d1SDavid du Colombier print("%O", n->op); 553e12c5d1SDavid du Colombier i = 3; 563e12c5d1SDavid du Colombier switch(n->op) 573e12c5d1SDavid du Colombier { 583e12c5d1SDavid du Colombier case ONAME: 59219b2ee8SDavid du Colombier print(" \"%F\"", n); 60219b2ee8SDavid du Colombier print(" %ld", n->xoffset); 613e12c5d1SDavid du Colombier i = 0; 623e12c5d1SDavid du Colombier break; 633e12c5d1SDavid du Colombier 643e12c5d1SDavid du Colombier case OINDREG: 65219b2ee8SDavid du Colombier print(" %ld(R%d)", n->xoffset, n->reg); 663e12c5d1SDavid du Colombier i = 0; 673e12c5d1SDavid du Colombier break; 683e12c5d1SDavid du Colombier 693e12c5d1SDavid du Colombier case OREGISTER: 70219b2ee8SDavid du Colombier if(n->xoffset) 71219b2ee8SDavid du Colombier print(" %ld+R%d", n->xoffset, n->reg); 723e12c5d1SDavid du Colombier else 733e12c5d1SDavid du Colombier print(" R%d", n->reg); 743e12c5d1SDavid du Colombier i = 0; 753e12c5d1SDavid du Colombier break; 763e12c5d1SDavid du Colombier 773e12c5d1SDavid du Colombier case OSTRING: 78219b2ee8SDavid du Colombier print(" \"%s\"", n->cstring); 793e12c5d1SDavid du Colombier i = 0; 803e12c5d1SDavid du Colombier break; 813e12c5d1SDavid du Colombier 823e12c5d1SDavid du Colombier case OLSTRING: 83219b2ee8SDavid du Colombier print(" \"%S\"", n->rstring); 843e12c5d1SDavid du Colombier i = 0; 853e12c5d1SDavid du Colombier break; 863e12c5d1SDavid du Colombier 873e12c5d1SDavid du Colombier case ODOT: 88219b2ee8SDavid du Colombier case OELEM: 89219b2ee8SDavid du Colombier print(" \"%F\"", n); 903e12c5d1SDavid du Colombier break; 913e12c5d1SDavid du Colombier 923e12c5d1SDavid du Colombier case OCONST: 93219b2ee8SDavid du Colombier if(typefd[n->type->etype]) 94219b2ee8SDavid du Colombier print(" \"%.8e\"", n->fconst); 953e12c5d1SDavid du Colombier else 96219b2ee8SDavid du Colombier print(" \"%lld\"", n->vconst); 973e12c5d1SDavid du Colombier i = 0; 983e12c5d1SDavid du Colombier break; 993e12c5d1SDavid du Colombier } 1003e12c5d1SDavid du Colombier if(n->addable != 0) 1013e12c5d1SDavid du Colombier print(" <%d>", n->addable); 1023e12c5d1SDavid du Colombier if(n->type != T) 1033e12c5d1SDavid du Colombier print(" %T", n->type); 1043e12c5d1SDavid du Colombier if(n->complex != 0) 1053e12c5d1SDavid du Colombier print(" (%d)", n->complex); 1063e12c5d1SDavid du Colombier print("\n"); 1073e12c5d1SDavid du Colombier if(i & 2) 1083e12c5d1SDavid du Colombier prtree1(n->left, d, 1); 1093e12c5d1SDavid du Colombier if(i & 1) 1103e12c5d1SDavid du Colombier prtree1(n->right, d, 1); 1113e12c5d1SDavid du Colombier } 1123e12c5d1SDavid du Colombier 1133e12c5d1SDavid du Colombier Type* 1143e12c5d1SDavid du Colombier typ(int et, Type *d) 1153e12c5d1SDavid du Colombier { 1163e12c5d1SDavid du Colombier Type *t; 1173e12c5d1SDavid du Colombier 1187dd7cddfSDavid du Colombier t = alloc(sizeof(*t)); 1193e12c5d1SDavid du Colombier t->etype = et; 1203e12c5d1SDavid du Colombier t->link = d; 1213e12c5d1SDavid du Colombier t->down = T; 1223e12c5d1SDavid du Colombier t->sym = S; 1233e12c5d1SDavid du Colombier t->width = ewidth[et]; 1243e12c5d1SDavid du Colombier t->offset = 0; 1253e12c5d1SDavid du Colombier t->shift = 0; 1263e12c5d1SDavid du Colombier t->nbits = 0; 1277dd7cddfSDavid du Colombier t->garb = 0; 1283e12c5d1SDavid du Colombier return t; 1293e12c5d1SDavid du Colombier } 1303e12c5d1SDavid du Colombier 1317dd7cddfSDavid du Colombier Type* 13280ee5cbfSDavid du Colombier copytyp(Type *t) 13380ee5cbfSDavid du Colombier { 13480ee5cbfSDavid du Colombier Type *nt; 13580ee5cbfSDavid du Colombier 13680ee5cbfSDavid du Colombier nt = typ(TXXX, T); 13780ee5cbfSDavid du Colombier *nt = *t; 13880ee5cbfSDavid du Colombier return nt; 13980ee5cbfSDavid du Colombier } 14080ee5cbfSDavid du Colombier 14180ee5cbfSDavid du Colombier Type* 1427dd7cddfSDavid du Colombier garbt(Type *t, long b) 1437dd7cddfSDavid du Colombier { 1447dd7cddfSDavid du Colombier Type *t1; 1457dd7cddfSDavid du Colombier 1467dd7cddfSDavid du Colombier if(b & BGARB) { 14780ee5cbfSDavid du Colombier t1 = copytyp(t); 1487dd7cddfSDavid du Colombier t1->garb = simpleg(b); 1497dd7cddfSDavid du Colombier return t1; 1507dd7cddfSDavid du Colombier } 1517dd7cddfSDavid du Colombier return t; 1527dd7cddfSDavid du Colombier } 1537dd7cddfSDavid du Colombier 1547dd7cddfSDavid du Colombier int 1557dd7cddfSDavid du Colombier simpleg(long b) 1567dd7cddfSDavid du Colombier { 1577dd7cddfSDavid du Colombier 1587dd7cddfSDavid du Colombier b &= BGARB; 1597dd7cddfSDavid du Colombier switch(b) { 1607dd7cddfSDavid du Colombier case BCONSTNT: 1617dd7cddfSDavid du Colombier return GCONSTNT; 1627dd7cddfSDavid du Colombier case BVOLATILE: 1637dd7cddfSDavid du Colombier return GVOLATILE; 1647dd7cddfSDavid du Colombier case BVOLATILE|BCONSTNT: 1657dd7cddfSDavid du Colombier return GCONSTNT|GVOLATILE; 1667dd7cddfSDavid du Colombier } 1677dd7cddfSDavid du Colombier return GXXX; 1687dd7cddfSDavid du Colombier } 1697dd7cddfSDavid du Colombier 1703e12c5d1SDavid du Colombier int 1713e12c5d1SDavid du Colombier simplec(long b) 1723e12c5d1SDavid du Colombier { 1733e12c5d1SDavid du Colombier 1743e12c5d1SDavid du Colombier b &= BCLASS; 1753e12c5d1SDavid du Colombier switch(b) { 1763e12c5d1SDavid du Colombier case 0: 1773e12c5d1SDavid du Colombier case BREGISTER: 1783e12c5d1SDavid du Colombier return CXXX; 1793e12c5d1SDavid du Colombier case BAUTO: 1803e12c5d1SDavid du Colombier case BAUTO|BREGISTER: 1813e12c5d1SDavid du Colombier return CAUTO; 1823e12c5d1SDavid du Colombier case BEXTERN: 1833e12c5d1SDavid du Colombier return CEXTERN; 1843e12c5d1SDavid du Colombier case BEXTERN|BREGISTER: 1853e12c5d1SDavid du Colombier return CEXREG; 1863e12c5d1SDavid du Colombier case BSTATIC: 1873e12c5d1SDavid du Colombier return CSTATIC; 1883e12c5d1SDavid du Colombier case BTYPEDEF: 1893e12c5d1SDavid du Colombier return CTYPEDEF; 19080ee5cbfSDavid du Colombier case BTYPESTR: 19180ee5cbfSDavid du Colombier return CTYPESTR; 1923e12c5d1SDavid du Colombier } 1933e12c5d1SDavid du Colombier diag(Z, "illegal combination of classes %Q", b); 1943e12c5d1SDavid du Colombier return CXXX; 1953e12c5d1SDavid du Colombier } 1963e12c5d1SDavid du Colombier 1973e12c5d1SDavid du Colombier Type* 1983e12c5d1SDavid du Colombier simplet(long b) 1993e12c5d1SDavid du Colombier { 2003e12c5d1SDavid du Colombier 2017dd7cddfSDavid du Colombier b &= ~BCLASS & ~BGARB; 2023e12c5d1SDavid du Colombier switch(b) { 2033e12c5d1SDavid du Colombier case BCHAR: 2043e12c5d1SDavid du Colombier case BCHAR|BSIGNED: 2053e12c5d1SDavid du Colombier return types[TCHAR]; 2063e12c5d1SDavid du Colombier 2073e12c5d1SDavid du Colombier case BCHAR|BUNSIGNED: 2083e12c5d1SDavid du Colombier return types[TUCHAR]; 2093e12c5d1SDavid du Colombier 2103e12c5d1SDavid du Colombier case BSHORT: 2113e12c5d1SDavid du Colombier case BSHORT|BINT: 2123e12c5d1SDavid du Colombier case BSHORT|BSIGNED: 2133e12c5d1SDavid du Colombier case BSHORT|BINT|BSIGNED: 2143e12c5d1SDavid du Colombier return types[TSHORT]; 2153e12c5d1SDavid du Colombier 2163e12c5d1SDavid du Colombier case BUNSIGNED|BSHORT: 2173e12c5d1SDavid du Colombier case BUNSIGNED|BSHORT|BINT: 2183e12c5d1SDavid du Colombier return types[TUSHORT]; 2193e12c5d1SDavid du Colombier 2203e12c5d1SDavid du Colombier case 0: 2213e12c5d1SDavid du Colombier case BINT: 2223e12c5d1SDavid du Colombier case BINT|BSIGNED: 2233e12c5d1SDavid du Colombier case BSIGNED: 2247dd7cddfSDavid du Colombier return types[TINT]; 2253e12c5d1SDavid du Colombier 2263e12c5d1SDavid du Colombier case BUNSIGNED: 2273e12c5d1SDavid du Colombier case BUNSIGNED|BINT: 2287dd7cddfSDavid du Colombier return types[TUINT]; 2293e12c5d1SDavid du Colombier 2303e12c5d1SDavid du Colombier case BLONG: 2313e12c5d1SDavid du Colombier case BLONG|BINT: 2323e12c5d1SDavid du Colombier case BLONG|BSIGNED: 2333e12c5d1SDavid du Colombier case BLONG|BINT|BSIGNED: 2343e12c5d1SDavid du Colombier return types[TLONG]; 2353e12c5d1SDavid du Colombier 2363e12c5d1SDavid du Colombier case BUNSIGNED|BLONG: 2373e12c5d1SDavid du Colombier case BUNSIGNED|BLONG|BINT: 2383e12c5d1SDavid du Colombier return types[TULONG]; 2393e12c5d1SDavid du Colombier 2403e12c5d1SDavid du Colombier case BVLONG|BLONG: 2413e12c5d1SDavid du Colombier case BVLONG|BLONG|BINT: 2423e12c5d1SDavid du Colombier case BVLONG|BLONG|BSIGNED: 2433e12c5d1SDavid du Colombier case BVLONG|BLONG|BINT|BSIGNED: 2443e12c5d1SDavid du Colombier return types[TVLONG]; 2453e12c5d1SDavid du Colombier 246219b2ee8SDavid du Colombier case BVLONG|BLONG|BUNSIGNED: 247219b2ee8SDavid du Colombier case BVLONG|BLONG|BINT|BUNSIGNED: 248219b2ee8SDavid du Colombier return types[TUVLONG]; 249219b2ee8SDavid du Colombier 2503e12c5d1SDavid du Colombier case BFLOAT: 2513e12c5d1SDavid du Colombier return types[TFLOAT]; 2523e12c5d1SDavid du Colombier 2533e12c5d1SDavid du Colombier case BDOUBLE: 2543e12c5d1SDavid du Colombier case BDOUBLE|BLONG: 2553e12c5d1SDavid du Colombier case BFLOAT|BLONG: 2563e12c5d1SDavid du Colombier return types[TDOUBLE]; 2573e12c5d1SDavid du Colombier 2583e12c5d1SDavid du Colombier case BVOID: 2593e12c5d1SDavid du Colombier return types[TVOID]; 2603e12c5d1SDavid du Colombier } 2613e12c5d1SDavid du Colombier 2623e12c5d1SDavid du Colombier diag(Z, "illegal combination of types %Q", b); 2637dd7cddfSDavid du Colombier return types[TINT]; 2643e12c5d1SDavid du Colombier } 2653e12c5d1SDavid du Colombier 2663e12c5d1SDavid du Colombier int 2673e12c5d1SDavid du Colombier stcompat(Node *n, Type *t1, Type *t2, long ttab[]) 2683e12c5d1SDavid du Colombier { 2697dd7cddfSDavid du Colombier int i; 2707dd7cddfSDavid du Colombier ulong b; 2713e12c5d1SDavid du Colombier 2723e12c5d1SDavid du Colombier i = 0; 2733e12c5d1SDavid du Colombier if(t2 != T) 2743e12c5d1SDavid du Colombier i = t2->etype; 2753e12c5d1SDavid du Colombier b = 1L << i; 2763e12c5d1SDavid du Colombier i = 0; 2773e12c5d1SDavid du Colombier if(t1 != T) 2783e12c5d1SDavid du Colombier i = t1->etype; 2793e12c5d1SDavid du Colombier if(b & ttab[i]) { 2803e12c5d1SDavid du Colombier if(ttab == tasign) 2813e12c5d1SDavid du Colombier if(b == BSTRUCT || b == BUNION) 2823e12c5d1SDavid du Colombier if(!sametype(t1, t2)) 2833e12c5d1SDavid du Colombier return 1; 2843e12c5d1SDavid du Colombier if(n->op != OCAST) 2853e12c5d1SDavid du Colombier if(b == BIND && i == TIND) 2863e12c5d1SDavid du Colombier if(!sametype(t1, t2)) 2873e12c5d1SDavid du Colombier return 1; 2883e12c5d1SDavid du Colombier return 0; 2893e12c5d1SDavid du Colombier } 2903e12c5d1SDavid du Colombier return 1; 2913e12c5d1SDavid du Colombier } 2923e12c5d1SDavid du Colombier 2933e12c5d1SDavid du Colombier int 2943e12c5d1SDavid du Colombier tcompat(Node *n, Type *t1, Type *t2, long ttab[]) 2953e12c5d1SDavid du Colombier { 2963e12c5d1SDavid du Colombier 2973e12c5d1SDavid du Colombier if(stcompat(n, t1, t2, ttab)) { 2983e12c5d1SDavid du Colombier if(t1 == T) 2993e12c5d1SDavid du Colombier diag(n, "incompatible type: \"%T\" for op \"%O\"", 3003e12c5d1SDavid du Colombier t2, n->op); 3013e12c5d1SDavid du Colombier else 3023e12c5d1SDavid du Colombier diag(n, "incompatible types: \"%T\" and \"%T\" for op \"%O\"", 3033e12c5d1SDavid du Colombier t1, t2, n->op); 3043e12c5d1SDavid du Colombier return 1; 3053e12c5d1SDavid du Colombier } 3063e12c5d1SDavid du Colombier return 0; 3073e12c5d1SDavid du Colombier } 3083e12c5d1SDavid du Colombier 3093e12c5d1SDavid du Colombier void 3103e12c5d1SDavid du Colombier makedot(Node *n, Type *t, long o) 3113e12c5d1SDavid du Colombier { 3123e12c5d1SDavid du Colombier Node *n1, *n2; 3133e12c5d1SDavid du Colombier 3143e12c5d1SDavid du Colombier if(t->nbits) { 3153e12c5d1SDavid du Colombier n1 = new(OXXX, Z, Z); 3163e12c5d1SDavid du Colombier *n1 = *n; 3173e12c5d1SDavid du Colombier n->op = OBIT; 3183e12c5d1SDavid du Colombier n->left = n1; 3193e12c5d1SDavid du Colombier n->right = Z; 3203e12c5d1SDavid du Colombier n->type = t; 3213e12c5d1SDavid du Colombier n->addable = n1->left->addable; 3223e12c5d1SDavid du Colombier n = n1; 3233e12c5d1SDavid du Colombier } 3243e12c5d1SDavid du Colombier n->addable = n->left->addable; 3253e12c5d1SDavid du Colombier if(n->addable == 0) { 3263e12c5d1SDavid du Colombier n1 = new1(OCONST, Z, Z); 327219b2ee8SDavid du Colombier n1->vconst = o; 3283e12c5d1SDavid du Colombier n1->type = types[TLONG]; 3293e12c5d1SDavid du Colombier n->right = n1; 3303e12c5d1SDavid du Colombier n->type = t; 3313e12c5d1SDavid du Colombier return; 3323e12c5d1SDavid du Colombier } 3333e12c5d1SDavid du Colombier n->left->type = t; 3343e12c5d1SDavid du Colombier if(o == 0) { 3353e12c5d1SDavid du Colombier *n = *n->left; 3363e12c5d1SDavid du Colombier return; 3373e12c5d1SDavid du Colombier } 3383e12c5d1SDavid du Colombier n->type = t; 3393e12c5d1SDavid du Colombier n1 = new1(OCONST, Z, Z); 340219b2ee8SDavid du Colombier n1->vconst = o; 3413e12c5d1SDavid du Colombier t = typ(TIND, t); 3423e12c5d1SDavid du Colombier t->width = types[TIND]->width; 3433e12c5d1SDavid du Colombier n1->type = t; 3443e12c5d1SDavid du Colombier 3453e12c5d1SDavid du Colombier n2 = new1(OADDR, n->left, Z); 3463e12c5d1SDavid du Colombier n2->type = t; 3473e12c5d1SDavid du Colombier 3483e12c5d1SDavid du Colombier n1 = new1(OADD, n1, n2); 3493e12c5d1SDavid du Colombier n1->type = t; 3503e12c5d1SDavid du Colombier 3513e12c5d1SDavid du Colombier n->op = OIND; 3523e12c5d1SDavid du Colombier n->left = n1; 3533e12c5d1SDavid du Colombier n->right = Z; 3543e12c5d1SDavid du Colombier } 3553e12c5d1SDavid du Colombier 3563e12c5d1SDavid du Colombier Type* 35780ee5cbfSDavid du Colombier dotsearch(Sym *s, Type *t, Node *n, long *off) 3583e12c5d1SDavid du Colombier { 35980ee5cbfSDavid du Colombier Type *t1, *xt, *rt; 3603e12c5d1SDavid du Colombier 3613e12c5d1SDavid du Colombier xt = T; 3623e12c5d1SDavid du Colombier 3633e12c5d1SDavid du Colombier /* 3643e12c5d1SDavid du Colombier * look it up by name 3653e12c5d1SDavid du Colombier */ 3663e12c5d1SDavid du Colombier for(t1 = t; t1 != T; t1 = t1->down) 3673e12c5d1SDavid du Colombier if(t1->sym == s) { 3683e12c5d1SDavid du Colombier if(xt != T) 3693e12c5d1SDavid du Colombier goto ambig; 3703e12c5d1SDavid du Colombier xt = t1; 3713e12c5d1SDavid du Colombier } 3723e12c5d1SDavid du Colombier 3733e12c5d1SDavid du Colombier /* 3743e12c5d1SDavid du Colombier * look it up by type 3753e12c5d1SDavid du Colombier */ 37680ee5cbfSDavid du Colombier if(s->class == CTYPEDEF || s->class == CTYPESTR) 3773e12c5d1SDavid du Colombier for(t1 = t; t1 != T; t1 = t1->down) 3783e12c5d1SDavid du Colombier if(t1->sym == S && typesu[t1->etype]) 3793e12c5d1SDavid du Colombier if(sametype(s->type, t1)) { 3803e12c5d1SDavid du Colombier if(xt != T) 3813e12c5d1SDavid du Colombier goto ambig; 3823e12c5d1SDavid du Colombier xt = t1; 3833e12c5d1SDavid du Colombier } 38480ee5cbfSDavid du Colombier if(xt != T) { 38580ee5cbfSDavid du Colombier *off = xt->offset; 3863e12c5d1SDavid du Colombier return xt; 38780ee5cbfSDavid du Colombier } 3883e12c5d1SDavid du Colombier 3893e12c5d1SDavid du Colombier /* 3903e12c5d1SDavid du Colombier * look it up in unnamed substructures 3913e12c5d1SDavid du Colombier */ 3923e12c5d1SDavid du Colombier for(t1 = t; t1 != T; t1 = t1->down) 39380ee5cbfSDavid du Colombier if(t1->sym == S && typesu[t1->etype]){ 39480ee5cbfSDavid du Colombier rt = dotsearch(s, t1->link, n, off); 39580ee5cbfSDavid du Colombier if(rt != T) { 3963e12c5d1SDavid du Colombier if(xt != T) 3973e12c5d1SDavid du Colombier goto ambig; 39880ee5cbfSDavid du Colombier xt = rt; 39980ee5cbfSDavid du Colombier *off += t1->offset; 40080ee5cbfSDavid du Colombier } 4013e12c5d1SDavid du Colombier } 4023e12c5d1SDavid du Colombier return xt; 4033e12c5d1SDavid du Colombier 4043e12c5d1SDavid du Colombier ambig: 4053e12c5d1SDavid du Colombier diag(n, "ambiguous structure element: %s", s->name); 4063e12c5d1SDavid du Colombier return xt; 4073e12c5d1SDavid du Colombier } 4083e12c5d1SDavid du Colombier 4093e12c5d1SDavid du Colombier long 4103e12c5d1SDavid du Colombier dotoffset(Type *st, Type *lt, Node *n) 4113e12c5d1SDavid du Colombier { 4123e12c5d1SDavid du Colombier Type *t; 4133e12c5d1SDavid du Colombier Sym *g; 4143e12c5d1SDavid du Colombier long o, o1; 4153e12c5d1SDavid du Colombier 4163e12c5d1SDavid du Colombier o = -1; 4173e12c5d1SDavid du Colombier /* 4183e12c5d1SDavid du Colombier * first try matching at the top level 4193e12c5d1SDavid du Colombier * for matching tag names 4203e12c5d1SDavid du Colombier */ 4213e12c5d1SDavid du Colombier g = st->tag; 4223e12c5d1SDavid du Colombier if(g != S) 4233e12c5d1SDavid du Colombier for(t=lt->link; t!=T; t=t->down) 4243e12c5d1SDavid du Colombier if(t->sym == S) 4253e12c5d1SDavid du Colombier if(g == t->tag) { 4263e12c5d1SDavid du Colombier if(o >= 0) 4273e12c5d1SDavid du Colombier goto ambig; 4283e12c5d1SDavid du Colombier o = t->offset; 4293e12c5d1SDavid du Colombier } 4303e12c5d1SDavid du Colombier if(o >= 0) 4313e12c5d1SDavid du Colombier return o; 4323e12c5d1SDavid du Colombier 4333e12c5d1SDavid du Colombier /* 4343e12c5d1SDavid du Colombier * second try matching at the top level 4353e12c5d1SDavid du Colombier * for similar types 4363e12c5d1SDavid du Colombier */ 4373e12c5d1SDavid du Colombier for(t=lt->link; t!=T; t=t->down) 4383e12c5d1SDavid du Colombier if(t->sym == S) 4393e12c5d1SDavid du Colombier if(sametype(st, t)) { 4403e12c5d1SDavid du Colombier if(o >= 0) 4413e12c5d1SDavid du Colombier goto ambig; 4423e12c5d1SDavid du Colombier o = t->offset; 4433e12c5d1SDavid du Colombier } 4443e12c5d1SDavid du Colombier if(o >= 0) 4453e12c5d1SDavid du Colombier return o; 4463e12c5d1SDavid du Colombier 4473e12c5d1SDavid du Colombier /* 4483e12c5d1SDavid du Colombier * last try matching sub-levels 4493e12c5d1SDavid du Colombier */ 4503e12c5d1SDavid du Colombier for(t=lt->link; t!=T; t=t->down) 4513e12c5d1SDavid du Colombier if(t->sym == S) 4523e12c5d1SDavid du Colombier if(typesu[t->etype]) { 4533e12c5d1SDavid du Colombier o1 = dotoffset(st, t, n); 4543e12c5d1SDavid du Colombier if(o1 >= 0) { 4553e12c5d1SDavid du Colombier if(o >= 0) 4563e12c5d1SDavid du Colombier goto ambig; 4573e12c5d1SDavid du Colombier o = o1 + t->offset; 4583e12c5d1SDavid du Colombier } 4593e12c5d1SDavid du Colombier } 4603e12c5d1SDavid du Colombier return o; 4613e12c5d1SDavid du Colombier 4623e12c5d1SDavid du Colombier ambig: 4633e12c5d1SDavid du Colombier diag(n, "ambiguous unnamed structure element"); 4643e12c5d1SDavid du Colombier return o; 4653e12c5d1SDavid du Colombier } 4663e12c5d1SDavid du Colombier 467219b2ee8SDavid du Colombier /* 468219b2ee8SDavid du Colombier * look into tree for floating point constant expressions 469219b2ee8SDavid du Colombier */ 470219b2ee8SDavid du Colombier int 471219b2ee8SDavid du Colombier allfloat(Node *n, int flag) 472219b2ee8SDavid du Colombier { 473219b2ee8SDavid du Colombier 474219b2ee8SDavid du Colombier if(n != Z) { 475219b2ee8SDavid du Colombier if(n->type->etype != TDOUBLE) 476219b2ee8SDavid du Colombier return 1; 477219b2ee8SDavid du Colombier switch(n->op) { 478219b2ee8SDavid du Colombier case OCONST: 479219b2ee8SDavid du Colombier if(flag) 480219b2ee8SDavid du Colombier n->type = types[TFLOAT]; 481219b2ee8SDavid du Colombier return 1; 482219b2ee8SDavid du Colombier case OADD: /* no need to get more exotic than this */ 483219b2ee8SDavid du Colombier case OSUB: 484219b2ee8SDavid du Colombier case OMUL: 485219b2ee8SDavid du Colombier case ODIV: 486219b2ee8SDavid du Colombier if(!allfloat(n->right, flag)) 487219b2ee8SDavid du Colombier break; 488219b2ee8SDavid du Colombier case OCAST: 489219b2ee8SDavid du Colombier if(!allfloat(n->left, flag)) 490219b2ee8SDavid du Colombier break; 491219b2ee8SDavid du Colombier if(flag) 492219b2ee8SDavid du Colombier n->type = types[TFLOAT]; 493219b2ee8SDavid du Colombier return 1; 494219b2ee8SDavid du Colombier } 495219b2ee8SDavid du Colombier } 496219b2ee8SDavid du Colombier return 0; 497219b2ee8SDavid du Colombier } 498219b2ee8SDavid du Colombier 499219b2ee8SDavid du Colombier void 5007dd7cddfSDavid du Colombier constas(Node *n, Type *il, Type *ir) 5017dd7cddfSDavid du Colombier { 5027dd7cddfSDavid du Colombier Type *l, *r; 5037dd7cddfSDavid du Colombier 5047dd7cddfSDavid du Colombier l = il; 5057dd7cddfSDavid du Colombier r = ir; 5067dd7cddfSDavid du Colombier 5077dd7cddfSDavid du Colombier if(l == T) 5087dd7cddfSDavid du Colombier return; 5097dd7cddfSDavid du Colombier if(l->garb & GCONSTNT) { 5107dd7cddfSDavid du Colombier warn(n, "assignment to a constant type (%T)", il); 5117dd7cddfSDavid du Colombier return; 5127dd7cddfSDavid du Colombier } 5137dd7cddfSDavid du Colombier if(r == T) 5147dd7cddfSDavid du Colombier return; 5157dd7cddfSDavid du Colombier for(;;) { 5167dd7cddfSDavid du Colombier if(l->etype != TIND || r->etype != TIND) 5177dd7cddfSDavid du Colombier break; 5187dd7cddfSDavid du Colombier l = l->link; 5197dd7cddfSDavid du Colombier r = r->link; 5207dd7cddfSDavid du Colombier if(l == T || r == T) 5217dd7cddfSDavid du Colombier break; 5227dd7cddfSDavid du Colombier if(r->garb & GCONSTNT) 5237dd7cddfSDavid du Colombier if(!(l->garb & GCONSTNT)) { 5247dd7cddfSDavid du Colombier warn(n, "assignment of a constant pointer type (%T)", ir); 5257dd7cddfSDavid du Colombier break; 5267dd7cddfSDavid du Colombier } 5277dd7cddfSDavid du Colombier } 5287dd7cddfSDavid du Colombier } 5297dd7cddfSDavid du Colombier 5307dd7cddfSDavid du Colombier void 531219b2ee8SDavid du Colombier typeext1(Type *st, Node *l) 532219b2ee8SDavid du Colombier { 533219b2ee8SDavid du Colombier if(st->etype == TFLOAT && allfloat(l, 0)) 534219b2ee8SDavid du Colombier allfloat(l, 1); 535219b2ee8SDavid du Colombier } 536219b2ee8SDavid du Colombier 5373e12c5d1SDavid du Colombier void 5383e12c5d1SDavid du Colombier typeext(Type *st, Node *l) 5393e12c5d1SDavid du Colombier { 5403e12c5d1SDavid du Colombier Type *lt; 5413e12c5d1SDavid du Colombier Node *n1, *n2; 5423e12c5d1SDavid du Colombier long o; 5433e12c5d1SDavid du Colombier 5443e12c5d1SDavid du Colombier lt = l->type; 5453e12c5d1SDavid du Colombier if(lt == T) 5463e12c5d1SDavid du Colombier return; 5473e12c5d1SDavid du Colombier if(st->etype == TIND && vconst(l) == 0) { 5483e12c5d1SDavid du Colombier l->type = st; 549219b2ee8SDavid du Colombier l->vconst = 0; 5503e12c5d1SDavid du Colombier return; 5513e12c5d1SDavid du Colombier } 552219b2ee8SDavid du Colombier typeext1(st, l); 5533e12c5d1SDavid du Colombier 5543e12c5d1SDavid du Colombier /* 5553e12c5d1SDavid du Colombier * extension of C 5563e12c5d1SDavid du Colombier * if assign of struct containing unnamed sub-struct 5573e12c5d1SDavid du Colombier * to type of sub-struct, insert the DOT. 5583e12c5d1SDavid du Colombier * if assign of *struct containing unnamed substruct 5593e12c5d1SDavid du Colombier * to type of *sub-struct, insert the add-offset 5603e12c5d1SDavid du Colombier */ 5613e12c5d1SDavid du Colombier if(typesu[st->etype] && typesu[lt->etype]) { 5623e12c5d1SDavid du Colombier o = dotoffset(st, lt, l); 5633e12c5d1SDavid du Colombier if(o >= 0) { 5643e12c5d1SDavid du Colombier n1 = new1(OXXX, Z, Z); 5653e12c5d1SDavid du Colombier *n1 = *l; 5663e12c5d1SDavid du Colombier l->op = ODOT; 5673e12c5d1SDavid du Colombier l->left = n1; 5683e12c5d1SDavid du Colombier l->right = Z; 5693e12c5d1SDavid du Colombier makedot(l, st, o); 5703e12c5d1SDavid du Colombier } 5713e12c5d1SDavid du Colombier return; 5723e12c5d1SDavid du Colombier } 5733e12c5d1SDavid du Colombier if(st->etype == TIND && typesu[st->link->etype]) 5743e12c5d1SDavid du Colombier if(lt->etype == TIND && typesu[lt->link->etype]) { 5753e12c5d1SDavid du Colombier o = dotoffset(st->link, lt->link, l); 5763e12c5d1SDavid du Colombier if(o >= 0) { 5773e12c5d1SDavid du Colombier l->type = st; 5783e12c5d1SDavid du Colombier if(o == 0) 5793e12c5d1SDavid du Colombier return; 5803e12c5d1SDavid du Colombier n1 = new1(OXXX, Z, Z); 5813e12c5d1SDavid du Colombier *n1 = *l; 5823e12c5d1SDavid du Colombier n2 = new1(OCONST, Z, Z); 583219b2ee8SDavid du Colombier n2->vconst = o; 5843e12c5d1SDavid du Colombier n2->type = st; 5853e12c5d1SDavid du Colombier l->op = OADD; 5863e12c5d1SDavid du Colombier l->left = n1; 5873e12c5d1SDavid du Colombier l->right = n2; 5883e12c5d1SDavid du Colombier } 5893e12c5d1SDavid du Colombier return; 5903e12c5d1SDavid du Colombier } 5913e12c5d1SDavid du Colombier } 5923e12c5d1SDavid du Colombier 5933e12c5d1SDavid du Colombier /* 5943e12c5d1SDavid du Colombier * a cast that generates no code 5953e12c5d1SDavid du Colombier * (same size move) 5963e12c5d1SDavid du Colombier */ 5973e12c5d1SDavid du Colombier int 5983e12c5d1SDavid du Colombier nocast(Type *t1, Type *t2) 5993e12c5d1SDavid du Colombier { 6003e12c5d1SDavid du Colombier int i, b; 6013e12c5d1SDavid du Colombier 6023e12c5d1SDavid du Colombier if(t1->nbits) 6033e12c5d1SDavid du Colombier return 0; 6043e12c5d1SDavid du Colombier i = 0; 6053e12c5d1SDavid du Colombier if(t2 != T) 6063e12c5d1SDavid du Colombier i = t2->etype; 6073e12c5d1SDavid du Colombier b = 1<<i; 6083e12c5d1SDavid du Colombier i = 0; 6093e12c5d1SDavid du Colombier if(t1 != T) 6103e12c5d1SDavid du Colombier i = t1->etype; 6113e12c5d1SDavid du Colombier if(b & ncast[i]) 6123e12c5d1SDavid du Colombier return 1; 6133e12c5d1SDavid du Colombier return 0; 6143e12c5d1SDavid du Colombier } 6153e12c5d1SDavid du Colombier 6163e12c5d1SDavid du Colombier /* 6173e12c5d1SDavid du Colombier * a cast that has a noop semantic 6183e12c5d1SDavid du Colombier * (small to large, convert) 6193e12c5d1SDavid du Colombier */ 6203e12c5d1SDavid du Colombier int 6213e12c5d1SDavid du Colombier nilcast(Type *t1, Type *t2) 6223e12c5d1SDavid du Colombier { 6237dd7cddfSDavid du Colombier int et1, et2; 6243e12c5d1SDavid du Colombier 6257dd7cddfSDavid du Colombier if(t1 == T) 6267dd7cddfSDavid du Colombier return 0; 6273e12c5d1SDavid du Colombier if(t1->nbits) 6283e12c5d1SDavid du Colombier return 0; 6297dd7cddfSDavid du Colombier if(t2 == T) 6307dd7cddfSDavid du Colombier return 0; 6317dd7cddfSDavid du Colombier et1 = t1->etype; 6327dd7cddfSDavid du Colombier et2 = t2->etype; 6337dd7cddfSDavid du Colombier if(et1 == et2) 6343e12c5d1SDavid du Colombier return 1; 6357dd7cddfSDavid du Colombier if(typefd[et1] && typefd[et2]) { 6367dd7cddfSDavid du Colombier if(ewidth[et1] < ewidth[et2]) 6377dd7cddfSDavid du Colombier return 1; 6387dd7cddfSDavid du Colombier return 0; 6397dd7cddfSDavid du Colombier } 6407dd7cddfSDavid du Colombier if(typechlp[et1] && typechlp[et2]) { 6417dd7cddfSDavid du Colombier if(ewidth[et1] < ewidth[et2]) 6427dd7cddfSDavid du Colombier return 1; 6437dd7cddfSDavid du Colombier return 0; 6447dd7cddfSDavid du Colombier } 6453e12c5d1SDavid du Colombier return 0; 6463e12c5d1SDavid du Colombier } 6473e12c5d1SDavid du Colombier 6483e12c5d1SDavid du Colombier /* 6493e12c5d1SDavid du Colombier * "the usual arithmetic conversions are performed" 6503e12c5d1SDavid du Colombier */ 6513e12c5d1SDavid du Colombier void 6523e12c5d1SDavid du Colombier arith(Node *n, int f) 6533e12c5d1SDavid du Colombier { 6543e12c5d1SDavid du Colombier Type *t1, *t2; 6553e12c5d1SDavid du Colombier int i, j, k; 6563e12c5d1SDavid du Colombier Node *n1; 6573e12c5d1SDavid du Colombier long w; 6583e12c5d1SDavid du Colombier 6593e12c5d1SDavid du Colombier t1 = n->left->type; 6603e12c5d1SDavid du Colombier if(n->right == Z) 6613e12c5d1SDavid du Colombier t2 = t1; 6623e12c5d1SDavid du Colombier else 6633e12c5d1SDavid du Colombier t2 = n->right->type; 6643e12c5d1SDavid du Colombier i = TXXX; 6653e12c5d1SDavid du Colombier if(t1 != T) 6663e12c5d1SDavid du Colombier i = t1->etype; 6673e12c5d1SDavid du Colombier j = TXXX; 6683e12c5d1SDavid du Colombier if(t2 != T) 6693e12c5d1SDavid du Colombier j = t2->etype; 6703e12c5d1SDavid du Colombier k = tab[i][j]; 6713e12c5d1SDavid du Colombier if(k == TIND) { 6723e12c5d1SDavid du Colombier if(i == TIND) 6733e12c5d1SDavid du Colombier n->type = t1; 6743e12c5d1SDavid du Colombier else 6753e12c5d1SDavid du Colombier if(j == TIND) 6763e12c5d1SDavid du Colombier n->type = t2; 6773e12c5d1SDavid du Colombier } else { 6783e12c5d1SDavid du Colombier /* convert up to at least int */ 6793e12c5d1SDavid du Colombier if(f == 1) 6807dd7cddfSDavid du Colombier while(k < TINT) 6813e12c5d1SDavid du Colombier k += 2; 6823e12c5d1SDavid du Colombier n->type = types[k]; 6833e12c5d1SDavid du Colombier } 6843e12c5d1SDavid du Colombier if(n->op == OSUB) 6853e12c5d1SDavid du Colombier if(i == TIND && j == TIND) { 6863e12c5d1SDavid du Colombier w = n->right->type->link->width; 6872cca75a1SDavid du Colombier if(w < 1 || n->left->type->link == T || n->left->type->link->width < 1) 6883e12c5d1SDavid du Colombier goto bad; 6897bd483b0SDavid du Colombier n->type = types[ewidth[TIND] <= ewidth[TLONG]? TLONG: TVLONG]; 6907bd483b0SDavid du Colombier if(1 && ewidth[TIND] > ewidth[TLONG]){ 6917bd483b0SDavid du Colombier n1 = new1(OXXX, Z, Z); 6927bd483b0SDavid du Colombier *n1 = *n; 6937bd483b0SDavid du Colombier n->op = OCAST; 6947bd483b0SDavid du Colombier n->left = n1; 6957bd483b0SDavid du Colombier n->right = Z; 6967bd483b0SDavid du Colombier n->type = types[TLONG]; 6977bd483b0SDavid du Colombier } 6983e12c5d1SDavid du Colombier if(w > 1) { 6993e12c5d1SDavid du Colombier n1 = new1(OXXX, Z, Z); 7003e12c5d1SDavid du Colombier *n1 = *n; 7013e12c5d1SDavid du Colombier n->op = ODIV; 7023e12c5d1SDavid du Colombier n->left = n1; 7033e12c5d1SDavid du Colombier n1 = new1(OCONST, Z, Z); 70480ee5cbfSDavid du Colombier n1->vconst = w; 7053e12c5d1SDavid du Colombier n1->type = n->type; 7063e12c5d1SDavid du Colombier n->right = n1; 70780ee5cbfSDavid du Colombier w = vlog(n1); 70880ee5cbfSDavid du Colombier if(w >= 0) { 70980ee5cbfSDavid du Colombier n->op = OASHR; 71080ee5cbfSDavid du Colombier n1->vconst = w; 71180ee5cbfSDavid du Colombier } 7123e12c5d1SDavid du Colombier } 7133e12c5d1SDavid du Colombier return; 7143e12c5d1SDavid du Colombier } 7153e12c5d1SDavid du Colombier if(!sametype(n->type, n->left->type)) { 7163e12c5d1SDavid du Colombier n->left = new1(OCAST, n->left, Z); 7173e12c5d1SDavid du Colombier n->left->type = n->type; 7183e12c5d1SDavid du Colombier if(n->type->etype == TIND) { 7193e12c5d1SDavid du Colombier w = n->type->link->width; 7207dd7cddfSDavid du Colombier if(w < 1) { 7217dd7cddfSDavid du Colombier snap(n->type->link); 7227dd7cddfSDavid du Colombier w = n->type->link->width; 7233e12c5d1SDavid du Colombier if(w < 1) 7243e12c5d1SDavid du Colombier goto bad; 7257dd7cddfSDavid du Colombier } 7263e12c5d1SDavid du Colombier if(w > 1) { 7273e12c5d1SDavid du Colombier n1 = new1(OCONST, Z, Z); 728219b2ee8SDavid du Colombier n1->vconst = w; 7293e12c5d1SDavid du Colombier n1->type = n->type; 7303e12c5d1SDavid du Colombier n->left = new1(OMUL, n->left, n1); 7313e12c5d1SDavid du Colombier n->left->type = n->type; 7323e12c5d1SDavid du Colombier } 7333e12c5d1SDavid du Colombier } 7343e12c5d1SDavid du Colombier } 7353e12c5d1SDavid du Colombier if(n->right != Z) 7363e12c5d1SDavid du Colombier if(!sametype(n->type, n->right->type)) { 7373e12c5d1SDavid du Colombier n->right = new1(OCAST, n->right, Z); 7383e12c5d1SDavid du Colombier n->right->type = n->type; 7393e12c5d1SDavid du Colombier if(n->type->etype == TIND) { 7403e12c5d1SDavid du Colombier w = n->type->link->width; 7417dd7cddfSDavid du Colombier if(w < 1) { 7427dd7cddfSDavid du Colombier snap(n->type->link); 7437dd7cddfSDavid du Colombier w = n->type->link->width; 7443e12c5d1SDavid du Colombier if(w < 1) 7453e12c5d1SDavid du Colombier goto bad; 7467dd7cddfSDavid du Colombier } 7473e12c5d1SDavid du Colombier if(w != 1) { 7483e12c5d1SDavid du Colombier n1 = new1(OCONST, Z, Z); 749219b2ee8SDavid du Colombier n1->vconst = w; 7503e12c5d1SDavid du Colombier n1->type = n->type; 7513e12c5d1SDavid du Colombier n->right = new1(OMUL, n->right, n1); 7523e12c5d1SDavid du Colombier n->right->type = n->type; 7533e12c5d1SDavid du Colombier } 7543e12c5d1SDavid du Colombier } 7553e12c5d1SDavid du Colombier } 7563e12c5d1SDavid du Colombier return; 7573e12c5d1SDavid du Colombier bad: 7587dd7cddfSDavid du Colombier diag(n, "pointer addition not fully declared: %T", n->type->link); 7593e12c5d1SDavid du Colombier } 7603e12c5d1SDavid du Colombier 761375daca8SDavid du Colombier /* 762375daca8SDavid du Colombier * try to rewrite shift & mask 763375daca8SDavid du Colombier */ 764375daca8SDavid du Colombier void 765375daca8SDavid du Colombier simplifyshift(Node *n) 766375daca8SDavid du Colombier { 767375daca8SDavid du Colombier ulong c3; 768375daca8SDavid du Colombier int o, s1, s2, c1, c2; 769375daca8SDavid du Colombier 770375daca8SDavid du Colombier if(!typechlp[n->type->etype]) 771375daca8SDavid du Colombier return; 772375daca8SDavid du Colombier switch(n->op) { 773375daca8SDavid du Colombier default: 774375daca8SDavid du Colombier return; 775375daca8SDavid du Colombier case OASHL: 776375daca8SDavid du Colombier s1 = 0; 777375daca8SDavid du Colombier break; 778375daca8SDavid du Colombier case OLSHR: 779375daca8SDavid du Colombier s1 = 1; 780375daca8SDavid du Colombier break; 781375daca8SDavid du Colombier case OASHR: 782375daca8SDavid du Colombier s1 = 2; 783375daca8SDavid du Colombier break; 784375daca8SDavid du Colombier } 785375daca8SDavid du Colombier if(n->right->op != OCONST) 786375daca8SDavid du Colombier return; 787375daca8SDavid du Colombier if(n->left->op != OAND) 788375daca8SDavid du Colombier return; 789375daca8SDavid du Colombier if(n->left->right->op != OCONST) 790375daca8SDavid du Colombier return; 791375daca8SDavid du Colombier switch(n->left->left->op) { 792375daca8SDavid du Colombier default: 793375daca8SDavid du Colombier return; 794375daca8SDavid du Colombier case OASHL: 795375daca8SDavid du Colombier s2 = 0; 796375daca8SDavid du Colombier break; 797375daca8SDavid du Colombier case OLSHR: 798375daca8SDavid du Colombier s2 = 1; 799375daca8SDavid du Colombier break; 800375daca8SDavid du Colombier case OASHR: 801375daca8SDavid du Colombier s2 = 2; 802375daca8SDavid du Colombier break; 803375daca8SDavid du Colombier } 804375daca8SDavid du Colombier if(n->left->left->right->op != OCONST) 805375daca8SDavid du Colombier return; 806375daca8SDavid du Colombier 807375daca8SDavid du Colombier c1 = n->right->vconst; 808375daca8SDavid du Colombier c2 = n->left->left->right->vconst; 809375daca8SDavid du Colombier c3 = n->left->right->vconst; 810375daca8SDavid du Colombier 811375daca8SDavid du Colombier /* 812375daca8SDavid du Colombier if(debug['h']) 813375daca8SDavid du Colombier print("%.3o %ld %ld %d #%.lux\n", 814375daca8SDavid du Colombier (s1<<3)|s2, c1, c2, topbit(c3), c3); 815375daca8SDavid du Colombier */ 816375daca8SDavid du Colombier 817375daca8SDavid du Colombier o = n->op; 818375daca8SDavid du Colombier switch((s1<<3)|s2) { 819375daca8SDavid du Colombier case 000: /* (((e <<u c2) & c3) <<u c1) */ 820375daca8SDavid du Colombier c3 >>= c2; 821375daca8SDavid du Colombier c1 += c2; 822375daca8SDavid du Colombier if(c1 >= 32) 823375daca8SDavid du Colombier break; 824375daca8SDavid du Colombier goto rewrite1; 825375daca8SDavid du Colombier 826375daca8SDavid du Colombier case 002: /* (((e >>s c2) & c3) <<u c1) */ 827375daca8SDavid du Colombier if(topbit(c3) >= (32-c2)) 828375daca8SDavid du Colombier break; 829375daca8SDavid du Colombier case 001: /* (((e >>u c2) & c3) <<u c1) */ 830375daca8SDavid du Colombier if(c1 > c2) { 831375daca8SDavid du Colombier c3 <<= c2; 832375daca8SDavid du Colombier c1 -= c2; 833375daca8SDavid du Colombier o = OASHL; 834375daca8SDavid du Colombier goto rewrite1; 835375daca8SDavid du Colombier } 836375daca8SDavid du Colombier c3 <<= c1; 837375daca8SDavid du Colombier if(c1 == c2) 838375daca8SDavid du Colombier goto rewrite0; 839375daca8SDavid du Colombier c1 = c2-c1; 840375daca8SDavid du Colombier o = OLSHR; 841375daca8SDavid du Colombier goto rewrite2; 842375daca8SDavid du Colombier 843375daca8SDavid du Colombier case 022: /* (((e >>s c2) & c3) >>s c1) */ 844375daca8SDavid du Colombier if(c2 <= 0) 845375daca8SDavid du Colombier break; 846375daca8SDavid du Colombier case 012: /* (((e >>s c2) & c3) >>u c1) */ 847375daca8SDavid du Colombier if(topbit(c3) >= (32-c2)) 848375daca8SDavid du Colombier break; 849375daca8SDavid du Colombier goto s11; 850375daca8SDavid du Colombier case 021: /* (((e >>u c2) & c3) >>s c1) */ 851375daca8SDavid du Colombier if(topbit(c3) >= 31 && c2 <= 0) 852375daca8SDavid du Colombier break; 853375daca8SDavid du Colombier goto s11; 854375daca8SDavid du Colombier case 011: /* (((e >>u c2) & c3) >>u c1) */ 855375daca8SDavid du Colombier s11: 856375daca8SDavid du Colombier c3 <<= c2; 857375daca8SDavid du Colombier c1 += c2; 858375daca8SDavid du Colombier if(c1 >= 32) 859375daca8SDavid du Colombier break; 860375daca8SDavid du Colombier o = OLSHR; 861375daca8SDavid du Colombier goto rewrite1; 862375daca8SDavid du Colombier 863375daca8SDavid du Colombier case 020: /* (((e <<u c2) & c3) >>s c1) */ 864375daca8SDavid du Colombier if(topbit(c3) >= 31) 865375daca8SDavid du Colombier break; 866375daca8SDavid du Colombier case 010: /* (((e <<u c2) & c3) >>u c1) */ 867375daca8SDavid du Colombier c3 >>= c1; 868375daca8SDavid du Colombier if(c1 == c2) 869375daca8SDavid du Colombier goto rewrite0; 870375daca8SDavid du Colombier if(c1 > c2) { 871375daca8SDavid du Colombier c1 -= c2; 872375daca8SDavid du Colombier goto rewrite2; 873375daca8SDavid du Colombier } 874375daca8SDavid du Colombier c1 = c2 - c1; 875375daca8SDavid du Colombier o = OASHL; 876375daca8SDavid du Colombier goto rewrite2; 877375daca8SDavid du Colombier } 878375daca8SDavid du Colombier return; 879375daca8SDavid du Colombier 880375daca8SDavid du Colombier rewrite0: /* get rid of both shifts */ 881375daca8SDavid du Colombier if(debug['<'])prtree(n, "rewrite0"); 882375daca8SDavid du Colombier *n = *n->left; 883375daca8SDavid du Colombier n->left = n->left->left; 884375daca8SDavid du Colombier n->right->vconst = c3; 885375daca8SDavid du Colombier return; 886375daca8SDavid du Colombier rewrite1: /* get rid of lower shift */ 887375daca8SDavid du Colombier if(debug['<'])prtree(n, "rewrite1"); 888375daca8SDavid du Colombier n->left->left = n->left->left->left; 889375daca8SDavid du Colombier n->left->right->vconst = c3; 890375daca8SDavid du Colombier n->right->vconst = c1; 891375daca8SDavid du Colombier n->op = o; 892375daca8SDavid du Colombier return; 893375daca8SDavid du Colombier rewrite2: /* get rid of upper shift */ 894375daca8SDavid du Colombier if(debug['<'])prtree(n, "rewrite2"); 895375daca8SDavid du Colombier *n = *n->left; 896375daca8SDavid du Colombier n->right->vconst = c3; 897375daca8SDavid du Colombier n->left->right->vconst = c1; 898375daca8SDavid du Colombier n->left->op = o; 899375daca8SDavid du Colombier } 900375daca8SDavid du Colombier 9013e12c5d1SDavid du Colombier int 9023e12c5d1SDavid du Colombier side(Node *n) 9033e12c5d1SDavid du Colombier { 9043e12c5d1SDavid du Colombier 9053e12c5d1SDavid du Colombier loop: 9063e12c5d1SDavid du Colombier if(n != Z) 9073e12c5d1SDavid du Colombier switch(n->op) { 9083e12c5d1SDavid du Colombier case OCAST: 9093e12c5d1SDavid du Colombier case ONOT: 9103e12c5d1SDavid du Colombier case OADDR: 9113e12c5d1SDavid du Colombier case OIND: 9123e12c5d1SDavid du Colombier n = n->left; 9133e12c5d1SDavid du Colombier goto loop; 9143e12c5d1SDavid du Colombier 9153e12c5d1SDavid du Colombier case OCOND: 9163e12c5d1SDavid du Colombier if(side(n->left)) 9173e12c5d1SDavid du Colombier break; 9183e12c5d1SDavid du Colombier n = n->right; 9193e12c5d1SDavid du Colombier 9203e12c5d1SDavid du Colombier case OEQ: 9213e12c5d1SDavid du Colombier case ONE: 9223e12c5d1SDavid du Colombier case OLT: 9233e12c5d1SDavid du Colombier case OGE: 9243e12c5d1SDavid du Colombier case OGT: 9253e12c5d1SDavid du Colombier case OLE: 9263e12c5d1SDavid du Colombier case OADD: 9273e12c5d1SDavid du Colombier case OSUB: 9283e12c5d1SDavid du Colombier case OMUL: 9293e12c5d1SDavid du Colombier case OLMUL: 9303e12c5d1SDavid du Colombier case ODIV: 9313e12c5d1SDavid du Colombier case OLDIV: 9323e12c5d1SDavid du Colombier case OLSHR: 9333e12c5d1SDavid du Colombier case OASHL: 9343e12c5d1SDavid du Colombier case OASHR: 9353e12c5d1SDavid du Colombier case OAND: 9363e12c5d1SDavid du Colombier case OOR: 9373e12c5d1SDavid du Colombier case OXOR: 9383e12c5d1SDavid du Colombier case OMOD: 9393e12c5d1SDavid du Colombier case OLMOD: 9403e12c5d1SDavid du Colombier case OANDAND: 9413e12c5d1SDavid du Colombier case OOROR: 9423e12c5d1SDavid du Colombier case OCOMMA: 9433e12c5d1SDavid du Colombier case ODOT: 9443e12c5d1SDavid du Colombier if(side(n->left)) 9453e12c5d1SDavid du Colombier break; 9463e12c5d1SDavid du Colombier n = n->right; 9473e12c5d1SDavid du Colombier goto loop; 9483e12c5d1SDavid du Colombier 9497dd7cddfSDavid du Colombier case OSIGN: 9503e12c5d1SDavid du Colombier case OSIZE: 9513e12c5d1SDavid du Colombier case OCONST: 9523e12c5d1SDavid du Colombier case OSTRING: 9533e12c5d1SDavid du Colombier case OLSTRING: 9543e12c5d1SDavid du Colombier case ONAME: 9553e12c5d1SDavid du Colombier return 0; 9563e12c5d1SDavid du Colombier } 9573e12c5d1SDavid du Colombier return 1; 9583e12c5d1SDavid du Colombier } 9593e12c5d1SDavid du Colombier 9603e12c5d1SDavid du Colombier int 9613e12c5d1SDavid du Colombier vconst(Node *n) 9623e12c5d1SDavid du Colombier { 9633e12c5d1SDavid du Colombier int i; 9643e12c5d1SDavid du Colombier 9653e12c5d1SDavid du Colombier if(n == Z) 9663e12c5d1SDavid du Colombier goto no; 9673e12c5d1SDavid du Colombier if(n->op != OCONST) 9683e12c5d1SDavid du Colombier goto no; 9693e12c5d1SDavid du Colombier if(n->type == T) 9703e12c5d1SDavid du Colombier goto no; 9713e12c5d1SDavid du Colombier switch(n->type->etype) 9723e12c5d1SDavid du Colombier { 9733e12c5d1SDavid du Colombier case TFLOAT: 9743e12c5d1SDavid du Colombier case TDOUBLE: 9753e12c5d1SDavid du Colombier i = 100; 976219b2ee8SDavid du Colombier if(n->fconst > i || n->fconst < -i) 9773e12c5d1SDavid du Colombier goto no; 978219b2ee8SDavid du Colombier i = n->fconst; 979219b2ee8SDavid du Colombier if(i != n->fconst) 980219b2ee8SDavid du Colombier goto no; 981219b2ee8SDavid du Colombier return i; 982219b2ee8SDavid du Colombier 983219b2ee8SDavid du Colombier case TVLONG: 984219b2ee8SDavid du Colombier case TUVLONG: 985219b2ee8SDavid du Colombier i = n->vconst; 986219b2ee8SDavid du Colombier if(i != n->vconst) 9873e12c5d1SDavid du Colombier goto no; 9883e12c5d1SDavid du Colombier return i; 9893e12c5d1SDavid du Colombier 9903e12c5d1SDavid du Colombier case TCHAR: 9913e12c5d1SDavid du Colombier case TUCHAR: 9923e12c5d1SDavid du Colombier case TSHORT: 9933e12c5d1SDavid du Colombier case TUSHORT: 9947dd7cddfSDavid du Colombier case TINT: 9957dd7cddfSDavid du Colombier case TUINT: 9963e12c5d1SDavid du Colombier case TLONG: 9973e12c5d1SDavid du Colombier case TULONG: 9983e12c5d1SDavid du Colombier case TIND: 999219b2ee8SDavid du Colombier i = n->vconst; 1000219b2ee8SDavid du Colombier if(i != n->vconst) 10013e12c5d1SDavid du Colombier goto no; 10023e12c5d1SDavid du Colombier return i; 10033e12c5d1SDavid du Colombier } 10043e12c5d1SDavid du Colombier no: 10053e12c5d1SDavid du Colombier return -159; /* first uninteresting constant */ 10063e12c5d1SDavid du Colombier } 10073e12c5d1SDavid du Colombier 10083e12c5d1SDavid du Colombier /* 10097dd7cddfSDavid du Colombier * return log(n) if n is a power of 2 constant 10107dd7cddfSDavid du Colombier */ 10117dd7cddfSDavid du Colombier int 1012282e677fSDavid du Colombier log2(uvlong v) 10137dd7cddfSDavid du Colombier { 10147dd7cddfSDavid du Colombier int s, i; 1015282e677fSDavid du Colombier uvlong m; 10167dd7cddfSDavid du Colombier 10177dd7cddfSDavid du Colombier s = 0; 10187dd7cddfSDavid du Colombier m = MASK(8*sizeof(uvlong)); 10197dd7cddfSDavid du Colombier for(i=32; i; i>>=1) { 10207dd7cddfSDavid du Colombier m >>= i; 10217dd7cddfSDavid du Colombier if(!(v & m)) { 10227dd7cddfSDavid du Colombier v >>= i; 10237dd7cddfSDavid du Colombier s += i; 10247dd7cddfSDavid du Colombier } 10257dd7cddfSDavid du Colombier } 10267dd7cddfSDavid du Colombier if(v == 1) 10277dd7cddfSDavid du Colombier return s; 1028282e677fSDavid du Colombier return -1; 1029282e677fSDavid du Colombier } 1030282e677fSDavid du Colombier 1031282e677fSDavid du Colombier int 1032282e677fSDavid du Colombier vlog(Node *n) 1033282e677fSDavid du Colombier { 1034282e677fSDavid du Colombier if(n->op != OCONST) 1035282e677fSDavid du Colombier goto bad; 1036282e677fSDavid du Colombier if(typefd[n->type->etype]) 1037282e677fSDavid du Colombier goto bad; 1038282e677fSDavid du Colombier 1039282e677fSDavid du Colombier return log2(n->vconst); 10407dd7cddfSDavid du Colombier 10417dd7cddfSDavid du Colombier bad: 10427dd7cddfSDavid du Colombier return -1; 10437dd7cddfSDavid du Colombier } 10447dd7cddfSDavid du Colombier 10457dd7cddfSDavid du Colombier int 10467dd7cddfSDavid du Colombier topbit(ulong v) 10477dd7cddfSDavid du Colombier { 10487dd7cddfSDavid du Colombier int i; 10497dd7cddfSDavid du Colombier 10507dd7cddfSDavid du Colombier for(i = -1; v; i++) 10517dd7cddfSDavid du Colombier v >>= 1; 10527dd7cddfSDavid du Colombier return i; 10537dd7cddfSDavid du Colombier } 10547dd7cddfSDavid du Colombier 10557dd7cddfSDavid du Colombier /* 10563e12c5d1SDavid du Colombier * try to cast a constant down 10573e12c5d1SDavid du Colombier * rather than cast a variable up 10583e12c5d1SDavid du Colombier * example: 10593e12c5d1SDavid du Colombier * if(c == 'a') 10603e12c5d1SDavid du Colombier */ 10613e12c5d1SDavid du Colombier void 10623e12c5d1SDavid du Colombier relcon(Node *l, Node *r) 10633e12c5d1SDavid du Colombier { 1064219b2ee8SDavid du Colombier vlong v; 10653e12c5d1SDavid du Colombier 10663e12c5d1SDavid du Colombier if(l->op != OCONST) 10673e12c5d1SDavid du Colombier return; 10683e12c5d1SDavid du Colombier if(r->op != OCAST) 10693e12c5d1SDavid du Colombier return; 10703e12c5d1SDavid du Colombier if(!nilcast(r->left->type, r->type)) 10713e12c5d1SDavid du Colombier return; 10723e12c5d1SDavid du Colombier switch(r->type->etype) { 10733e12c5d1SDavid du Colombier default: 10743e12c5d1SDavid du Colombier return; 10753e12c5d1SDavid du Colombier case TCHAR: 10763e12c5d1SDavid du Colombier case TUCHAR: 10773e12c5d1SDavid du Colombier case TSHORT: 10783e12c5d1SDavid du Colombier case TUSHORT: 1079219b2ee8SDavid du Colombier v = convvtox(l->vconst, r->type->etype); 1080219b2ee8SDavid du Colombier if(v != l->vconst) 10813e12c5d1SDavid du Colombier return; 10823e12c5d1SDavid du Colombier break; 10833e12c5d1SDavid du Colombier } 10843e12c5d1SDavid du Colombier l->type = r->left->type; 10853e12c5d1SDavid du Colombier *r = *r->left; 10863e12c5d1SDavid du Colombier } 10873e12c5d1SDavid du Colombier 10883e12c5d1SDavid du Colombier int 10893e12c5d1SDavid du Colombier relindex(int o) 10903e12c5d1SDavid du Colombier { 10913e12c5d1SDavid du Colombier 10923e12c5d1SDavid du Colombier switch(o) { 10933e12c5d1SDavid du Colombier default: 10943e12c5d1SDavid du Colombier diag(Z, "bad in relindex: %O", o); 10953e12c5d1SDavid du Colombier case OEQ: return 0; 10963e12c5d1SDavid du Colombier case ONE: return 1; 10973e12c5d1SDavid du Colombier case OLE: return 2; 10983e12c5d1SDavid du Colombier case OLS: return 3; 10993e12c5d1SDavid du Colombier case OLT: return 4; 11003e12c5d1SDavid du Colombier case OLO: return 5; 11013e12c5d1SDavid du Colombier case OGE: return 6; 11023e12c5d1SDavid du Colombier case OHS: return 7; 11033e12c5d1SDavid du Colombier case OGT: return 8; 11043e12c5d1SDavid du Colombier case OHI: return 9; 11053e12c5d1SDavid du Colombier } 11063e12c5d1SDavid du Colombier } 11073e12c5d1SDavid du Colombier 11083e12c5d1SDavid du Colombier Node* 11093e12c5d1SDavid du Colombier invert(Node *n) 11103e12c5d1SDavid du Colombier { 11113e12c5d1SDavid du Colombier Node *i; 11123e12c5d1SDavid du Colombier 11133e12c5d1SDavid du Colombier if(n == Z || n->op != OLIST) 11143e12c5d1SDavid du Colombier return n; 11153e12c5d1SDavid du Colombier i = n; 11163e12c5d1SDavid du Colombier for(n = n->left; n != Z; n = n->left) { 11173e12c5d1SDavid du Colombier if(n->op != OLIST) 11183e12c5d1SDavid du Colombier break; 11193e12c5d1SDavid du Colombier i->left = n->right; 11203e12c5d1SDavid du Colombier n->right = i; 11213e12c5d1SDavid du Colombier i = n; 11223e12c5d1SDavid du Colombier } 11233e12c5d1SDavid du Colombier i->left = n; 11243e12c5d1SDavid du Colombier return i; 11253e12c5d1SDavid du Colombier } 11263e12c5d1SDavid du Colombier 11273e12c5d1SDavid du Colombier int 11283e12c5d1SDavid du Colombier bitno(long b) 11293e12c5d1SDavid du Colombier { 11303e12c5d1SDavid du Colombier int i; 11313e12c5d1SDavid du Colombier 11323e12c5d1SDavid du Colombier for(i=0; i<32; i++) 11333e12c5d1SDavid du Colombier if(b & (1L<<i)) 11343e12c5d1SDavid du Colombier return i; 11353e12c5d1SDavid du Colombier diag(Z, "bad in bitno"); 11363e12c5d1SDavid du Colombier return 0; 11373e12c5d1SDavid du Colombier } 11383e12c5d1SDavid du Colombier 11397dd7cddfSDavid du Colombier long 11407dd7cddfSDavid du Colombier typebitor(long a, long b) 11417dd7cddfSDavid du Colombier { 11427dd7cddfSDavid du Colombier long c; 11437dd7cddfSDavid du Colombier 11447dd7cddfSDavid du Colombier c = a | b; 11457dd7cddfSDavid du Colombier if(a & b) 11467dd7cddfSDavid du Colombier if((a & b) == BLONG) 11477dd7cddfSDavid du Colombier c |= BVLONG; /* long long => vlong */ 11487dd7cddfSDavid du Colombier else 11497dd7cddfSDavid du Colombier warn(Z, "once is enough: %Q", a & b); 11507dd7cddfSDavid du Colombier return c; 11517dd7cddfSDavid du Colombier } 11527dd7cddfSDavid du Colombier 11533e12c5d1SDavid du Colombier void 11547dd7cddfSDavid du Colombier diag(Node *n, char *fmt, ...) 11553e12c5d1SDavid du Colombier { 11563e12c5d1SDavid du Colombier char buf[STRINGSZ]; 11577dd7cddfSDavid du Colombier va_list arg; 11583e12c5d1SDavid du Colombier 11597dd7cddfSDavid du Colombier va_start(arg, fmt); 11609a747e4fSDavid du Colombier vseprint(buf, buf+sizeof(buf), fmt, arg); 11617dd7cddfSDavid du Colombier va_end(arg); 116218027f8cSDavid du Colombier Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf); 11633e12c5d1SDavid du Colombier 116418027f8cSDavid du Colombier if(debug['X']){ 116518027f8cSDavid du Colombier Bflush(&diagbuf); 11663e12c5d1SDavid du Colombier abort(); 116718027f8cSDavid du Colombier } 11683e12c5d1SDavid du Colombier if(n != Z) 11693e12c5d1SDavid du Colombier if(debug['v']) 11703e12c5d1SDavid du Colombier prtree(n, "diagnostic"); 11713e12c5d1SDavid du Colombier 11723e12c5d1SDavid du Colombier nerrors++; 11733e12c5d1SDavid du Colombier if(nerrors > 10) { 117418027f8cSDavid du Colombier Bprint(&diagbuf, "too many errors\n"); 11753e12c5d1SDavid du Colombier errorexit(); 11763e12c5d1SDavid du Colombier } 11773e12c5d1SDavid du Colombier } 11783e12c5d1SDavid du Colombier 11793e12c5d1SDavid du Colombier void 11807dd7cddfSDavid du Colombier warn(Node *n, char *fmt, ...) 11813e12c5d1SDavid du Colombier { 11823e12c5d1SDavid du Colombier char buf[STRINGSZ]; 11837dd7cddfSDavid du Colombier va_list arg; 11843e12c5d1SDavid du Colombier 11853e12c5d1SDavid du Colombier if(debug['w']) { 118618027f8cSDavid du Colombier Bprint(&diagbuf, "warning: "); 11877dd7cddfSDavid du Colombier va_start(arg, fmt); 11889a747e4fSDavid du Colombier vseprint(buf, buf+sizeof(buf), fmt, arg); 11897dd7cddfSDavid du Colombier va_end(arg); 119018027f8cSDavid du Colombier Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf); 11913e12c5d1SDavid du Colombier 11923e12c5d1SDavid du Colombier if(n != Z) 11933e12c5d1SDavid du Colombier if(debug['v']) 11943e12c5d1SDavid du Colombier prtree(n, "warning"); 11953e12c5d1SDavid du Colombier } 11963e12c5d1SDavid du Colombier } 11973e12c5d1SDavid du Colombier 11983e12c5d1SDavid du Colombier void 11997dd7cddfSDavid du Colombier yyerror(char *fmt, ...) 12003e12c5d1SDavid du Colombier { 12013e12c5d1SDavid du Colombier char buf[STRINGSZ]; 12027dd7cddfSDavid du Colombier va_list arg; 12033e12c5d1SDavid du Colombier 12043e12c5d1SDavid du Colombier /* 12053e12c5d1SDavid du Colombier * hack to intercept message from yaccpar 12063e12c5d1SDavid du Colombier */ 12077dd7cddfSDavid du Colombier if(strcmp(fmt, "syntax error") == 0) { 12083e12c5d1SDavid du Colombier yyerror("syntax error, last name: %s", symb); 12093e12c5d1SDavid du Colombier return; 12103e12c5d1SDavid du Colombier } 12117dd7cddfSDavid du Colombier va_start(arg, fmt); 12129a747e4fSDavid du Colombier vseprint(buf, buf+sizeof(buf), fmt, arg); 12137dd7cddfSDavid du Colombier va_end(arg); 121418027f8cSDavid du Colombier Bprint(&diagbuf, "%L %s\n", lineno, buf); 12153e12c5d1SDavid du Colombier nerrors++; 12163e12c5d1SDavid du Colombier if(nerrors > 10) { 121718027f8cSDavid du Colombier Bprint(&diagbuf, "too many errors\n"); 12183e12c5d1SDavid du Colombier errorexit(); 12193e12c5d1SDavid du Colombier } 12203e12c5d1SDavid du Colombier } 12213e12c5d1SDavid du Colombier 1222375daca8SDavid du Colombier void 1223375daca8SDavid du Colombier fatal(Node *n, char *fmt, ...) 1224375daca8SDavid du Colombier { 1225375daca8SDavid du Colombier char buf[STRINGSZ]; 1226375daca8SDavid du Colombier va_list arg; 1227375daca8SDavid du Colombier 1228375daca8SDavid du Colombier va_start(arg, fmt); 1229375daca8SDavid du Colombier vseprint(buf, buf+sizeof(buf), fmt, arg); 1230375daca8SDavid du Colombier va_end(arg); 123118027f8cSDavid du Colombier Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf); 1232375daca8SDavid du Colombier 123318027f8cSDavid du Colombier if(debug['X']){ 123418027f8cSDavid du Colombier Bflush(&diagbuf); 1235375daca8SDavid du Colombier abort(); 123618027f8cSDavid du Colombier } 1237375daca8SDavid du Colombier if(n != Z) 1238375daca8SDavid du Colombier if(debug['v']) 1239375daca8SDavid du Colombier prtree(n, "diagnostic"); 1240375daca8SDavid du Colombier 1241375daca8SDavid du Colombier nerrors++; 1242375daca8SDavid du Colombier errorexit(); 1243375daca8SDavid du Colombier } 1244375daca8SDavid du Colombier 12457dd7cddfSDavid du Colombier ulong thash1 = 0x2edab8c9; 12467dd7cddfSDavid du Colombier ulong thash2 = 0x1dc74fb8; 12477dd7cddfSDavid du Colombier ulong thash3 = 0x1f241331; 12487dd7cddfSDavid du Colombier ulong thash[NALLTYPES]; 12497dd7cddfSDavid du Colombier Init thashinit[] = 12503e12c5d1SDavid du Colombier { 12517dd7cddfSDavid du Colombier TXXX, 0x17527bbd, 0, 12527dd7cddfSDavid du Colombier TCHAR, 0x5cedd32b, 0, 12537dd7cddfSDavid du Colombier TUCHAR, 0x552c4454, 0, 12547dd7cddfSDavid du Colombier TSHORT, 0x63040b4b, 0, 12557dd7cddfSDavid du Colombier TUSHORT, 0x32a45878, 0, 12567dd7cddfSDavid du Colombier TINT, 0x4151d5bd, 0, 12577dd7cddfSDavid du Colombier TUINT, 0x5ae707d6, 0, 12587dd7cddfSDavid du Colombier TLONG, 0x5ef20f47, 0, 12597dd7cddfSDavid du Colombier TULONG, 0x36d8eb8f, 0, 12607dd7cddfSDavid du Colombier TVLONG, 0x6e5e9590, 0, 12617dd7cddfSDavid du Colombier TUVLONG, 0x75910105, 0, 12627dd7cddfSDavid du Colombier TFLOAT, 0x25fd7af1, 0, 12637dd7cddfSDavid du Colombier TDOUBLE, 0x7c40a1b2, 0, 12647dd7cddfSDavid du Colombier TIND, 0x1b832357, 0, 12657dd7cddfSDavid du Colombier TFUNC, 0x6babc9cb, 0, 12667dd7cddfSDavid du Colombier TARRAY, 0x7c50986d, 0, 12677dd7cddfSDavid du Colombier TVOID, 0x44112eff, 0, 12687dd7cddfSDavid du Colombier TSTRUCT, 0x7c2da3bf, 0, 12697dd7cddfSDavid du Colombier TUNION, 0x3eb25e98, 0, 12707dd7cddfSDavid du Colombier TENUM, 0x44b54f61, 0, 12717dd7cddfSDavid du Colombier TFILE, 0x19242ac3, 0, 12727dd7cddfSDavid du Colombier TOLD, 0x22b15988, 0, 12737dd7cddfSDavid du Colombier TDOT, 0x0204f6b3, 0, 12747dd7cddfSDavid du Colombier -1, 0, 0, 12753e12c5d1SDavid du Colombier }; 12767dd7cddfSDavid du Colombier 12777dd7cddfSDavid du Colombier char* bnames[NALIGN]; 12787dd7cddfSDavid du Colombier Init bnamesinit[] = 12793e12c5d1SDavid du Colombier { 12807dd7cddfSDavid du Colombier Axxx, 0, "Axxx", 12817dd7cddfSDavid du Colombier Ael1, 0, "el1", 12827dd7cddfSDavid du Colombier Ael2, 0, "el2", 12837dd7cddfSDavid du Colombier Asu2, 0, "su2", 12847dd7cddfSDavid du Colombier Aarg0, 0, "arg0", 12857dd7cddfSDavid du Colombier Aarg1, 0, "arg1", 12867dd7cddfSDavid du Colombier Aarg2, 0, "arg2", 12877dd7cddfSDavid du Colombier Aaut3, 0, "aut3", 12887dd7cddfSDavid du Colombier -1, 0, 0, 12893e12c5d1SDavid du Colombier }; 12907dd7cddfSDavid du Colombier 12917dd7cddfSDavid du Colombier char* tnames[NALLTYPES]; 12927dd7cddfSDavid du Colombier Init tnamesinit[] = 12933e12c5d1SDavid du Colombier { 12947dd7cddfSDavid du Colombier TXXX, 0, "TXXX", 12957dd7cddfSDavid du Colombier TCHAR, 0, "CHAR", 12967dd7cddfSDavid du Colombier TUCHAR, 0, "UCHAR", 12977dd7cddfSDavid du Colombier TSHORT, 0, "SHORT", 12987dd7cddfSDavid du Colombier TUSHORT, 0, "USHORT", 12997dd7cddfSDavid du Colombier TINT, 0, "INT", 13007dd7cddfSDavid du Colombier TUINT, 0, "UINT", 13017dd7cddfSDavid du Colombier TLONG, 0, "LONG", 13027dd7cddfSDavid du Colombier TULONG, 0, "ULONG", 13037dd7cddfSDavid du Colombier TVLONG, 0, "VLONG", 13047dd7cddfSDavid du Colombier TUVLONG, 0, "UVLONG", 13057dd7cddfSDavid du Colombier TFLOAT, 0, "FLOAT", 13067dd7cddfSDavid du Colombier TDOUBLE, 0, "DOUBLE", 13077dd7cddfSDavid du Colombier TIND, 0, "IND", 13087dd7cddfSDavid du Colombier TFUNC, 0, "FUNC", 13097dd7cddfSDavid du Colombier TARRAY, 0, "ARRAY", 13107dd7cddfSDavid du Colombier TVOID, 0, "VOID", 13117dd7cddfSDavid du Colombier TSTRUCT, 0, "STRUCT", 13127dd7cddfSDavid du Colombier TUNION, 0, "UNION", 13137dd7cddfSDavid du Colombier TENUM, 0, "ENUM", 13147dd7cddfSDavid du Colombier TFILE, 0, "FILE", 13157dd7cddfSDavid du Colombier TOLD, 0, "OLD", 13167dd7cddfSDavid du Colombier TDOT, 0, "DOT", 13177dd7cddfSDavid du Colombier -1, 0, 0, 13183e12c5d1SDavid du Colombier }; 13197dd7cddfSDavid du Colombier 13207dd7cddfSDavid du Colombier char* gnames[NGTYPES]; 13217dd7cddfSDavid du Colombier Init gnamesinit[] = 13223e12c5d1SDavid du Colombier { 13237dd7cddfSDavid du Colombier GXXX, 0, "GXXX", 13247dd7cddfSDavid du Colombier GCONSTNT, 0, "CONST", 13257dd7cddfSDavid du Colombier GVOLATILE, 0, "VOLATILE", 13267dd7cddfSDavid du Colombier GVOLATILE|GCONSTNT, 0, "CONST-VOLATILE", 13277dd7cddfSDavid du Colombier -1, 0, 0, 13287dd7cddfSDavid du Colombier }; 13297dd7cddfSDavid du Colombier 13307dd7cddfSDavid du Colombier char* qnames[NALLTYPES]; 13317dd7cddfSDavid du Colombier Init qnamesinit[] = 13327dd7cddfSDavid du Colombier { 13337dd7cddfSDavid du Colombier TXXX, 0, "TXXX", 13347dd7cddfSDavid du Colombier TCHAR, 0, "CHAR", 13357dd7cddfSDavid du Colombier TUCHAR, 0, "UCHAR", 13367dd7cddfSDavid du Colombier TSHORT, 0, "SHORT", 13377dd7cddfSDavid du Colombier TUSHORT, 0, "USHORT", 13387dd7cddfSDavid du Colombier TINT, 0, "INT", 13397dd7cddfSDavid du Colombier TUINT, 0, "UINT", 13407dd7cddfSDavid du Colombier TLONG, 0, "LONG", 13417dd7cddfSDavid du Colombier TULONG, 0, "ULONG", 13427dd7cddfSDavid du Colombier TVLONG, 0, "VLONG", 13437dd7cddfSDavid du Colombier TUVLONG, 0, "UVLONG", 13447dd7cddfSDavid du Colombier TFLOAT, 0, "FLOAT", 13457dd7cddfSDavid du Colombier TDOUBLE, 0, "DOUBLE", 13467dd7cddfSDavid du Colombier TIND, 0, "IND", 13477dd7cddfSDavid du Colombier TFUNC, 0, "FUNC", 13487dd7cddfSDavid du Colombier TARRAY, 0, "ARRAY", 13497dd7cddfSDavid du Colombier TVOID, 0, "VOID", 13507dd7cddfSDavid du Colombier TSTRUCT, 0, "STRUCT", 13517dd7cddfSDavid du Colombier TUNION, 0, "UNION", 13527dd7cddfSDavid du Colombier TENUM, 0, "ENUM", 13537dd7cddfSDavid du Colombier 13547dd7cddfSDavid du Colombier TAUTO, 0, "AUTO", 13557dd7cddfSDavid du Colombier TEXTERN, 0, "EXTERN", 13567dd7cddfSDavid du Colombier TSTATIC, 0, "STATIC", 13577dd7cddfSDavid du Colombier TTYPEDEF, 0, "TYPEDEF", 135880ee5cbfSDavid du Colombier TTYPESTR, 0, "TYPESTR", 13597dd7cddfSDavid du Colombier TREGISTER, 0, "REGISTER", 13607dd7cddfSDavid du Colombier TCONSTNT, 0, "CONSTNT", 13617dd7cddfSDavid du Colombier TVOLATILE, 0, "VOLATILE", 13627dd7cddfSDavid du Colombier TUNSIGNED, 0, "UNSIGNED", 13637dd7cddfSDavid du Colombier TSIGNED, 0, "SIGNED", 13647dd7cddfSDavid du Colombier TDOT, 0, "DOT", 13657dd7cddfSDavid du Colombier TFILE, 0, "FILE", 13667dd7cddfSDavid du Colombier TOLD, 0, "OLD", 13677dd7cddfSDavid du Colombier -1, 0, 0, 13687dd7cddfSDavid du Colombier }; 13697dd7cddfSDavid du Colombier char* cnames[NCTYPES]; 13707dd7cddfSDavid du Colombier Init cnamesinit[] = 13717dd7cddfSDavid du Colombier { 13727dd7cddfSDavid du Colombier CXXX, 0, "CXXX", 13737dd7cddfSDavid du Colombier CAUTO, 0, "AUTO", 13747dd7cddfSDavid du Colombier CEXTERN, 0, "EXTERN", 13757dd7cddfSDavid du Colombier CGLOBL, 0, "GLOBL", 13767dd7cddfSDavid du Colombier CSTATIC, 0, "STATIC", 13777dd7cddfSDavid du Colombier CLOCAL, 0, "LOCAL", 13787dd7cddfSDavid du Colombier CTYPEDEF, 0, "TYPEDEF", 137980ee5cbfSDavid du Colombier CTYPESTR, 0, "TYPESTR", 13807dd7cddfSDavid du Colombier CPARAM, 0, "PARAM", 13817dd7cddfSDavid du Colombier CSELEM, 0, "SELEM", 13827dd7cddfSDavid du Colombier CLABEL, 0, "LABEL", 13837dd7cddfSDavid du Colombier CEXREG, 0, "EXREG", 13847dd7cddfSDavid du Colombier -1, 0, 0, 13857dd7cddfSDavid du Colombier }; 13867dd7cddfSDavid du Colombier 13877dd7cddfSDavid du Colombier char* onames[OEND+1]; 13887dd7cddfSDavid du Colombier Init onamesinit[] = 13897dd7cddfSDavid du Colombier { 13907dd7cddfSDavid du Colombier OXXX, 0, "OXXX", 13917dd7cddfSDavid du Colombier OADD, 0, "ADD", 13927dd7cddfSDavid du Colombier OADDR, 0, "ADDR", 13937dd7cddfSDavid du Colombier OAND, 0, "AND", 13947dd7cddfSDavid du Colombier OANDAND, 0, "ANDAND", 13957dd7cddfSDavid du Colombier OARRAY, 0, "ARRAY", 13967dd7cddfSDavid du Colombier OAS, 0, "AS", 13977dd7cddfSDavid du Colombier OASI, 0, "ASI", 13987dd7cddfSDavid du Colombier OASADD, 0, "ASADD", 13997dd7cddfSDavid du Colombier OASAND, 0, "ASAND", 14007dd7cddfSDavid du Colombier OASASHL, 0, "ASASHL", 14017dd7cddfSDavid du Colombier OASASHR, 0, "ASASHR", 14027dd7cddfSDavid du Colombier OASDIV, 0, "ASDIV", 14037dd7cddfSDavid du Colombier OASHL, 0, "ASHL", 14047dd7cddfSDavid du Colombier OASHR, 0, "ASHR", 14057dd7cddfSDavid du Colombier OASLDIV, 0, "ASLDIV", 14067dd7cddfSDavid du Colombier OASLMOD, 0, "ASLMOD", 14077dd7cddfSDavid du Colombier OASLMUL, 0, "ASLMUL", 14087dd7cddfSDavid du Colombier OASLSHR, 0, "ASLSHR", 14097dd7cddfSDavid du Colombier OASMOD, 0, "ASMOD", 14107dd7cddfSDavid du Colombier OASMUL, 0, "ASMUL", 14117dd7cddfSDavid du Colombier OASOR, 0, "ASOR", 14127dd7cddfSDavid du Colombier OASSUB, 0, "ASSUB", 14137dd7cddfSDavid du Colombier OASXOR, 0, "ASXOR", 14147dd7cddfSDavid du Colombier OBIT, 0, "BIT", 14157dd7cddfSDavid du Colombier OBREAK, 0, "BREAK", 14167dd7cddfSDavid du Colombier OCASE, 0, "CASE", 14177dd7cddfSDavid du Colombier OCAST, 0, "CAST", 14187dd7cddfSDavid du Colombier OCOMMA, 0, "COMMA", 14197dd7cddfSDavid du Colombier OCOND, 0, "COND", 14207dd7cddfSDavid du Colombier OCONST, 0, "CONST", 14217dd7cddfSDavid du Colombier OCONTINUE, 0, "CONTINUE", 14227dd7cddfSDavid du Colombier ODIV, 0, "DIV", 14237dd7cddfSDavid du Colombier ODOT, 0, "DOT", 14247dd7cddfSDavid du Colombier ODOTDOT, 0, "DOTDOT", 14257dd7cddfSDavid du Colombier ODWHILE, 0, "DWHILE", 14267dd7cddfSDavid du Colombier OENUM, 0, "ENUM", 14277dd7cddfSDavid du Colombier OEQ, 0, "EQ", 14287dd7cddfSDavid du Colombier OFOR, 0, "FOR", 14297dd7cddfSDavid du Colombier OFUNC, 0, "FUNC", 14307dd7cddfSDavid du Colombier OGE, 0, "GE", 14317dd7cddfSDavid du Colombier OGOTO, 0, "GOTO", 14327dd7cddfSDavid du Colombier OGT, 0, "GT", 14337dd7cddfSDavid du Colombier OHI, 0, "HI", 14347dd7cddfSDavid du Colombier OHS, 0, "HS", 14357dd7cddfSDavid du Colombier OIF, 0, "IF", 14367dd7cddfSDavid du Colombier OIND, 0, "IND", 14377dd7cddfSDavid du Colombier OINDREG, 0, "INDREG", 14387dd7cddfSDavid du Colombier OINIT, 0, "INIT", 14397dd7cddfSDavid du Colombier OLABEL, 0, "LABEL", 14407dd7cddfSDavid du Colombier OLDIV, 0, "LDIV", 14417dd7cddfSDavid du Colombier OLE, 0, "LE", 14427dd7cddfSDavid du Colombier OLIST, 0, "LIST", 14437dd7cddfSDavid du Colombier OLMOD, 0, "LMOD", 14447dd7cddfSDavid du Colombier OLMUL, 0, "LMUL", 14457dd7cddfSDavid du Colombier OLO, 0, "LO", 14467dd7cddfSDavid du Colombier OLS, 0, "LS", 14477dd7cddfSDavid du Colombier OLSHR, 0, "LSHR", 14487dd7cddfSDavid du Colombier OLT, 0, "LT", 14497dd7cddfSDavid du Colombier OMOD, 0, "MOD", 14507dd7cddfSDavid du Colombier OMUL, 0, "MUL", 14517dd7cddfSDavid du Colombier ONAME, 0, "NAME", 14527dd7cddfSDavid du Colombier ONE, 0, "NE", 14537dd7cddfSDavid du Colombier ONOT, 0, "NOT", 14547dd7cddfSDavid du Colombier OOR, 0, "OR", 14557dd7cddfSDavid du Colombier OOROR, 0, "OROR", 14567dd7cddfSDavid du Colombier OPOSTDEC, 0, "POSTDEC", 14577dd7cddfSDavid du Colombier OPOSTINC, 0, "POSTINC", 14587dd7cddfSDavid du Colombier OPREDEC, 0, "PREDEC", 14597dd7cddfSDavid du Colombier OPREINC, 0, "PREINC", 14607dd7cddfSDavid du Colombier OPROTO, 0, "PROTO", 14617dd7cddfSDavid du Colombier OREGISTER, 0, "REGISTER", 14627dd7cddfSDavid du Colombier ORETURN, 0, "RETURN", 14637dd7cddfSDavid du Colombier OSET, 0, "SET", 14647dd7cddfSDavid du Colombier OSIGN, 0, "SIGN", 14657dd7cddfSDavid du Colombier OSIZE, 0, "SIZE", 14667dd7cddfSDavid du Colombier OSTRING, 0, "STRING", 14677dd7cddfSDavid du Colombier OLSTRING, 0, "LSTRING", 14687dd7cddfSDavid du Colombier OSTRUCT, 0, "STRUCT", 14697dd7cddfSDavid du Colombier OSUB, 0, "SUB", 14707dd7cddfSDavid du Colombier OSWITCH, 0, "SWITCH", 14717dd7cddfSDavid du Colombier OUNION, 0, "UNION", 14727dd7cddfSDavid du Colombier OUSED, 0, "USED", 14737dd7cddfSDavid du Colombier OWHILE, 0, "WHILE", 14747dd7cddfSDavid du Colombier OXOR, 0, "XOR", 147580ee5cbfSDavid du Colombier OPOS, 0, "POS", 14767dd7cddfSDavid du Colombier ONEG, 0, "NEG", 14777dd7cddfSDavid du Colombier OCOM, 0, "COM", 14787dd7cddfSDavid du Colombier OELEM, 0, "ELEM", 14797dd7cddfSDavid du Colombier OTST, 0, "TST", 14807dd7cddfSDavid du Colombier OINDEX, 0, "INDEX", 14817dd7cddfSDavid du Colombier OFAS, 0, "FAS", 1482da51d93aSDavid du Colombier OREGPAIR, 0, "REGPAIR", 14837dd7cddfSDavid du Colombier OEND, 0, "END", 14847dd7cddfSDavid du Colombier -1, 0, 0, 14853e12c5d1SDavid du Colombier }; 14863e12c5d1SDavid du Colombier 148722a127bbSDavid du Colombier /* OEQ, ONE, OLE, OLS, OLT, OLO, OGE, OHS, OGT, OHI */ 14883e12c5d1SDavid du Colombier char comrel[12] = 14893e12c5d1SDavid du Colombier { 14903e12c5d1SDavid du Colombier ONE, OEQ, OGT, OHI, OGE, OHS, OLT, OLO, OLE, OLS, 14913e12c5d1SDavid du Colombier }; 14923e12c5d1SDavid du Colombier char invrel[12] = 14933e12c5d1SDavid du Colombier { 14943e12c5d1SDavid du Colombier OEQ, ONE, OGE, OHS, OGT, OHI, OLE, OLS, OLT, OLO, 14953e12c5d1SDavid du Colombier }; 14963e12c5d1SDavid du Colombier char logrel[12] = 14973e12c5d1SDavid du Colombier { 14983e12c5d1SDavid du Colombier OEQ, ONE, OLS, OLS, OLO, OLO, OHS, OHS, OHI, OHI, 14993e12c5d1SDavid du Colombier }; 15003e12c5d1SDavid du Colombier 15017dd7cddfSDavid du Colombier char typei[NTYPE]; 15027dd7cddfSDavid du Colombier int typeiinit[] = 15037dd7cddfSDavid du Colombier { 15047dd7cddfSDavid du Colombier TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TVLONG, TUVLONG, -1, 15057dd7cddfSDavid du Colombier }; 15067dd7cddfSDavid du Colombier char typeu[NTYPE]; 15077dd7cddfSDavid du Colombier int typeuinit[] = 15087dd7cddfSDavid du Colombier { 15097dd7cddfSDavid du Colombier TUCHAR, TUSHORT, TUINT, TULONG, TUVLONG, TIND, -1, 15107dd7cddfSDavid du Colombier }; 1511219b2ee8SDavid du Colombier 15127dd7cddfSDavid du Colombier char typesuv[NTYPE]; 15137dd7cddfSDavid du Colombier int typesuvinit[] = 15147dd7cddfSDavid du Colombier { 15157dd7cddfSDavid du Colombier TVLONG, TUVLONG, TSTRUCT, TUNION, -1, 15167dd7cddfSDavid du Colombier }; 15173e12c5d1SDavid du Colombier 15187dd7cddfSDavid du Colombier char typeilp[NTYPE]; 15197dd7cddfSDavid du Colombier int typeilpinit[] = 15207dd7cddfSDavid du Colombier { 15217dd7cddfSDavid du Colombier TINT, TUINT, TLONG, TULONG, TIND, -1 15227dd7cddfSDavid du Colombier }; 1523219b2ee8SDavid du Colombier 15247dd7cddfSDavid du Colombier char typechl[NTYPE]; 1525da51d93aSDavid du Colombier char typechlv[NTYPE]; 152622a127bbSDavid du Colombier char typechlvp[NTYPE]; 15277dd7cddfSDavid du Colombier int typechlinit[] = 15283e12c5d1SDavid du Colombier { 15297dd7cddfSDavid du Colombier TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, -1, 15303e12c5d1SDavid du Colombier }; 15317dd7cddfSDavid du Colombier 15327dd7cddfSDavid du Colombier char typechlp[NTYPE]; 15337dd7cddfSDavid du Colombier int typechlpinit[] = 15343e12c5d1SDavid du Colombier { 15357dd7cddfSDavid du Colombier TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TIND, -1, 15363e12c5d1SDavid du Colombier }; 15377dd7cddfSDavid du Colombier 15387dd7cddfSDavid du Colombier char typechlpfd[NTYPE]; 15397dd7cddfSDavid du Colombier int typechlpfdinit[] = 15403e12c5d1SDavid du Colombier { 15417dd7cddfSDavid du Colombier TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TFLOAT, TDOUBLE, TIND, -1, 15423e12c5d1SDavid du Colombier }; 15437dd7cddfSDavid du Colombier 15447dd7cddfSDavid du Colombier char typec[NTYPE]; 15457dd7cddfSDavid du Colombier int typecinit[] = 15463e12c5d1SDavid du Colombier { 15477dd7cddfSDavid du Colombier TCHAR, TUCHAR, -1 15483e12c5d1SDavid du Colombier }; 15497dd7cddfSDavid du Colombier 15507dd7cddfSDavid du Colombier char typeh[NTYPE]; 15517dd7cddfSDavid du Colombier int typehinit[] = 15523e12c5d1SDavid du Colombier { 15537dd7cddfSDavid du Colombier TSHORT, TUSHORT, -1, 15543e12c5d1SDavid du Colombier }; 15557dd7cddfSDavid du Colombier 15567dd7cddfSDavid du Colombier char typeil[NTYPE]; 15577dd7cddfSDavid du Colombier int typeilinit[] = 15583e12c5d1SDavid du Colombier { 15597dd7cddfSDavid du Colombier TINT, TUINT, TLONG, TULONG, -1, 15603e12c5d1SDavid du Colombier }; 15617dd7cddfSDavid du Colombier 15627dd7cddfSDavid du Colombier char typev[NTYPE]; 15637dd7cddfSDavid du Colombier int typevinit[] = 15643e12c5d1SDavid du Colombier { 15657dd7cddfSDavid du Colombier TVLONG, TUVLONG, -1, 15663e12c5d1SDavid du Colombier }; 15677dd7cddfSDavid du Colombier 15687dd7cddfSDavid du Colombier char typefd[NTYPE]; 15697dd7cddfSDavid du Colombier int typefdinit[] = 15703e12c5d1SDavid du Colombier { 15717dd7cddfSDavid du Colombier TFLOAT, TDOUBLE, -1, 15723e12c5d1SDavid du Colombier }; 15737dd7cddfSDavid du Colombier 15747dd7cddfSDavid du Colombier char typeaf[NTYPE]; 15757dd7cddfSDavid du Colombier int typeafinit[] = 15763e12c5d1SDavid du Colombier { 15777dd7cddfSDavid du Colombier TFUNC, TARRAY, -1, 15783e12c5d1SDavid du Colombier }; 15797dd7cddfSDavid du Colombier 15807dd7cddfSDavid du Colombier char typesu[NTYPE]; 15817dd7cddfSDavid du Colombier int typesuinit[] = 15827dd7cddfSDavid du Colombier { 15837dd7cddfSDavid du Colombier TSTRUCT, TUNION, -1, 15847dd7cddfSDavid du Colombier }; 15857dd7cddfSDavid du Colombier 15867dd7cddfSDavid du Colombier long tasign[NTYPE]; 15877dd7cddfSDavid du Colombier Init tasigninit[] = 15887dd7cddfSDavid du Colombier { 15897dd7cddfSDavid du Colombier TCHAR, BNUMBER, 0, 15907dd7cddfSDavid du Colombier TUCHAR, BNUMBER, 0, 15917dd7cddfSDavid du Colombier TSHORT, BNUMBER, 0, 15927dd7cddfSDavid du Colombier TUSHORT, BNUMBER, 0, 15937dd7cddfSDavid du Colombier TINT, BNUMBER, 0, 15947dd7cddfSDavid du Colombier TUINT, BNUMBER, 0, 15957dd7cddfSDavid du Colombier TLONG, BNUMBER, 0, 15967dd7cddfSDavid du Colombier TULONG, BNUMBER, 0, 15977dd7cddfSDavid du Colombier TVLONG, BNUMBER, 0, 15987dd7cddfSDavid du Colombier TUVLONG, BNUMBER, 0, 15997dd7cddfSDavid du Colombier TFLOAT, BNUMBER, 0, 16007dd7cddfSDavid du Colombier TDOUBLE, BNUMBER, 0, 16017dd7cddfSDavid du Colombier TIND, BIND, 0, 16027dd7cddfSDavid du Colombier TSTRUCT, BSTRUCT, 0, 16037dd7cddfSDavid du Colombier TUNION, BUNION, 0, 16047dd7cddfSDavid du Colombier -1, 0, 0, 16057dd7cddfSDavid du Colombier }; 16067dd7cddfSDavid du Colombier 16077dd7cddfSDavid du Colombier long tasadd[NTYPE]; 16087dd7cddfSDavid du Colombier Init tasaddinit[] = 16097dd7cddfSDavid du Colombier { 16107dd7cddfSDavid du Colombier TCHAR, BNUMBER, 0, 16117dd7cddfSDavid du Colombier TUCHAR, BNUMBER, 0, 16127dd7cddfSDavid du Colombier TSHORT, BNUMBER, 0, 16137dd7cddfSDavid du Colombier TUSHORT, BNUMBER, 0, 16147dd7cddfSDavid du Colombier TINT, BNUMBER, 0, 16157dd7cddfSDavid du Colombier TUINT, BNUMBER, 0, 16167dd7cddfSDavid du Colombier TLONG, BNUMBER, 0, 16177dd7cddfSDavid du Colombier TULONG, BNUMBER, 0, 16187dd7cddfSDavid du Colombier TVLONG, BNUMBER, 0, 16197dd7cddfSDavid du Colombier TUVLONG, BNUMBER, 0, 16207dd7cddfSDavid du Colombier TFLOAT, BNUMBER, 0, 16217dd7cddfSDavid du Colombier TDOUBLE, BNUMBER, 0, 16227dd7cddfSDavid du Colombier TIND, BINTEGER, 0, 16237dd7cddfSDavid du Colombier -1, 0, 0, 16247dd7cddfSDavid du Colombier }; 16257dd7cddfSDavid du Colombier 16267dd7cddfSDavid du Colombier long tcast[NTYPE]; 16277dd7cddfSDavid du Colombier Init tcastinit[] = 16287dd7cddfSDavid du Colombier { 16297dd7cddfSDavid du Colombier TCHAR, BNUMBER|BIND|BVOID, 0, 16307dd7cddfSDavid du Colombier TUCHAR, BNUMBER|BIND|BVOID, 0, 16317dd7cddfSDavid du Colombier TSHORT, BNUMBER|BIND|BVOID, 0, 16327dd7cddfSDavid du Colombier TUSHORT, BNUMBER|BIND|BVOID, 0, 16337dd7cddfSDavid du Colombier TINT, BNUMBER|BIND|BVOID, 0, 16347dd7cddfSDavid du Colombier TUINT, BNUMBER|BIND|BVOID, 0, 16357dd7cddfSDavid du Colombier TLONG, BNUMBER|BIND|BVOID, 0, 16367dd7cddfSDavid du Colombier TULONG, BNUMBER|BIND|BVOID, 0, 16377dd7cddfSDavid du Colombier TVLONG, BNUMBER|BIND|BVOID, 0, 16387dd7cddfSDavid du Colombier TUVLONG, BNUMBER|BIND|BVOID, 0, 16397dd7cddfSDavid du Colombier TFLOAT, BNUMBER|BVOID, 0, 16407dd7cddfSDavid du Colombier TDOUBLE, BNUMBER|BVOID, 0, 16417dd7cddfSDavid du Colombier TIND, BINTEGER|BIND|BVOID, 0, 16427dd7cddfSDavid du Colombier TVOID, BVOID, 0, 16437dd7cddfSDavid du Colombier TSTRUCT, BSTRUCT|BVOID, 0, 16447dd7cddfSDavid du Colombier TUNION, BUNION|BVOID, 0, 16457dd7cddfSDavid du Colombier -1, 0, 0, 16467dd7cddfSDavid du Colombier }; 16477dd7cddfSDavid du Colombier 16487dd7cddfSDavid du Colombier long tadd[NTYPE]; 16497dd7cddfSDavid du Colombier Init taddinit[] = 16507dd7cddfSDavid du Colombier { 16517dd7cddfSDavid du Colombier TCHAR, BNUMBER|BIND, 0, 16527dd7cddfSDavid du Colombier TUCHAR, BNUMBER|BIND, 0, 16537dd7cddfSDavid du Colombier TSHORT, BNUMBER|BIND, 0, 16547dd7cddfSDavid du Colombier TUSHORT, BNUMBER|BIND, 0, 16557dd7cddfSDavid du Colombier TINT, BNUMBER|BIND, 0, 16567dd7cddfSDavid du Colombier TUINT, BNUMBER|BIND, 0, 16577dd7cddfSDavid du Colombier TLONG, BNUMBER|BIND, 0, 16587dd7cddfSDavid du Colombier TULONG, BNUMBER|BIND, 0, 16597dd7cddfSDavid du Colombier TVLONG, BNUMBER|BIND, 0, 16607dd7cddfSDavid du Colombier TUVLONG, BNUMBER|BIND, 0, 16617dd7cddfSDavid du Colombier TFLOAT, BNUMBER, 0, 16627dd7cddfSDavid du Colombier TDOUBLE, BNUMBER, 0, 16637dd7cddfSDavid du Colombier TIND, BINTEGER, 0, 16647dd7cddfSDavid du Colombier -1, 0, 0, 16657dd7cddfSDavid du Colombier }; 16667dd7cddfSDavid du Colombier 16677dd7cddfSDavid du Colombier long tsub[NTYPE]; 16687dd7cddfSDavid du Colombier Init tsubinit[] = 16697dd7cddfSDavid du Colombier { 16707dd7cddfSDavid du Colombier TCHAR, BNUMBER, 0, 16717dd7cddfSDavid du Colombier TUCHAR, BNUMBER, 0, 16727dd7cddfSDavid du Colombier TSHORT, BNUMBER, 0, 16737dd7cddfSDavid du Colombier TUSHORT, BNUMBER, 0, 16747dd7cddfSDavid du Colombier TINT, BNUMBER, 0, 16757dd7cddfSDavid du Colombier TUINT, BNUMBER, 0, 16767dd7cddfSDavid du Colombier TLONG, BNUMBER, 0, 16777dd7cddfSDavid du Colombier TULONG, BNUMBER, 0, 16787dd7cddfSDavid du Colombier TVLONG, BNUMBER, 0, 16797dd7cddfSDavid du Colombier TUVLONG, BNUMBER, 0, 16807dd7cddfSDavid du Colombier TFLOAT, BNUMBER, 0, 16817dd7cddfSDavid du Colombier TDOUBLE, BNUMBER, 0, 16827dd7cddfSDavid du Colombier TIND, BINTEGER|BIND, 0, 16837dd7cddfSDavid du Colombier -1, 0, 0, 16847dd7cddfSDavid du Colombier }; 16857dd7cddfSDavid du Colombier 16867dd7cddfSDavid du Colombier long tmul[NTYPE]; 16877dd7cddfSDavid du Colombier Init tmulinit[] = 16887dd7cddfSDavid du Colombier { 16897dd7cddfSDavid du Colombier TCHAR, BNUMBER, 0, 16907dd7cddfSDavid du Colombier TUCHAR, BNUMBER, 0, 16917dd7cddfSDavid du Colombier TSHORT, BNUMBER, 0, 16927dd7cddfSDavid du Colombier TUSHORT, BNUMBER, 0, 16937dd7cddfSDavid du Colombier TINT, BNUMBER, 0, 16947dd7cddfSDavid du Colombier TUINT, BNUMBER, 0, 16957dd7cddfSDavid du Colombier TLONG, BNUMBER, 0, 16967dd7cddfSDavid du Colombier TULONG, BNUMBER, 0, 16977dd7cddfSDavid du Colombier TVLONG, BNUMBER, 0, 16987dd7cddfSDavid du Colombier TUVLONG, BNUMBER, 0, 16997dd7cddfSDavid du Colombier TFLOAT, BNUMBER, 0, 17007dd7cddfSDavid du Colombier TDOUBLE, BNUMBER, 0, 17017dd7cddfSDavid du Colombier -1, 0, 0, 17027dd7cddfSDavid du Colombier }; 17037dd7cddfSDavid du Colombier 17047dd7cddfSDavid du Colombier long tand[NTYPE]; 17057dd7cddfSDavid du Colombier Init tandinit[] = 17067dd7cddfSDavid du Colombier { 17077dd7cddfSDavid du Colombier TCHAR, BINTEGER, 0, 17087dd7cddfSDavid du Colombier TUCHAR, BINTEGER, 0, 17097dd7cddfSDavid du Colombier TSHORT, BINTEGER, 0, 17107dd7cddfSDavid du Colombier TUSHORT, BINTEGER, 0, 17117dd7cddfSDavid du Colombier TINT, BNUMBER, 0, 17127dd7cddfSDavid du Colombier TUINT, BNUMBER, 0, 17137dd7cddfSDavid du Colombier TLONG, BINTEGER, 0, 17147dd7cddfSDavid du Colombier TULONG, BINTEGER, 0, 17157dd7cddfSDavid du Colombier TVLONG, BINTEGER, 0, 17167dd7cddfSDavid du Colombier TUVLONG, BINTEGER, 0, 17177dd7cddfSDavid du Colombier -1, 0, 0, 17187dd7cddfSDavid du Colombier }; 17197dd7cddfSDavid du Colombier 17207dd7cddfSDavid du Colombier long trel[NTYPE]; 17217dd7cddfSDavid du Colombier Init trelinit[] = 17227dd7cddfSDavid du Colombier { 17237dd7cddfSDavid du Colombier TCHAR, BNUMBER, 0, 17247dd7cddfSDavid du Colombier TUCHAR, BNUMBER, 0, 17257dd7cddfSDavid du Colombier TSHORT, BNUMBER, 0, 17267dd7cddfSDavid du Colombier TUSHORT, BNUMBER, 0, 17277dd7cddfSDavid du Colombier TINT, BNUMBER, 0, 17287dd7cddfSDavid du Colombier TUINT, BNUMBER, 0, 17297dd7cddfSDavid du Colombier TLONG, BNUMBER, 0, 17307dd7cddfSDavid du Colombier TULONG, BNUMBER, 0, 17317dd7cddfSDavid du Colombier TVLONG, BNUMBER, 0, 17327dd7cddfSDavid du Colombier TUVLONG, BNUMBER, 0, 17337dd7cddfSDavid du Colombier TFLOAT, BNUMBER, 0, 17347dd7cddfSDavid du Colombier TDOUBLE, BNUMBER, 0, 17357dd7cddfSDavid du Colombier TIND, BIND, 0, 17367dd7cddfSDavid du Colombier -1, 0, 0, 17377dd7cddfSDavid du Colombier }; 17387dd7cddfSDavid du Colombier 17393e12c5d1SDavid du Colombier long tfunct[1] = 17403e12c5d1SDavid du Colombier { 17417dd7cddfSDavid du Colombier BFUNC, 17423e12c5d1SDavid du Colombier }; 17437dd7cddfSDavid du Colombier 17443e12c5d1SDavid du Colombier long tindir[1] = 17453e12c5d1SDavid du Colombier { 17467dd7cddfSDavid du Colombier BIND, 17473e12c5d1SDavid du Colombier }; 17487dd7cddfSDavid du Colombier 17493e12c5d1SDavid du Colombier long tdot[1] = 17503e12c5d1SDavid du Colombier { 17517dd7cddfSDavid du Colombier BSTRUCT|BUNION, 17523e12c5d1SDavid du Colombier }; 17537dd7cddfSDavid du Colombier 17543e12c5d1SDavid du Colombier long tnot[1] = 17553e12c5d1SDavid du Colombier { 17567dd7cddfSDavid du Colombier BNUMBER|BIND, 17573e12c5d1SDavid du Colombier }; 17587dd7cddfSDavid du Colombier 17593e12c5d1SDavid du Colombier long targ[1] = 17603e12c5d1SDavid du Colombier { 17617dd7cddfSDavid du Colombier BNUMBER|BIND|BSTRUCT|BUNION, 17623e12c5d1SDavid du Colombier }; 17633e12c5d1SDavid du Colombier 17643e12c5d1SDavid du Colombier char tab[NTYPE][NTYPE] = 17653e12c5d1SDavid du Colombier { 17667dd7cddfSDavid du Colombier /*TXXX*/ { 0, 17677dd7cddfSDavid du Colombier }, 17687dd7cddfSDavid du Colombier 17697dd7cddfSDavid du Colombier /*TCHAR*/ { 0, TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, 17707dd7cddfSDavid du Colombier TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, 17717dd7cddfSDavid du Colombier }, 17727dd7cddfSDavid du Colombier /*TUCHAR*/ { 0, TUCHAR, TUCHAR, TUSHORT, TUSHORT, TUINT, TUINT, TULONG, 17737dd7cddfSDavid du Colombier TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, 17747dd7cddfSDavid du Colombier }, 17757dd7cddfSDavid du Colombier /*TSHORT*/ { 0, TSHORT, TUSHORT, TSHORT, TUSHORT, TINT, TUINT, TLONG, 17767dd7cddfSDavid du Colombier TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, 17777dd7cddfSDavid du Colombier }, 17787dd7cddfSDavid du Colombier /*TUSHORT*/ { 0, TUSHORT, TUSHORT, TUSHORT, TUSHORT, TUINT, TUINT, TULONG, 17797dd7cddfSDavid du Colombier TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, 17807dd7cddfSDavid du Colombier }, 17817dd7cddfSDavid du Colombier /*TINT*/ { 0, TINT, TUINT, TINT, TUINT, TINT, TUINT, TLONG, 17827dd7cddfSDavid du Colombier TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, 17837dd7cddfSDavid du Colombier }, 17847dd7cddfSDavid du Colombier /*TUINT*/ { 0, TUINT, TUINT, TUINT, TUINT, TUINT, TUINT, TULONG, 17857dd7cddfSDavid du Colombier TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, 17867dd7cddfSDavid du Colombier }, 17877dd7cddfSDavid du Colombier /*TLONG*/ { 0, TLONG, TULONG, TLONG, TULONG, TLONG, TULONG, TLONG, 17887dd7cddfSDavid du Colombier TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, 17897dd7cddfSDavid du Colombier }, 17907dd7cddfSDavid du Colombier /*TULONG*/ { 0, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG, 17917dd7cddfSDavid du Colombier TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, 17927dd7cddfSDavid du Colombier }, 17937dd7cddfSDavid du Colombier /*TVLONG*/ { 0, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG, 17947dd7cddfSDavid du Colombier TUVLONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, 17957dd7cddfSDavid du Colombier }, 17967dd7cddfSDavid du Colombier /*TUVLONG*/ { 0, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, 17977dd7cddfSDavid du Colombier TUVLONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, 17987dd7cddfSDavid du Colombier }, 17997dd7cddfSDavid du Colombier /*TFLOAT*/ { 0, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, 18007dd7cddfSDavid du Colombier TFLOAT, TFLOAT, TFLOAT, TFLOAT, TDOUBLE, TIND, 18017dd7cddfSDavid du Colombier }, 18027dd7cddfSDavid du Colombier /*TDOUBLE*/ { 0, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, 18037dd7cddfSDavid du Colombier TDOUBLE, TDOUBLE, TDOUBLE, TFLOAT, TDOUBLE, TIND, 18047dd7cddfSDavid du Colombier }, 18057dd7cddfSDavid du Colombier /*TIND*/ { 0, TIND, TIND, TIND, TIND, TIND, TIND, TIND, 18067dd7cddfSDavid du Colombier TIND, TIND, TIND, TIND, TIND, TIND, 18077dd7cddfSDavid du Colombier }, 18083e12c5d1SDavid du Colombier }; 18097dd7cddfSDavid du Colombier 18107dd7cddfSDavid du Colombier void 18117dd7cddfSDavid du Colombier urk(char *name, int max, int i) 18127dd7cddfSDavid du Colombier { 18137dd7cddfSDavid du Colombier if(i >= max) { 18147dd7cddfSDavid du Colombier fprint(2, "bad tinit: %s %d>=%d\n", name, i, max); 18157dd7cddfSDavid du Colombier exits("init"); 18167dd7cddfSDavid du Colombier } 18177dd7cddfSDavid du Colombier } 18187dd7cddfSDavid du Colombier 18197dd7cddfSDavid du Colombier void 18207dd7cddfSDavid du Colombier tinit(void) 18217dd7cddfSDavid du Colombier { 1822*4ac975e2SDavid du Colombier int *ip; 18237dd7cddfSDavid du Colombier Init *p; 18247dd7cddfSDavid du Colombier 18257dd7cddfSDavid du Colombier for(p=thashinit; p->code >= 0; p++) { 18267dd7cddfSDavid du Colombier urk("thash", nelem(thash), p->code); 18277dd7cddfSDavid du Colombier thash[p->code] = p->value; 18287dd7cddfSDavid du Colombier } 18297dd7cddfSDavid du Colombier for(p=bnamesinit; p->code >= 0; p++) { 18307dd7cddfSDavid du Colombier urk("bnames", nelem(bnames), p->code); 18317dd7cddfSDavid du Colombier bnames[p->code] = p->s; 18327dd7cddfSDavid du Colombier } 18337dd7cddfSDavid du Colombier for(p=tnamesinit; p->code >= 0; p++) { 18347dd7cddfSDavid du Colombier urk("tnames", nelem(tnames), p->code); 18357dd7cddfSDavid du Colombier tnames[p->code] = p->s; 18367dd7cddfSDavid du Colombier } 18377dd7cddfSDavid du Colombier for(p=gnamesinit; p->code >= 0; p++) { 18387dd7cddfSDavid du Colombier urk("gnames", nelem(gnames), p->code); 18397dd7cddfSDavid du Colombier gnames[p->code] = p->s; 18407dd7cddfSDavid du Colombier } 18417dd7cddfSDavid du Colombier for(p=qnamesinit; p->code >= 0; p++) { 18427dd7cddfSDavid du Colombier urk("qnames", nelem(qnames), p->code); 18437dd7cddfSDavid du Colombier qnames[p->code] = p->s; 18447dd7cddfSDavid du Colombier } 18457dd7cddfSDavid du Colombier for(p=cnamesinit; p->code >= 0; p++) { 18467dd7cddfSDavid du Colombier urk("cnames", nelem(cnames), p->code); 18477dd7cddfSDavid du Colombier cnames[p->code] = p->s; 18487dd7cddfSDavid du Colombier } 18497dd7cddfSDavid du Colombier for(p=onamesinit; p->code >= 0; p++) { 18507dd7cddfSDavid du Colombier urk("onames", nelem(onames), p->code); 18517dd7cddfSDavid du Colombier onames[p->code] = p->s; 18527dd7cddfSDavid du Colombier } 1853*4ac975e2SDavid du Colombier for(ip=typeiinit; *ip>=0; ip++) { 1854*4ac975e2SDavid du Colombier urk("typei", nelem(typei), *ip); 1855*4ac975e2SDavid du Colombier typei[*ip] = 1; 18567dd7cddfSDavid du Colombier } 1857*4ac975e2SDavid du Colombier for(ip=typeuinit; *ip>=0; ip++) { 1858*4ac975e2SDavid du Colombier urk("typeu", nelem(typeu), *ip); 1859*4ac975e2SDavid du Colombier typeu[*ip] = 1; 18607dd7cddfSDavid du Colombier } 1861*4ac975e2SDavid du Colombier for(ip=typesuvinit; *ip>=0; ip++) { 1862*4ac975e2SDavid du Colombier urk("typesuv", nelem(typesuv), *ip); 1863*4ac975e2SDavid du Colombier typesuv[*ip] = 1; 18647dd7cddfSDavid du Colombier } 1865*4ac975e2SDavid du Colombier for(ip=typeilpinit; *ip>=0; ip++) { 1866*4ac975e2SDavid du Colombier urk("typeilp", nelem(typeilp), *ip); 1867*4ac975e2SDavid du Colombier typeilp[*ip] = 1; 18687dd7cddfSDavid du Colombier } 1869*4ac975e2SDavid du Colombier for(ip=typechlinit; *ip>=0; ip++) { 1870*4ac975e2SDavid du Colombier urk("typechl", nelem(typechl), *ip); 1871*4ac975e2SDavid du Colombier typechl[*ip] = 1; 1872*4ac975e2SDavid du Colombier typechlv[*ip] = 1; 1873*4ac975e2SDavid du Colombier typechlvp[*ip] = 1; 18747dd7cddfSDavid du Colombier } 1875*4ac975e2SDavid du Colombier for(ip=typechlpinit; *ip>=0; ip++) { 1876*4ac975e2SDavid du Colombier urk("typechlp", nelem(typechlp), *ip); 1877*4ac975e2SDavid du Colombier typechlp[*ip] = 1; 1878*4ac975e2SDavid du Colombier typechlvp[*ip] = 1; 18797dd7cddfSDavid du Colombier } 1880*4ac975e2SDavid du Colombier for(ip=typechlpfdinit; *ip>=0; ip++) { 1881*4ac975e2SDavid du Colombier urk("typechlpfd", nelem(typechlpfd), *ip); 1882*4ac975e2SDavid du Colombier typechlpfd[*ip] = 1; 18837dd7cddfSDavid du Colombier } 1884*4ac975e2SDavid du Colombier for(ip=typecinit; *ip>=0; ip++) { 1885*4ac975e2SDavid du Colombier urk("typec", nelem(typec), *ip); 1886*4ac975e2SDavid du Colombier typec[*ip] = 1; 18877dd7cddfSDavid du Colombier } 1888*4ac975e2SDavid du Colombier for(ip=typehinit; *ip>=0; ip++) { 1889*4ac975e2SDavid du Colombier urk("typeh", nelem(typeh), *ip); 1890*4ac975e2SDavid du Colombier typeh[*ip] = 1; 18917dd7cddfSDavid du Colombier } 1892*4ac975e2SDavid du Colombier for(ip=typeilinit; *ip>=0; ip++) { 1893*4ac975e2SDavid du Colombier urk("typeil", nelem(typeil), *ip); 1894*4ac975e2SDavid du Colombier typeil[*ip] = 1; 18957dd7cddfSDavid du Colombier } 1896*4ac975e2SDavid du Colombier for(ip=typevinit; *ip>=0; ip++) { 1897*4ac975e2SDavid du Colombier urk("typev", nelem(typev), *ip); 1898*4ac975e2SDavid du Colombier typev[*ip] = 1; 1899*4ac975e2SDavid du Colombier typechlv[*ip] = 1; 1900*4ac975e2SDavid du Colombier typechlvp[*ip] = 1; 19017dd7cddfSDavid du Colombier } 1902*4ac975e2SDavid du Colombier for(ip=typefdinit; *ip>=0; ip++) { 1903*4ac975e2SDavid du Colombier urk("typefd", nelem(typefd), *ip); 1904*4ac975e2SDavid du Colombier typefd[*ip] = 1; 19057dd7cddfSDavid du Colombier } 1906*4ac975e2SDavid du Colombier for(ip=typeafinit; *ip>=0; ip++) { 1907*4ac975e2SDavid du Colombier urk("typeaf", nelem(typeaf), *ip); 1908*4ac975e2SDavid du Colombier typeaf[*ip] = 1; 19097dd7cddfSDavid du Colombier } 1910*4ac975e2SDavid du Colombier for(ip=typesuinit; *ip >= 0; ip++) { 1911*4ac975e2SDavid du Colombier urk("typesu", nelem(typesu), *ip); 1912*4ac975e2SDavid du Colombier typesu[*ip] = 1; 19137dd7cddfSDavid du Colombier } 19147dd7cddfSDavid du Colombier for(p=tasigninit; p->code >= 0; p++) { 19157dd7cddfSDavid du Colombier urk("tasign", nelem(tasign), p->code); 19167dd7cddfSDavid du Colombier tasign[p->code] = p->value; 19177dd7cddfSDavid du Colombier } 19187dd7cddfSDavid du Colombier for(p=tasaddinit; p->code >= 0; p++) { 19197dd7cddfSDavid du Colombier urk("tasadd", nelem(tasadd), p->code); 19207dd7cddfSDavid du Colombier tasadd[p->code] = p->value; 19217dd7cddfSDavid du Colombier } 19227dd7cddfSDavid du Colombier for(p=tcastinit; p->code >= 0; p++) { 19237dd7cddfSDavid du Colombier urk("tcast", nelem(tcast), p->code); 19247dd7cddfSDavid du Colombier tcast[p->code] = p->value; 19257dd7cddfSDavid du Colombier } 19267dd7cddfSDavid du Colombier for(p=taddinit; p->code >= 0; p++) { 19277dd7cddfSDavid du Colombier urk("tadd", nelem(tadd), p->code); 19287dd7cddfSDavid du Colombier tadd[p->code] = p->value; 19297dd7cddfSDavid du Colombier } 19307dd7cddfSDavid du Colombier for(p=tsubinit; p->code >= 0; p++) { 19317dd7cddfSDavid du Colombier urk("tsub", nelem(tsub), p->code); 19327dd7cddfSDavid du Colombier tsub[p->code] = p->value; 19337dd7cddfSDavid du Colombier } 19347dd7cddfSDavid du Colombier for(p=tmulinit; p->code >= 0; p++) { 19357dd7cddfSDavid du Colombier urk("tmul", nelem(tmul), p->code); 19367dd7cddfSDavid du Colombier tmul[p->code] = p->value; 19377dd7cddfSDavid du Colombier } 19387dd7cddfSDavid du Colombier for(p=tandinit; p->code >= 0; p++) { 19397dd7cddfSDavid du Colombier urk("tand", nelem(tand), p->code); 19407dd7cddfSDavid du Colombier tand[p->code] = p->value; 19417dd7cddfSDavid du Colombier } 19427dd7cddfSDavid du Colombier for(p=trelinit; p->code >= 0; p++) { 19437dd7cddfSDavid du Colombier urk("trel", nelem(trel), p->code); 19447dd7cddfSDavid du Colombier trel[p->code] = p->value; 19457dd7cddfSDavid du Colombier } 1946*4ac975e2SDavid du Colombier 1947*4ac975e2SDavid du Colombier /* 32-bit defaults */ 1948*4ac975e2SDavid du Colombier typeword = typechlp; 1949*4ac975e2SDavid du Colombier typecmplx = typesuv; 19507dd7cddfSDavid du Colombier } 19519a747e4fSDavid du Colombier 1952*4ac975e2SDavid du Colombier /* 1953*4ac975e2SDavid du Colombier * return 1 if it is impossible to jump into the middle of n. 1954*4ac975e2SDavid du Colombier */ 19559a747e4fSDavid du Colombier static int 19569a747e4fSDavid du Colombier deadhead(Node *n, int caseok) 19579a747e4fSDavid du Colombier { 19589a747e4fSDavid du Colombier loop: 19599a747e4fSDavid du Colombier if(n == Z) 19609a747e4fSDavid du Colombier return 1; 19619a747e4fSDavid du Colombier switch(n->op) { 19629a747e4fSDavid du Colombier case OLIST: 19639a747e4fSDavid du Colombier if(!deadhead(n->left, caseok)) 19649a747e4fSDavid du Colombier return 0; 19659a747e4fSDavid du Colombier rloop: 19669a747e4fSDavid du Colombier n = n->right; 19679a747e4fSDavid du Colombier goto loop; 19689a747e4fSDavid du Colombier 19699a747e4fSDavid du Colombier case ORETURN: 19709a747e4fSDavid du Colombier break; 19719a747e4fSDavid du Colombier 19729a747e4fSDavid du Colombier case OLABEL: 19739a747e4fSDavid du Colombier return 0; 19749a747e4fSDavid du Colombier 19759a747e4fSDavid du Colombier case OGOTO: 19769a747e4fSDavid du Colombier break; 19779a747e4fSDavid du Colombier 19789a747e4fSDavid du Colombier case OCASE: 19799a747e4fSDavid du Colombier if(!caseok) 19809a747e4fSDavid du Colombier return 0; 19819a747e4fSDavid du Colombier goto rloop; 19829a747e4fSDavid du Colombier 19839a747e4fSDavid du Colombier case OSWITCH: 19849a747e4fSDavid du Colombier return deadhead(n->right, 1); 19859a747e4fSDavid du Colombier 19869a747e4fSDavid du Colombier case OWHILE: 19879a747e4fSDavid du Colombier case ODWHILE: 19889a747e4fSDavid du Colombier goto rloop; 19899a747e4fSDavid du Colombier 19909a747e4fSDavid du Colombier case OFOR: 19919a747e4fSDavid du Colombier goto rloop; 19929a747e4fSDavid du Colombier 19939a747e4fSDavid du Colombier case OCONTINUE: 19949a747e4fSDavid du Colombier break; 19959a747e4fSDavid du Colombier 19969a747e4fSDavid du Colombier case OBREAK: 19979a747e4fSDavid du Colombier break; 19989a747e4fSDavid du Colombier 19999a747e4fSDavid du Colombier case OIF: 20009a747e4fSDavid du Colombier return deadhead(n->right->left, caseok) && deadhead(n->right->right, caseok); 20019a747e4fSDavid du Colombier 20029a747e4fSDavid du Colombier case OSET: 20039a747e4fSDavid du Colombier case OUSED: 20049a747e4fSDavid du Colombier break; 20059a747e4fSDavid du Colombier } 20069a747e4fSDavid du Colombier return 1; 20079a747e4fSDavid du Colombier } 20089a747e4fSDavid du Colombier 20099a747e4fSDavid du Colombier int 20109a747e4fSDavid du Colombier deadheads(Node *c) 20119a747e4fSDavid du Colombier { 20129a747e4fSDavid du Colombier return deadhead(c->left, 0) && deadhead(c->right, 0); 20139a747e4fSDavid du Colombier } 2014ce941d97SDavid du Colombier 2015ce941d97SDavid du Colombier int 2016ce941d97SDavid du Colombier mixedasop(Type *l, Type *r) 2017ce941d97SDavid du Colombier { 2018ce941d97SDavid du Colombier return !typefd[l->etype] && typefd[r->etype]; 2019ce941d97SDavid du Colombier } 2020