From: matloob Date: Mon, 25 Aug 2025 20:50:06 +0000 (-0400) Subject: cmd/cgo: move typedefs and typedefList out of Package X-Git-Tag: go1.26rc1~989 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a7d9d5a80ae799f54e323060df0dfbccc83d3759;p=gostls13.git 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 #75167 Change-Id: I6a6a696491d00eb4b1cc56dfcb9e94ed53573a7a Reviewed-on: https://go-review.googlesource.com/c/go/+/699015 Reviewed-by: Cherry Mui LUCI-TryBot-Result: Go LUCI Reviewed-by: Michael Matloob --- diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index f5b9eb9086..716db08d2b 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -195,13 +195,12 @@ func (p *Package) Translate(f *File) { var conv typeConv conv.Init(p.PtrSize, p.IntSize) - p.typedefs = map[string]bool{} - p.typedefList = nil + ft := fileTypedefs{typedefs: make(map[string]bool)} numTypedefs := -1 - for len(p.typedefs) > numTypedefs { - numTypedefs = len(p.typedefs) + for len(ft.typedefs) > numTypedefs { + numTypedefs = len(ft.typedefs) // Also ask about any typedefs we've seen so far. - for _, info := range p.typedefList { + for _, info := range ft.typedefList { if f.Name[info.typedef] != nil { continue } @@ -214,7 +213,7 @@ func (p *Package) Translate(f *File) { } needType := p.guessKinds(f) if len(needType) > 0 { - p.loadDWARF(f, &conv, needType) + p.loadDWARF(f, &ft, &conv, needType) } // In godefs mode we're OK with the typedefs, which @@ -523,7 +522,7 @@ func (p *Package) guessKinds(f *File) []*Name { // loadDWARF parses the DWARF debug information generated // by gcc to learn the details of the constants, variables, and types // being referred to as C.xxx. -func (p *Package) loadDWARF(f *File, conv *typeConv, names []*Name) { +func (p *Package) loadDWARF(f *File, ft *fileTypedefs, conv *typeConv, names []*Name) { // Extract the types from the DWARF section of an object // from a well-formed C program. Gcc only generates DWARF info // 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) { fatalf("malformed __cgo__ name: %s", name) } types[i] = t.Type - p.recordTypedefs(t.Type, f.NamePos[names[i]]) + ft.recordTypedefs(t.Type, f.NamePos[names[i]]) } if e.Tag != dwarf.TagCompileUnit { r.SkipChildren() @@ -702,12 +701,17 @@ func (p *Package) loadDWARF(f *File, conv *typeConv, names []*Name) { } } -// recordTypedefs remembers in p.typedefs all the typedefs used in dtypes and its children. -func (p *Package) recordTypedefs(dtype dwarf.Type, pos token.Pos) { - p.recordTypedefs1(dtype, pos, map[dwarf.Type]bool{}) +type fileTypedefs struct { + typedefs map[string]bool // type names that appear in the types of the objects we're interested in + typedefList []typedefInfo } -func (p *Package) recordTypedefs1(dtype dwarf.Type, pos token.Pos, visited map[dwarf.Type]bool) { +// recordTypedefs remembers in ft.typedefs all the typedefs used in dtypes and its children. +func (ft *fileTypedefs) recordTypedefs(dtype dwarf.Type, pos token.Pos) { + ft.recordTypedefs1(dtype, pos, map[dwarf.Type]bool{}) +} + +func (ft *fileTypedefs) recordTypedefs1(dtype dwarf.Type, pos token.Pos, visited map[dwarf.Type]bool) { if dtype == nil { return } @@ -721,25 +725,25 @@ func (p *Package) recordTypedefs1(dtype dwarf.Type, pos token.Pos, visited map[d // Don't look inside builtin types. There be dragons. return } - if !p.typedefs[dt.Name] { - p.typedefs[dt.Name] = true - p.typedefList = append(p.typedefList, typedefInfo{dt.Name, pos}) - p.recordTypedefs1(dt.Type, pos, visited) + if !ft.typedefs[dt.Name] { + ft.typedefs[dt.Name] = true + ft.typedefList = append(ft.typedefList, typedefInfo{dt.Name, pos}) + ft.recordTypedefs1(dt.Type, pos, visited) } case *dwarf.PtrType: - p.recordTypedefs1(dt.Type, pos, visited) + ft.recordTypedefs1(dt.Type, pos, visited) case *dwarf.ArrayType: - p.recordTypedefs1(dt.Type, pos, visited) + ft.recordTypedefs1(dt.Type, pos, visited) case *dwarf.QualType: - p.recordTypedefs1(dt.Type, pos, visited) + ft.recordTypedefs1(dt.Type, pos, visited) case *dwarf.FuncType: - p.recordTypedefs1(dt.ReturnType, pos, visited) + ft.recordTypedefs1(dt.ReturnType, pos, visited) for _, a := range dt.ParamType { - p.recordTypedefs1(a, pos, visited) + ft.recordTypedefs1(a, pos, visited) } case *dwarf.StructType: - for _, f := range dt.Field { - p.recordTypedefs1(f.Type, pos, visited) + for _, l := range dt.Field { + ft.recordTypedefs1(l.Type, pos, visited) } } } diff --git a/src/cmd/cgo/main.go b/src/cmd/cgo/main.go index 77beb0992c..df3b7fbd1d 100644 --- a/src/cmd/cgo/main.go +++ b/src/cmd/cgo/main.go @@ -49,8 +49,6 @@ type Package struct { GoFiles []string // list of Go files GccFiles []string // list of gcc output files Preamble string // collected preamble for _cgo_export.h - typedefs map[string]bool // type names that appear in the types of the objects we're interested in - typedefList []typedefInfo noCallbacks map[string]bool // C function names with #cgo nocallback directive noEscapes map[string]bool // C function names with #cgo noescape directive }