aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2014-10-27 17:19:41 -0400
committerAustin Clements <austin@google.com>2014-10-27 17:19:41 -0400
commit6be0c8a566f6747fd18e9f5f49df37a6cd289407 (patch)
treeb8d0406393787a75aa9b0a5b90a7497b4ff97fc4
parent5a653089ef756ecda170e4ee030480d547496362 (diff)
downloadgo-6be0c8a566f6747fd18e9f5f49df37a6cd289407.tar.gz
go-6be0c8a566f6747fd18e9f5f49df37a6cd289407.zip
[dev.power64] liblink: fix lost branch target
A recent commit lost the branch target in the really-big-stack case of splitstack, causing an infinite loop stack preempt case. Revive the branch target. LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/157790044
-rw-r--r--src/liblink/obj9.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/liblink/obj9.c b/src/liblink/obj9.c
index fa8af5f839..3db08c5450 100644
--- a/src/liblink/obj9.c
+++ b/src/liblink/obj9.c
@@ -703,7 +703,7 @@ addstacksplit(Link *ctxt, LSym *cursym)
static Prog*
stacksplit(Link *ctxt, Prog *p, int32 framesize, int noctxt)
{
- Prog *q1;
+ Prog *q, *q1;
// MOVD g_stackguard(g), R3
p = appendp(ctxt, p);
@@ -716,6 +716,7 @@ stacksplit(Link *ctxt, Prog *p, int32 framesize, int noctxt)
p->to.type = D_REG;
p->to.reg = 3;
+ q = nil;
if(framesize <= StackSmall) {
// small stack: SP < stackguard
// CMP stackguard, SP
@@ -766,7 +767,7 @@ stacksplit(Link *ctxt, Prog *p, int32 framesize, int noctxt)
p->to.type = D_CONST;
p->to.offset = StackPreempt;
- p = appendp(ctxt, p);
+ q = p = appendp(ctxt, p);
p->as = ABEQ;
p->to.type = D_BRANCH;
@@ -812,6 +813,8 @@ stacksplit(Link *ctxt, Prog *p, int32 framesize, int noctxt)
p->from.offset = D_LR;
p->to.type = D_REG;
p->to.reg = 5;
+ if(q)
+ q->pcond = p;
// BL runtime.morestack(SB)
p = appendp(ctxt, p);