]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix buglet in inlined info abstract function dwarf-gen
authorThan McIntosh <thanm@google.com>
Wed, 17 Feb 2021 20:51:05 +0000 (15:51 -0500)
committerThan McIntosh <thanm@google.com>
Fri, 19 Feb 2021 14:46:21 +0000 (14:46 +0000)
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>

src/cmd/compile/internal/dwarfgen/scope.go
test/fixedbugs/issue44344.go [new file with mode: 0644]

index 1c040edc2842391cdc544de6280c3afad83f8e14..4957e24e447978cc504d84009fefbe2f016d6270 100644 (file)
@@ -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 (file)
index 0000000..06c4cb6
--- /dev/null
@@ -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])
+       }
+}