Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendwarfget.c
Go to the documentation of this file.
00001 /* 00002 * Dwarf data format parsing routines. 00003 */ 00004 00005 #include <precomp.h> 00006 00007 #define NDEBUG 00008 #include <debug.h> 00009 00010 ulong 00011 dwarfget1(DwarfBuf *b) 00012 { 00013 if(b->p==nil || b->p+1 > b->ep){ 00014 b->p = nil; 00015 return 0; 00016 } 00017 return *b->p++; 00018 } 00019 00020 int 00021 dwarfgetn(DwarfBuf *b, uchar *a, int n) 00022 { 00023 if(b->p==nil || b->p+n > b->ep){ 00024 b->p = nil; 00025 memset(a, 0, n); 00026 return -1; 00027 } 00028 memmove(a, b->p, n); 00029 b->p += n; 00030 return 0; 00031 } 00032 00033 uchar* 00034 dwarfgetnref(DwarfBuf *b, ulong n) 00035 { 00036 uchar *p; 00037 00038 if(b->p==nil || b->p+n > b->ep){ 00039 b->p = nil; 00040 return nil; 00041 } 00042 p = b->p; 00043 b->p += n; 00044 return p; 00045 } 00046 00047 char* 00048 dwarfgetstring(DwarfBuf *b) 00049 { 00050 char *s; 00051 00052 if(b->p == nil) 00053 return nil; 00054 s = (char*)b->p; 00055 while(b->p < b->ep && *b->p) 00056 b->p++; 00057 if(b->p >= b->ep){ 00058 b->p = nil; 00059 return nil; 00060 } 00061 b->p++; 00062 return s; 00063 } 00064 00065 void 00066 dwarfskip(DwarfBuf *b, int n) 00067 { 00068 if(b->p==nil || b->p+n > b->ep) 00069 b->p = nil; 00070 else 00071 b->p += n; 00072 } 00073 00074 ulong 00075 dwarfget2(DwarfBuf *b) 00076 { 00077 ulong v; 00078 00079 if(b->p==nil || b->p+2 > b->ep){ 00080 b->p = nil; 00081 return 0; 00082 } 00083 v = b->d->pe->e2(b->p); 00084 b->p += 2; 00085 return v; 00086 } 00087 00088 ulong 00089 dwarfget4(DwarfBuf *b) 00090 { 00091 ulong v; 00092 00093 if(b->p==nil || b->p+4 > b->ep){ 00094 b->p = nil; 00095 return 0; 00096 } 00097 v = b->d->pe->e4(b->p); 00098 b->p += 4; 00099 return v; 00100 } 00101 00102 uvlong 00103 dwarfget8(DwarfBuf *b) 00104 { 00105 uvlong v; 00106 00107 if(b->p==nil || b->p+8 > b->ep){ 00108 b->p = nil; 00109 return 0; 00110 } 00111 v = b->d->pe->e8(b->p); 00112 b->p += 8; 00113 return v; 00114 } 00115 00116 ulong 00117 dwarfgetaddr(DwarfBuf *b) 00118 { 00119 static int nbad; 00120 00121 if(b->addrsize == 0) 00122 b->addrsize = b->d->addrsize; 00123 00124 switch(b->addrsize){ 00125 case 1: 00126 return dwarfget1(b); 00127 case 2: 00128 return dwarfget2(b); 00129 case 4: 00130 return dwarfget4(b); 00131 case 8: 00132 return dwarfget8(b); 00133 default: 00134 if(++nbad == 1) 00135 werrstr("dwarf: unexpected address size %lud in dwarfgetaddr", b->addrsize); 00136 b->p = nil; 00137 return 0; 00138 } 00139 } 00140 00141 int n1, n2, n3, n4, n5; 00142 00143 /* An inline function picks off the calls to dwarfget128 for 1-byte encodings, 00144 * more than by far the common case (99.999% on most binaries!). */ 00145 ulong 00146 dwarfget128(DwarfBuf *b) 00147 { 00148 static int nbad; 00149 ulong c, d; 00150 00151 if(b->p == nil) 00152 return 0; 00153 c = *b->p++; 00154 if(!(c&0x80)) 00155 {n1++; 00156 return c; 00157 } 00158 c &= ~0x80; 00159 d = *b->p++; 00160 c |= (d&0x7F)<<7; 00161 if(!(d&0x80)) 00162 {n2++; 00163 return c; 00164 } 00165 d = *b->p++; 00166 c |= (d&0x7F)<<14; 00167 if(!(d&0x80)) 00168 {n3++; 00169 return c; 00170 } 00171 d = *b->p++; 00172 c |= (d&0x7F)<<21; 00173 if(!(d&0x80)) 00174 {n4++; 00175 return c; 00176 } 00177 d = *b->p++; 00178 c |= (d&0x7F)<<28; 00179 if(!(d&0x80)) 00180 {n5++; 00181 return c; 00182 } 00183 while(b->p<b->ep && *b->p&0x80) 00184 b->p++; 00185 if(++nbad == 1) 00186 werrstr("dwarf: overflow during parsing of uleb128 integer"); 00187 return c; 00188 } 00189 00190 long 00191 dwarfget128s(DwarfBuf *b) 00192 { 00193 int nb, c; 00194 ulong v; 00195 static int nbad; 00196 00197 v = 0; 00198 nb = 0; 00199 if(b->p==nil) 00200 return 0; 00201 while(b->p<b->ep){ 00202 c = *b->p++; 00203 v |= (c & 0x7F)<<nb; 00204 nb += 7; 00205 if(!(c&0x80)) 00206 break; 00207 } 00208 if(v&(1<<(nb-1))) 00209 v |= ~(((ulong)1<<nb)-1); 00210 if(nb > 8*sizeof(ulong)){ 00211 if(0) 00212 if(++nbad == 1) 00213 werrstr("dwarf: overflow during parsing of sleb128 integer: got %d bits", nb); 00214 } 00215 return v; 00216 } 00217 00218 Generated on Sun May 27 2012 04:36:17 for ReactOS by
1.7.6.1
|