Commit 0e31b4ed authored by Austin Clements's avatar Austin Clements

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/6733Reviewed-by: default avatarRob Pike <r@golang.org>
Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
parent de1693f9
...@@ -308,18 +308,13 @@ func (r *Reader) Seek(off Offset) { ...@@ -308,18 +308,13 @@ func (r *Reader) Seek(off Offset) {
return return
} }
// TODO(rsc): binary search (maybe a new package) i := d.offsetToUnit(off)
var i int if i == -1 {
var u *unit r.err = errors.New("offset out of range")
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
}
} }
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. // maybeNextUnit advances to the next unit if this one is finished.
......
...@@ -4,7 +4,10 @@ ...@@ -4,7 +4,10 @@
package dwarf package dwarf
import "strconv" import (
"sort"
"strconv"
)
// DWARF debug info is split into a sequence of compilation units. // DWARF debug info is split into a sequence of compilation units.
// Each unit has its own abbreviation table and address size. // Each unit has its own abbreviation table and address size.
...@@ -88,3 +91,20 @@ func (d *Data) parseUnits() ([]unit, error) { ...@@ -88,3 +91,20 @@ func (d *Data) parseUnits() ([]unit, error) {
} }
return units, nil 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
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment