...
Source file src/pkg/debug/dwarf/buf.go
1
2
3
4
5
6
7 package dwarf
8
9 import (
10 "encoding/binary"
11 "strconv"
12 )
13
14
15 type buf struct {
16 dwarf *Data
17 order binary.ByteOrder
18 format dataFormat
19 name string
20 off Offset
21 data []byte
22 err error
23 }
24
25
26
27 type dataFormat interface {
28
29 version() int
30
31
32 dwarf64() (dwarf64 bool, isKnown bool)
33
34
35 addrsize() int
36 }
37
38
39 type unknownFormat struct{}
40
41 func (u unknownFormat) version() int {
42 return 0
43 }
44
45 func (u unknownFormat) dwarf64() (bool, bool) {
46 return false, false
47 }
48
49 func (u unknownFormat) addrsize() int {
50 return 0
51 }
52
53 func makeBuf(d *Data, format dataFormat, name string, off Offset, data []byte) buf {
54 return buf{d, d.order, format, name, off, data, nil}
55 }
56
57 func (b *buf) uint8() uint8 {
58 if len(b.data) < 1 {
59 b.error("underflow")
60 return 0
61 }
62 val := b.data[0]
63 b.data = b.data[1:]
64 b.off++
65 return val
66 }
67
68 func (b *buf) bytes(n int) []byte {
69 if len(b.data) < n {
70 b.error("underflow")
71 return nil
72 }
73 data := b.data[0:n]
74 b.data = b.data[n:]
75 b.off += Offset(n)
76 return data
77 }
78
79 func (b *buf) skip(n int) { b.bytes(n) }
80
81 func (b *buf) string() string {
82 for i := 0; i < len(b.data); i++ {
83 if b.data[i] == 0 {
84 s := string(b.data[0:i])
85 b.data = b.data[i+1:]
86 b.off += Offset(i + 1)
87 return s
88 }
89 }
90 b.error("underflow")
91 return ""
92 }
93
94 func (b *buf) uint16() uint16 {
95 a := b.bytes(2)
96 if a == nil {
97 return 0
98 }
99 return b.order.Uint16(a)
100 }
101
102 func (b *buf) uint32() uint32 {
103 a := b.bytes(4)
104 if a == nil {
105 return 0
106 }
107 return b.order.Uint32(a)
108 }
109
110 func (b *buf) uint64() uint64 {
111 a := b.bytes(8)
112 if a == nil {
113 return 0
114 }
115 return b.order.Uint64(a)
116 }
117
118
119
120 func (b *buf) varint() (c uint64, bits uint) {
121 for i := 0; i < len(b.data); i++ {
122 byte := b.data[i]
123 c |= uint64(byte&0x7F) << bits
124 bits += 7
125 if byte&0x80 == 0 {
126 b.off += Offset(i + 1)
127 b.data = b.data[i+1:]
128 return c, bits
129 }
130 }
131 return 0, 0
132 }
133
134
135 func (b *buf) uint() uint64 {
136 x, _ := b.varint()
137 return x
138 }
139
140
141 func (b *buf) int() int64 {
142 ux, bits := b.varint()
143 x := int64(ux)
144 if x&(1<<(bits-1)) != 0 {
145 x |= -1 << bits
146 }
147 return x
148 }
149
150
151 func (b *buf) addr() uint64 {
152 switch b.format.addrsize() {
153 case 1:
154 return uint64(b.uint8())
155 case 2:
156 return uint64(b.uint16())
157 case 4:
158 return uint64(b.uint32())
159 case 8:
160 return b.uint64()
161 }
162 b.error("unknown address size")
163 return 0
164 }
165
166 func (b *buf) unitLength() (length Offset, dwarf64 bool) {
167 length = Offset(b.uint32())
168 if length == 0xffffffff {
169 dwarf64 = true
170 length = Offset(b.uint64())
171 } else if length >= 0xfffffff0 {
172 b.error("unit length has reserved value")
173 }
174 return
175 }
176
177 func (b *buf) error(s string) {
178 if b.err == nil {
179 b.data = nil
180 b.err = DecodeError{b.name, b.off, s}
181 }
182 }
183
184 type DecodeError struct {
185 Name string
186 Offset Offset
187 Err string
188 }
189
190 func (e DecodeError) Error() string {
191 return "decoding dwarf section " + e.Name + " at offset 0x" + strconv.FormatInt(int64(e.Offset), 16) + ": " + e.Err
192 }
193
View as plain text