Skip to content

Commit

Permalink
cmd/internal/objfile: cache computation of goobj.Arch
Browse files Browse the repository at this point in the history
Change-Id: I23774cf185e5fa6b89398001cd0655fb0c5bdb46
GitHub-Last-Rev: ca8cae2
GitHub-Pull-Request: #40877
Reviewed-on: https://go-review.googlesource.com/c/go/+/249180
Run-TryBot: Keith Randall <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
Reviewed-by: Keith Randall <[email protected]>
  • Loading branch information
qingyunha authored and randall77 committed Aug 19, 2020
1 parent ac875bc commit 31da1d9
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 19 deletions.
6 changes: 6 additions & 0 deletions src/cmd/internal/archive/archive.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"log"
"os"
"strconv"
"strings"
"time"
"unicode/utf8"
)
Expand Down Expand Up @@ -83,6 +84,7 @@ func (e *Entry) String() string {

type GoObj struct {
TextHeader []byte
Arch string
Data
}

Expand Down Expand Up @@ -404,6 +406,10 @@ func (r *objReader) parseObject(o *GoObj, size int64) error {
}
}
o.TextHeader = h
hs := strings.Fields(string(h))
if len(hs) >= 4 {
o.Arch = hs[3]
}
o.Offset = r.offset
o.Size = size - int64(len(h))

Expand Down
32 changes: 13 additions & 19 deletions src/cmd/internal/objfile/goobj.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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:
Expand Down Expand Up @@ -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
}
pcdataBase := r.PcdataBase()
Expand Down Expand Up @@ -264,10 +262,10 @@ func (f *goobjFile) PCToLine(pc uint64) (string, int, *gosym.Func) {
lengths := info.ReadFuncInfoLengths(b)
off, end := info.ReadPcline(b)
pcline := r.BytesAt(pcdataBase+off, int(end-off))
line := int(pcValue(pcline, pc-addr, arch))
line := int(pcValue(pcline, pc-addr, f.arch))
off, end = info.ReadPcfile(b)
pcfile := r.BytesAt(pcdataBase+off, int(end-off))
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.
Expand Down Expand Up @@ -332,11 +330,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) {
Expand Down

0 comments on commit 31da1d9

Please sign in to comment.