mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.regabi] cmd/compile: add code to support register ABI spills around morestack calls
This is a selected copy from the register ABI experiment CL, focused on the files and data structures that handle spilling around morestack. Unnecessary code from the experiment was removed, other code was adapted. Would it make sense to leave comments in the experiment as pieces are brought over? Experiment CL (for comparison purposes) https://go-review.googlesource.com/c/go/+/28832 Change-Id: I92136f070351d4fcca1407b52ecf9b80898fed95 Reviewed-on: https://go-review.googlesource.com/c/go/+/279520 Trust: David Chase <drchase@google.com> Run-TryBot: David Chase <drchase@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Jeremy Faller <jeremy@golang.org>
This commit is contained in:
parent
2abd24f3b7
commit
c1370e918f
4 changed files with 76 additions and 7 deletions
|
|
@ -1114,7 +1114,8 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, newprog obj.ProgA
|
|||
spfix.Spadj = -framesize
|
||||
|
||||
pcdata := ctxt.EmitEntryStackMap(cursym, spfix, newprog)
|
||||
pcdata = ctxt.StartUnsafePoint(pcdata, newprog)
|
||||
spill := ctxt.StartUnsafePoint(pcdata, newprog)
|
||||
pcdata = ctxt.SpillRegisterArgs(spill, newprog)
|
||||
|
||||
call := obj.Appendp(pcdata, newprog)
|
||||
call.Pos = cursym.Func().Text.Pos
|
||||
|
|
@ -1139,7 +1140,8 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, newprog obj.ProgA
|
|||
progedit(ctxt, callend.Link, newprog)
|
||||
}
|
||||
|
||||
pcdata = ctxt.EndUnsafePoint(callend, newprog, -1)
|
||||
pcdata = ctxt.UnspillRegisterArgs(callend, newprog)
|
||||
pcdata = ctxt.EndUnsafePoint(pcdata, newprog, -1)
|
||||
|
||||
jmp := obj.Appendp(pcdata, newprog)
|
||||
jmp.As = obj.AJMP
|
||||
|
|
@ -1147,9 +1149,9 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, newprog obj.ProgA
|
|||
jmp.To.SetTarget(cursym.Func().Text.Link)
|
||||
jmp.Spadj = +framesize
|
||||
|
||||
jls.To.SetTarget(call)
|
||||
jls.To.SetTarget(spill)
|
||||
if q1 != nil {
|
||||
q1.To.SetTarget(call)
|
||||
q1.To.SetTarget(spill)
|
||||
}
|
||||
|
||||
return end
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue