ReactOS 0.4.15-dev-6047-gb29e82d
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
18enum
19{
93
94 FormAddr = 0x01,
97 FormData2 = 0x05,
98 FormData4 = 0x06,
99 FormData8 = 0x07,
103 FormData1 = 0x0B,
104 FormFlag = 0x0C,
105 FormSdata = 0x0D,
106 FormStrp = 0x0E,
107 FormUdata = 0x0F,
109 FormRef1 = 0x11,
110 FormRef2 = 0x12,
111 FormRef4 = 0x13,
112 FormRef8 = 0x14,
114 FormIndirect = 0x16
116
118static int getulong(DwarfBuf*, int, ulong, ulong*, int*);
119static int getuchar(DwarfBuf*, int, uchar*);
120static int getstring(DwarfBuf*, int, char**);
121static int getblock(DwarfBuf*, int, DwarfBlock*);
122static int skipform(DwarfBuf*, int);
123static int constblock(Dwarf*, DwarfBlock*, ulong*);
124
125int
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
140int
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
151int
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
170int
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
181int
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
201int
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
241int
243{
244 if(dwarfenumunit(d, 0, s) < 0)
245 return -1;
246 s->allunits = 1;
247 return 0;
248}
249
250int
252{
253 ulong num;
254 DwarfAbbrev *a;
255
256 if(s->attrs.haskids)
257 s->depth++;
258top:
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
292int
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
330typedef struct Parse Parse;
331struct Parse {
332 int name;
333 int off;
335 int type;
336};
337
338#define OFFSET(x) offsetof(DwarfAttrs, x), offsetof(DwarfAttrs, have.x)
339
340static 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
407static 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 */
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);
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
458static 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
526static int
528{
529 switch(form){
530 default:
531 return -1;
532
533 case FormFlag:
534 *u = dwarfget1(b);
535 return 0;
536 }
537}
538
539static int
540getstring(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
567static 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
595static 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 */
648static int
650{
651 int type;
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
unsigned char uchar
Definition: Unfrag.h:59
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
UINT32 uint
Definition: types.h:83
r parent
Definition: btrfs.c:3010
unsigned long ulong
Definition: linux.h:275
int form
Definition: main.c:89
int bytesize
Definition: main.c:93
static enum @940 ordering
GLint GLint GLsizei GLsizei GLsizei depth
Definition: gl.h:1546
const GLdouble * v
Definition: gl.h:2040
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLdouble s
Definition: gl.h:2039
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLdouble GLdouble t
Definition: gl.h:2047
GLdouble n
Definition: glext.h:7729
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859
GLfloat f
Definition: glext.h:7540
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLuint GLfloat * val
Definition: glext.h:7180
GLuint GLuint num
Definition: glext.h:9618
GLenum GLsizei len
Definition: glext.h:6722
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
GLsizei GLenum const GLvoid GLsizei GLenum 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 const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum 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 const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
#define d
Definition: ke_i.h:81
#define f
Definition: ke_i.h:83
#define a
Definition: ke_i.h:78
#define b
Definition: ke_i.h:79
static int priority
Definition: timer.c:163
png_const_structrp png_const_inforp int * unit
Definition: png.h:2159
static int getstring(DwarfBuf *, int, char **)
Definition: dwarfinfo.c:540
int dwarflookupsubname(Dwarf *d, DwarfSym *parent, char *name, DwarfSym *s)
Definition: dwarfinfo.c:141
static int getuchar(DwarfBuf *, int, uchar *)
Definition: dwarfinfo.c:527
static int constblock(Dwarf *, DwarfBlock *, ulong *)
Definition: dwarfinfo.c:596
static int getblock(DwarfBuf *, int, DwarfBlock *)
Definition: dwarfinfo.c:568
int dwarflookupfn(Dwarf *d, ulong unit, ulong pc, DwarfSym *s)
Definition: dwarfinfo.c:182
int dwarfnextsymat(Dwarf *d, DwarfSym *s, int depth)
Definition: dwarfinfo.c:293
int dwarflookupnameinunit(Dwarf *d, ulong unit, char *name, DwarfSym *s)
Definition: dwarfinfo.c:126
static int getulong(DwarfBuf *, int, ulong, ulong *, int *)
Definition: dwarfinfo.c:459
int dwarfenumunit(Dwarf *d, ulong unit, DwarfSym *s)
Definition: dwarfinfo.c:202
@ DwarfAttrSibling
Definition: dwarfinfo.c:20
@ DwarfAttrIsOptional
Definition: dwarfinfo.c:42
@ DwarfAttrUpperBound
Definition: dwarfinfo.c:49
@ DwarfAttrVirtuality
Definition: dwarfinfo.c:77
@ DwarfAttrDefaultValue
Definition: dwarfinfo.c:40
@ DwarfAttrUseUTF8
Definition: dwarfinfo.c:84
@ DwarfAttrConstValue
Definition: dwarfinfo.c:38
@ DwarfAttrLanguage
Definition: dwarfinfo.c:30
@ DwarfAttrTrampoline
Definition: dwarfinfo.c:87
@ DwarfAttrIdentifierCase
Definition: dwarfinfo.c:67
@ DwarfAttrAddrClass
Definition: dwarfinfo.c:52
@ FormAddr
Definition: dwarfinfo.c:94
@ DwarfAttrAllocated
Definition: dwarfinfo.c:79
@ DwarfAttrCallColumn
Definition: dwarfinfo.c:88
@ DwarfAttrExternal
Definition: dwarfinfo.c:64
@ DwarfAttrName
Definition: dwarfinfo.c:22
@ DwarfAttrNamelistItem
Definition: dwarfinfo.c:69
@ DwarfAttrAssociated
Definition: dwarfinfo.c:80
@ FormUdata
Definition: dwarfinfo.c:107
@ FormRefAddr
Definition: dwarfinfo.c:108
@ FormRef2
Definition: dwarfinfo.c:110
@ DwarfAttrMacroInfo
Definition: dwarfinfo.c:68
@ DwarfAttrOrdering
Definition: dwarfinfo.c:23
@ FormIndirect
Definition: dwarfinfo.c:114
@ FormSdata
Definition: dwarfinfo.c:105
@ FormRef4
Definition: dwarfinfo.c:111
@ DwarfAttrByteSize
Definition: dwarfinfo.c:24
@ FormDwarfBlock4
Definition: dwarfinfo.c:96
@ DwarfAttrLocation
Definition: dwarfinfo.c:21
@ DwarfAttrExtension
Definition: dwarfinfo.c:85
@ DwarfAttrSegment
Definition: dwarfinfo.c:71
@ DwarfAttrDataLocation
Definition: dwarfinfo.c:81
@ DwarfAttrCalling
Definition: dwarfinfo.c:55
@ DwarfAttrAbstractOrigin
Definition: dwarfinfo.c:50
@ DwarfAttrVarParam
Definition: dwarfinfo.c:76
@ DwarfAttrDescription
Definition: dwarfinfo.c:91
@ DwarfAttrUseLocation
Definition: dwarfinfo.c:75
@ DwarfAttrStartScope
Definition: dwarfinfo.c:47
@ DwarfAttrStrideSize
Definition: dwarfinfo.c:48
@ DwarfAttrDiscrValue
Definition: dwarfinfo.c:32
@ DwarfAttrContainingType
Definition: dwarfinfo.c:39
@ DwarfAttrCommonRef
Definition: dwarfinfo.c:36
@ DwarfAttrType
Definition: dwarfinfo.c:74
@ DwarfAttrLowerBound
Definition: dwarfinfo.c:43
@ DwarfAttrCallFile
Definition: dwarfinfo.c:89
@ DwarfAttrEntrypc
Definition: dwarfinfo.c:83
@ FormData1
Definition: dwarfinfo.c:103
@ DwarfAttrDeclaration
Definition: dwarfinfo.c:61
@ DwarfAttrStride
Definition: dwarfinfo.c:82
@ DwarfAttrDeclColumn
Definition: dwarfinfo.c:58
@ DwarfAttrFriend
Definition: dwarfinfo.c:66
@ FormRef8
Definition: dwarfinfo.c:112
@ DwarfAttrBaseTypes
Definition: dwarfinfo.c:54
@ DwarfAttrStaticLink
Definition: dwarfinfo.c:73
@ FormData8
Definition: dwarfinfo.c:99
@ DwarfAttrStringLength
Definition: dwarfinfo.c:35
@ DwarfAttrCompDir
Definition: dwarfinfo.c:37
@ DwarfAttrPrototyped
Definition: dwarfinfo.c:45
@ DwarfAttrHighpc
Definition: dwarfinfo.c:29
@ FormDwarfBlock2
Definition: dwarfinfo.c:95
@ DwarfAttrAccessibility
Definition: dwarfinfo.c:51
@ DwarfAttrReturnAddr
Definition: dwarfinfo.c:46
@ DwarfAttrCount
Definition: dwarfinfo.c:56
@ DwarfAttrArtificial
Definition: dwarfinfo.c:53
@ DwarfAttrBitSize
Definition: dwarfinfo.c:26
@ DwarfAttrCallLine
Definition: dwarfinfo.c:90
@ DwarfAttrDataMemberLoc
Definition: dwarfinfo.c:57
@ FormDwarfBlock1
Definition: dwarfinfo.c:102
@ DwarfAttrImport
Definition: dwarfinfo.c:34
@ FormRef1
Definition: dwarfinfo.c:109
@ DwarfAttrStmtList
Definition: dwarfinfo.c:27
@ DwarfAttrSpecification
Definition: dwarfinfo.c:72
@ DwarfAttrLowpc
Definition: dwarfinfo.c:28
@ DwarfAttrRanges
Definition: dwarfinfo.c:86
@ FormRefUdata
Definition: dwarfinfo.c:113
@ DwarfAttrInline
Definition: dwarfinfo.c:41
@ FormData2
Definition: dwarfinfo.c:97
@ DwarfAttrVtableElemLoc
Definition: dwarfinfo.c:78
@ DwarfAttrMax
Definition: dwarfinfo.c:92
@ FormData4
Definition: dwarfinfo.c:98
@ FormFlag
Definition: dwarfinfo.c:104
@ DwarfAttrDeclFile
Definition: dwarfinfo.c:59
@ FormDwarfBlock
Definition: dwarfinfo.c:101
@ DwarfAttrProducer
Definition: dwarfinfo.c:44
@ DwarfAttrVisibility
Definition: dwarfinfo.c:33
@ DwarfAttrEncoding
Definition: dwarfinfo.c:63
@ DwarfAttrDiscr
Definition: dwarfinfo.c:31
@ DwarfAttrPriority
Definition: dwarfinfo.c:70
@ DwarfAttrDeclLine
Definition: dwarfinfo.c:60
@ DwarfAttrFrameBase
Definition: dwarfinfo.c:65
@ DwarfAttrDiscrList
Definition: dwarfinfo.c:62
@ FormStrp
Definition: dwarfinfo.c:106
@ DwarfAttrBitOffset
Definition: dwarfinfo.c:25
@ FormString
Definition: dwarfinfo.c:100
int dwarflookuptag(Dwarf *d, ulong unit, ulong tag, DwarfSym *s)
Definition: dwarfinfo.c:152
static Parse ptab[DwarfAttrMax]
Definition: dwarfinfo.c:405
int dwarfnextsym(Dwarf *d, DwarfSym *s)
Definition: dwarfinfo.c:251
int dwarfseeksym(Dwarf *d, ulong unit, ulong off, DwarfSym *s)
Definition: dwarfinfo.c:171
static int skipform(DwarfBuf *, int)
Definition: dwarfinfo.c:649
#define OFFSET(x)
Definition: dwarfinfo.c:338
int dwarfenum(Dwarf *d, DwarfSym *s)
Definition: dwarfinfo.c:242
static Parse plist[]
Definition: dwarfinfo.c:340
static int parseattrs(DwarfBuf *, ulong, DwarfAbbrev *, DwarfAttrs *)
Definition: dwarfinfo.c:408
signed char schar
Definition: compat.h:5
long long s64int
Definition: compat.h:16
#define werrstr(str,...)
Definition: compat.h:34
unsigned long long uvlong
Definition: compat.h:9
int s32int
Definition: compat.h:14
#define nil
Definition: compat.h:23
unsigned long long u64int
Definition: compat.h:15
short s16int
Definition: compat.h:12
#define memset(x, y, z)
Definition: compat.h:39
@ OpConst4s
Definition: dwarf.h:144
@ OpConst4u
Definition: dwarf.h:143
@ OpConsts
Definition: dwarf.h:148
@ OpConst2u
Definition: dwarf.h:141
@ TAddress
Definition: dwarf.h:135
@ OpConst8u
Definition: dwarf.h:145
@ TString
Definition: dwarf.h:133
@ TReference
Definition: dwarf.h:130
@ TConstant
Definition: dwarf.h:132
@ OpPlusUconst
Definition: dwarf.h:166
@ OpAddr
Definition: dwarf.h:137
@ OpConst1s
Definition: dwarf.h:140
@ TagSubprogram
Definition: dwarf.h:52
@ OpConst2s
Definition: dwarf.h:142
@ OpConstu
Definition: dwarf.h:147
@ TBlock
Definition: dwarf.h:131
@ OpConst8s
Definition: dwarf.h:146
@ OpConst1u
Definition: dwarf.h:139
@ TFlag
Definition: dwarf.h:134
ulong dwarfget128(DwarfBuf *)
Definition: dwarfget.c:153
ulong dwarfget2(DwarfBuf *)
Definition: dwarfget.c:82
char * dwarfgetstring(DwarfBuf *)
Definition: dwarfget.c:55
ulong dwarfget1(DwarfBuf *)
Definition: dwarfget.c:18
long dwarfget128s(DwarfBuf *)
Definition: dwarfget.c:198
ulong dwarfgetaddr(DwarfBuf *)
Definition: dwarfget.c:124
uchar * dwarfgetnref(DwarfBuf *, ulong)
Definition: dwarfget.c:41
ulong dwarfget4(DwarfBuf *)
Definition: dwarfget.c:96
uvlong dwarfget8(DwarfBuf *)
Definition: dwarfget.c:110
DwarfAbbrev * dwarfgetabbrev(Dwarf *, ulong, ulong)
Definition: dwarfabbrev.c:129
uchar haskids
Definition: dwarf.h:226
ulong tag
Definition: dwarf.h:225
uchar * data
Definition: dwarf.h:202
ulong len
Definition: dwarf.h:203
Definition: dwarf.h:437
int type
Definition: dwarfinfo.c:335
int name
Definition: dwarfinfo.c:332
int off
Definition: dwarfinfo.c:333
int haveoff
Definition: dwarfinfo.c:334
Definition: name.c:39
Definition: ecma_167.h:138
static char * encoding
Definition: xmllint.c:155