mirror of https://github.com/golang/go.git
cmd/internal/obj: fix inline marker issue on s390x
The optimization that replaces inline markers with pre-existing instructions assumes that 'Prog' values produced by the compiler are still reachable after the assembler has run. This was not true on s390x where the assembler was removing NOP instructions from the linked list of 'Prog' values. This led to broken inlining data which in turn caused an infinite loop in the runtime traceback code. Fix this by stopping the s390x assembler backend removing NOP values. It does not make any difference to the output of the assembler because NOP instructions are 0 bytes long anyway. Fixes #40473. Change-Id: Ib4fabadd1de8adb80421f75950ee9aad2111147a Reviewed-on: https://go-review.googlesource.com/c/go/+/247697 Run-TryBot: Michael Munday <mike.munday@ibm.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
cde5fd1c0f
commit
d0d6593d1d
|
|
@ -278,6 +278,21 @@ func linkpcln(ctxt *Link, cursym *LSym) {
|
|||
funcpctab(ctxt, &pcln.Pcfile, cursym, "pctofile", pctofileline, pcln)
|
||||
funcpctab(ctxt, &pcln.Pcline, cursym, "pctoline", pctofileline, nil)
|
||||
|
||||
// Check that all the Progs used as inline markers are still reachable.
|
||||
// See issue #40473.
|
||||
inlMarkProgs := make(map[*Prog]struct{}, len(cursym.Func.InlMarks))
|
||||
for _, inlMark := range cursym.Func.InlMarks {
|
||||
inlMarkProgs[inlMark.p] = struct{}{}
|
||||
}
|
||||
for p := cursym.Func.Text; p != nil; p = p.Link {
|
||||
if _, ok := inlMarkProgs[p]; ok {
|
||||
delete(inlMarkProgs, p)
|
||||
}
|
||||
}
|
||||
if len(inlMarkProgs) > 0 {
|
||||
ctxt.Diag("one or more instructions used as inline markers are no longer reachable")
|
||||
}
|
||||
|
||||
pcinlineState := new(pcinlineState)
|
||||
funcpctab(ctxt, &pcln.Pcinline, cursym, "pctoinline", pcinlineState.pctoinline, nil)
|
||||
for _, inlMark := range cursym.Func.InlMarks {
|
||||
|
|
|
|||
|
|
@ -283,17 +283,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
|||
ACMPUBNE:
|
||||
q = p
|
||||
p.Mark |= BRANCH
|
||||
if p.Pcond != nil {
|
||||
q := p.Pcond
|
||||
for q.As == obj.ANOP {
|
||||
q = q.Link
|
||||
p.Pcond = q
|
||||
}
|
||||
}
|
||||
|
||||
case obj.ANOP:
|
||||
q.Link = p.Link /* q is non-nop */
|
||||
p.Link.Mark |= p.Mark
|
||||
|
||||
default:
|
||||
q = p
|
||||
|
|
|
|||
Loading…
Reference in New Issue