cmd/compile: handle degenerate entry blocks in -N debug gen

The code that created DWARF debug var locations for input parameters
in the non-optimized case for regabi was not doing the right thing for
degenerate functions with infinite loops. Detect these cases and don't
try to emit the normal location data.

Fixes #45948.

Change-Id: I2717fc4bac2e03d5d850a6ec8a09ed05fed0c896
Reviewed-on: https://go-review.googlesource.com/c/go/+/316752
Trust: Than McIntosh <thanm@google.com>
Run-TryBot: Than McIntosh <thanm@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
Than McIntosh 2021-05-04 16:18:56 -04:00
parent 4df662fb37
commit 66ce8aa88d
2 changed files with 25 additions and 3 deletions

View file

@ -1362,9 +1362,6 @@ func BuildFuncDebugNoOptimized(ctxt *obj.Link, f *Func, loggingEnabled bool, sta
// Locate the value corresponding to the last spill of
// an input register.
afterPrologVal := locatePrologEnd(f)
if afterPrologVal == ID(-1) {
panic(fmt.Sprintf("internal error: f=%s: can't locate after prolog value", f.Name))
}
// Walk the input params again and process the register-resident elements.
pidx := 0
@ -1381,6 +1378,15 @@ func BuildFuncDebugNoOptimized(ctxt *obj.Link, f *Func, loggingEnabled bool, sta
slid := len(fd.VarSlots)
fd.VarSlots = append(fd.VarSlots, []SlotID{SlotID(slid)})
if afterPrologVal == ID(-1) {
// This can happen for degenerate functions with infinite
// loops such as that in issue 45948. In such cases, leave
// the var/slot set up for the param, but don't try to
// emit a location list.
pidx++
continue
}
// Param is arriving in one or more registers. We need a 2-element
// location expression for it. First entry in location list
// will correspond to lifetime in input registers.

View file

@ -0,0 +1,16 @@
// compile -N
// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Issue 45948: assert in debug generation for degenerate
// function with infinite loop.
package p
func f(p int) {
L:
goto L
}