Blame


1 a84cbb2a 2004-04-19 devnull #include <u.h>
2 a84cbb2a 2004-04-19 devnull #include <libc.h>
3 a84cbb2a 2004-04-19 devnull #include <bio.h>
4 a84cbb2a 2004-04-19 devnull #include "elf.h"
5 a84cbb2a 2004-04-19 devnull #include "dwarf.h"
6 a84cbb2a 2004-04-19 devnull
7 a84cbb2a 2004-04-19 devnull void printrules(Dwarf *d, ulong pc);
8 a84cbb2a 2004-04-19 devnull int exprfmt(Fmt*);
9 a84cbb2a 2004-04-19 devnull
10 a84cbb2a 2004-04-19 devnull void
11 a84cbb2a 2004-04-19 devnull usage(void)
12 a84cbb2a 2004-04-19 devnull {
13 a84cbb2a 2004-04-19 devnull fprint(2, "usage: dwarfdump file\n");
14 a84cbb2a 2004-04-19 devnull exits("usage");
15 a84cbb2a 2004-04-19 devnull }
16 a84cbb2a 2004-04-19 devnull
17 a84cbb2a 2004-04-19 devnull void
18 a84cbb2a 2004-04-19 devnull main(int argc, char **argv)
19 a84cbb2a 2004-04-19 devnull {
20 a84cbb2a 2004-04-19 devnull int c;
21 a84cbb2a 2004-04-19 devnull Elf *elf;
22 a84cbb2a 2004-04-19 devnull Dwarf *d;
23 a84cbb2a 2004-04-19 devnull DwarfSym s;
24 a84cbb2a 2004-04-19 devnull char *cdir, *dir, *file;
25 a84cbb2a 2004-04-19 devnull ulong line, mtime, length;
26 a84cbb2a 2004-04-19 devnull
27 a84cbb2a 2004-04-19 devnull ARGBEGIN{
28 a84cbb2a 2004-04-19 devnull default:
29 a84cbb2a 2004-04-19 devnull usage();
30 a84cbb2a 2004-04-19 devnull }ARGEND
31 a84cbb2a 2004-04-19 devnull
32 a84cbb2a 2004-04-19 devnull if(argc != 1)
33 a84cbb2a 2004-04-19 devnull usage();
34 a84cbb2a 2004-04-19 devnull
35 a84cbb2a 2004-04-19 devnull fmtinstall('R', exprfmt);
36 a84cbb2a 2004-04-19 devnull fmtinstall('H', encodefmt);
37 a84cbb2a 2004-04-19 devnull
38 a84cbb2a 2004-04-19 devnull if((elf = elfopen(argv[0])) == nil)
39 a84cbb2a 2004-04-19 devnull sysfatal("elfopen %s: %r", argv[0]);
40 a84cbb2a 2004-04-19 devnull if((d=dwarfopen(elf)) == nil)
41 a84cbb2a 2004-04-19 devnull sysfatal("dwarfopen: %r");
42 a84cbb2a 2004-04-19 devnull
43 a84cbb2a 2004-04-19 devnull if(dwarfenum(d, &s) < 0)
44 a84cbb2a 2004-04-19 devnull sysfatal("dwarfenumall: %r");
45 a84cbb2a 2004-04-19 devnull
46 95f57b01 2004-04-21 devnull while(dwarfnextsym(d, &s) == 1){
47 a84cbb2a 2004-04-19 devnull switch(s.attrs.tag){
48 a84cbb2a 2004-04-19 devnull case TagCompileUnit:
49 a84cbb2a 2004-04-19 devnull print("compileunit %s\n", s.attrs.name);
50 a84cbb2a 2004-04-19 devnull break;
51 a84cbb2a 2004-04-19 devnull case TagSubprogram:
52 a84cbb2a 2004-04-19 devnull c = 't';
53 a84cbb2a 2004-04-19 devnull goto sym;
54 a84cbb2a 2004-04-19 devnull case TagVariable:
55 a84cbb2a 2004-04-19 devnull c = 'd';
56 a84cbb2a 2004-04-19 devnull goto sym;
57 a84cbb2a 2004-04-19 devnull case TagConstant:
58 a84cbb2a 2004-04-19 devnull c = 'c';
59 a84cbb2a 2004-04-19 devnull goto sym;
60 a84cbb2a 2004-04-19 devnull case TagFormalParameter:
61 a84cbb2a 2004-04-19 devnull if(!s.attrs.name)
62 a84cbb2a 2004-04-19 devnull break;
63 a84cbb2a 2004-04-19 devnull c = 'p';
64 a84cbb2a 2004-04-19 devnull sym:
65 a84cbb2a 2004-04-19 devnull if(s.attrs.isexternal)
66 a84cbb2a 2004-04-19 devnull c += 'A' - 'a';
67 a84cbb2a 2004-04-19 devnull print("%c %s", c, s.attrs.name);
68 a84cbb2a 2004-04-19 devnull if(s.attrs.have.lowpc)
69 a84cbb2a 2004-04-19 devnull print(" 0x%lux-0x%lux", s.attrs.lowpc, s.attrs.highpc);
70 a84cbb2a 2004-04-19 devnull switch(s.attrs.have.location){
71 a84cbb2a 2004-04-19 devnull case TBlock:
72 a84cbb2a 2004-04-19 devnull print(" @ %.*H", s.attrs.location.b.len, s.attrs.location.b.data);
73 a84cbb2a 2004-04-19 devnull break;
74 a84cbb2a 2004-04-19 devnull case TConstant:
75 a84cbb2a 2004-04-19 devnull print(" @ 0x%lux", s.attrs.location.c);
76 a84cbb2a 2004-04-19 devnull break;
77 a84cbb2a 2004-04-19 devnull }
78 a84cbb2a 2004-04-19 devnull if(s.attrs.have.ranges)
79 a84cbb2a 2004-04-19 devnull print(" ranges@0x%lux", s.attrs.ranges);
80 a84cbb2a 2004-04-19 devnull print("\n");
81 a84cbb2a 2004-04-19 devnull if(s.attrs.have.lowpc){
82 a84cbb2a 2004-04-19 devnull if(dwarfpctoline(d, s.attrs.lowpc, &cdir, &dir, &file, &line, &mtime, &length) < 0)
83 a84cbb2a 2004-04-19 devnull print("\tcould not find source: %r\n");
84 a84cbb2a 2004-04-19 devnull else
85 a84cbb2a 2004-04-19 devnull print("\t%s/%s/%s:%lud mtime=%lud length=%lud\n",
86 a84cbb2a 2004-04-19 devnull cdir, dir, file, line, mtime, length);
87 a84cbb2a 2004-04-19 devnull
88 a84cbb2a 2004-04-19 devnull if(0) printrules(d, s.attrs.lowpc);
89 a84cbb2a 2004-04-19 devnull if(0) printrules(d, (s.attrs.lowpc+s.attrs.highpc)/2);
90 a84cbb2a 2004-04-19 devnull }
91 a84cbb2a 2004-04-19 devnull break;
92 a84cbb2a 2004-04-19 devnull }
93 a84cbb2a 2004-04-19 devnull }
94 a84cbb2a 2004-04-19 devnull exits(0);
95 a84cbb2a 2004-04-19 devnull }
96 a84cbb2a 2004-04-19 devnull
97 a84cbb2a 2004-04-19 devnull void
98 a84cbb2a 2004-04-19 devnull printrules(Dwarf *d, ulong pc)
99 a84cbb2a 2004-04-19 devnull {
100 a84cbb2a 2004-04-19 devnull int i;
101 a84cbb2a 2004-04-19 devnull DwarfExpr r[10];
102 a84cbb2a 2004-04-19 devnull DwarfExpr cfa, ra;
103 a84cbb2a 2004-04-19 devnull
104 a84cbb2a 2004-04-19 devnull if(dwarfunwind(d, pc, &cfa, &ra, r, nelem(r)) < 0)
105 a84cbb2a 2004-04-19 devnull print("\tcannot unwind from pc 0x%lux: %r\n", pc);
106 a84cbb2a 2004-04-19 devnull
107 a84cbb2a 2004-04-19 devnull print("\tpc=0x%lux cfa=%R ra=%R", pc, &cfa, &ra);
108 a84cbb2a 2004-04-19 devnull for(i=0; i<nelem(r); i++)
109 a84cbb2a 2004-04-19 devnull if(r[i].type != RuleSame)
110 a84cbb2a 2004-04-19 devnull print(" r%d=%R", i, &r[i]);
111 a84cbb2a 2004-04-19 devnull print("\n");
112 a84cbb2a 2004-04-19 devnull }
113 a84cbb2a 2004-04-19 devnull
114 a84cbb2a 2004-04-19 devnull int
115 a84cbb2a 2004-04-19 devnull exprfmt(Fmt *fmt)
116 a84cbb2a 2004-04-19 devnull {
117 a84cbb2a 2004-04-19 devnull DwarfExpr *e;
118 a84cbb2a 2004-04-19 devnull
119 a84cbb2a 2004-04-19 devnull if((e = va_arg(fmt->args, DwarfExpr*)) == nil)
120 a84cbb2a 2004-04-19 devnull return fmtstrcpy(fmt, "<nil>");
121 a84cbb2a 2004-04-19 devnull
122 a84cbb2a 2004-04-19 devnull switch(e->type){
123 a84cbb2a 2004-04-19 devnull case RuleUndef:
124 a84cbb2a 2004-04-19 devnull return fmtstrcpy(fmt, "undef");
125 a84cbb2a 2004-04-19 devnull case RuleSame:
126 a84cbb2a 2004-04-19 devnull return fmtstrcpy(fmt, "same");
127 a84cbb2a 2004-04-19 devnull case RuleCfaOffset:
128 a84cbb2a 2004-04-19 devnull return fmtprint(fmt, "%ld(cfa)", e->offset);
129 a84cbb2a 2004-04-19 devnull case RuleRegister:
130 a84cbb2a 2004-04-19 devnull return fmtprint(fmt, "r%ld", e->reg);
131 a84cbb2a 2004-04-19 devnull case RuleRegOff:
132 a84cbb2a 2004-04-19 devnull return fmtprint(fmt, "%ld(r%ld)", e->offset, e->reg);
133 a84cbb2a 2004-04-19 devnull case RuleLocation:
134 a84cbb2a 2004-04-19 devnull return fmtprint(fmt, "l.%.*H", e->loc.len, e->loc.data);
135 a84cbb2a 2004-04-19 devnull default:
136 a84cbb2a 2004-04-19 devnull return fmtprint(fmt, "?%d", e->type);
137 a84cbb2a 2004-04-19 devnull }
138 a84cbb2a 2004-04-19 devnull }