mirror of
https://github.com/golang/go
synced 2024-11-26 04:07:59 -07: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
@ -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.
|
||||
|
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…
Reference in New Issue
Block a user