1
0
mirror of https://github.com/golang/go synced 2024-11-06 15:36:24 -07:00

cmd/link: use side table instead of sym.Symbol 'Reachparent' field

The sym.Symbol 'Reachparent' field is used only when field tracking
is enabled. So as to use less memory for the common case where
field tracking is not enabled, remove this field and use a side
table stored in the context to achieve the same functionality.

Updates #26186

Change-Id: Idc5f8b0aa323689d4d51dddb5d1b0341a37bb7d2
Reviewed-on: https://go-review.googlesource.com/121915
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Than McIntosh 2018-06-28 15:42:20 -04:00 committed by Brad Fitzpatrick
parent 0e0cd70ecf
commit 32bc0976f9
5 changed files with 22 additions and 13 deletions

View File

@ -190,7 +190,9 @@ func (d *deadcodepass) mark(s, parent *sym.Symbol) {
fmt.Printf("%s -> %s\n", p, s.Name) fmt.Printf("%s -> %s\n", p, s.Name)
} }
s.Attr |= sym.AttrReachable s.Attr |= sym.AttrReachable
s.Reachparent = parent if d.ctxt.Reachparent != nil {
d.ctxt.Reachparent[s] = parent
}
d.markQueue = append(d.markQueue, s) d.markQueue = append(d.markQueue, s)
} }

View File

@ -294,7 +294,7 @@ func fieldtrack(ctxt *Link) {
s.Attr |= sym.AttrNotInSymbolTable s.Attr |= sym.AttrNotInSymbolTable
if s.Attr.Reachable() { if s.Attr.Reachable() {
buf.WriteString(s.Name[9:]) buf.WriteString(s.Name[9:])
for p := s.Reachparent; p != nil; p = p.Reachparent { for p := ctxt.Reachparent[s]; p != nil; p = ctxt.Reachparent[p] {
buf.WriteString("\t") buf.WriteString("\t")
buf.WriteString(p.Name) buf.WriteString(p.Name)
} }

View File

@ -86,6 +86,9 @@ type Link struct {
// unresolvedSymSet is a set of erroneous unresolved references. // unresolvedSymSet is a set of erroneous unresolved references.
// Used to avoid duplicated error messages. // Used to avoid duplicated error messages.
unresolvedSymSet map[unresolvedSymKey]bool unresolvedSymSet map[unresolvedSymKey]bool
// Used to implement field tracking.
Reachparent map[*sym.Symbol]*sym.Symbol
} }
type unresolvedSymKey struct { type unresolvedSymKey struct {

View File

@ -34,6 +34,7 @@ import (
"bufio" "bufio"
"cmd/internal/objabi" "cmd/internal/objabi"
"cmd/internal/sys" "cmd/internal/sys"
"cmd/link/internal/sym"
"flag" "flag"
"log" "log"
"os" "os"
@ -144,6 +145,10 @@ func Main(arch *sys.Arch, theArch Arch) {
} }
} }
if objabi.Fieldtrack_enabled != 0 {
ctxt.Reachparent = make(map[*sym.Symbol]*sym.Symbol)
}
startProfile() startProfile()
if ctxt.BuildMode == BuildModeUnset { if ctxt.BuildMode == BuildModeUnset {
ctxt.BuildMode = BuildModeExe ctxt.BuildMode = BuildModeExe

View File

@ -35,7 +35,6 @@ type Symbol struct {
Sub *Symbol Sub *Symbol
Outer *Symbol Outer *Symbol
Gotype *Symbol Gotype *Symbol
Reachparent *Symbol
File string File string
Dynimplib string Dynimplib string
Dynimpvers string Dynimpvers string