aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThan McIntosh <thanm@google.com>2021-02-17 15:51:05 -0500
committerThan McIntosh <thanm@google.com>2021-02-19 14:46:21 +0000
commitfce2a94d84dd5e39e0d53e60beda22da7b6f55b0 (patch)
treec0910d1f727b141bbce2d98468d23e846e123646
parent7764ee5614df2228e03326487af7670c7c5d268a (diff)
downloadgo-fce2a94d84dd5e39e0d53e60beda22da7b6f55b0.tar.xz
cmd/compile: fix buglet in inlined info abstract function dwarf-gen
When generating DWARF inlined info records, it's possible to have a local function whose only callsites are inlined away, meaning that we emit an abstract function DIE but no regular subprogram DIE. When emitting DWARF scope info we need to handle this case (specifically when scoping PCs, check for the case that the func in question has been entirely deleted). Fixes #44344. Change-Id: I9f5bc692f225aa4c5c23f7bd2e50bcf7fe4fc5f3 Reviewed-on: https://go-review.googlesource.com/c/go/+/293309 TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com> Reviewed-by: Russ Cox <rsc@golang.org> Trust: Than McIntosh <thanm@google.com> Run-TryBot: Than McIntosh <thanm@google.com>
-rw-r--r--src/cmd/compile/internal/dwarfgen/scope.go4
-rw-r--r--test/fixedbugs/issue44344.go30
2 files changed, 33 insertions, 1 deletions
diff --git a/src/cmd/compile/internal/dwarfgen/scope.go b/src/cmd/compile/internal/dwarfgen/scope.go
index 1c040edc28..4957e24e44 100644
--- a/src/cmd/compile/internal/dwarfgen/scope.go
+++ b/src/cmd/compile/internal/dwarfgen/scope.go
@@ -37,7 +37,9 @@ func assembleScopes(fnsym *obj.LSym, fn *ir.Func, dwarfVars []*dwarf.Var, varSco
}
scopeVariables(dwarfVars, varScopes, dwarfScopes)
- scopePCs(fnsym, fn.Marks, dwarfScopes)
+ if fnsym.Func().Text != nil {
+ scopePCs(fnsym, fn.Marks, dwarfScopes)
+ }
return compactScopes(dwarfScopes)
}
diff --git a/test/fixedbugs/issue44344.go b/test/fixedbugs/issue44344.go
new file mode 100644
index 0000000000..06c4cb6cb8
--- /dev/null
+++ b/test/fixedbugs/issue44344.go
@@ -0,0 +1,30 @@
+// compile
+
+// 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 #44344: a crash in DWARF scope generation (trying to
+// scope the PCs of a function that was inlined away).
+
+package main
+
+func main() {
+ pv := []int{3, 4, 5}
+ if pv[1] != 9 {
+ pv = append(pv, 9)
+ }
+ tryit := func() bool {
+ lpv := len(pv)
+ if lpv == 101 {
+ return false
+ }
+ if worst := pv[pv[1]&1]; worst != 101 {
+ return true
+ }
+ return false
+ }()
+ if tryit {
+ println(pv[0])
+ }
+}