Commit f7659d49 authored by Than McIntosh's avatar Than McIntosh

[dev.link] cmd/link/internal/objfile: new 'Sym' type for global symbol index

First change of several to update the loader API to reflect the final
consensus version of the loader API as described in Cherry's doc.

This piece:

 - define new loader.Sym type to encapsulate a global symbol
   index (as opposed to just using 'int')

Change-Id: I6f6483e269f80abfc7d373b2856b2c0d61b9ac24
Reviewed-on: https://go-review.googlesource.com/c/go/+/200417
Run-TryBot: Than McIntosh <thanm@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarAustin Clements <austin@google.com>
Reviewed-by: default avatarJeremy Faller <jeremy@golang.org>
parent c455e887
...@@ -23,6 +23,10 @@ import ( ...@@ -23,6 +23,10 @@ import (
var _ = fmt.Print var _ = fmt.Print
// Sym encapsulates a global symbol index, used to identify a specific
// Go symbol. The 0-valued Sym is corresponds to an invalid symbol.
type Sym int
// oReader is a wrapper type of obj.Reader, along with some // oReader is a wrapper type of obj.Reader, along with some
// extra information. // extra information.
// TODO: rename to objReader once the old one is gone? // TODO: rename to objReader once the old one is gone?
...@@ -35,7 +39,7 @@ type oReader struct { ...@@ -35,7 +39,7 @@ type oReader struct {
type objIdx struct { type objIdx struct {
r *oReader r *oReader
i int // start index i Sym // start index
} }
type nameVer struct { type nameVer struct {
...@@ -47,11 +51,11 @@ type nameVer struct { ...@@ -47,11 +51,11 @@ type nameVer struct {
// //
// TODO: describe local-global index mapping. // TODO: describe local-global index mapping.
type Loader struct { type Loader struct {
start map[*oReader]int // map from object file to its start index start map[*oReader]Sym // map from object file to its start index
objs []objIdx // sorted by start index (i.e. objIdx.i) objs []objIdx // sorted by start index (i.e. objIdx.i)
max int // current max index max Sym // current max index
symsByName map[nameVer]int // map symbol name to index symsByName map[nameVer]Sym // map symbol name to index
objByPkg map[string]*oReader // map package path to its Go object reader objByPkg map[string]*oReader // map package path to its Go object reader
...@@ -60,21 +64,21 @@ type Loader struct { ...@@ -60,21 +64,21 @@ type Loader struct {
func NewLoader() *Loader { func NewLoader() *Loader {
return &Loader{ return &Loader{
start: make(map[*oReader]int), start: make(map[*oReader]Sym),
objs: []objIdx{{nil, 0}}, objs: []objIdx{{nil, 0}},
symsByName: make(map[nameVer]int), symsByName: make(map[nameVer]Sym),
objByPkg: make(map[string]*oReader), objByPkg: make(map[string]*oReader),
Syms: []*sym.Symbol{nil}, Syms: []*sym.Symbol{nil},
} }
} }
// Return the start index in the global index space for a given object file. // Return the start index in the global index space for a given object file.
func (l *Loader) StartIndex(r *oReader) int { func (l *Loader) StartIndex(r *oReader) Sym {
return l.start[r] return l.start[r]
} }
// Add object file r, return the start index. // Add object file r, return the start index.
func (l *Loader) AddObj(pkg string, r *oReader) int { func (l *Loader) AddObj(pkg string, r *oReader) Sym {
if _, ok := l.start[r]; ok { if _, ok := l.start[r]; ok {
panic("already added") panic("already added")
} }
...@@ -85,12 +89,12 @@ func (l *Loader) AddObj(pkg string, r *oReader) int { ...@@ -85,12 +89,12 @@ func (l *Loader) AddObj(pkg string, r *oReader) int {
i := l.max + 1 i := l.max + 1
l.start[r] = i l.start[r] = i
l.objs = append(l.objs, objIdx{r, i}) l.objs = append(l.objs, objIdx{r, i})
l.max += n l.max += Sym(n)
return i return i
} }
// Add a symbol with a given index, return if it is added. // Add a symbol with a given index, return if it is added.
func (l *Loader) AddSym(name string, ver int, i int, dupok bool) bool { func (l *Loader) AddSym(name string, ver int, i Sym, dupok bool) bool {
nv := nameVer{name, ver} nv := nameVer{name, ver}
if _, ok := l.symsByName[nv]; ok { if _, ok := l.symsByName[nv]; ok {
if dupok || true { // TODO: "true" isn't quite right. need to implement "overwrite" logic. if dupok || true { // TODO: "true" isn't quite right. need to implement "overwrite" logic.
...@@ -104,7 +108,7 @@ func (l *Loader) AddSym(name string, ver int, i int, dupok bool) bool { ...@@ -104,7 +108,7 @@ func (l *Loader) AddSym(name string, ver int, i int, dupok bool) bool {
// Add an external symbol (without index). Return the index of newly added // Add an external symbol (without index). Return the index of newly added
// symbol, or 0 if not added. // symbol, or 0 if not added.
func (l *Loader) AddExtSym(name string, ver int) int { func (l *Loader) AddExtSym(name string, ver int) Sym {
nv := nameVer{name, ver} nv := nameVer{name, ver}
if _, ok := l.symsByName[nv]; ok { if _, ok := l.symsByName[nv]; ok {
return 0 return 0
...@@ -116,23 +120,23 @@ func (l *Loader) AddExtSym(name string, ver int) int { ...@@ -116,23 +120,23 @@ func (l *Loader) AddExtSym(name string, ver int) int {
} }
// Convert a local index to a global index. // Convert a local index to a global index.
func (l *Loader) ToGlobal(r *oReader, i int) int { func (l *Loader) ToGlobal(r *oReader, i int) Sym {
return l.StartIndex(r) + i return l.StartIndex(r) + Sym(i)
} }
// Convert a global index to a local index. // Convert a global index to a local index.
func (l *Loader) ToLocal(i int) (*oReader, int) { func (l *Loader) ToLocal(i Sym) (*oReader, int) {
k := sort.Search(i, func(k int) bool { k := sort.Search(int(i), func(k int) bool {
return l.objs[k].i >= i return l.objs[k].i >= i
}) })
if k == len(l.objs) { if k == len(l.objs) {
return nil, 0 return nil, 0
} }
return l.objs[k].r, i - l.objs[k].i return l.objs[k].r, int(i - l.objs[k].i)
} }
// Resolve a local symbol reference. Return global index. // Resolve a local symbol reference. Return global index.
func (l *Loader) Resolve(r *oReader, s goobj2.SymRef) int { func (l *Loader) Resolve(r *oReader, s goobj2.SymRef) Sym {
var rr *oReader var rr *oReader
switch p := s.PkgIdx; p { switch p := s.PkgIdx; p {
case goobj2.PkgIdxInvalid: case goobj2.PkgIdxInvalid:
...@@ -163,7 +167,7 @@ func (l *Loader) Resolve(r *oReader, s goobj2.SymRef) int { ...@@ -163,7 +167,7 @@ func (l *Loader) Resolve(r *oReader, s goobj2.SymRef) int {
// Look up a symbol by name, return global index, or 0 if not found. // Look up a symbol by name, return global index, or 0 if not found.
// This is more like Syms.ROLookup than Lookup -- it doesn't create // This is more like Syms.ROLookup than Lookup -- it doesn't create
// new symbol. // new symbol.
func (l *Loader) Lookup(name string, ver int) int { func (l *Loader) Lookup(name string, ver int) Sym {
nv := nameVer{name, ver} nv := nameVer{name, ver}
return l.symsByName[nv] return l.symsByName[nv]
} }
...@@ -213,10 +217,10 @@ func LoadNew(l *Loader, arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib *s ...@@ -213,10 +217,10 @@ func LoadNew(l *Loader, arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib *s
} }
v := abiToVer(osym.ABI, localSymVersion) v := abiToVer(osym.ABI, localSymVersion)
dupok := osym.Flag&goobj2.SymFlagDupok != 0 dupok := osym.Flag&goobj2.SymFlagDupok != 0
if l.AddSym(name, v, istart+i, dupok) { if l.AddSym(name, v, istart+Sym(i), dupok) {
s := syms.Newsym(name, v) s := syms.Newsym(name, v)
preprocess(arch, s) // TODO: put this at a better place preprocess(arch, s) // TODO: put this at a better place
l.Syms[istart+i] = s l.Syms[istart+Sym(i)] = s
} }
} }
...@@ -244,7 +248,7 @@ func loadObjRefs(l *Loader, r *oReader, arch *sys.Arch, syms *sym.Symbols) { ...@@ -244,7 +248,7 @@ func loadObjRefs(l *Loader, r *oReader, arch *sys.Arch, syms *sym.Symbols) {
if ii := l.AddExtSym(name, v); ii != 0 { if ii := l.AddExtSym(name, v); ii != 0 {
s := syms.Newsym(name, v) s := syms.Newsym(name, v)
preprocess(arch, s) // TODO: put this at a better place preprocess(arch, s) // TODO: put this at a better place
if ii != len(l.Syms) { if ii != Sym(len(l.Syms)) {
panic("AddExtSym returned bad index") panic("AddExtSym returned bad index")
} }
l.Syms = append(l.Syms, s) l.Syms = append(l.Syms, s)
...@@ -309,7 +313,7 @@ func loadObjReloc(l *Loader, r *oReader) { ...@@ -309,7 +313,7 @@ func loadObjReloc(l *Loader, r *oReader) {
} }
for i, n := 0, r.NSym()+r.NNonpkgdef(); i < n; i++ { for i, n := 0, r.NSym()+r.NNonpkgdef(); i < n; i++ {
s := l.Syms[istart+i] s := l.Syms[istart+Sym(i)]
if s == nil || s.Name == "" { if s == nil || s.Name == "" {
continue continue
} }
...@@ -422,7 +426,7 @@ func loadObjFull(l *Loader, r *oReader) { ...@@ -422,7 +426,7 @@ func loadObjFull(l *Loader, r *oReader) {
pcdataBase := r.PcdataBase() pcdataBase := r.PcdataBase()
for i, n := 0, r.NSym()+r.NNonpkgdef(); i < n; i++ { for i, n := 0, r.NSym()+r.NNonpkgdef(); i < n; i++ {
s := l.Syms[istart+i] s := l.Syms[istart+Sym(i)]
if s == nil || s.Name == "" { if s == nil || s.Name == "" {
continue continue
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment