Commit 9372166f authored by Than McIntosh's avatar Than McIntosh

cmd/compile: fix DWARF type symbol buglet

The code that generates the list of DWARF variables for a function
(params and autos) will emit a "no-location" entry in the DWARF for a
user var that appears in the original pre-optimization version of the
function but is no longer around when optimization is complete. The
intent is that if a GDB user types "print foo" (where foo has been
optimized out), the response will be "<optimized out>" as opposed to
"there is no such variable 'foo'). This change fixes said code to
include vars on the autom list for the function, to insure that the
type symbol for the variable makes it to the linker.

Fixes #22941.

Change-Id: Id29f1f39d68fbb798602dfd6728603040624fc41
Reviewed-on: https://go-review.googlesource.com/81415
Run-TryBot: Than McIntosh <thanm@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarDavid Chase <drchase@google.com>
Reviewed-by: 's avatarCherry Zhang <cherryyz@google.com>
parent 0c0c3c18
......@@ -558,6 +558,18 @@ func createDwarfVars(fnsym *obj.LSym, debugInfo *ssa.FuncDebug, automDecls []*No
InlIndex: int32(inlIndex),
ChildIndex: -1,
})
// Note: the auto that we're appending here is simply to insure
// that the DWARF type in question is picked up by the linker --
// there isn't a real auto variable with this name. This is
// to fix issue 22941.
gotype := ngotype(n).Linksym()
fnsym.Func.Autom = append(fnsym.Func.Autom, &obj.Auto{
Asym: Ctxt.Lookup(n.Sym.Name),
Aoffset: int32(-1),
Name: obj.NAME_AUTO,
Gotype: gotype,
})
}
// Parameter and local variable names are given middle dot
......
// Copyright 2017 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 q
type P int
// Copyright 2017 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
import q "./a"
type T struct {
X *q.P
}
func F(in, out *T) {
*out = *in
if in.X != nil {
in, out := &in.X, &out.X
if *in == nil {
*out = nil
} else {
*out = new(q.P)
**out = **in
}
}
return
}
//go:noinline
func G(x, y *T) {
F(x, y)
}
// Copyright 2017 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 main
import p "./b"
var G int
func main() {
if G == 101 {
p.G(nil, nil)
}
}
// rundir
// Copyright 2017 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 ignored
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment