summaryrefslogtreecommitdiff
path: root/src/pkg/debug/dwarf/unit.go
blob: 582fd0cf27313370bba57985fe7b945b39305efa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// Copyright 2009 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package dwarf

import (
	"os";
	"strconv";
)

// DWARF debug info is split into a sequence of compilation units.
// Each unit has its own abbreviation table and address size.

type unit struct {
	base		Offset;	// byte offset of header within the aggregate info
	off		Offset;	// byte offset of data within the aggregate info
	data		[]byte;
	atable		abbrevTable;
	addrsize	int;
}

func (d *Data) parseUnits() ([]unit, os.Error) {
	// Count units.
	nunit := 0;
	b := makeBuf(d, "info", 0, d.info, 0);
	for len(b.data) > 0 {
		b.skip(int(b.uint32()));
		nunit++;
	}
	if b.err != nil {
		return nil, b.err
	}

	// Again, this time writing them down.
	b = makeBuf(d, "info", 0, d.info, 0);
	units := make([]unit, nunit);
	for i := range units {
		u := &units[i];
		u.base = b.off;
		n := b.uint32();
		if vers := b.uint16(); vers != 2 {
			b.error("unsupported DWARF version " + strconv.Itoa(int(vers)));
			break;
		}
		atable, err := d.parseAbbrev(b.uint32());
		if err != nil {
			if b.err == nil {
				b.err = err
			}
			break;
		}
		u.atable = atable;
		u.addrsize = int(b.uint8());
		u.off = b.off;
		u.data = b.bytes(int(n-(2+4+1)));
	}
	if b.err != nil {
		return nil, b.err
	}
	return units, nil;
}