1
0
mirror of https://github.com/golang/go synced 2024-11-20 06:14:53 -07:00

cmd/5l: support -Z (zero stack frame at function entry)

also added appropriate docs to cmd/ld/doc.go
(largely copied from Russ's CL 6938073).

R=rsc
CC=golang-dev
https://golang.org/cl/7004049
This commit is contained in:
Shenghou Ma 2013-01-11 12:24:28 +08:00
parent 60abc6b577
commit d5d4ee47ed
4 changed files with 83 additions and 2 deletions

View File

@ -420,8 +420,9 @@ int32 immaddr(int32);
int32 opbra(int, int); int32 opbra(int, int);
int brextra(Prog*); int brextra(Prog*);
int isbranch(Prog*); int isbranch(Prog*);
void fnptrs(void); void fnptrs(void);
void doelf(void); void doelf(void);
void dozerostk(void); // used by -Z
vlong addaddr(Sym *s, Sym *t); vlong addaddr(Sym *s, Sym *t);
vlong addsize(Sym *s, Sym *t); vlong addsize(Sym *s, Sym *t);

View File

@ -255,7 +255,12 @@ main(int argc, char *argv[])
doelf(); doelf();
follow(); follow();
softfloat(); softfloat();
noops(); // 5l -Z means zero the stack frame on entry.
// This slows down function calls but can help avoid
// false positives in garbage collection.
if(debug['Z'])
dozerostk();
noops(); // generate stack split prolog, handle div/mod, etc.
dostkcheck(); dostkcheck();
span(); span();
addexport(); addexport();

View File

@ -333,3 +333,70 @@ rnd(int32 v, int32 r)
v -= c; v -= c;
return v; return v;
} }
void
dozerostk(void)
{
Prog *p, *pl;
int32 autoffset;
for(cursym = textp; cursym != nil; cursym = cursym->next) {
if(cursym->text == nil || cursym->text->link == nil)
continue;
p = cursym->text;
autoffset = p->to.offset;
if(autoffset < 0)
autoffset = 0;
if(autoffset && !(p->reg&NOSPLIT)) {
// MOVW $4(R13), R1
p = appendp(p);
p->as = AMOVW;
p->from.type = D_CONST;
p->from.reg = 13;
p->from.offset = 4;
p->to.type = D_REG;
p->to.reg = 1;
// MOVW $n(R13), R2
p = appendp(p);
p->as = AMOVW;
p->from.type = D_CONST;
p->from.reg = 13;
p->from.offset = 4 + autoffset;
p->to.type = D_REG;
p->to.reg = 2;
// MOVW $0, R3
p = appendp(p);
p->as = AMOVW;
p->from.type = D_CONST;
p->from.offset = 0;
p->to.type = D_REG;
p->to.reg = 3;
// L:
// MOVW.P R3, 0(R1) +4
// CMP R1, R2
// BNE L
p = pl = appendp(p);
p->as = AMOVW;
p->from.type = D_REG;
p->from.reg = 3;
p->to.type = D_OREG;
p->to.reg = 1;
p->to.offset = 4;
p->scond |= C_PBIT;
p = appendp(p);
p->as = ACMP;
p->from.type = D_REG;
p->from.reg = 1;
p->reg = 2;
p = appendp(p);
p->as = ABNE;
p->to.type = D_BRANCH;
p->cond = pl;
}
}
}

View File

@ -61,5 +61,13 @@ Options new in this version:
-B value -B value
Add a NT_GNU_BUILD_ID note when using ELF. The value Add a NT_GNU_BUILD_ID note when using ELF. The value
should start with 0x and be an even number of hex digits. should start with 0x and be an even number of hex digits.
-Z
Zero stack on function entry. This is expensive but it might
be useful in cases where you are suffering from false positives
during garbage collection and are willing to trade the CPU time
for getting rid of the false positives.
NOTE: it only eliminates false positives caused by other function
calls, not false positives caused by dead temporaries stored in
the current function call.
*/ */
package documentation package documentation