aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/objfile/goobj.go
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2020-08-21 14:18:06 -0400
committerCherry Zhang <cherryyz@google.com>2020-08-21 14:18:06 -0400
commit0ef562592fe05b50b0ae8fce495ee7e2eec791f0 (patch)
treed1c0f668e473ebdcb4a30e190008043bdb223bd9 /src/cmd/internal/objfile/goobj.go
parentac5c406ef0ab20e2a11f57470271266ef4265221 (diff)
parent9679b307334bce77cc6e50751956a4c717e9458c (diff)
downloadgo-0ef562592fe05b50b0ae8fce495ee7e2eec791f0.tar.xz
[dev.link] all: merge branch 'master' into dev.link
Change-Id: Ic66b5138f3ecd9e9a48d7ab05782297c06e4a5b5
Diffstat (limited to 'src/cmd/internal/objfile/goobj.go')
-rw-r--r--src/cmd/internal/objfile/goobj.go32
1 files changed, 13 insertions, 19 deletions
diff --git a/src/cmd/internal/objfile/goobj.go b/src/cmd/internal/objfile/goobj.go
index 8eecebb1df..7f74a8256c 100644
--- a/src/cmd/internal/objfile/goobj.go
+++ b/src/cmd/internal/objfile/goobj.go
@@ -17,13 +17,13 @@ import (
"fmt"
"io"
"os"
- "strings"
)
type goobjFile struct {
goobj *archive.GoObj
r *goobj.Reader
f *os.File
+ arch *sys.Arch
}
func openGoFile(f *os.File) (*File, error) {
@@ -45,9 +45,16 @@ L:
return nil, err
}
r := goobj.NewReaderFromBytes(b, false)
+ var arch *sys.Arch
+ for _, a := range sys.Archs {
+ if a.Name == e.Obj.Arch {
+ arch = a
+ break
+ }
+ }
entries = append(entries, &Entry{
name: e.Name,
- raw: &goobjFile{e.Obj, r, f},
+ raw: &goobjFile{e.Obj, r, f, arch},
})
continue
case archive.EntryNativeObj:
@@ -223,17 +230,8 @@ func (f *goobjFile) pcln() (textStart uint64, symtab, pclntab []byte, err error)
// Returns "",0,nil if unknown.
// This function implements the Liner interface in preference to pcln() above.
func (f *goobjFile) PCToLine(pc uint64) (string, int, *gosym.Func) {
- // TODO: this is really inefficient. Binary search? Memoize last result?
r := f.r
- var arch *sys.Arch
- archname := f.goarch()
- for _, a := range sys.Archs {
- if a.Name == archname {
- arch = a
- break
- }
- }
- if arch == nil {
+ if f.arch == nil {
return "", 0, nil
}
getSymData := func(s goobj.SymRef) []byte {
@@ -271,9 +269,9 @@ func (f *goobjFile) PCToLine(pc uint64) (string, int, *gosym.Func) {
var info *goobj.FuncInfo
lengths := info.ReadFuncInfoLengths(b)
pcline := getSymData(info.ReadPcline(b))
- line := int(pcValue(pcline, pc-addr, arch))
+ line := int(pcValue(pcline, pc-addr, f.arch))
pcfile := getSymData(info.ReadPcfile(b))
- fileID := pcValue(pcfile, pc-addr, arch)
+ fileID := pcValue(pcfile, pc-addr, f.arch)
globalFileID := info.ReadFile(b, lengths.FileOff, uint32(fileID))
fileName := r.File(int(globalFileID))
// Note: we provide only the name in the Func structure.
@@ -338,11 +336,7 @@ func (f *goobjFile) text() (textStart uint64, text []byte, err error) {
}
func (f *goobjFile) goarch() string {
- hs := strings.Fields(string(f.goobj.TextHeader))
- if len(hs) >= 4 {
- return hs[3]
- }
- return ""
+ return f.goobj.Arch
}
func (f *goobjFile) loadAddress() (uint64, error) {