diff options
Diffstat (limited to 'libgo/go/debug/dwarf/entry.go')
-rw-r--r-- | libgo/go/debug/dwarf/entry.go | 40 |
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) } } |