Skip to content

Commit a7d9d5a

Browse files
committed
cmd/cgo: move typedefs and typedefList out of Package
Theyre moved into a new fileTypedefs type so we can better keep track of their lifetime. For golang#75167 Change-Id: I6a6a696491d00eb4b1cc56dfcb9e94ed53573a7a Reviewed-on: https://go-review.googlesource.com/c/go/+/699015 Reviewed-by: Cherry Mui <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Michael Matloob <[email protected]>
1 parent 1d459c4 commit a7d9d5a

File tree

2 files changed

+27
-25
lines changed

2 files changed

+27
-25
lines changed

src/cmd/cgo/gcc.go

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -195,13 +195,12 @@ func (p *Package) Translate(f *File) {
195195
var conv typeConv
196196
conv.Init(p.PtrSize, p.IntSize)
197197

198-
p.typedefs = map[string]bool{}
199-
p.typedefList = nil
198+
ft := fileTypedefs{typedefs: make(map[string]bool)}
200199
numTypedefs := -1
201-
for len(p.typedefs) > numTypedefs {
202-
numTypedefs = len(p.typedefs)
200+
for len(ft.typedefs) > numTypedefs {
201+
numTypedefs = len(ft.typedefs)
203202
// Also ask about any typedefs we've seen so far.
204-
for _, info := range p.typedefList {
203+
for _, info := range ft.typedefList {
205204
if f.Name[info.typedef] != nil {
206205
continue
207206
}
@@ -214,7 +213,7 @@ func (p *Package) Translate(f *File) {
214213
}
215214
needType := p.guessKinds(f)
216215
if len(needType) > 0 {
217-
p.loadDWARF(f, &conv, needType)
216+
p.loadDWARF(f, &ft, &conv, needType)
218217
}
219218

220219
// In godefs mode we're OK with the typedefs, which
@@ -523,7 +522,7 @@ func (p *Package) guessKinds(f *File) []*Name {
523522
// loadDWARF parses the DWARF debug information generated
524523
// by gcc to learn the details of the constants, variables, and types
525524
// being referred to as C.xxx.
526-
func (p *Package) loadDWARF(f *File, conv *typeConv, names []*Name) {
525+
func (p *Package) loadDWARF(f *File, ft *fileTypedefs, conv *typeConv, names []*Name) {
527526
// Extract the types from the DWARF section of an object
528527
// from a well-formed C program. Gcc only generates DWARF info
529528
// for symbols in the object file, so it is not enough to print the
@@ -637,7 +636,7 @@ func (p *Package) loadDWARF(f *File, conv *typeConv, names []*Name) {
637636
fatalf("malformed __cgo__ name: %s", name)
638637
}
639638
types[i] = t.Type
640-
p.recordTypedefs(t.Type, f.NamePos[names[i]])
639+
ft.recordTypedefs(t.Type, f.NamePos[names[i]])
641640
}
642641
if e.Tag != dwarf.TagCompileUnit {
643642
r.SkipChildren()
@@ -702,12 +701,17 @@ func (p *Package) loadDWARF(f *File, conv *typeConv, names []*Name) {
702701
}
703702
}
704703

705-
// recordTypedefs remembers in p.typedefs all the typedefs used in dtypes and its children.
706-
func (p *Package) recordTypedefs(dtype dwarf.Type, pos token.Pos) {
707-
p.recordTypedefs1(dtype, pos, map[dwarf.Type]bool{})
704+
type fileTypedefs struct {
705+
typedefs map[string]bool // type names that appear in the types of the objects we're interested in
706+
typedefList []typedefInfo
708707
}
709708

710-
func (p *Package) recordTypedefs1(dtype dwarf.Type, pos token.Pos, visited map[dwarf.Type]bool) {
709+
// recordTypedefs remembers in ft.typedefs all the typedefs used in dtypes and its children.
710+
func (ft *fileTypedefs) recordTypedefs(dtype dwarf.Type, pos token.Pos) {
711+
ft.recordTypedefs1(dtype, pos, map[dwarf.Type]bool{})
712+
}
713+
714+
func (ft *fileTypedefs) recordTypedefs1(dtype dwarf.Type, pos token.Pos, visited map[dwarf.Type]bool) {
711715
if dtype == nil {
712716
return
713717
}
@@ -721,25 +725,25 @@ func (p *Package) recordTypedefs1(dtype dwarf.Type, pos token.Pos, visited map[d
721725
// Don't look inside builtin types. There be dragons.
722726
return
723727
}
724-
if !p.typedefs[dt.Name] {
725-
p.typedefs[dt.Name] = true
726-
p.typedefList = append(p.typedefList, typedefInfo{dt.Name, pos})
727-
p.recordTypedefs1(dt.Type, pos, visited)
728+
if !ft.typedefs[dt.Name] {
729+
ft.typedefs[dt.Name] = true
730+
ft.typedefList = append(ft.typedefList, typedefInfo{dt.Name, pos})
731+
ft.recordTypedefs1(dt.Type, pos, visited)
728732
}
729733
case *dwarf.PtrType:
730-
p.recordTypedefs1(dt.Type, pos, visited)
734+
ft.recordTypedefs1(dt.Type, pos, visited)
731735
case *dwarf.ArrayType:
732-
p.recordTypedefs1(dt.Type, pos, visited)
736+
ft.recordTypedefs1(dt.Type, pos, visited)
733737
case *dwarf.QualType:
734-
p.recordTypedefs1(dt.Type, pos, visited)
738+
ft.recordTypedefs1(dt.Type, pos, visited)
735739
case *dwarf.FuncType:
736-
p.recordTypedefs1(dt.ReturnType, pos, visited)
740+
ft.recordTypedefs1(dt.ReturnType, pos, visited)
737741
for _, a := range dt.ParamType {
738-
p.recordTypedefs1(a, pos, visited)
742+
ft.recordTypedefs1(a, pos, visited)
739743
}
740744
case *dwarf.StructType:
741-
for _, f := range dt.Field {
742-
p.recordTypedefs1(f.Type, pos, visited)
745+
for _, l := range dt.Field {
746+
ft.recordTypedefs1(l.Type, pos, visited)
743747
}
744748
}
745749
}

src/cmd/cgo/main.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ type Package struct {
4949
GoFiles []string // list of Go files
5050
GccFiles []string // list of gcc output files
5151
Preamble string // collected preamble for _cgo_export.h
52-
typedefs map[string]bool // type names that appear in the types of the objects we're interested in
53-
typedefList []typedefInfo
5452
noCallbacks map[string]bool // C function names with #cgo nocallback directive
5553
noEscapes map[string]bool // C function names with #cgo noescape directive
5654
}

0 commit comments

Comments
 (0)