spfix.As = obj.ANOP
spfix.Spadj = -framesize
- pcdata := obj.Appendp(spfix, c.newprog)
- pcdata.Pos = c.cursym.Func.Text.Pos
- pcdata.As = obj.APCDATA
- pcdata.From.Type = obj.TYPE_CONST
- pcdata.From.Offset = objabi.PCDATA_StackMapIndex
- pcdata.To.Type = obj.TYPE_CONST
- pcdata.To.Offset = -1 // pcdata starts at -1 at function entry
+ pcdata := c.ctxt.EmitEntryLiveness(c.cursym, spfix, c.newprog)
// MOVW LR, R3
movw := obj.Appendp(pcdata, c.newprog)
spfix.As = obj.ANOP
spfix.Spadj = -framesize
- pcdata := obj.Appendp(spfix, c.newprog)
- pcdata.Pos = c.cursym.Func.Text.Pos
- pcdata.As = obj.APCDATA
- pcdata.From.Type = obj.TYPE_CONST
- pcdata.From.Offset = objabi.PCDATA_StackMapIndex
- pcdata.To.Type = obj.TYPE_CONST
- pcdata.To.Offset = -1 // pcdata starts at -1 at function entry
+ pcdata := c.ctxt.EmitEntryLiveness(c.cursym, spfix, c.newprog)
// MOV LR, R3
movlr := obj.Appendp(pcdata, c.newprog)
p.Mark |= LABEL
}
+ p = c.ctxt.EmitEntryLiveness(c.cursym, p, c.newprog)
+
// JAL runtime.morestack(SB)
p = obj.Appendp(p, c.newprog)
s.Type = objabi.STLSBSS
}
}
+
+// EmitEntryLiveness generates PCDATA Progs after p to switch to the
+// liveness map active at the entry of function s. It returns the last
+// Prog generated.
+func (ctxt *Link) EmitEntryLiveness(s *LSym, p *Prog, newprog ProgAlloc) *Prog {
+ pcdata := Appendp(p, newprog)
+ pcdata.Pos = s.Func.Text.Pos
+ pcdata.As = APCDATA
+ pcdata.From.Type = TYPE_CONST
+ pcdata.From.Offset = objabi.PCDATA_StackMapIndex
+ pcdata.To.Type = TYPE_CONST
+ pcdata.To.Offset = -1 // pcdata starts at -1 at function entry
+
+ return pcdata
+}
q.Pcond = p
}
+ p = c.ctxt.EmitEntryLiveness(c.cursym, p, c.newprog)
+
var morestacksym *obj.LSym
if c.cursym.CFunc() {
morestacksym = c.ctxt.Lookup("runtime.morestackc")
spfix.As = obj.ANOP
spfix.Spadj = -framesize
- pcdata := obj.Appendp(spfix, c.newprog)
- pcdata.Pos = c.cursym.Func.Text.Pos
- pcdata.As = obj.APCDATA
- pcdata.From.Type = obj.TYPE_CONST
- pcdata.From.Offset = objabi.PCDATA_StackMapIndex
- pcdata.To.Type = obj.TYPE_CONST
- pcdata.To.Offset = -1 // pcdata starts at -1 at function entry
+ pcdata := c.ctxt.EmitEntryLiveness(c.cursym, spfix, c.newprog)
// MOVD LR, R5
p = obj.Appendp(pcdata, c.newprog)
spfix.As = obj.ANOP
spfix.Spadj = -framesize
- pcdata := obj.Appendp(spfix, newprog)
- pcdata.Pos = cursym.Func.Text.Pos
- pcdata.As = obj.APCDATA
- pcdata.From.Type = obj.TYPE_CONST
- pcdata.From.Offset = objabi.PCDATA_StackMapIndex
- pcdata.To.Type = obj.TYPE_CONST
- pcdata.To.Offset = -1 // pcdata starts at -1 at function entry
+ pcdata := ctxt.EmitEntryLiveness(cursym, spfix, newprog)
call := obj.Appendp(pcdata, newprog)
call.Pos = cursym.Func.Text.Pos