Create the AHCI branch for Aman's work
[reactos.git] / sdk / lib / rossym_new / dwarfaranges.c
1 /*
2 * Dwarf address ranges parsing code.
3 */
4
5 #include <precomp.h>
6
7 #define NDEBUG
8 #include <debug.h>
9
10 int
11 dwarfaddrtounit(Dwarf *d, ulong addr, ulong *unit)
12 {
13 DwarfBuf b;
14 int segsize, i;
15 ulong len, id, off, base, size;
16 uchar *start, *end;
17
18 memset(&b, 0, sizeof b);
19 b.d = d;
20 b.p = d->aranges.data;
21 b.ep = b.p + d->aranges.len;
22
23 while(b.p < b.ep){
24 start = b.p;
25 len = dwarfget4(&b);
26 if (!len) { b.ep = b.p - 4; return -1; }
27 if((id = dwarfget2(&b)) != 2){
28 if(b.p == nil){
29 underflow:
30 werrstr("buffer underflow reading address ranges header");
31 }else
32 werrstr("bad dwarf version 0x%x in address ranges header", id);
33 return -1;
34 }
35 off = dwarfget4(&b);
36 b.addrsize = dwarfget1(&b);
37 if(d->addrsize == 0)
38 d->addrsize = b.addrsize;
39 segsize = dwarfget1(&b);
40 USED(segsize); /* what am i supposed to do with this? */
41 if(b.p == nil)
42 goto underflow;
43 if((i = (b.p-start) % (2*b.addrsize)) != 0)
44 b.p += 2*b.addrsize - i;
45 end = start+4+len;
46 while(b.p!=nil && b.p<end){
47 base = dwarfgetaddr(&b);
48 size = dwarfgetaddr(&b);
49 if (!size) continue;
50 if(b.p == nil)
51 goto underflow;
52 if(base <= addr && addr < base+size){
53 *unit = off;
54 return 0;
55 }
56 }
57 if(b.p == nil)
58 goto underflow;
59 b.p = end;
60 }
61 werrstr("address 0x%lux is not listed in dwarf debugging symbols", addr);
62 return -1;
63 }