summaryrefslogtreecommitdiff
path: root/libgo/go/debug/dwarf/unit.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/debug/dwarf/unit.go')
-rw-r--r--libgo/go/debug/dwarf/unit.go26
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)))
}