]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: handle degenerate entry blocks in -N debug gen
authorThan McIntosh <thanm@google.com>
Tue, 4 May 2021 20:18:56 +0000 (16:18 -0400)
committerThan McIntosh <thanm@google.com>
Wed, 5 May 2021 01:47:58 +0000 (01:47 +0000)
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>

src/cmd/compile/internal/ssa/debug.go
test/fixedbugs/issue45948.go [new file with mode: 0644]

index ee522f41ef9c3592698e25067908fba57e50695b..2f379c9e2c4e2e975030e949872e30a9222b4be3 100644 (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.
diff --git a/test/fixedbugs/issue45948.go b/test/fixedbugs/issue45948.go
new file mode 100644 (file)
index 0000000..37f8e70
--- /dev/null
@@ -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
+
+}