[release-branch.go1.18] cmd/cgo: allow DW_TAG_variable's with no name

https://reviews.llvm.org/D123534 is emitting DW_TAG_variable's that don't have a DW_AT_name. This is allowed in the DWARF standard. It is adding DIE's for string literals for better symbolization on buffer overlows etc on these strings. They no associated name because they are not user provided variables.

Fixes #57044
Updates #53000

Change-Id: I2cf063160508687067c7672cef0517bccd707d7b
Reviewed-on: https://go-review.googlesource.com/c/go/+/406816
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Ian Lance Taylor <iant@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
(cherry picked from commit e66f895667)

Change-Id: I2cf063160508687067c7672cef0517bccd707d7b
GitHub-Last-Rev: 32208e4fa2
GitHub-Pull-Request: golang/go#57067
Reviewed-on: https://go-review.googlesource.com/c/go/+/455055
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
Alex Brachet 2022-12-03 18:52:26 +00:00 committed by David Chase
parent 6aa1e6d52d
commit e6adccb3c5
1 changed files with 16 additions and 1 deletions

View File

@ -577,8 +577,23 @@ func (p *Package) loadDWARF(f *File, conv *typeConv, names []*Name) {
switch e.Tag {
case dwarf.TagVariable:
name, _ := e.Val(dwarf.AttrName).(string)
// As of https://reviews.llvm.org/D123534, clang
// now emits DW_TAG_variable DIEs that have
// no name (so as to be able to describe the
// type and source locations of constant strings
// like the second arg in the call below:
//
// myfunction(42, "foo")
//
// If a var has no name we won't see attempts to
// refer to it via "C.<name>", so skip these vars
//
// See issue 53000 for more context.
if name == "" {
break
}
typOff, _ := e.Val(dwarf.AttrType).(dwarf.Offset)
if name == "" || typOff == 0 {
if typOff == 0 {
if e.Val(dwarf.AttrSpecification) != nil {
// Since we are reading all the DWARF,
// assume we will see the variable elsewhere.