From 9372166faa1bf04f0d83706da2b33ed2659ee976 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Fri, 1 Dec 2017 09:39:59 -0500 Subject: [PATCH] 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 "" 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 TryBot-Result: Gobot Gobot Reviewed-by: David Chase Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/gc/pgen.go | 12 +++++++++++ test/fixedbugs/issue22941.dir/a.go | 7 +++++++ test/fixedbugs/issue22941.dir/b.go | 30 +++++++++++++++++++++++++++ test/fixedbugs/issue22941.dir/main.go | 15 ++++++++++++++ test/fixedbugs/issue22941.go | 7 +++++++ 5 files changed, 71 insertions(+) create mode 100644 test/fixedbugs/issue22941.dir/a.go create mode 100644 test/fixedbugs/issue22941.dir/b.go create mode 100644 test/fixedbugs/issue22941.dir/main.go create mode 100644 test/fixedbugs/issue22941.go diff --git a/src/cmd/compile/internal/gc/pgen.go b/src/cmd/compile/internal/gc/pgen.go index 39da514d53..3d099ad6c0 100644 --- a/src/cmd/compile/internal/gc/pgen.go +++ b/src/cmd/compile/internal/gc/pgen.go @@ -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 diff --git a/test/fixedbugs/issue22941.dir/a.go b/test/fixedbugs/issue22941.dir/a.go new file mode 100644 index 0000000000..7a4ede438f --- /dev/null +++ b/test/fixedbugs/issue22941.dir/a.go @@ -0,0 +1,7 @@ +// 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 diff --git a/test/fixedbugs/issue22941.dir/b.go b/test/fixedbugs/issue22941.dir/b.go new file mode 100644 index 0000000000..87d59a6764 --- /dev/null +++ b/test/fixedbugs/issue22941.dir/b.go @@ -0,0 +1,30 @@ +// 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) +} diff --git a/test/fixedbugs/issue22941.dir/main.go b/test/fixedbugs/issue22941.dir/main.go new file mode 100644 index 0000000000..84666adf0d --- /dev/null +++ b/test/fixedbugs/issue22941.dir/main.go @@ -0,0 +1,15 @@ +// 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) + } +} diff --git a/test/fixedbugs/issue22941.go b/test/fixedbugs/issue22941.go new file mode 100644 index 0000000000..c3732c311b --- /dev/null +++ b/test/fixedbugs/issue22941.go @@ -0,0 +1,7 @@ +// 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 -- 2.50.0