diff options
Diffstat (limited to 'src/cmd/5g/ggen.c')
-rw-r--r-- | src/cmd/5g/ggen.c | 113 |
1 files changed, 1 insertions, 112 deletions
diff --git a/src/cmd/5g/ggen.c b/src/cmd/5g/ggen.c index a3306b44f..abd44e51b 100644 --- a/src/cmd/5g/ggen.c +++ b/src/cmd/5g/ggen.c @@ -536,118 +536,7 @@ no: } int -gen_as_init(Node *nr, Node *nl) +gen_as_init(Node *n) { - Node nam, nod1; - Prog *p; - - if(!initflag) - goto no; - - if(nr == N) { - if(!stataddr(&nam, nl)) - goto no; - if(nam.class != PEXTERN) - goto no; - return 1; - } - - if(nr->op == OCOMPSLICE) { - // create a slice pointing to an array - if(!stataddr(&nam, nl)) { - dump("stataddr", nl); - goto no; - } - - p = gins(ADATA, &nam, nr->left); - p->reg = types[tptr]->width; - p->to.type = D_CONST; -//print("%P\n", p); - - nodconst(&nod1, types[TINT32], nr->left->type->bound); - p = gins(ADATA, &nam, &nod1); - p->reg = types[TINT32]->width; - p->from.offset += types[tptr]->width; -//print("%P\n", p); - - p = gins(ADATA, &nam, &nod1); - p->reg = types[TINT32]->width; - p->from.offset += types[tptr]->width+types[TINT32]->width; - - goto yes; - } - - if(nr->op == OCOMPMAP) { - goto yes; - } - - if(nr->type == T || - !eqtype(nl->type, nr->type)) - goto no; - - if(!stataddr(&nam, nl)) - goto no; - if(nam.class != PEXTERN) - goto no; - - switch(nr->op) { - default: - goto no; - - case OLITERAL: - goto lit; - } - -no: return 0; - -lit: - switch(nr->type->etype) { - default: - goto no; - - case TBOOL: - if(memcmp(nam.sym->name, "initdoneĀ·", 9) == 0) - goto no; - case TINT8: - case TUINT8: - case TINT16: - case TUINT16: - case TINT32: - case TUINT32: - case TINT64: - case TUINT64: - case TINT: - case TUINT: - case TFLOAT32: - case TFLOAT64: - case TFLOAT: - p = gins(ADATA, &nam, nr); - p->reg = nr->type->width; - break; - - case TSTRING: - p = gins(ADATA, &nam, N); - datastring(nr->val.u.sval->s, nr->val.u.sval->len, &p->to); - p->reg = types[tptr]->width; - p->to.type = D_CONST; -//print("%P\n", p); - - nodconst(&nod1, types[TINT32], nr->val.u.sval->len); - p = gins(ADATA, &nam, &nod1); - p->reg = types[TINT32]->width; - p->from.offset += types[tptr]->width; -//print("%P\n", p); - - p = gins(ADATA, &nam, &nod1); - p->reg = types[TINT32]->width; - p->from.offset += types[tptr]->width+types[TINT32]->width; - break; - } - -yes: -//dump("\ngen_as_init", nl); -//dump("", nr); -//print("%P\n", p); - return 1; } |