Source file src/pkg/debug/dwarf/unit.go
1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 package dwarf
6
7 import "strconv"
8
9 // DWARF debug info is split into a sequence of compilation units.
10 // Each unit has its own abbreviation table and address size.
11
12 type unit struct {
13 base Offset // byte offset of header within the aggregate info
14 off Offset // byte offset of data within the aggregate info
15 data []byte
16 atable abbrevTable
17 addrsize int
18 }
19
20 func (d *Data) parseUnits() ([]unit, error) {
21 // Count units.
22 nunit := 0
23 b := makeBuf(d, "info", 0, d.info, 0)
24 for len(b.data) > 0 {
25 b.skip(int(b.uint32()))
26 nunit++
27 }
28 if b.err != nil {
29 return nil, b.err
30 }
31
32 // Again, this time writing them down.
33 b = makeBuf(d, "info", 0, d.info, 0)
34 units := make([]unit, nunit)
35 for i := range units {
36 u := &units[i]
37 u.base = b.off
38 n := b.uint32()
39 if vers := b.uint16(); vers != 2 {
40 b.error("unsupported DWARF version " + strconv.Itoa(int(vers)))
41 break
42 }
43 atable, err := d.parseAbbrev(b.uint32())
44 if err != nil {
45 if b.err == nil {
46 b.err = err
47 }
48 break
49 }
50 u.atable = atable
51 u.addrsize = int(b.uint8())
52 u.off = b.off
53 u.data = b.bytes(int(n - (2 + 4 + 1)))
54 }
55 if b.err != nil {
56 return nil, b.err
57 }
58 return units, nil
59 }