mirror of
https://github.com/golang/go
synced 2024-11-26 01:47:58 -07:00
add -K flag to check stack underflow
R=ken DELTA=38 (36 added, 0 deleted, 2 changed) OCL=15482 CL=15491
This commit is contained in:
parent
d1d7dc6c42
commit
f74ec00278
@ -565,7 +565,7 @@ brloop(Prog *p)
|
|||||||
void
|
void
|
||||||
dostkoff(void)
|
dostkoff(void)
|
||||||
{
|
{
|
||||||
Prog *p, *q;
|
Prog *p, *q, *q1;
|
||||||
int32 autoffset, deltasp;
|
int32 autoffset, deltasp;
|
||||||
int a, f, curframe, curbecome, maxbecome, pcsize;
|
int a, f, curframe, curbecome, maxbecome, pcsize;
|
||||||
Prog *pmorestack;
|
Prog *pmorestack;
|
||||||
@ -667,8 +667,33 @@ dostkoff(void)
|
|||||||
autoffset = 0;
|
autoffset = 0;
|
||||||
|
|
||||||
q = P;
|
q = P;
|
||||||
|
q1 = P;
|
||||||
if(pmorestack != P)
|
if(pmorestack != P)
|
||||||
if(!(p->from.scale & NOSPLIT)) {
|
if(!(p->from.scale & NOSPLIT)) {
|
||||||
|
if(debug['K']) {
|
||||||
|
// 6l -K means check not only for stack
|
||||||
|
// overflow but stack underflow.
|
||||||
|
// On underflow, INT 3 (breakpoint).
|
||||||
|
// Underflow itself is rare but this also
|
||||||
|
// catches out-of-sync stack guard info.
|
||||||
|
p = appendp(p);
|
||||||
|
p->as = ACMPQ;
|
||||||
|
p->from.type = D_INDIR+D_R15;
|
||||||
|
p->from.offset = 8;
|
||||||
|
p->to.type = D_SP;
|
||||||
|
|
||||||
|
p = appendp(p);
|
||||||
|
p->as = AJHI;
|
||||||
|
p->to.type = D_BRANCH;
|
||||||
|
p->to.offset = 4;
|
||||||
|
q1 = p;
|
||||||
|
|
||||||
|
p = appendp(p);
|
||||||
|
p->as = AINT;
|
||||||
|
p->from.type = D_CONST;
|
||||||
|
p->from.offset = 3;
|
||||||
|
}
|
||||||
|
|
||||||
if(autoffset < 4096) { // do we need to call morestack
|
if(autoffset < 4096) { // do we need to call morestack
|
||||||
if(autoffset <= 75) {
|
if(autoffset <= 75) {
|
||||||
// small stack
|
// small stack
|
||||||
@ -676,7 +701,10 @@ dostkoff(void)
|
|||||||
p->as = ACMPQ;
|
p->as = ACMPQ;
|
||||||
p->from.type = D_SP;
|
p->from.type = D_SP;
|
||||||
p->to.type = D_INDIR+D_R15;
|
p->to.type = D_INDIR+D_R15;
|
||||||
|
if(q1) {
|
||||||
|
q1->pcond = p;
|
||||||
|
q1 = P;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// large stack
|
// large stack
|
||||||
p = appendp(p);
|
p = appendp(p);
|
||||||
@ -684,6 +712,10 @@ dostkoff(void)
|
|||||||
p->from.type = D_INDIR+D_SP;
|
p->from.type = D_INDIR+D_SP;
|
||||||
p->from.offset = -(autoffset-75);
|
p->from.offset = -(autoffset-75);
|
||||||
p->to.type = D_AX;
|
p->to.type = D_AX;
|
||||||
|
if(q1) {
|
||||||
|
q1->pcond = p;
|
||||||
|
q1 = P;
|
||||||
|
}
|
||||||
|
|
||||||
p = appendp(p);
|
p = appendp(p);
|
||||||
p->as = ACMPQ;
|
p->as = ACMPQ;
|
||||||
@ -704,6 +736,10 @@ dostkoff(void)
|
|||||||
p->from.type = D_CONST;
|
p->from.type = D_CONST;
|
||||||
p->from.offset = 0;
|
p->from.offset = 0;
|
||||||
p->to.type = D_AX;
|
p->to.type = D_AX;
|
||||||
|
if(q1) {
|
||||||
|
q1->pcond = p;
|
||||||
|
q1 = P;
|
||||||
|
}
|
||||||
|
|
||||||
/* 160 comes from 3 calls (3*8) 4 safes (4*8) and 104 guard */
|
/* 160 comes from 3 calls (3*8) 4 safes (4*8) and 104 guard */
|
||||||
if(autoffset+160 > 4096)
|
if(autoffset+160 > 4096)
|
||||||
|
Loading…
Reference in New Issue
Block a user