mirror of
https://github.com/golang/go
synced 2024-11-26 23:51:29 -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:
parent
7bbe0163c7
commit
0965459bd9
22
misc/cgo/test/issue6472.go
Normal file
22
misc/cgo/test/issue6472.go
Normal 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)
|
||||||
|
}
|
@ -271,24 +271,43 @@ func (d *Data) Type(off Offset) (Type, error) {
|
|||||||
// d.Type recursively, to handle circular types correctly.
|
// d.Type recursively, to handle circular types correctly.
|
||||||
var typ Type
|
var typ Type
|
||||||
|
|
||||||
|
nextDepth := 0
|
||||||
|
|
||||||
// Get next child; set err if error happens.
|
// Get next child; set err if error happens.
|
||||||
next := func() *Entry {
|
next := func() *Entry {
|
||||||
if !e.Children {
|
if !e.Children {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
kid, err1 := r.Next()
|
// Only return direct children.
|
||||||
if err1 != nil {
|
// Skip over composite entries that happen to be nested
|
||||||
err = err1
|
// inside this one. Most DWARF generators wouldn't generate
|
||||||
return nil
|
// 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.
|
// Get Type referred to by Entry's AttrType field.
|
||||||
|
Loading…
Reference in New Issue
Block a user