mirror of
https://github.com/golang/go
synced 2024-11-19 21:04:43 -07:00
5l/6l/8l: undo spadj cleanup at ARET for following instructions in the same stackframe.
5l was already correct, clarified comment and added diags for unmaintained code. R=rsc CC=golang-dev https://golang.org/cl/4277070
This commit is contained in:
parent
9d3b39986c
commit
14b9032f84
@ -364,14 +364,14 @@ noops(void)
|
||||
p = appendp(p);
|
||||
p->as = ABL;
|
||||
p->scond = C_SCOND_LO;
|
||||
p->to.type = D_BRANCH;
|
||||
p->to.type = D_BRANCH;
|
||||
p->to.sym = symmorestack;
|
||||
p->cond = pmorestack;
|
||||
|
||||
// MOVW.W R14,$-autosize(SP)
|
||||
p = appendp(p);
|
||||
p->as = AMOVW;
|
||||
p->scond |= C_WBIT;
|
||||
p->scond |= C_WBIT;
|
||||
p->from.type = D_REG;
|
||||
p->from.reg = REGLINK;
|
||||
p->to.type = D_OREG;
|
||||
@ -413,14 +413,14 @@ noops(void)
|
||||
// BL runtime.morestack(SB) // modifies LR
|
||||
p = appendp(p);
|
||||
p->as = ABL;
|
||||
p->to.type = D_BRANCH;
|
||||
p->to.type = D_BRANCH;
|
||||
p->to.sym = symmorestack;
|
||||
p->cond = pmorestack;
|
||||
|
||||
// MOVW.W R14,$-autosize(SP)
|
||||
p = appendp(p);
|
||||
p->as = AMOVW;
|
||||
p->scond |= C_WBIT;
|
||||
p->scond |= C_WBIT;
|
||||
p->from.type = D_REG;
|
||||
p->from.reg = REGLINK;
|
||||
p->to.type = D_OREG;
|
||||
@ -450,6 +450,8 @@ noops(void)
|
||||
}
|
||||
}
|
||||
if(thumb){
|
||||
diag("thumb not maintained");
|
||||
errorexit();
|
||||
if(cursym->text->mark & LEAF){
|
||||
if(autosize){
|
||||
p->as = AADD;
|
||||
@ -481,7 +483,7 @@ noops(void)
|
||||
q->to.type = D_REG;
|
||||
q->to.reg = REGSP;
|
||||
q->link = p->link;
|
||||
p->link = q;
|
||||
p->link = q;
|
||||
}
|
||||
else
|
||||
q = p;
|
||||
@ -492,6 +494,8 @@ noops(void)
|
||||
break;
|
||||
}
|
||||
if(foreign) {
|
||||
diag("foreign not maintained");
|
||||
errorexit();
|
||||
// if(foreign) print("ABXRET 3 %s\n", cursym->name);
|
||||
#define R 1
|
||||
p->as = AMOVW;
|
||||
@ -530,7 +534,9 @@ noops(void)
|
||||
p->from.reg = REGSP;
|
||||
p->to.type = D_REG;
|
||||
p->to.reg = REGPC;
|
||||
// no spadj because it doesn't fall through
|
||||
// If there are instructions following
|
||||
// this ARET, they come from a branch
|
||||
// with the same stackframe, so no spadj.
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -274,10 +274,10 @@ patch(void)
|
||||
if(HEADTYPE == Hwindows) {
|
||||
// Windows
|
||||
// Convert
|
||||
// op n(GS), reg
|
||||
// op n(GS), reg
|
||||
// to
|
||||
// MOVL 0x58(GS), reg
|
||||
// op n(reg), reg
|
||||
// op n(reg), reg
|
||||
// The purpose of this patch is to fix some accesses
|
||||
// to extern register variables (TLS) on Windows, as
|
||||
// a different method is used to access them.
|
||||
@ -674,6 +674,11 @@ dostkoff(void)
|
||||
p->spadj = -autoffset;
|
||||
p = appendp(p);
|
||||
p->as = ARET;
|
||||
// If there are instructions following
|
||||
// this ARET, they come from a branch
|
||||
// with the same stackframe, so undo
|
||||
// the cleanup.
|
||||
p->spadj = +autoffset;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -614,14 +614,17 @@ dostkoff(void)
|
||||
diag("unbalanced PUSH/POP");
|
||||
|
||||
if(autoffset) {
|
||||
q = p;
|
||||
p->as = AADJSP;
|
||||
p->from.type = D_CONST;
|
||||
p->from.offset = -autoffset;
|
||||
p->spadj = -autoffset;
|
||||
p = appendp(p);
|
||||
p->as = ARET;
|
||||
|
||||
q->as = AADJSP;
|
||||
q->from.type = D_CONST;
|
||||
q->from.offset = -autoffset;
|
||||
p->spadj = -autoffset;
|
||||
// If there are instructions following
|
||||
// this ARET, they come from a branch
|
||||
// with the same stackframe, so undo
|
||||
// the cleanup.
|
||||
p->spadj = +autoffset;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user