diff options
author | Austin Clements <austin@google.com> | 2014-10-27 17:19:41 -0400 |
---|---|---|
committer | Austin Clements <austin@google.com> | 2014-10-27 17:19:41 -0400 |
commit | 6be0c8a566f6747fd18e9f5f49df37a6cd289407 (patch) | |
tree | b8d0406393787a75aa9b0a5b90a7497b4ff97fc4 | |
parent | 5a653089ef756ecda170e4ee030480d547496362 (diff) | |
download | go-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.c | 7 |
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); |