|
|
1.1 ! root 1: #include <u.h> ! 2: #include <libc.h> ! 3: #include <bio.h> ! 4: #include <ctype.h> ! 5: #define Extern extern ! 6: #include "parl.h" ! 7: #include "globl.h" ! 8: ! 9: void ! 10: cominit(Node *v, Type *t, Node *i, int off) ! 11: { ! 12: Type *comt; ! 13: int ind, l, cnt, dim, sz; ! 14: Node n, **ilist, *in, *treg, *tdat; ! 15: ! 16: if(opt('i')) { ! 17: print("COMINIT %N T %T off %d\n", v, t, off); ! 18: ptree(i, 0); ! 19: } ! 20: ! 21: switch(t->type) { ! 22: case TINT: ! 23: case TUINT: ! 24: case TSINT: ! 25: case TSUINT: ! 26: case TCHAR: ! 27: case TFLOAT: ! 28: case TIND: ! 29: case TCHANNEL: ! 30: if(i->sun >= Sucall) { ! 31: treg = stknode(builtype[TIND]); ! 32: v->type = OREGISTER; ! 33: v->t = builtype[TIND]; ! 34: assign(v, treg); ! 35: tdat = stknode(i->t); ! 36: n.t = i->t; ! 37: n.type = OASGN; ! 38: n.left = tdat; ! 39: n.right = i; ! 40: n.islval = 0; ! 41: genexp(&n, ZeroN); ! 42: assign(treg, v); ! 43: v->type = OINDREG; ! 44: v->ival = off; ! 45: v->t = t; ! 46: genexp(tdat, v); ! 47: break; ! 48: } ! 49: v->ival = off; ! 50: v->t = t; ! 51: n.type = OASGN; ! 52: n.t = t; ! 53: n.left = v; ! 54: n.right = i; ! 55: n.islval = 0; ! 56: genexp(&n, ZeroN); ! 57: break; ! 58: ! 59: case TARRAY: ! 60: veccnt = 0; ! 61: listcount(i->left, 0); ! 62: ilist = malloc(sizeof(Node*)*veccnt); ! 63: veccnt = 0; ! 64: listcount(i->left, ilist); ! 65: cnt = veccnt; ! 66: ! 67: sz = t->next->size; ! 68: ind = 0; ! 69: dim = 0; ! 70: for(l = 0; l < cnt; l++) { ! 71: if(ind > dim) ! 72: dim = ind; ! 73: in = ilist[l]; ! 74: if(in->type != OINDEX) { ! 75: cominit(v, t->next, in, off+ind); ! 76: ind += sz; ! 77: continue; ! 78: } ! 79: ind = in->left->ival*sz; ! 80: cominit(v, t->next, in->right, off+ind); ! 81: ind += sz; ! 82: } ! 83: break; ! 84: ! 85: case TADT: ! 86: case TUNION: ! 87: case TAGGREGATE: ! 88: if(i->type != OILIST) { ! 89: if(i->sun >= Sucall) { ! 90: v->ival = 0; ! 91: v->type = OREGISTER; ! 92: v->t = at(TIND, t); ! 93: treg = stknode(v->t); ! 94: assign(v, treg); ! 95: in = an(OADD, treg, con(off)); ! 96: in->t = v->t; ! 97: in = an(OIND, in, ZeroN); ! 98: in->t = t; ! 99: n.type = OASGN; ! 100: n.t = t; ! 101: n.left = in; ! 102: n.right = i; ! 103: n.islval = 0; ! 104: genexp(&n, ZeroN); ! 105: assign(treg, v); ! 106: v->type = OINDREG; ! 107: break; ! 108: } ! 109: v->ival = 0; ! 110: v->t = at(TIND, t); ! 111: v->type = OREGISTER; ! 112: in = an(OADD, v, con(off)); ! 113: in->t = v->t; ! 114: in = an(OIND, in, ZeroN); ! 115: in->t = t; ! 116: n.type = OASGN; ! 117: n.t = t; ! 118: n.left = in; ! 119: n.right = i; ! 120: n.islval = 0; ! 121: genexp(&n, ZeroN); ! 122: v->type = OINDREG; ! 123: break; ! 124: } ! 125: ! 126: veccnt = 0; ! 127: listcount(i->left, 0); ! 128: ilist = malloc(sizeof(Node*)*veccnt); ! 129: veccnt = 0; ! 130: listcount(i->left, ilist); ! 131: ! 132: cnt = veccnt; ! 133: comt = t->next; ! 134: for(l = 0; l < cnt; l++) { ! 135: cominit(v, comt, ilist[l], off+comt->offset); ! 136: for(;;) { ! 137: comt = comt->member; ! 138: if(comt == ZeroT) ! 139: break; ! 140: /* Skip adt prototypes */ ! 141: if(comt->type != TFUNC) ! 142: break; ! 143: } ! 144: } ! 145: break; ! 146: ! 147: case TFUNC: ! 148: case TVOID: ! 149: fatal("cominit"); ! 150: } ! 151: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.