aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link/internal/loader
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2019-10-18 17:08:35 -0400
committerCherry Zhang <cherryyz@google.com>2019-10-24 15:24:20 +0000
commitfb066098171c349355f2ad1e8d40d56d64673dc9 (patch)
treebeb784b8812cc337238499925673fe7a161c7d67 /src/cmd/link/internal/loader
parentdf01b7968bb613d30fa2bbd11fef2f3fb77803a5 (diff)
downloadgo-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.go21
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