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/12144
Reviewed-by: Rob Pike <r@golang.org>
diff --git a/src/cmd/internal/obj/arm/obj5.go b/src/cmd/internal/obj/arm/obj5.go
index ce1cad9..15534e6 100644
--- a/src/cmd/internal/obj/arm/obj5.go
+++ b/src/cmd/internal/obj/arm/obj5.go
@@ -804,8 +804,12 @@
 	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 := obj.Appendp(ctxt, last)
+	movw := obj.Appendp(ctxt, spfix)
 	movw.As = AMOVW
 	movw.From.Type = obj.TYPE_REG
 	movw.From.Reg = REGLINK
@@ -833,6 +837,10 @@
 	b.To.Type = obj.TYPE_BRANCH
 	b.Pcond = ctxt.Cursym.Text.Link
 
+	spfix = obj.Appendp(ctxt, b)
+	spfix.As = obj.ANOP
+	spfix.Spadj = +framesize
+
 	return bls
 }
 
diff --git a/src/cmd/internal/obj/arm64/obj7.go b/src/cmd/internal/obj/arm64/obj7.go
index 77117fb..91088c1 100644
--- a/src/cmd/internal/obj/arm64/obj7.go
+++ b/src/cmd/internal/obj/arm64/obj7.go
@@ -161,8 +161,12 @@
 	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
-	movlr := obj.Appendp(ctxt, last)
+	movlr := obj.Appendp(ctxt, spfix)
 	movlr.As = AMOVD
 	movlr.From.Type = obj.TYPE_REG
 	movlr.From.Reg = REGLINK
@@ -202,6 +206,10 @@
 	jmp.To.Type = obj.TYPE_BRANCH
 	jmp.Pcond = ctxt.Cursym.Text.Link
 
+	spfix = obj.Appendp(ctxt, jmp)
+	spfix.As = obj.ANOP
+	spfix.Spadj = +framesize
+
 	// placeholder for bls's jump target
 	// p = obj.Appendp(ctxt, p)
 	// p.As = obj.ANOP
diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go
index fa9c474..5ee097e 100644
--- a/src/cmd/internal/obj/x86/obj6.go
+++ b/src/cmd/internal/obj/x86/obj6.go
@@ -975,7 +975,12 @@
 	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.Mode = ctxt.Cursym.Text.Mode
 	call.As = obj.ACALL
@@ -994,6 +999,10 @@
 	jmp.To.Type = obj.TYPE_BRANCH
 	jmp.Pcond = ctxt.Cursym.Text.Link
 
+	spfix = obj.Appendp(ctxt, jmp)
+	spfix.As = obj.ANOP
+	spfix.Spadj = +framesize
+
 	jls.Pcond = call
 	if q1 != nil {
 		q1.Pcond = call