mirror of
https://github.com/golang/go
synced 2024-11-07 07:36:14 -07:00
[dev.link] cmd/link: record go.itablink symbols during object file read
Change the new loader to keep a note of the set of "go.itablink.*" symbols (using a small map), and add a method that clients can use to query whether a given global index corresponds to a "go.itablink.*" sym. This eliminates one instance of raw symbol name reading/matching during new deadcode, which should produce a minor speedup. Change-Id: I5915773a3f33c16099ccd68592dbba783d909bc9 Reviewed-on: https://go-review.googlesource.com/c/go/+/201400 Run-TryBot: Than McIntosh <thanm@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
8011051361
commit
6cbf37b30b
@ -11,7 +11,6 @@ import (
|
|||||||
"cmd/link/internal/loader"
|
"cmd/link/internal/loader"
|
||||||
"cmd/link/internal/sym"
|
"cmd/link/internal/sym"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
|
||||||
"unicode"
|
"unicode"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -226,7 +225,7 @@ func deadcode2(ctxt *Link) {
|
|||||||
// (When BuildModeShared, always keep itablinks.)
|
// (When BuildModeShared, always keep itablinks.)
|
||||||
for i := 1; i < n; i++ {
|
for i := 1; i < n; i++ {
|
||||||
s := loader.Sym(i)
|
s := loader.Sym(i)
|
||||||
if strings.HasPrefix(ldr.RawSymName(s), "go.itablink.") { // TODO: use an attribute instread of checking name
|
if ldr.IsItabLink(s) {
|
||||||
relocs := ldr.Relocs(s)
|
relocs := ldr.Relocs(s)
|
||||||
if relocs.Count > 0 && ldr.Reachable.Has(relocs.At(0).Sym) {
|
if relocs.Count > 0 && ldr.Reachable.Has(relocs.At(0).Sym) {
|
||||||
ldr.Reachable.Set(s)
|
ldr.Reachable.Set(s)
|
||||||
|
@ -100,6 +100,8 @@ type Loader struct {
|
|||||||
symsByName map[nameVer]Sym // map symbol name to index
|
symsByName map[nameVer]Sym // map symbol name to index
|
||||||
overwrite map[Sym]Sym // overwrite[i]=j if symbol j overwrites symbol i
|
overwrite map[Sym]Sym // overwrite[i]=j if symbol j overwrites symbol i
|
||||||
|
|
||||||
|
itablink map[Sym]struct{} // itablink[j] defined if j is go.itablink.*
|
||||||
|
|
||||||
objByPkg map[string]*oReader // map package path to its Go object reader
|
objByPkg map[string]*oReader // map package path to its Go object reader
|
||||||
|
|
||||||
Syms []*sym.Symbol // indexed symbols. XXX we still make sym.Symbol for now.
|
Syms []*sym.Symbol // indexed symbols. XXX we still make sym.Symbol for now.
|
||||||
@ -114,6 +116,7 @@ func NewLoader() *Loader {
|
|||||||
symsByName: make(map[nameVer]Sym),
|
symsByName: make(map[nameVer]Sym),
|
||||||
objByPkg: make(map[string]*oReader),
|
objByPkg: make(map[string]*oReader),
|
||||||
overwrite: make(map[Sym]Sym),
|
overwrite: make(map[Sym]Sym),
|
||||||
|
itablink: make(map[Sym]struct{}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -369,6 +372,14 @@ func (l *Loader) IsGoType(i Sym) bool {
|
|||||||
return l.SymAttr(i)&goobj2.SymFlagGoType != 0
|
return l.SymAttr(i)&goobj2.SymFlagGoType != 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns whether this is a "go.itablink.*" symbol.
|
||||||
|
func (l *Loader) IsItabLink(i Sym) bool {
|
||||||
|
if _, ok := l.itablink[i]; ok {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// Returns the symbol content of the i-th symbol. i is global index.
|
// Returns the symbol content of the i-th symbol. i is global index.
|
||||||
func (l *Loader) Data(i Sym) []byte {
|
func (l *Loader) Data(i Sym) []byte {
|
||||||
if l.isExternal(i) {
|
if l.isExternal(i) {
|
||||||
@ -491,7 +502,10 @@ func (l *Loader) Preload(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib *
|
|||||||
}
|
}
|
||||||
v := abiToVer(osym.ABI, localSymVersion)
|
v := abiToVer(osym.ABI, localSymVersion)
|
||||||
dupok := osym.Dupok()
|
dupok := osym.Dupok()
|
||||||
l.AddSym(name, v, istart+Sym(i), or, dupok, sym.AbiSymKindToSymKind[objabi.SymKind(osym.Type)])
|
added := l.AddSym(name, v, istart+Sym(i), or, dupok, sym.AbiSymKindToSymKind[objabi.SymKind(osym.Type)])
|
||||||
|
if added && strings.HasPrefix(name, "go.itablink.") {
|
||||||
|
l.itablink[istart+Sym(i)] = struct{}{}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The caller expects us consuming all the data
|
// The caller expects us consuming all the data
|
||||||
|
Loading…
Reference in New Issue
Block a user