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 88bb285e 2005-06-22 devnull else if(dir == nil)
85 88bb285e 2005-06-22 devnull print("\t%s/%s:%lud mtime=%lud length=%lud\n",
86 88bb285e 2005-06-22 devnull cdir, file, line, mtime, length);
87 a84cbb2a 2004-04-19 devnull else
88 a84cbb2a 2004-04-19 devnull print("\t%s/%s/%s:%lud mtime=%lud length=%lud\n",
89 a84cbb2a 2004-04-19 devnull cdir, dir, file, line, mtime, length);
90 a84cbb2a 2004-04-19 devnull
91 a84cbb2a 2004-04-19 devnull if(0) printrules(d, s.attrs.lowpc);
92 a84cbb2a 2004-04-19 devnull if(0) printrules(d, (s.attrs.lowpc+s.attrs.highpc)/2);
93 a84cbb2a 2004-04-19 devnull }
94 a84cbb2a 2004-04-19 devnull break;
95 a84cbb2a 2004-04-19 devnull }
96 a84cbb2a 2004-04-19 devnull }
97 a84cbb2a 2004-04-19 devnull exits(0);
98 a84cbb2a 2004-04-19 devnull }
99 a84cbb2a 2004-04-19 devnull
100 a84cbb2a 2004-04-19 devnull void
101 a84cbb2a 2004-04-19 devnull printrules(Dwarf *d, ulong pc)
102 a84cbb2a 2004-04-19 devnull {
103 a84cbb2a 2004-04-19 devnull int i;
104 a84cbb2a 2004-04-19 devnull DwarfExpr r[10];
105 a84cbb2a 2004-04-19 devnull DwarfExpr cfa, ra;
106 a84cbb2a 2004-04-19 devnull
107 a84cbb2a 2004-04-19 devnull if(dwarfunwind(d, pc, &cfa, &ra, r, nelem(r)) < 0)
108 a84cbb2a 2004-04-19 devnull print("\tcannot unwind from pc 0x%lux: %r\n", pc);
109 a84cbb2a 2004-04-19 devnull
110 a84cbb2a 2004-04-19 devnull print("\tpc=0x%lux cfa=%R ra=%R", pc, &cfa, &ra);
111 a84cbb2a 2004-04-19 devnull for(i=0; i<nelem(r); i++)
112 a84cbb2a 2004-04-19 devnull if(r[i].type != RuleSame)
113 a84cbb2a 2004-04-19 devnull print(" r%d=%R", i, &r[i]);
114 a84cbb2a 2004-04-19 devnull print("\n");
115 a84cbb2a 2004-04-19 devnull }
116 a84cbb2a 2004-04-19 devnull
117 a84cbb2a 2004-04-19 devnull int
118 a84cbb2a 2004-04-19 devnull exprfmt(Fmt *fmt)
119 a84cbb2a 2004-04-19 devnull {
120 a84cbb2a 2004-04-19 devnull DwarfExpr *e;
121 a84cbb2a 2004-04-19 devnull
122 a84cbb2a 2004-04-19 devnull if((e = va_arg(fmt->args, DwarfExpr*)) == nil)
123 a84cbb2a 2004-04-19 devnull return fmtstrcpy(fmt, "<nil>");
124 a84cbb2a 2004-04-19 devnull
125 a84cbb2a 2004-04-19 devnull switch(e->type){
126 a84cbb2a 2004-04-19 devnull case RuleUndef:
127 a84cbb2a 2004-04-19 devnull return fmtstrcpy(fmt, "undef");
128 a84cbb2a 2004-04-19 devnull case RuleSame:
129 a84cbb2a 2004-04-19 devnull return fmtstrcpy(fmt, "same");
130 a84cbb2a 2004-04-19 devnull case RuleCfaOffset:
131 a84cbb2a 2004-04-19 devnull return fmtprint(fmt, "%ld(cfa)", e->offset);
132 a84cbb2a 2004-04-19 devnull case RuleRegister:
133 a84cbb2a 2004-04-19 devnull return fmtprint(fmt, "r%ld", e->reg);
134 a84cbb2a 2004-04-19 devnull case RuleRegOff:
135 a84cbb2a 2004-04-19 devnull return fmtprint(fmt, "%ld(r%ld)", e->offset, e->reg);
136 a84cbb2a 2004-04-19 devnull case RuleLocation:
137 a84cbb2a 2004-04-19 devnull return fmtprint(fmt, "l.%.*H", e->loc.len, e->loc.data);
138 a84cbb2a 2004-04-19 devnull default:
139 a84cbb2a 2004-04-19 devnull return fmtprint(fmt, "?%d", e->type);
140 a84cbb2a 2004-04-19 devnull }
141 a84cbb2a 2004-04-19 devnull }