diff options
Diffstat (limited to 'src/cmd/6g/cgen.c')
| -rw-r--r-- | src/cmd/6g/cgen.c | 59 |
1 files changed, 35 insertions, 24 deletions
diff --git a/src/cmd/6g/cgen.c b/src/cmd/6g/cgen.c index a51c0ca58..2eae865f3 100644 --- a/src/cmd/6g/cgen.c +++ b/src/cmd/6g/cgen.c @@ -568,7 +568,7 @@ agenr(Node *n, Node *a, Node *res) Node n1, n2, n3, n4, n5, tmp, tmp2, nlen; Prog *p1; Type *t; - uint32 w; + uint64 w; uint64 v; int freelen; @@ -882,24 +882,37 @@ agen(Node *n, Node *res) case ODOT: agen(nl, res); + // explicit check for nil if struct is large enough + // that we might derive too big a pointer. If the left node + // was ODOT we have already done the nil check. + if(nl->op != ODOT) + if(nl->type->width >= unmappedzero) { + regalloc(&n1, types[tptr], res); + gmove(res, &n1); + n1.op = OINDREG; + n1.type = types[TUINT8]; + n1.xoffset = 0; + gins(ATESTB, nodintconst(0), &n1); + regfree(&n1); + } if(n->xoffset != 0) ginscon(optoas(OADD, types[tptr]), n->xoffset, res); break; case ODOTPTR: cgen(nl, res); + // explicit check for nil if struct is large enough + // that we might derive too big a pointer. + if(nl->type->type->width >= unmappedzero) { + regalloc(&n1, types[tptr], res); + gmove(res, &n1); + n1.op = OINDREG; + n1.type = types[TUINT8]; + n1.xoffset = 0; + gins(ATESTB, nodintconst(0), &n1); + regfree(&n1); + } if(n->xoffset != 0) { - // explicit check for nil if struct is large enough - // that we might derive too big a pointer. - if(nl->type->type->width >= unmappedzero) { - regalloc(&n1, types[tptr], res); - gmove(res, &n1); - n1.op = OINDREG; - n1.type = types[TUINT8]; - n1.xoffset = 0; - gins(ATESTB, nodintconst(0), &n1); - regfree(&n1); - } ginscon(optoas(OADD, types[tptr]), n->xoffset, res); } break; @@ -950,16 +963,14 @@ igen(Node *n, Node *a, Node *res) case ODOTPTR: cgenr(n->left, a, res); - if(n->xoffset != 0) { - // explicit check for nil if struct is large enough - // that we might derive too big a pointer. - if(n->left->type->type->width >= unmappedzero) { - n1 = *a; - n1.op = OINDREG; - n1.type = types[TUINT8]; - n1.xoffset = 0; - gins(ATESTB, nodintconst(0), &n1); - } + // explicit check for nil if struct is large enough + // that we might derive too big a pointer. + if(n->left->type->type->width >= unmappedzero) { + n1 = *a; + n1.op = OINDREG; + n1.type = types[TUINT8]; + n1.xoffset = 0; + gins(ATESTB, nodintconst(0), &n1); } a->op = OINDREG; a->xoffset += n->xoffset; @@ -1276,12 +1287,12 @@ ret: * or return value from function call. * return n's offset from SP. */ -int32 +int64 stkof(Node *n) { Type *t; Iter flist; - int32 off; + int64 off; switch(n->op) { case OINDREG: |
