mirror of https://github.com/golang/go.git
cmd/compile: make a better bogus line for empty infinite loops
The old recipe for making an infinite loop not be infinite in the debugger could create an instruction (Prog) with a line number not tied to any file (index == 0). This caused downstream failures in DWARF processing. So don't do that. Also adds a test, also adds a check+panic to ensure that the next time this happens the error is less mystifying. Fixes #35652 Change-Id: I04f30bc94fdc4aef20dd9130561303ff84fd945e Reviewed-on: https://go-review.googlesource.com/c/go/+/207613 Run-TryBot: David Chase <drchase@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
647741721c
commit
9bba63bbbe
|
|
@ -6041,6 +6041,9 @@ func genssa(f *ssa.Func, pp *Progs) {
|
|||
if s.bstart[b.ID] == s.pp.next && len(b.Succs) == 1 && b.Succs[0].Block() == b {
|
||||
p := thearch.Ginsnop(s.pp)
|
||||
p.Pos = p.Pos.WithIsStmt()
|
||||
if b.Pos == src.NoXPos {
|
||||
b.Pos = p.Pos // It needs a file, otherwise a no-file non-zero line causes confusion. See #35652.
|
||||
}
|
||||
b.Pos = b.Pos.WithBogusLine() // Debuggers are not good about infinite loops, force a change in line number
|
||||
}
|
||||
// Emit control flow instructions for block
|
||||
|
|
|
|||
|
|
@ -71,6 +71,10 @@ func (p XPos) WithIsStmt() XPos {
|
|||
// gdb chooses not to display the bogus line; delve shows it with a complaint, but the
|
||||
// alternative behavior is to hang.
|
||||
func (p XPos) WithBogusLine() XPos {
|
||||
if p.index == 0 {
|
||||
// See #35652
|
||||
panic("Assigning a bogus line to XPos with no file will cause mysterious downstream failures.")
|
||||
}
|
||||
p.lico = makeBogusLico()
|
||||
return p
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,15 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2019 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.
|
||||
|
||||
package p
|
||||
|
||||
func f() {
|
||||
for true {
|
||||
if true {
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue