7 void printrules(Dwarf *d, ulong pc);
13 fprint(2, "usage: dwarfdump file\n");
18 main(int argc, char **argv)
24 char *cdir, *dir, *file;
25 ulong line, mtime, length;
35 fmtinstall('R', exprfmt);
36 fmtinstall('H', encodefmt);
38 if((elf = elfopen(argv[0])) == nil)
39 sysfatal("elfopen %s: %r", argv[0]);
40 if((d=dwarfopen(elf)) == nil)
41 sysfatal("dwarfopen: %r");
43 if(dwarfenum(d, &s) < 0)
44 sysfatal("dwarfenumall: %r");
46 while(dwarfnextsym(d, &s) == 1){
49 print("compileunit %s\n", s.attrs.name);
60 case TagFormalParameter:
65 if(s.attrs.isexternal)
67 print("%c %s", c, s.attrs.name);
68 if(s.attrs.have.lowpc)
69 print(" 0x%lux-0x%lux", s.attrs.lowpc, s.attrs.highpc);
70 switch(s.attrs.have.location){
72 print(" @ %.*H", s.attrs.location.b.len, s.attrs.location.b.data);
75 print(" @ 0x%lux", s.attrs.location.c);
78 if(s.attrs.have.ranges)
79 print(" ranges@0x%lux", s.attrs.ranges);
81 if(s.attrs.have.lowpc){
82 if(dwarfpctoline(d, s.attrs.lowpc, &cdir, &dir, &file, &line, &mtime, &length) < 0)
83 print("\tcould not find source: %r\n");
85 print("\t%s/%s:%lud mtime=%lud length=%lud\n",
86 cdir, file, line, mtime, length);
88 print("\t%s/%s/%s:%lud mtime=%lud length=%lud\n",
89 cdir, dir, file, line, mtime, length);
91 if(0) printrules(d, s.attrs.lowpc);
92 if(0) printrules(d, (s.attrs.lowpc+s.attrs.highpc)/2);
101 printrules(Dwarf *d, ulong pc)
107 if(dwarfunwind(d, pc, &cfa, &ra, r, nelem(r)) < 0)
108 print("\tcannot unwind from pc 0x%lux: %r\n", pc);
110 print("\tpc=0x%lux cfa=%R ra=%R", pc, &cfa, &ra);
111 for(i=0; i<nelem(r); i++)
112 if(r[i].type != RuleSame)
113 print(" r%d=%R", i, &r[i]);
122 if((e = va_arg(fmt->args, DwarfExpr*)) == nil)
123 return fmtstrcpy(fmt, "<nil>");
127 return fmtstrcpy(fmt, "undef");
129 return fmtstrcpy(fmt, "same");
131 return fmtprint(fmt, "%ld(cfa)", e->offset);
133 return fmtprint(fmt, "r%ld", e->reg);
135 return fmtprint(fmt, "%ld(r%ld)", e->offset, e->reg);
137 return fmtprint(fmt, "l.%.*H", e->loc.len, e->loc.data);
139 return fmtprint(fmt, "?%d", e->type);