]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: move typedefs and typedefList out of Package
authormatloob <matloob@golang.org>
Mon, 25 Aug 2025 20:50:06 +0000 (16:50 -0400)
committerMichael Matloob <matloob@google.com>
Fri, 29 Aug 2025 23:58:30 +0000 (16:58 -0700)
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 <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Matloob <matloob@google.com>
src/cmd/cgo/gcc.go
src/cmd/cgo/main.go

index f5b9eb90865daf83882b031402fbd837c8068689..716db08d2bccf69a50404383725f97479493ab14 100644 (file)
@@ -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)
                }
        }
 }
index 77beb0992cf74f1fa592ba7661f7c512649f5da2..df3b7fbd1db04147c6fb918ddc9c5d8bd10d779c 100644 (file)
@@ -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
 }