diff options
Diffstat (limited to 'libgo/go/debug/dwarf/unit.go')
-rw-r--r-- | libgo/go/debug/dwarf/unit.go | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/libgo/go/debug/dwarf/unit.go b/libgo/go/debug/dwarf/unit.go index 98024ca1f84..29a744fd184 100644 --- a/libgo/go/debug/dwarf/unit.go +++ b/libgo/go/debug/dwarf/unit.go @@ -19,7 +19,8 @@ type unit struct { atable abbrevTable asize int vers int - is64 bool // True for 64-bit DWARF format + utype uint8 // DWARF 5 unit type + is64 bool // True for 64-bit DWARF format } // Implement the dataFormat interface. @@ -63,11 +64,15 @@ func (d *Data) parseUnits() ([]unit, error) { n, u.is64 = b.unitLength() dataOff := b.off vers := b.uint16() - if vers != 2 && vers != 3 && vers != 4 { + if vers < 2 || vers > 5 { b.error("unsupported DWARF version " + strconv.Itoa(int(vers))) break } u.vers = int(vers) + if vers >= 5 { + u.utype = b.uint8() + u.asize = int(b.uint8()) + } var abbrevOff uint64 if u.is64 { abbrevOff = b.uint64() @@ -82,7 +87,22 @@ func (d *Data) parseUnits() ([]unit, error) { break } u.atable = atable - u.asize = int(b.uint8()) + if vers < 5 { + u.asize = int(b.uint8()) + } + + switch u.utype { + case utSkeleton, utSplitCompile: + b.uint64() // unit ID + case utType, utSplitType: + b.uint64() // type signature + if u.is64 { // type offset + b.uint64() + } else { + b.uint32() + } + } + u.off = b.off u.data = b.bytes(int(n - (b.off - dataOff))) } |