2 * Dwarf data format parsing routines.
7 #include <reactos/rossym.h>
8 #include "rossympriv.h"
18 dwarfget1(DwarfBuf
*b
)
20 if(b
->p
==nil
|| b
->p
+1 > b
->ep
){
28 dwarfgetn(DwarfBuf
*b
, uchar
*a
, int n
)
30 if(b
->p
==nil
|| b
->p
+n
> b
->ep
){
41 dwarfgetnref(DwarfBuf
*b
, ulong n
)
45 if(b
->p
==nil
|| b
->p
+n
> b
->ep
){
55 dwarfgetstring(DwarfBuf
*b
)
62 while(b
->p
< b
->ep
&& *b
->p
)
73 dwarfskip(DwarfBuf
*b
, int n
)
75 if(b
->p
==nil
|| b
->p
+n
> b
->ep
)
82 dwarfget2(DwarfBuf
*b
)
86 if(b
->p
==nil
|| b
->p
+2 > b
->ep
){
90 v
= b
->d
->pe
->e2(b
->p
);
96 dwarfget4(DwarfBuf
*b
)
100 if(b
->p
==nil
|| b
->p
+4 > b
->ep
){
104 v
= b
->d
->pe
->e4(b
->p
);
110 dwarfget8(DwarfBuf
*b
)
114 if(b
->p
==nil
|| b
->p
+8 > b
->ep
){
118 v
= b
->d
->pe
->e8(b
->p
);
124 dwarfgetaddr(DwarfBuf
*b
)
129 b
->addrsize
= b
->d
->addrsize
;
142 werrstr("dwarf: unexpected address size %lud in dwarfgetaddr\n", b
->addrsize
);
148 int n1
, n2
, n3
, n4
, n5
;
150 /* An inline function picks off the calls to dwarfget128 for 1-byte encodings,
151 * more than by far the common case (99.999% on most binaries!). */
153 dwarfget128(DwarfBuf
*b
)
190 while(b
->p
<b
->ep
&& *b
->p
&0x80)
193 werrstr("dwarf: overflow during parsing of uleb128 integer\n");
198 dwarfget128s(DwarfBuf
*b
)
216 v
|= ~(((ulong
)1<<nb
)-1);
217 if(nb
> 8*sizeof(ulong
)){
220 werrstr("dwarf: overflow during parsing of sleb128 integer: got %d bits", nb
);