diff options
author | Russ Cox <rsc@golang.org> | 2014-02-19 17:08:55 -0500 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2014-02-19 17:08:55 -0500 |
commit | bad327a9d33e61c1c5f9056a2beedec9abe545cc (patch) | |
tree | 47da2af3d74ac686ce698918c2beb5089698ef83 /src/cmd/8g | |
parent | 7d216d05e6113b834b231e932696307805abec14 (diff) | |
download | go-bad327a9d33e61c1c5f9056a2beedec9abe545cc.tar.gz |
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://codereview.appspot.com/66170043
Diffstat (limited to 'src/cmd/8g')
-rw-r--r-- | src/cmd/8g/ggen.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/cmd/8g/ggen.c b/src/cmd/8g/ggen.c index fe1b63de1..b3e2665ca 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. |