aboutsummaryrefslogtreecommitdiff
path: root/libgo/go/debug/dwarf/entry.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/debug/dwarf/entry.go')
-rw-r--r--libgo/go/debug/dwarf/entry.go40
1 files changed, 33 insertions, 7 deletions
diff --git a/libgo/go/debug/dwarf/entry.go b/libgo/go/debug/dwarf/entry.go
index f9a4c1b..4761d74 100644
--- a/libgo/go/debug/dwarf/entry.go
+++ b/libgo/go/debug/dwarf/entry.go
@@ -40,7 +40,7 @@ func (d *Data) parseAbbrev(off uint32) (abbrevTable, error) {
} else {
data = data[off:]
}
- b := makeBuf(d, "abbrev", 0, data, 0)
+ b := makeBuf(d, nil, "abbrev", 0, data)
// Error handling is simplified by the buf getters
// returning an endless stream of 0s after an error.
@@ -182,13 +182,37 @@ func (b *buf) entry(atab abbrevTable, ubase Offset) *Entry {
case formUdata:
val = int64(b.uint())
+ // exprloc
+ case formExprLoc:
+ val = b.bytes(int(b.uint()))
+
// flag
case formFlag:
val = b.uint8() == 1
+ case formFlagPresent:
+ val = true
+
+ // lineptr, loclistptr, macptr, rangelistptr
+ case formSecOffset:
+ if b.u == nil {
+ b.error("unknown size for DW_FORM_sec_offset")
+ } else if b.u.dwarf64 {
+ val = Offset(b.uint64())
+ } else {
+ val = Offset(b.uint32())
+ }
// reference to other entry
case formRefAddr:
- val = Offset(b.addr())
+ if b.u == nil {
+ b.error("unknown version for DW_FORM_ref_addr")
+ } else if b.u.version == 2 {
+ val = Offset(b.addr())
+ } else if b.u.dwarf64 {
+ val = Offset(b.uint64())
+ } else {
+ val = Offset(b.uint32())
+ }
case formRef1:
val = Offset(b.uint8()) + ubase
case formRef2:
@@ -199,6 +223,8 @@ func (b *buf) entry(atab abbrevTable, ubase Offset) *Entry {
val = Offset(b.uint64()) + ubase
case formRefUdata:
val = Offset(b.uint()) + ubase
+ case formRefSig8:
+ val = b.uint64()
// string
case formString:
@@ -208,7 +234,7 @@ func (b *buf) entry(atab abbrevTable, ubase Offset) *Entry {
if b.err != nil {
return nil
}
- b1 := makeBuf(b.dwarf, "str", 0, b.dwarf.str, 0)
+ b1 := makeBuf(b.dwarf, b.u, "str", 0, b.dwarf.str)
b1.skip(int(off))
val = b1.string()
if b1.err != nil {
@@ -251,7 +277,7 @@ func (d *Data) unitReader(i int) *Reader {
r := &Reader{d: d}
r.unit = i
u := &d.unit[i]
- r.b = makeBuf(d, "info", u.off, u.data, u.addrsize)
+ r.b = makeBuf(d, u, "info", u.off, u.data)
return r
}
@@ -267,7 +293,7 @@ func (r *Reader) Seek(off Offset) {
}
u := &d.unit[0]
r.unit = 0
- r.b = makeBuf(r.d, "info", u.off, u.data, u.addrsize)
+ r.b = makeBuf(r.d, u, "info", u.off, u.data)
return
}
@@ -278,7 +304,7 @@ func (r *Reader) Seek(off Offset) {
u = &d.unit[i]
if u.off <= off && off < u.off+Offset(len(u.data)) {
r.unit = i
- r.b = makeBuf(r.d, "info", off, u.data[off-u.off:], u.addrsize)
+ r.b = makeBuf(r.d, u, "info", off, u.data[off-u.off:])
return
}
}
@@ -290,7 +316,7 @@ func (r *Reader) maybeNextUnit() {
for len(r.b.data) == 0 && r.unit+1 < len(r.d.unit) {
r.unit++
u := &r.d.unit[r.unit]
- r.b = makeBuf(r.d, "info", u.off, u.data, u.addrsize)
+ r.b = makeBuf(r.d, u, "info", u.off, u.data)
}
}