mirror of
https://github.com/golang/go
synced 2024-11-19 03:04:42 -07:00
debug/dwarf: factor finding unit containing entry offset
This factors out the code for finding which unit contains an offset in the "info" section. The new code also replaces linear search with a binary search. The line table reader will also need this functionality. Change-Id: I2076e4fc6719b6f06fd2796cbbc7548ec1876cb3 Reviewed-on: https://go-review.googlesource.com/6733 Reviewed-by: Rob Pike <r@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
de1693f984
commit
0e31b4ed26
@ -308,18 +308,13 @@ func (r *Reader) Seek(off Offset) {
|
||||
return
|
||||
}
|
||||
|
||||
// TODO(rsc): binary search (maybe a new package)
|
||||
var i int
|
||||
var u *unit
|
||||
for i = range d.unit {
|
||||
u = &d.unit[i]
|
||||
if u.off <= off && off < u.off+Offset(len(u.data)) {
|
||||
r.unit = i
|
||||
r.b = makeBuf(r.d, u, "info", off, u.data[off-u.off:])
|
||||
return
|
||||
}
|
||||
i := d.offsetToUnit(off)
|
||||
if i == -1 {
|
||||
r.err = errors.New("offset out of range")
|
||||
}
|
||||
r.err = errors.New("offset out of range")
|
||||
u := &d.unit[i]
|
||||
r.unit = i
|
||||
r.b = makeBuf(r.d, u, "info", off, u.data[off-u.off:])
|
||||
}
|
||||
|
||||
// maybeNextUnit advances to the next unit if this one is finished.
|
||||
|
@ -4,7 +4,10 @@
|
||||
|
||||
package dwarf
|
||||
|
||||
import "strconv"
|
||||
import (
|
||||
"sort"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// DWARF debug info is split into a sequence of compilation units.
|
||||
// Each unit has its own abbreviation table and address size.
|
||||
@ -88,3 +91,20 @@ func (d *Data) parseUnits() ([]unit, error) {
|
||||
}
|
||||
return units, nil
|
||||
}
|
||||
|
||||
// offsetToUnit returns the index of the unit containing offset off.
|
||||
// It returns -1 if no unit contains this offset.
|
||||
func (d *Data) offsetToUnit(off Offset) int {
|
||||
// Find the unit after off
|
||||
next := sort.Search(len(d.unit), func(i int) bool {
|
||||
return d.unit[i].off > off
|
||||
})
|
||||
if next == 0 {
|
||||
return -1
|
||||
}
|
||||
u := &d.unit[next-1]
|
||||
if u.off <= off && off < u.off+Offset(len(u.data)) {
|
||||
return next - 1
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user