Commit 0a3c991f authored by Russ Cox's avatar Russ Cox

cmd/internal/obj: fix pc/sp information for prologue

When the prologue call to morestack was moved down to the
bottom of the function, the pc/sp tables were not updated.
If a traceback through a call to morestack is needed, it would
get confused at and stop at morestack.

Confirmed the fix by adding //go:systemstack (which calls
morestackc, but same issue) where it did not belong
and inspecting the crash.

Change-Id: Id0294bb9dba51ef1a49154637228fb57f1086a94
Reviewed-on: https://go-review.googlesource.com/12144Reviewed-by: default avatarRob Pike <r@golang.org>
parent 0c72eeb1
...@@ -804,8 +804,12 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32) *obj.Prog { ...@@ -804,8 +804,12 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32) *obj.Prog {
for last = ctxt.Cursym.Text; last.Link != nil; last = last.Link { for last = ctxt.Cursym.Text; last.Link != nil; last = last.Link {
} }
spfix := obj.Appendp(ctxt, last)
spfix.As = obj.ANOP
spfix.Spadj = -framesize
// MOVW LR, R3 // MOVW LR, R3
movw := obj.Appendp(ctxt, last) movw := obj.Appendp(ctxt, spfix)
movw.As = AMOVW movw.As = AMOVW
movw.From.Type = obj.TYPE_REG movw.From.Type = obj.TYPE_REG
movw.From.Reg = REGLINK movw.From.Reg = REGLINK
...@@ -833,6 +837,10 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32) *obj.Prog { ...@@ -833,6 +837,10 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32) *obj.Prog {
b.To.Type = obj.TYPE_BRANCH b.To.Type = obj.TYPE_BRANCH
b.Pcond = ctxt.Cursym.Text.Link b.Pcond = ctxt.Cursym.Text.Link
spfix = obj.Appendp(ctxt, b)
spfix.As = obj.ANOP
spfix.Spadj = +framesize
return bls return bls
} }
......
...@@ -161,8 +161,12 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32) *obj.Prog { ...@@ -161,8 +161,12 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32) *obj.Prog {
for last = ctxt.Cursym.Text; last.Link != nil; last = last.Link { for last = ctxt.Cursym.Text; last.Link != nil; last = last.Link {
} }
spfix := obj.Appendp(ctxt, last)
spfix.As = obj.ANOP
spfix.Spadj = -framesize
// MOV LR, R3 // MOV LR, R3
movlr := obj.Appendp(ctxt, last) movlr := obj.Appendp(ctxt, spfix)
movlr.As = AMOVD movlr.As = AMOVD
movlr.From.Type = obj.TYPE_REG movlr.From.Type = obj.TYPE_REG
movlr.From.Reg = REGLINK movlr.From.Reg = REGLINK
...@@ -202,6 +206,10 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32) *obj.Prog { ...@@ -202,6 +206,10 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32) *obj.Prog {
jmp.To.Type = obj.TYPE_BRANCH jmp.To.Type = obj.TYPE_BRANCH
jmp.Pcond = ctxt.Cursym.Text.Link jmp.Pcond = ctxt.Cursym.Text.Link
spfix = obj.Appendp(ctxt, jmp)
spfix.As = obj.ANOP
spfix.Spadj = +framesize
// placeholder for bls's jump target // placeholder for bls's jump target
// p = obj.Appendp(ctxt, p) // p = obj.Appendp(ctxt, p)
// p.As = obj.ANOP // p.As = obj.ANOP
......
...@@ -975,7 +975,12 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32, textarg int32) *ob ...@@ -975,7 +975,12 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32, textarg int32) *ob
for last = ctxt.Cursym.Text; last.Link != nil; last = last.Link { for last = ctxt.Cursym.Text; last.Link != nil; last = last.Link {
} }
call := obj.Appendp(ctxt, last) // Explain to PC-line tables that there is no frame here.
spfix := obj.Appendp(ctxt, last)
spfix.As = obj.ANOP
spfix.Spadj = -framesize
call := obj.Appendp(ctxt, spfix)
call.Lineno = ctxt.Cursym.Text.Lineno call.Lineno = ctxt.Cursym.Text.Lineno
call.Mode = ctxt.Cursym.Text.Mode call.Mode = ctxt.Cursym.Text.Mode
call.As = obj.ACALL call.As = obj.ACALL
...@@ -994,6 +999,10 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32, textarg int32) *ob ...@@ -994,6 +999,10 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32, textarg int32) *ob
jmp.To.Type = obj.TYPE_BRANCH jmp.To.Type = obj.TYPE_BRANCH
jmp.Pcond = ctxt.Cursym.Text.Link jmp.Pcond = ctxt.Cursym.Text.Link
spfix = obj.Appendp(ctxt, jmp)
spfix.As = obj.ANOP
spfix.Spadj = +framesize
jls.Pcond = call jls.Pcond = call
if q1 != nil { if q1 != nil {
q1.Pcond = call q1.Pcond = call
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment