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)