From: Russ Cox Date: Sat, 22 Dec 2012 16:20:17 +0000 (-0500) Subject: cmd/6l, cmd/8l: add -Z flag to zero stack frame on entry X-Git-Tag: go1.1rc2~1556 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=b9da27bed238b5bc55f0f92ed60dc691bd4691f5;p=gostls13.git cmd/6l, cmd/8l: add -Z flag to zero stack frame on entry Replacement for GOEXPERIMENT=zerostack, easier to use. Does not require a separate toolchain. R=ken2 CC=golang-dev https://golang.org/cl/6996051 --- diff --git a/src/cmd/6l/pass.c b/src/cmd/6l/pass.c index 043048e8a0..0054b329f4 100644 --- a/src/cmd/6l/pass.c +++ b/src/cmd/6l/pass.c @@ -653,6 +653,34 @@ dostkoff(void) q1->pcond = p; } + if(debug['Z'] && autoffset && !(cursym->text->from.scale&NOSPLIT)) { + // 6l -Z means zero the stack frame on entry. + // This slows down function calls but can help avoid + // false positives in garbage collection. + p = appendp(p); + p->as = AMOVQ; + p->from.type = D_SP; + p->to.type = D_DI; + + p = appendp(p); + p->as = AMOVQ; + p->from.type = D_CONST; + p->from.offset = autoffset/8; + p->to.type = D_CX; + + p = appendp(p); + p->as = AMOVQ; + p->from.type = D_CONST; + p->from.offset = 0; + p->to.type = D_AX; + + p = appendp(p); + p->as = AREP; + + p = appendp(p); + p->as = ASTOSQ; + } + for(; p != P; p = p->link) { pcsize = p->mode/8; a = p->from.type; diff --git a/src/cmd/8l/pass.c b/src/cmd/8l/pass.c index 6cf3009e2c..03292a5b3f 100644 --- a/src/cmd/8l/pass.c +++ b/src/cmd/8l/pass.c @@ -593,6 +593,34 @@ dostkoff(void) } deltasp = autoffset; + if(debug['Z'] && autoffset && !(cursym->text->from.scale&NOSPLIT)) { + // 8l -Z means zero the stack frame on entry. + // This slows down function calls but can help avoid + // false positives in garbage collection. + p = appendp(p); + p->as = AMOVL; + p->from.type = D_SP; + p->to.type = D_DI; + + p = appendp(p); + p->as = AMOVL; + p->from.type = D_CONST; + p->from.offset = autoffset/4; + p->to.type = D_CX; + + p = appendp(p); + p->as = AMOVL; + p->from.type = D_CONST; + p->from.offset = 0; + p->to.type = D_AX; + + p = appendp(p); + p->as = AREP; + + p = appendp(p); + p->as = ASTOSL; + } + for(; p != P; p = p->link) { a = p->from.type; if(a == D_AUTO)