mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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:
parent
4df662fb37
commit
66ce8aa88d
2 changed files with 25 additions and 3 deletions
|
|
@ -1362,9 +1362,6 @@ func BuildFuncDebugNoOptimized(ctxt *obj.Link, f *Func, loggingEnabled bool, sta
|
||||||
// Locate the value corresponding to the last spill of
|
// Locate the value corresponding to the last spill of
|
||||||
// an input register.
|
// an input register.
|
||||||
afterPrologVal := locatePrologEnd(f)
|
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.
|
// Walk the input params again and process the register-resident elements.
|
||||||
pidx := 0
|
pidx := 0
|
||||||
|
|
@ -1381,6 +1378,15 @@ func BuildFuncDebugNoOptimized(ctxt *obj.Link, f *Func, loggingEnabled bool, sta
|
||||||
slid := len(fd.VarSlots)
|
slid := len(fd.VarSlots)
|
||||||
fd.VarSlots = append(fd.VarSlots, []SlotID{SlotID(slid)})
|
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
|
// Param is arriving in one or more registers. We need a 2-element
|
||||||
// location expression for it. First entry in location list
|
// location expression for it. First entry in location list
|
||||||
// will correspond to lifetime in input registers.
|
// will correspond to lifetime in input registers.
|
||||||
|
|
|
||||||
16
test/fixedbugs/issue45948.go
Normal file
16
test/fixedbugs/issue45948.go
Normal 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
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue