From 1ca1cbea6589802bc0a0fa6b5475de03b913e8f3 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 19 Feb 2014 17:08:55 -0500 Subject: [PATCH] cmd/5g, cmd/8g: zero ambiguously live values on entry The code here is being restored after its deletion in CL 14430048. I restored the copy in cmd/6g in CL 56430043 but neglected the other two. This is the reason that enabling precisestack only worked on amd64. LGTM=r R=r CC=golang-codereviews https://golang.org/cl/66170043 --- src/cmd/5g/ggen.c | 38 ++++++++++++++++++++++++++++++++++++++ src/cmd/8g/ggen.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/src/cmd/5g/ggen.c b/src/cmd/5g/ggen.c index 18431c2bf9..b9930f49e7 100644 --- a/src/cmd/5g/ggen.c +++ b/src/cmd/5g/ggen.c @@ -9,10 +9,13 @@ #include "gg.h" #include "opt.h" +static Prog* appendpp(Prog*, int, int, int, int32, int, int, int32); + void defframe(Prog *ptxt) { uint32 frame; + Prog *p, *p1; // fill in argument size ptxt->to.type = D_CONST2; @@ -24,6 +27,41 @@ defframe(Prog *ptxt) frame = rnd(maxstksize+maxarg, widthptr); ptxt->to.offset = frame; maxstksize = 0; + + p = ptxt; + if(stkzerosize > 0) { + p = appendpp(p, AMOVW, D_CONST, NREG, 0, D_REG, 0, 0); + p = appendpp(p, AADD, D_CONST, NREG, 4+frame-stkzerosize, D_REG, 1, 0); + p->reg = REGSP; + p = appendpp(p, AADD, D_CONST, NREG, stkzerosize, D_REG, 2, 0); + p->reg = 1; + p1 = p = appendpp(p, AMOVW, D_REG, 0, 0, D_OREG, 1, 4); + p->scond |= C_PBIT; + p = appendpp(p, ACMP, D_REG, 1, 0, D_NONE, 0, 0); + p->reg = 2; + p = appendpp(p, ABNE, D_NONE, NREG, 0, D_BRANCH, NREG, 0); + patch(p, p1); + } +} + +static Prog* +appendpp(Prog *p, int as, int ftype, int freg, int32 foffset, int ttype, int treg, int32 toffset) +{ + Prog *q; + + q = mal(sizeof(*q)); + clearp(q); + q->as = as; + q->lineno = p->lineno; + q->from.type = ftype; + q->from.reg = freg; + q->from.offset = foffset; + q->to.type = ttype; + q->to.reg = treg; + q->to.offset = toffset; + q->link = p->link; + p->link = q; + return q; } // Sweep the prog list to mark any used nodes. diff --git a/src/cmd/8g/ggen.c b/src/cmd/8g/ggen.c index fe1b63de12..b3e2665ca4 100644 --- a/src/cmd/8g/ggen.c +++ b/src/cmd/8g/ggen.c @@ -9,10 +9,13 @@ #include "gg.h" #include "opt.h" +static Prog *appendpp(Prog*, int, int, vlong, int, vlong); + void defframe(Prog *ptxt) { uint32 frame; + Prog *p; // fill in argument size ptxt->to.offset2 = rnd(curfn->type->argwid, widthptr); @@ -23,6 +26,35 @@ defframe(Prog *ptxt) frame = rnd(maxstksize+maxarg, widthptr); ptxt->to.offset = frame; maxstksize = 0; + + // insert code to contain ambiguously live variables + // so that garbage collector only sees initialized values + // when it looks for pointers. + p = ptxt; + if(stkzerosize > 0) { + p = appendpp(p, AMOVL, D_CONST, 0, D_AX, 0); + p = appendpp(p, AMOVL, D_CONST, stkzerosize/widthptr, D_CX, 0); + p = appendpp(p, ALEAL, D_SP+D_INDIR, frame-stkzerosize, D_DI, 0); + p = appendpp(p, AREP, D_NONE, 0, D_NONE, 0); + appendpp(p, ASTOSL, D_NONE, 0, D_NONE, 0); + } +} + +static Prog* +appendpp(Prog *p, int as, int ftype, vlong foffset, int ttype, vlong toffset) +{ + Prog *q; + q = mal(sizeof(*q)); + clearp(q); + q->as = as; + q->lineno = p->lineno; + q->from.type = ftype; + q->from.offset = foffset; + q->to.type = ttype; + q->to.offset = toffset; + q->link = p->link; + p->link = q; + return q; } // Sweep the prog list to mark any used nodes. -- 2.48.1