1
2
3
4
5
6
7
8 package dwarf
9
10 import (
11 "encoding/binary"
12 "os"
13 )
14
15
16
17 type Data struct {
18
19 abbrev []byte
20 aranges []byte
21 frame []byte
22 info []byte
23 line []byte
24 pubnames []byte
25 ranges []byte
26 str []byte
27
28
29 abbrevCache map[uint32]abbrevTable
30 addrsize int
31 order binary.ByteOrder
32 typeCache map[Offset]Type
33 unit []unit
34 }
35
36
37
38
39
40
41
42
43 func New(abbrev, aranges, frame, info, line, pubnames, ranges, str []byte) (*Data, os.Error) {
44 d := &Data{
45 abbrev: abbrev,
46 aranges: aranges,
47 frame: frame,
48 info: info,
49 line: line,
50 pubnames: pubnames,
51 ranges: ranges,
52 str: str,
53 abbrevCache: make(map[uint32]abbrevTable),
54 typeCache: make(map[Offset]Type),
55 }
56
57
58
59 if len(d.info) < 6 {
60 return nil, DecodeError{"info", Offset(len(d.info)), "too short"}
61 }
62 x, y := d.info[4], d.info[5]
63 switch {
64 case x == 0 && y == 0:
65 return nil, DecodeError{"info", 4, "unsupported version 0"}
66 case x == 0:
67 d.order = binary.BigEndian
68 case y == 0:
69 d.order = binary.LittleEndian
70 default:
71 return nil, DecodeError{"info", 4, "cannot determine byte order"}
72 }
73
74 u, err := d.parseUnits()
75 if err != nil {
76 return nil, err
77 }
78 d.unit = u
79 return d, nil
80 }