fix bug in stack overflow check.

if stack is in low memory and frame size is huge, test could wrap around!
fix by omitting test altogether if we know frame is big.

R=gri
OCL=14782
CL=14782
This commit is contained in:
Rob Pike 2008-09-03 19:58:46 -07:00
parent f5cb258195
commit 6c72bfa55b
3 changed files with 27 additions and 29 deletions

View File

@ -669,34 +669,36 @@ dostkoff(void)
q = P;
if(pmorestack != P)
if(!(p->from.scale & NOSPLIT)) {
if(autoffset <= 75) {
// small stack
p = appendp(p);
p->as = ACMPQ;
p->from.type = D_SP;
p->to.type = D_INDIR+D_R15;
if(autoffset < 4096) { // do we need to call morestack
if(autoffset <= 75) {
// small stack
p = appendp(p);
p->as = ACMPQ;
p->from.type = D_SP;
p->to.type = D_INDIR+D_R15;
} else {
// large stack
p = appendp(p);
p->as = ALEAQ;
p->from.type = D_INDIR+D_SP;
p->from.offset = -(autoffset-75);
p->to.type = D_AX;
} else {
// large stack
p = appendp(p);
p->as = ALEAQ;
p->from.type = D_INDIR+D_SP;
p->from.offset = -(autoffset-75);
p->to.type = D_AX;
p = appendp(p);
p->as = ACMPQ;
p->from.type = D_AX;
p->to.type = D_INDIR+D_R15;
}
// common
p = appendp(p);
p->as = ACMPQ;
p->from.type = D_AX;
p->to.type = D_INDIR+D_R15;
p->as = AJHI;
p->to.type = D_BRANCH;
p->to.offset = 4;
q = p;
}
// common
p = appendp(p);
p->as = AJHI;
p->to.type = D_BRANCH;
p->to.offset = 4;
q = p;
p = appendp(p);
p->as = AMOVQ;
p->from.type = D_CONST;

View File

@ -145,10 +145,6 @@ BUG: fails incorrectly
=========== bugs/bug090.go
BUG: compilation succeeds incorrectly
=========== bugs/bug092.go
BUG should not crash
$RUNFILE: line 1: PID Illegal instruction ./$A.out
=========== fixedbugs/bug015.go
fixedbugs/bug015.go:7: overflow converting constant to <int64>INT64