1
0
mirror of https://github.com/golang/go synced 2024-11-26 23:41:37 -07:00

debug/dwarf: handle surprising clang encoding

Fixes a bug in cgo on OS X using clang.
See golang.org/issue/6472 for details.

Fixes #6472.

R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/14575043
This commit is contained in:
Russ Cox 2013-10-09 11:08:22 -04:00
parent 7bbe0163c7
commit 0965459bd9
2 changed files with 53 additions and 12 deletions

View File

@ -0,0 +1,22 @@
// Copyright 2013 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 cgotest
/*
typedef struct
{
struct
{
int x;
} y[16];
} z;
*/
import "C"
func test6472() {
// nothing to run, just make sure this compiles
s := new(C.z)
println(s.y[0].x)
}

View File

@ -271,24 +271,43 @@ func (d *Data) Type(off Offset) (Type, error) {
// d.Type recursively, to handle circular types correctly.
var typ Type
nextDepth := 0
// Get next child; set err if error happens.
next := func() *Entry {
if !e.Children {
return nil
}
kid, err1 := r.Next()
if err1 != nil {
err = err1
return nil
// Only return direct children.
// Skip over composite entries that happen to be nested
// inside this one. Most DWARF generators wouldn't generate
// such a thing, but clang does.
// See golang.org/issue/6472.
for {
kid, err1 := r.Next()
if err1 != nil {
err = err1
return nil
}
if kid == nil {
err = DecodeError{"info", r.b.off, "unexpected end of DWARF entries"}
return nil
}
if kid.Tag == 0 {
if nextDepth > 0 {
nextDepth--
continue
}
return nil
}
if kid.Children {
nextDepth++
}
if nextDepth > 0 {
continue
}
return kid
}
if kid == nil {
err = DecodeError{"info", r.b.off, "unexpected end of DWARF entries"}
return nil
}
if kid.Tag == 0 {
return nil
}
return kid
}
// Get Type referred to by Entry's AttrType field.