1
0
mirror of https://github.com/golang/go synced 2024-11-19 16:34:49 -07:00

cmd/link: remove ctxt from objfile reader

Preparation for moving the object file reader to its own package.

For #22095

Change-Id: I31fe4a10a2c465f8ea4bf548f40918807e4ec6b5
Reviewed-on: https://go-review.googlesource.com/67314
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
David Crawshaw 2017-09-30 16:50:00 +00:00
parent 52abe50c33
commit c80338accb
3 changed files with 34 additions and 24 deletions

View File

@ -1425,7 +1425,8 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *Library, length int64, pn string, fil
ldpkg(ctxt, f, pkg, import1-import0-2, pn, whence) // -2 for !\n ldpkg(ctxt, f, pkg, import1-import0-2, pn, whence) // -2 for !\n
f.Seek(import1, 0) f.Seek(import1, 0)
LoadObjFile(ctxt, f, lib, eof-f.Offset(), pn) LoadObjFile(ctxt.Arch, ctxt.Syms, f, lib, eof-f.Offset(), pn)
lib.addImports(ctxt, pn)
return nil return nil
} }

View File

@ -206,21 +206,33 @@ func (l *Link) Logf(format string, args ...interface{}) {
} }
type Library struct { type Library struct {
Objref string Objref string
Srcref string Srcref string
File string File string
Pkg string Pkg string
Shlib string Shlib string
hash string hash string
imports []*Library importStrings []string
textp []*Symbol // text symbols defined in this library imports []*Library
dupTextSyms []*Symbol // dupok text symbols defined in this library textp []*Symbol // text symbols defined in this library
dupTextSyms []*Symbol // dupok text symbols defined in this library
} }
func (l Library) String() string { func (l Library) String() string {
return l.Pkg return l.Pkg
} }
func (l *Library) addImports(ctxt *Link, pn string) {
pkg := objabi.PathToPrefix(l.Pkg)
for _, importStr := range l.importStrings {
lib := addlib(ctxt, pkg, pn, importStr)
if lib != nil {
l.imports = append(l.imports, lib)
}
}
l.importStrings = nil
}
type FuncInfo struct { type FuncInfo struct {
Args int32 Args int32
Locals int32 Locals int32

View File

@ -12,6 +12,7 @@ import (
"cmd/internal/bio" "cmd/internal/bio"
"cmd/internal/dwarf" "cmd/internal/dwarf"
"cmd/internal/objabi" "cmd/internal/objabi"
"cmd/internal/sys"
"crypto/sha1" "crypto/sha1"
"encoding/base64" "encoding/base64"
"io" "io"
@ -30,7 +31,8 @@ var emptyPkg = []byte(`"".`)
// objReader reads Go object files. // objReader reads Go object files.
type objReader struct { type objReader struct {
rd *bufio.Reader rd *bufio.Reader
ctxt *Link arch *sys.Arch
syms *Symbols
lib *Library lib *Library
pn string pn string
dupSym *Symbol dupSym *Symbol
@ -50,16 +52,16 @@ type objReader struct {
file []*Symbol file []*Symbol
} }
func LoadObjFile(ctxt *Link, f *bio.Reader, lib *Library, length int64, pn string) { func LoadObjFile(arch *sys.Arch, syms *Symbols, f *bio.Reader, lib *Library, length int64, pn string) {
start := f.Offset() start := f.Offset()
r := &objReader{ r := &objReader{
rd: f.Reader, rd: f.Reader,
lib: lib, lib: lib,
ctxt: ctxt, arch: arch,
syms: syms,
pn: pn, pn: pn,
dupSym: &Symbol{Name: ".dup"}, dupSym: &Symbol{Name: ".dup"},
localSymVersion: ctxt.Syms.IncVersion(), localSymVersion: syms.IncVersion(),
} }
r.loadObjFile() r.loadObjFile()
if f.Offset() != start+length { if f.Offset() != start+length {
@ -68,8 +70,6 @@ func LoadObjFile(ctxt *Link, f *bio.Reader, lib *Library, length int64, pn strin
} }
func (r *objReader) loadObjFile() { func (r *objReader) loadObjFile() {
pkg := objabi.PathToPrefix(r.lib.Pkg)
// Magic header // Magic header
var buf [8]uint8 var buf [8]uint8
r.readFull(buf[:]) r.readFull(buf[:])
@ -89,10 +89,7 @@ func (r *objReader) loadObjFile() {
if lib == "" { if lib == "" {
break break
} }
l := addlib(r.ctxt, pkg, r.pn, lib) r.lib.importStrings = append(r.lib.importStrings, lib)
if l != nil {
r.lib.imports = append(r.lib.imports, l)
}
} }
// Symbol references // Symbol references
@ -386,7 +383,7 @@ func (r *objReader) readRef() {
if v == 1 { if v == 1 {
v = r.localSymVersion v = r.localSymVersion
} }
s := r.ctxt.Syms.Lookup(name, v) s := r.syms.Lookup(name, v)
r.refs = append(r.refs, s) r.refs = append(r.refs, s)
if s == nil || v != 0 { if s == nil || v != 0 {
@ -404,9 +401,9 @@ func (r *objReader) readRef() {
if uint64(uint32(x)) != x { if uint64(uint32(x)) != x {
log.Panicf("$-symbol %s too large: %d", s.Name, x) log.Panicf("$-symbol %s too large: %d", s.Name, x)
} }
s.AddUint32(r.ctxt.Arch, uint32(x)) s.AddUint32(r.arch, uint32(x))
case "$f64.", "$i64.": case "$f64.", "$i64.":
s.AddUint64(r.ctxt.Arch, x) s.AddUint64(r.arch, x)
default: default:
log.Panicf("unrecognized $-symbol: %s", s.Name) log.Panicf("unrecognized $-symbol: %s", s.Name)
} }