ReactOS  0.4.11-dev-433-g473ca91
dwarfinfo.c
Go to the documentation of this file.
1 /*
2  * Dwarf info parse and search.
3  */
4 
5 #define NTOSAPI
6 #include <ntifs.h>
7 #include <ndk/ntndk.h>
8 #include <reactos/rossym.h>
9 #include "rossympriv.h"
10 #include <ntimage.h>
11 
12 #define NDEBUG
13 #include <debug.h>
14 
15 #include "dwarf.h"
16 #include <windef.h>
17 
18 enum
19 {
22  DwarfAttrName = 0x03,
74  DwarfAttrType = 0x49,
93 
94  FormAddr = 0x01,
97  FormData2 = 0x05,
98  FormData4 = 0x06,
99  FormData8 = 0x07,
100  FormString = 0x08,
103  FormData1 = 0x0B,
104  FormFlag = 0x0C,
105  FormSdata = 0x0D,
106  FormStrp = 0x0E,
107  FormUdata = 0x0F,
108  FormRefAddr = 0x10,
109  FormRef1 = 0x11,
110  FormRef2 = 0x12,
111  FormRef4 = 0x13,
112  FormRef8 = 0x14,
113  FormRefUdata = 0x15,
115 };
116 
118 static int getulong(DwarfBuf*, int, ulong, ulong*, int*);
119 static int getuchar(DwarfBuf*, int, uchar*);
120 static int getstring(DwarfBuf*, int, char**);
121 static int getblock(DwarfBuf*, int, DwarfBlock*);
122 static int skipform(DwarfBuf*, int);
123 static int constblock(Dwarf*, DwarfBlock*, ulong*);
124 
125 int
127 {
128  if(dwarfenumunit(d, unit, s) < 0)
129  return -1;
130 
131  dwarfnextsymat(d, s, 0); /* s is now the CompileUnit */
132  while(dwarfnextsymat(d, s, 1) == 1)
133  if(s->attrs.name && strcmp(s->attrs.name, name) == 0)
134  return 0;
135  werrstr("symbol '%s' not found", name);
136  return -1;
137 }
138 
139 
140 int
142 {
143  *s = *parent;
144  while(dwarfnextsymat(d, s, parent->depth+1))
145  if(s->attrs.name && strcmp(s->attrs.name, name) == 0)
146  return 0;
147  werrstr("symbol '%s' not found", name);
148  return -1;
149 }
150 
151 int
153 {
154  if(dwarfenumunit(d, unit, s) < 0) {
155  return -1;
156  }
157 
158  dwarfnextsymat(d, s, 0); /* s is now the CompileUnit */
159  if(s->attrs.tag == tag) {
160  return 0;
161  }
162  while(dwarfnextsymat(d, s, 1) == 1)
163  if(s->attrs.tag == tag) {
164  return 0;
165  }
166  werrstr("symbol with tag 0x%lux not found", tag);
167  return -1;
168 }
169 
170 int
172 {
173  if(dwarfenumunit(d, unit, s) < 0)
174  return -1;
175  s->b.p = d->info.data + unit + off;
176  if(dwarfnextsymat(d, s, 0) != 1)
177  return -1;
178  return 0;
179 }
180 
181 int
183 {
184  if(dwarfenumunit(d, unit, s) < 0)
185  return -1;
186 
187  if(dwarfnextsymat(d, s, 0) != 1)
188  return -1;
189  /* s is now the CompileUnit */
190 
191  while(dwarfnextsymat(d, s, 1) == 1){
192  if(s->attrs.tag != TagSubprogram)
193  continue;
194  if(s->attrs.lowpc <= pc && pc < s->attrs.highpc)
195  return 0;
196  }
197  werrstr("fn containing pc 0x%lux not found", pc);
198  return -1;
199 }
200 
201 int
203 {
204  int i;
205  ulong aoff, len;
206 
207  if(unit >= d->info.len){
208  werrstr("dwarf unit address 0x%x >= 0x%x out of range", unit, d->info.len);
209  return -1;
210  }
211  memset(s, 0, sizeof *s);
212  memset(&s->b, 0, sizeof s->b);
213 
214  s->b.d = d;
215  s->b.p = d->info.data + unit;
216  s->b.ep = d->info.data + d->info.len;
217  len = dwarfget4(&s->b);
218  s->nextunit = unit + 4 + len;
219 
220  if(s->b.ep - s->b.p < len){
221  badheader:
222  werrstr("bad dwarf unit header at unit 0x%lux", unit);
223  return -1;
224  }
225  s->b.ep = s->b.p+len;
226  if((i=dwarfget2(&s->b)) != 2)
227  goto badheader;
228  aoff = dwarfget4(&s->b);
229  s->b.addrsize = dwarfget1(&s->b);
230  if(d->addrsize == 0)
231  d->addrsize = s->b.addrsize;
232  if(s->b.p == nil)
233  goto badheader;
234 
235  s->aoff = aoff;
236  s->unit = unit;
237  s->depth = 0;
238  return 0;
239 }
240 
241 int
243 {
244  if(dwarfenumunit(d, 0, s) < 0)
245  return -1;
246  s->allunits = 1;
247  return 0;
248 }
249 
250 int
252 {
253  ulong num;
254  DwarfAbbrev *a;
255 
256  if(s->attrs.haskids)
257  s->depth++;
258 top:
259  if(s->b.p >= s->b.ep){
260  if(s->allunits && s->nextunit < d->info.len){
261  if(dwarfenumunit(d, s->nextunit, s) < 0) {
262  return -1;
263  }
264  s->allunits = 1;
265  goto top;
266  }
267  return 0;
268  }
269 
270  s->uoff = s->b.p - (d->info.data+s->unit);
271  num = dwarfget128(&s->b);
272  if(num == 0){
273  if(s->depth == 0) {
274  return 0;
275  }
276  if(s->depth > 0)
277  s->depth--;
278  goto top;
279  }
280 
281  a = dwarfgetabbrev(d, s->aoff, num);
282  if(a == nil){
283  werrstr("getabbrev %ud %ud for %ud,%ud: %r\n", s->aoff, num, s->unit, s->uoff);
284  return -1;
285  }
286  if(parseattrs(&s->b, s->unit, a, &s->attrs) < 0) {
287  return -1;
288  }
289  return 1;
290 }
291 
292 int
294 {
295  int r;
296  DwarfSym t;
297  uint sib;
298 
299  if(s->depth == depth && s->attrs.have.sibling){
300  sib = s->attrs.sibling;
301  if(sib < d->info.len && d->info.data+sib >= s->b.p)
302  s->b.p = d->info.data+sib;
303  s->attrs.haskids = 0;
304  }
305 
306  /*
307  * The funny game with t and s make sure that
308  * if we get to the end of a run of a particular
309  * depth, we leave s so that a call to nextsymat with depth-1
310  * will actually produce the desired guy. We could change
311  * the interface to dwarfnextsym instead, but I'm scared
312  * to touch it.
313  */
314  t = *s;
315  for(;;){
316  if((r = dwarfnextsym(d, &t)) != 1) {
317  return r;
318  }
319  if(t.depth < depth){
320  /* went too far - nothing to see */
321  return 0;
322  }
323  *s = t;
324  if(t.depth == depth) {
325  return 1;
326  }
327  }
328 }
329 
330 typedef struct Parse Parse;
331 struct Parse {
332  int name;
333  int off;
334  int haveoff;
335  int type;
336 };
337 
338 #define OFFSET(x) offsetof(DwarfAttrs, x), offsetof(DwarfAttrs, have.x)
339 
340 static Parse plist[] = { /* Font Tab 4 */
341  { DwarfAttrAbstractOrigin, OFFSET(abstractorigin), TReference },
342  { DwarfAttrAccessibility, OFFSET(accessibility), TConstant },
343  { DwarfAttrAddrClass, OFFSET(addrclass), TConstant },
344  { DwarfAttrArtificial, OFFSET(isartificial), TFlag },
345  { DwarfAttrBaseTypes, OFFSET(basetypes), TReference },
346  { DwarfAttrBitOffset, OFFSET(bitoffset), TConstant },
347  { DwarfAttrBitSize, OFFSET(bitsize), TConstant },
349  { DwarfAttrCalling, OFFSET(calling), TConstant },
350  { DwarfAttrCommonRef, OFFSET(commonref), TReference },
351  { DwarfAttrCompDir, OFFSET(compdir), TString },
353  { DwarfAttrContainingType, OFFSET(containingtype), TReference },
356  { DwarfAttrDeclColumn, OFFSET(declcolumn), TConstant },
357  { DwarfAttrDeclFile, OFFSET(declfile), TConstant },
358  { DwarfAttrDeclLine, OFFSET(declline), TConstant },
359  { DwarfAttrDeclaration, OFFSET(isdeclaration), TFlag },
360  { DwarfAttrDefaultValue, OFFSET(defaultvalue), TReference },
361  { DwarfAttrDiscr, OFFSET(discr), TReference },
362  { DwarfAttrDiscrList, OFFSET(discrlist), TBlock },
363  { DwarfAttrDiscrValue, OFFSET(discrvalue), TConstant },
365  { DwarfAttrExternal, OFFSET(isexternal), TFlag },
366  { DwarfAttrFrameBase, OFFSET(framebase), TBlock|TConstant },
367  { DwarfAttrFriend, OFFSET(friend), TReference },
368  { DwarfAttrHighpc, OFFSET(highpc), TAddress },
369  { DwarfAttrEntrypc, OFFSET(entrypc), TAddress },
370  { DwarfAttrIdentifierCase, OFFSET(identifiercase), TConstant },
371  { DwarfAttrImport, OFFSET(import), TReference },
372  { DwarfAttrInline, OFFSET(inlined), TConstant },
373  { DwarfAttrIsOptional, OFFSET(isoptional), TFlag },
374  { DwarfAttrLanguage, OFFSET(language), TConstant },
377  { DwarfAttrLowpc, OFFSET(lowpc), TAddress },
378  { DwarfAttrMacroInfo, OFFSET(macroinfo), TConstant },
380  { DwarfAttrNamelistItem, OFFSET(namelistitem), TBlock },
383  { DwarfAttrProducer, OFFSET(producer), TString },
384  { DwarfAttrPrototyped, OFFSET(isprototyped), TFlag },
385  { DwarfAttrRanges, OFFSET(ranges), TReference },
386  { DwarfAttrReturnAddr, OFFSET(returnaddr), TBlock|TConstant },
388  { DwarfAttrSibling, OFFSET(sibling), TReference },
389  { DwarfAttrSpecification, OFFSET(specification), TReference },
390  { DwarfAttrStartScope, OFFSET(startscope), TConstant },
391  { DwarfAttrStaticLink, OFFSET(staticlink), TBlock|TConstant },
392  { DwarfAttrStmtList, OFFSET(stmtlist), TConstant },
393  { DwarfAttrStrideSize, OFFSET(stridesize), TConstant },
394  { DwarfAttrStringLength, OFFSET(stringlength), TBlock|TConstant },
397  { DwarfAttrUseLocation, OFFSET(uselocation), TBlock|TConstant },
398  { DwarfAttrVarParam, OFFSET(isvarparam), TFlag },
399  { DwarfAttrVirtuality, OFFSET(virtuality), TConstant },
400  { DwarfAttrVisibility, OFFSET(visibility), TConstant },
401  { DwarfAttrVtableElemLoc, OFFSET(vtableelemloc), TBlock|TReference },
402  { }
403 };
404 
406 
407 static int
409 {
410  int i, f, n, got;
411  static int nbad;
412  void *v;
413 
414  /* initialize ptab first time through for quick access */
415  if(ptab[DwarfAttrName].name != DwarfAttrName)
416  for(i=0; plist[i].name; i++)
417  ptab[plist[i].name] = plist[i];
418 
419  memset(attrs, 0, sizeof *attrs);
420  attrs->tag = a->tag;
421  attrs->haskids = a->haskids;
422 
423  for(i=0; i<a->nattr; i++){
424  n = a->attr[i].name;
425  f = a->attr[i].form;
426  if(n < 0 || n >= DwarfAttrMax || ptab[n].name==0){
427  if(++nbad == 1)
428  werrstr("dwarf parse attrs: unexpected attribute name 0x%x", n);
429  continue; //return -1;
430  }
431  v = (char*)attrs + ptab[n].off;
432  got = 0;
433  if(f == FormIndirect)
434  f = dwarfget128(b);
435  if((ptab[n].type&(TConstant|TReference|TAddress))
436  && getulong(b, f, unit, v, &got) >= 0)
437  ;
438  else if((ptab[n].type&TFlag) && getuchar(b, f, v) >= 0)
439  got = TFlag;
440  else if((ptab[n].type&TString) && getstring(b, f, v) >= 0)
441  got = TString;
442  else if((ptab[n].type&TBlock) && getblock(b, f, v) >= 0)
443  got = TBlock;
444  else{
445  if(skipform(b, f) < 0){
446  if(++nbad == 1)
447  werrstr("dwarf parse attrs: cannot skip form %d", f);
448  return -1;
449  }
450  }
451  if(got == TBlock && (ptab[n].type&TConstant))
452  got = constblock(b->d, v, v);
453  *((uchar*)attrs+ptab[n].haveoff) = got;
454  }
455  return 0;
456 }
457 
458 static int
460 {
461  static int nbad;
462  uvlong uv;
463 
464  switch(form){
465  default:
466  return -1;
467 
468  /* addresses */
469  case FormAddr:
470  *type = TAddress;
471  *u = dwarfgetaddr(b);
472  return 0;
473 
474  /* references */
475  case FormRefAddr:
476  /* absolute ref in .debug_info */
477  *type = TReference;
478  *u = dwarfgetaddr(b);
479  return 0;
480  case FormRef1:
481  *u = dwarfget1(b);
482  goto relativeref;
483  case FormRef2:
484  *u = dwarfget2(b);
485  goto relativeref;
486  case FormRef4:
487  *u = dwarfget4(b);
488  goto relativeref;
489  case FormRef8:
490  *u = dwarfget8(b);
491  goto relativeref;
492  case FormRefUdata:
493  *u = dwarfget128(b);
494  relativeref:
495  *u += unit;
496  *type = TReference;
497  return 0;
498 
499  /* constants */
500  case FormData1:
501  *u = dwarfget1(b);
502  goto constant;
503  case FormData2:
504  *u = dwarfget2(b);
505  goto constant;
506  case FormData4:
507  *u = dwarfget4(b);
508  goto constant;
509  case FormData8:
510  uv = dwarfget8(b);
511  *u = uv;
512  if(uv != *u && ++nbad == 1)
513  werrstr("dwarf: truncating 64-bit attribute constants");
514  goto constant;
515  case FormSdata:
516  *u = dwarfget128s(b);
517  goto constant;
518  case FormUdata:
519  *u = dwarfget128(b);
520  constant:
521  *type = TConstant;
522  return 0;
523  }
524 }
525 
526 static int
528 {
529  switch(form){
530  default:
531  return -1;
532 
533  case FormFlag:
534  *u = dwarfget1(b);
535  return 0;
536  }
537 }
538 
539 static int
540 getstring(DwarfBuf *b, int form, char **s)
541 {
542  static int nbad;
543  ulong u;
544 
545  switch(form){
546  default:
547  return -1;
548 
549  case FormString:
550  *s = dwarfgetstring(b);
551  return 0;
552 
553  case FormStrp:
554  u = dwarfget4(b);
555  if(u >= b->d->str.len){
556  if(++nbad == 1)
557  werrstr("dwarf: bad string pointer 0x%lux in attribute", u);
558  /* don't return error - maybe can proceed */
559  *s = nil;
560  }else
561  *s = (char*)b->d->str.data + u;
562  return 0;
563 
564  }
565 }
566 
567 static int
569 {
570  ulong n;
571 
572  switch(form){
573  default:
574  return -1;
575  case FormDwarfBlock:
576  n = dwarfget128(b);
577  goto copyn;
578  case FormDwarfBlock1:
579  n = dwarfget1(b);
580  goto copyn;
581  case FormDwarfBlock2:
582  n = dwarfget2(b);
583  goto copyn;
584  case FormDwarfBlock4:
585  n = dwarfget4(b);
586  copyn:
587  bl->data = dwarfgetnref(b, n);
588  bl->len = n;
589  if(bl->data == nil)
590  return -1;
591  return 0;
592  }
593 }
594 
595 static int
597 {
598  DwarfBuf b;
599 
600  memset(&b, 0, sizeof b);
601  b.p = bl->data;
602  b.ep = bl->data+bl->len;
603  b.d = d;
604 
605  switch(dwarfget1(&b)){
606  case OpAddr:
607  *pval = dwarfgetaddr(&b);
608  return TConstant;
609  case OpConst1u:
610  *pval = dwarfget1(&b);
611  return TConstant;
612  case OpConst1s:
613  *pval = (schar)dwarfget1(&b);
614  return TConstant;
615  case OpConst2u:
616  *pval = dwarfget2(&b);
617  return TConstant;
618  case OpConst2s:
619  *pval = (s16int)dwarfget2(&b);
620  return TConstant;
621  case OpConst4u:
622  *pval = dwarfget4(&b);
623  return TConstant;
624  case OpConst4s:
625  *pval = (s32int)dwarfget4(&b);
626  return TConstant;
627  case OpConst8u:
628  *pval = (u64int)dwarfget8(&b);
629  return TConstant;
630  case OpConst8s:
631  *pval = (s64int)dwarfget8(&b);
632  return TConstant;
633  case OpConstu:
634  *pval = dwarfget128(&b);
635  return TConstant;
636  case OpConsts:
637  *pval = dwarfget128s(&b);
638  return TConstant;
639  case OpPlusUconst:
640  *pval = dwarfget128(&b);
641  return TConstant;
642  default:
643  return TBlock;
644  }
645 }
646 
647 /* last resort */
648 static int
650 {
651  int type;
652  DwarfVal val;
653 
654  if(getulong(b, form, 0, &val.c, &type) < 0
655  && getuchar(b, form, (uchar*)&val) < 0
656  && getstring(b, form, &val.s) < 0
657  && getblock(b, form, &val.b) < 0)
658  return -1;
659  return 0;
660 }
661 
uchar lowpc
Definition: dwarf.h:268
static void segment(struct gl_context *ctx, struct LineInfo *line, plot_func plot, GLfloat t0, GLfloat t1)
Definition: s_aaline.c:326
uint addrsize
Definition: dwarf.h:212
#define werrstr(str,...)
Definition: compat.h:34
int dwarfenumunit(Dwarf *d, ulong unit, DwarfSym *s)
Definition: dwarfinfo.c:202
DwarfBlock info
Definition: dwarf.h:446
static int getstring(DwarfBuf *, int, char **)
Definition: dwarfinfo.c:540
static Parse plist[]
Definition: dwarfinfo.c:340
ulong name
Definition: dwarf.h:421
unsigned char uchar
Definition: Unfrag.h:59
int off
Definition: dwarfinfo.c:333
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
char * dwarfgetstring(DwarfBuf *)
Definition: dwarfget.c:55
Dwarf * d
Definition: dwarf.h:209
const XML_Char const XML_Char * encoding
Definition: expat.h:187
int form
Definition: main.c:89
ulong dwarfget4(DwarfBuf *)
Definition: dwarfget.c:96
uchar * data
Definition: dwarf.h:202
GLdouble GLdouble t
Definition: gl.h:2047
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
Definition: ecma_167.h:138
int dwarfnextsym(Dwarf *d, DwarfSym *s)
Definition: dwarfinfo.c:251
signed char schar
Definition: compat.h:5
int s32int
Definition: compat.h:14
GLenum GLclampf GLint GLenum GLuint GLenum GLenum GLsizei GLenum const GLvoid GLfloat GLfloat GLfloat GLfloat GLclampd GLint GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean GLboolean GLboolean GLboolean GLint GLenum GLsizei const GLvoid GLenum GLint GLenum GLint GLint GLsizei GLint GLenum GLint GLint GLint GLint GLsizei GLenum GLsizei const GLuint GLboolean GLenum GLenum GLint GLsizei GLenum GLsizei GLenum const GLvoid GLboolean const GLboolean GLenum const GLdouble * u
Definition: glfuncs.h:88
static Parse ptab[DwarfAttrMax]
Definition: dwarfinfo.c:405
Definition: dwarf.h:137
int dwarfseeksym(Dwarf *d, ulong unit, ulong off, DwarfSym *s)
Definition: dwarfinfo.c:171
int nattr
Definition: dwarf.h:431
long long s64int
Definition: compat.h:16
uint uoff
Definition: dwarf.h:380
int name
Definition: dwarfinfo.c:332
GLuint n
Definition: s_context.h:57
static int skipform(DwarfBuf *, int)
Definition: dwarfinfo.c:649
int bytesize
Definition: main.c:93
GLenum GLclampf GLint i
Definition: glfuncs.h:14
ulong tag
Definition: dwarf.h:225
ulong dwarfget1(DwarfBuf *)
Definition: dwarfget.c:18
short s16int
Definition: compat.h:12
#define a
Definition: ke_i.h:78
int allunits
Definition: dwarf.h:383
Definition: dwarf.h:133
png_const_structrp png_const_inforp int * unit
Definition: png.h:2192
ulong unit
Definition: dwarf.h:379
ulong tag
Definition: dwarf.h:428
static int constblock(Dwarf *, DwarfBlock *, ulong *)
Definition: dwarfinfo.c:596
#define b
Definition: ke_i.h:79
GLuint GLfloat * val
Definition: glext.h:7180
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
uchar haskids
Definition: dwarf.h:226
static int getblock(DwarfBuf *, int, DwarfBlock *)
Definition: dwarfinfo.c:568
#define d
Definition: ke_i.h:81
Definition: dwarf.h:131
static int getulong(DwarfBuf *, int, ulong, ulong *, int *)
Definition: dwarfinfo.c:459
r parent
Definition: btrfs.c:2644
int addrsize
Definition: dwarf.h:442
DwarfBlock b
Definition: dwarf.h:220
ulong len
Definition: dwarf.h:203
GLuint GLuint num
Definition: glext.h:9618
int dwarfnextsymat(Dwarf *d, DwarfSym *s, int depth)
Definition: dwarfinfo.c:293
GLuint GLuint GLsizei count
Definition: gl.h:1545
int dwarflookupsubname(Dwarf *d, DwarfSym *parent, char *name, DwarfSym *s)
Definition: dwarfinfo.c:141
uchar * p
Definition: dwarf.h:210
int dwarflookuptag(Dwarf *d, ulong unit, ulong tag, DwarfSym *s)
Definition: dwarfinfo.c:152
long dwarfget128s(DwarfBuf *)
Definition: dwarfget.c:198
ulong dwarfget2(DwarfBuf *)
Definition: dwarfget.c:82
ulong c
Definition: dwarf.h:218
GLint GLint GLsizei GLsizei GLsizei depth
Definition: gl.h:1546
ulong nextunit
Definition: dwarf.h:384
GLdouble s
Definition: gl.h:2039
GLenum GLsizei len
Definition: glext.h:6722
unsigned long ulong
Definition: linux.h:275
DwarfBuf b
Definition: dwarf.h:378
const GLdouble * v
Definition: gl.h:2040
ulong dwarfget128(DwarfBuf *)
Definition: dwarfget.c:153
int dwarflookupfn(Dwarf *d, ulong unit, ulong pc, DwarfSym *s)
Definition: dwarfinfo.c:182
Definition: dwarf.h:134
#define OFFSET(x)
Definition: dwarfinfo.c:338
static int getuchar(DwarfBuf *, int, uchar *)
Definition: dwarfinfo.c:527
#define f
Definition: ke_i.h:83
Definition: dwarf.h:436
DwarfAttr * attr
Definition: dwarf.h:430
DwarfAbbrev * dwarfgetabbrev(Dwarf *, ulong, ulong)
Definition: dwarfabbrev.c:129
#define nil
Definition: compat.h:23
uchar * ep
Definition: dwarf.h:211
int type
Definition: dwarfinfo.c:335
unsigned long long uvlong
Definition: compat.h:9
ulong form
Definition: dwarf.h:422
uchar * dwarfgetnref(DwarfBuf *, ulong)
Definition: dwarfget.c:41
Definition: name.c:36
uvlong dwarfget8(DwarfBuf *)
Definition: dwarfget.c:110
int depth
Definition: dwarf.h:382
uchar haskids
Definition: dwarf.h:429
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
uchar name
Definition: dwarf.h:270
DwarfBlock str
Definition: dwarf.h:451
static int priority
Definition: timer.c:163
int haveoff
Definition: dwarfinfo.c:334
ulong aoff
Definition: dwarf.h:381
int dwarfenum(Dwarf *d, DwarfSym *s)
Definition: dwarfinfo.c:242
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859
UINT32 uint
Definition: types.h:83
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
struct DwarfAttrs::@3957 have
uchar sibling
Definition: dwarf.h:278
char * s
Definition: dwarf.h:217
static int parseattrs(DwarfBuf *, ulong, DwarfAbbrev *, DwarfAttrs *)
Definition: dwarfinfo.c:408
#define memset(x, y, z)
Definition: compat.h:39
int dwarflookupnameinunit(Dwarf *d, ulong unit, char *name, DwarfSym *s)
Definition: dwarfinfo.c:126
ulong dwarfgetaddr(DwarfBuf *)
Definition: dwarfget.c:124
DwarfAttrs attrs
Definition: dwarf.h:375
const char const char ** ordering
Definition: cffdrivr.c:690
unsigned long long u64int
Definition: compat.h:15
off
Definition: i386-dis.c:3909