From b9da27bed238b5bc55f0f92ed60dc691bd4691f5 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Sat, 22 Dec 2012 11:20:17 -0500 Subject: [PATCH] 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 --- src/cmd/6l/pass.c | 28 ++++++++++++++++++++++++++++ src/cmd/8l/pass.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) 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) -- 2.48.1