From 9bba63bbbe43ee6370367220feb46717ec50ea9c Mon Sep 17 00:00:00 2001 From: David Chase Date: Mon, 18 Nov 2019 14:14:22 -0500 Subject: [PATCH] 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 TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/gc/ssa.go | 3 +++ src/cmd/internal/src/xpos.go | 4 ++++ test/fixedbugs/issue35652.go | 15 +++++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 test/fixedbugs/issue35652.go diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index fa4fd058d7..96fbddb5cd 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -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 diff --git a/src/cmd/internal/src/xpos.go b/src/cmd/internal/src/xpos.go index 54fe64cf86..23c8346757 100644 --- a/src/cmd/internal/src/xpos.go +++ b/src/cmd/internal/src/xpos.go @@ -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 } diff --git a/test/fixedbugs/issue35652.go b/test/fixedbugs/issue35652.go new file mode 100644 index 0000000000..1ae4069755 --- /dev/null +++ b/test/fixedbugs/issue35652.go @@ -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 + } + } +} -- 2.50.0