diff options
Diffstat (limited to 'src/cmd/8g/gsubr.c')
-rw-r--r-- | src/cmd/8g/gsubr.c | 69 |
1 files changed, 39 insertions, 30 deletions
diff --git a/src/cmd/8g/gsubr.c b/src/cmd/8g/gsubr.c index 34703ba6e..2f3cb28c8 100644 --- a/src/cmd/8g/gsubr.c +++ b/src/cmd/8g/gsubr.c @@ -48,7 +48,7 @@ clearp(Prog *p) p->from.index = D_NONE; p->to.type = D_NONE; p->to.index = D_NONE; - p->loc = pcloc; + p->pc = pcloc; pcloc++; } @@ -137,7 +137,7 @@ patch(Prog *p, Prog *to) if(p->to.type != D_BRANCH) fatal("patch: not a branch"); p->to.u.branch = to; - p->to.offset = to->loc; + p->to.offset = to->pc; } Prog* @@ -161,13 +161,8 @@ newplist(void) { Plist *pl; - pl = mal(sizeof(*pl)); - if(plist == nil) - plist = pl; - else - plast->link = pl; - plast = pl; - + pl = linknewplist(ctxt); + pc = mal(sizeof(*pc)); clearp(pc); pl->firstpc = pc; @@ -199,8 +194,8 @@ ggloblnod(Node *nam) p = gins(AGLOBL, nam, N); p->lineno = nam->lineno; - p->from.gotype = ngotype(nam); - p->to.sym = S; + p->from.sym->gotype = linksym(ngotype(nam)); + p->to.sym = nil; p->to.type = D_CONST; p->to.offset = nam->type->width; if(nam->readonly) @@ -227,7 +222,7 @@ ggloblsym(Sym *s, int32 width, int dupok, int rodata) p = gins(AGLOBL, N, N); p->from.type = D_EXTERN; p->from.index = D_NONE; - p->from.sym = s; + p->from.sym = linksym(s); p->to.type = D_CONST; p->to.index = D_NONE; p->to.offset = width; @@ -245,7 +240,7 @@ gtrack(Sym *s) p = gins(AUSEFIELD, N, N); p->from.type = D_EXTERN; p->from.index = D_NONE; - p->from.sym = s; + p->from.sym = linksym(s); } int @@ -273,7 +268,7 @@ afunclit(Addr *a, Node *n) if(a->type == D_ADDR && a->index == D_EXTERN) { a->type = D_EXTERN; a->index = D_NONE; - a->sym = n->sym; + a->sym = linksym(n->sym); } } @@ -437,6 +432,7 @@ optoas(int op, Type *t) case CASE(OADD, TINT32): case CASE(OADD, TUINT32): case CASE(OADD, TPTR32): + case CASE(OADDPTR, TPTR32): a = AADDL; break; @@ -1048,6 +1044,7 @@ Node* nodarg(Type *t, int fp) { Node *n; + NodeList *l; Type *first; Iter savet; @@ -1072,6 +1069,14 @@ nodarg(Type *t, int fp) break; case TFIELD: + if(fp == 1 && t->sym != S && !isblanksym(t->sym)) { + for(l=curfn->dcl; l; l=l->next) { + n = l->n; + if((n->class == PPARAM || n->class == PPARAMOUT) && n->sym == t->sym) + return n; + } + } + n = nod(ONAME, N, N); n->type = t->type; n->sym = t->sym; @@ -1692,7 +1697,6 @@ floatmove(Node *f, Node *t) gins(ACMPL, &thi, ncon(0)); p1 = gbranch(AJLT, T, 0); // native - t1.type = types[TINT64]; nodreg(&r1, types[tt], D_F0); gins(AFMOVV, &t1, &r1); if(tt == TFLOAT32) @@ -2178,10 +2182,12 @@ gins(int as, Node *f, Node *t) void naddr(Node *n, Addr *a, int canemitcode) { + Sym *s; + a->scale = 0; a->index = D_NONE; a->type = D_NONE; - a->gotype = S; + a->gotype = nil; a->node = N; if(n == N) return; @@ -2193,12 +2199,12 @@ naddr(Node *n, Addr *a, int canemitcode) case OREGISTER: a->type = n->val.u.reg; - a->sym = S; + a->sym = nil; break; case OINDREG: a->type = n->val.u.reg+D_INDIR; - a->sym = n->sym; + a->sym = linksym(n->sym); a->offset = n->xoffset; break; @@ -2208,20 +2214,22 @@ naddr(Node *n, Addr *a, int canemitcode) a->etype = n->left->type->etype; a->width = n->left->type->width; a->offset = n->xoffset; - a->sym = n->left->sym; + a->sym = linksym(n->left->sym); a->type = D_PARAM; a->node = n->left->orig; break; case OCLOSUREVAR: + if(!curfn->needctxt) + fatal("closurevar without needctxt"); a->type = D_DX+D_INDIR; a->offset = n->xoffset; - a->sym = S; + a->sym = nil; break; case OCFUNC: naddr(n->left, a, canemitcode); - a->sym = n->left->sym; + a->sym = linksym(n->left->sym); break; case ONAME: @@ -2233,17 +2241,17 @@ naddr(Node *n, Addr *a, int canemitcode) a->width = n->type->width; } a->offset = n->xoffset; - a->sym = n->sym; + s = n->sym; a->node = n->orig; //if(a->node >= (Node*)&n) // fatal("stack node"); - if(a->sym == S) - a->sym = lookup(".noname"); + if(s == S) + s = lookup(".noname"); if(n->method) { if(n->type != T) if(n->type->sym != S) if(n->type->sym->pkg != nil) - a->sym = pkglookup(a->sym->name, n->type->sym->pkg); + s = pkglookup(s->name, n->type->sym->pkg); } switch(n->class) { @@ -2262,9 +2270,10 @@ naddr(Node *n, Addr *a, int canemitcode) case PFUNC: a->index = D_EXTERN; a->type = D_ADDR; - a->sym = funcsym(a->sym); + s = funcsym(s); break; } + a->sym = linksym(s); break; case OLITERAL: @@ -2278,7 +2287,7 @@ naddr(Node *n, Addr *a, int canemitcode) break; case CTINT: case CTRUNE: - a->sym = S; + a->sym = nil; a->type = D_CONST; a->offset = mpgetfix(n->val.u.xval); break; @@ -2286,12 +2295,12 @@ naddr(Node *n, Addr *a, int canemitcode) datagostring(n->val.u.sval, a); break; case CTBOOL: - a->sym = S; + a->sym = nil; a->type = D_CONST; a->offset = n->val.u.bval; break; case CTNIL: - a->sym = S; + a->sym = nil; a->type = D_CONST; a->offset = 0; break; @@ -2327,7 +2336,7 @@ naddr(Node *n, Addr *a, int canemitcode) naddr(n->left, a, canemitcode); if(a->type == D_CONST && a->offset == 0) break; // ptr(nil) - a->etype = simtype[TUINTPTR]; + a->etype = simtype[tptr]; a->offset += Array_array; a->width = widthptr; break; |