diff options
| author | Cherry Zhang <cherryyz@google.com> | 2019-10-18 17:08:35 -0400 |
|---|---|---|
| committer | Cherry Zhang <cherryyz@google.com> | 2019-10-24 15:24:20 +0000 |
| commit | fb066098171c349355f2ad1e8d40d56d64673dc9 (patch) | |
| tree | beb784b8812cc337238499925673fe7a161c7d67 /src/cmd/link/internal/loader | |
| parent | df01b7968bb613d30fa2bbd11fef2f3fb77803a5 (diff) | |
| download | go-fb066098171c349355f2ad1e8d40d56d64673dc9.tar.xz | |
[dev.link] cmd/link: assign special indices for builtin functions
Compiler-generated function references (e.g. call to
runtime.newobject) appear frequently. We assign special indices
for them, so they don't need to be referenced by name.
Change-Id: I2072594cbc56c9e1037a26e4aae12e68c2436e9f
Reviewed-on: https://go-review.googlesource.com/c/go/+/202085
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
Diffstat (limited to 'src/cmd/link/internal/loader')
| -rw-r--r-- | src/cmd/link/internal/loader/loader.go | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index e3f7480ac7..846e954aa1 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -91,11 +91,12 @@ func makeBitmap(n int) bitmap { // A Loader loads new object files and resolves indexed symbol references. type Loader struct { - start map[*oReader]Sym // map from object file to its start index - objs []objIdx // sorted by start index (i.e. objIdx.i) - max Sym // current max index - extStart Sym // from this index on, the symbols are externally defined - extSyms []nameVer // externally defined symbols + start map[*oReader]Sym // map from object file to its start index + objs []objIdx // sorted by start index (i.e. objIdx.i) + max Sym // current max index + extStart Sym // from this index on, the symbols are externally defined + extSyms []nameVer // externally defined symbols + builtinSyms []Sym // global index of builtin symbols symsByName [2]map[string]Sym // map symbol name to index, two maps are for ABI0 and ABIInternal extStaticSyms map[nameVer]Sym // externally defined static symbols, keyed by name @@ -111,6 +112,7 @@ type Loader struct { } func NewLoader() *Loader { + nbuiltin := goobj2.NBuiltin() return &Loader{ start: make(map[*oReader]Sym), objs: []objIdx{{nil, 0}}, @@ -119,6 +121,7 @@ func NewLoader() *Loader { overwrite: make(map[Sym]Sym), itablink: make(map[Sym]struct{}), extStaticSyms: make(map[nameVer]Sym), + builtinSyms: make([]Sym, nbuiltin), } } @@ -272,7 +275,7 @@ func (l *Loader) resolve(r *oReader, s goobj2.SymRef) Sym { v := abiToVer(osym.ABI, r.version) return l.Lookup(name, v) case goobj2.PkgIdxBuiltin: - panic("PkgIdxBuiltin not used") + return l.builtinSyms[s.SymIdx] case goobj2.PkgIdxSelf: rr = r default: @@ -575,6 +578,12 @@ func (l *Loader) Preload(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib * if added && strings.HasPrefix(name, "go.itablink.") { l.itablink[istart+Sym(i)] = struct{}{} } + if added && strings.HasPrefix(name, "runtime.") { + if bi := goobj2.BuiltinIdx(name, v); bi != -1 { + // This is a definition of a builtin symbol. Record where it is. + l.builtinSyms[bi] = istart + Sym(i) + } + } } // The caller expects us consuming all the data |
