mirror of
https://github.com/golang/go
synced 2024-11-05 18:36:08 +00:00
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
This commit is contained in:
parent
e431398e09
commit
b9da27bed2
2 changed files with 56 additions and 0 deletions
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue