2 * Dwarf data format parsing routines.
11 dwarfget1(DwarfBuf
*b
)
13 if(b
->p
==nil
|| b
->p
+1 > b
->ep
){
21 dwarfgetn(DwarfBuf
*b
, uchar
*a
, int n
)
23 if(b
->p
==nil
|| b
->p
+n
> b
->ep
){
34 dwarfgetnref(DwarfBuf
*b
, ulong n
)
38 if(b
->p
==nil
|| b
->p
+n
> b
->ep
){
48 dwarfgetstring(DwarfBuf
*b
)
55 while(b
->p
< b
->ep
&& *b
->p
)
66 dwarfskip(DwarfBuf
*b
, int n
)
68 if(b
->p
==nil
|| b
->p
+n
> b
->ep
)
75 dwarfget2(DwarfBuf
*b
)
79 if(b
->p
==nil
|| b
->p
+2 > b
->ep
){
83 v
= b
->d
->pe
->e2(b
->p
);
89 dwarfget4(DwarfBuf
*b
)
93 if(b
->p
==nil
|| b
->p
+4 > b
->ep
){
97 v
= b
->d
->pe
->e4(b
->p
);
103 dwarfget8(DwarfBuf
*b
)
107 if(b
->p
==nil
|| b
->p
+8 > b
->ep
){
111 v
= b
->d
->pe
->e8(b
->p
);
117 dwarfgetaddr(DwarfBuf
*b
)
122 b
->addrsize
= b
->d
->addrsize
;
135 werrstr("dwarf: unexpected address size %lud in dwarfgetaddr", b
->addrsize
);
141 int n1
, n2
, n3
, n4
, n5
;
143 /* An inline function picks off the calls to dwarfget128 for 1-byte encodings,
144 * more than by far the common case (99.999% on most binaries!). */
146 dwarfget128(DwarfBuf
*b
)
183 while(b
->p
<b
->ep
&& *b
->p
&0x80)
186 werrstr("dwarf: overflow during parsing of uleb128 integer");
191 dwarfget128s(DwarfBuf
*b
)
209 v
|= ~(((ulong
)1<<nb
)-1);
210 if(nb
> 8*sizeof(ulong
)){
213 werrstr("dwarf: overflow during parsing of sleb128 integer: got %d bits", nb
);